C#入门经典 Chapter4 流程控制

4.1布尔逻辑

  布尔比较运算符

  ==  !=   <   >    <=    >=

  处理布尔值的布尔值运算符

  ! & | ^(异或)

  条件布尔运算符

  &&   ||  比&和|性能更好    比如&&只需判断前面的布尔值为false,整体值就为false,不用计算后面的布尔值

  1.布尔赋值运算符

    &=  |=  ^=

  2.按位运算符

    &  |  ^  ~

    位移运算符 >>  <<

    位移赋值运算符>>=   <<=

  3.运算符优先级(更新)

    ++,--(用作前缀);(),+,-(一元),!,~

    *,/,%

    +,-

    <<,>>

    <,>,<=,>=

    ==,!=

    &

    ^

    |

    &&

    ||

    =,*=,/=,%=,+=,-=,>>=,<<=,&=,^=,|=赋值运算符

    ++,--(用作后缀)

4.2 goto语句

  goto  <labelName>

4.3 分支

  1.三元运算符

    ? :

  2.if语句

    if(){}else{}

  3.switch语句

    switch()

    {

      case val1:……;break;

       case val2:……;break;

       ……

       default:如果没有匹配的val值,有default,执行default中的代码

    }

    声明常量:指定变量类型和关键字const,同时必须给它们赋值。

4.4.循环:重复执行语句

  1.do循环

    do

    {先执行一次判断while()内的值,为true则再次执行,false退出循环

    }while();

  2.while循环

      while(){}先判断while()内的值,true才开始执行

  3.for循环

    for(int i=0;i<4,i++){}

  4.循环中断

    break:立即终止循环

    continue:立即终止当前循环,进入下一次循环

    goto:跳出循环到指定标记位置上

    return:跳出循环及包含该循环的函数

  5.无限循环

    while(true){}    利用break等退出



Mandelbrot集合示例(书中给出的示例代码用C#)

 class Program
    {
        //Mandelbrot图像中的每个位置都对应于公式N=x+y*i中的一个复数。其实数部分是x,虚数部分是y,i是-1的平方根。图像中各个位置的x和y坐标对应于虚数的x和y部分
        //图像中的每个位置用参数N来表示,它是x*x+y*y的平方根。如果这个值大于或等于2,则这个数字对应的位置值是0。如果参数N的值小于2,就把N的值改为N*N-N(N=(x* x-y* y-x)+(2*x* y-y)*i)),并再次测试这个新N值。如果这个值大于或等于2,则这个数字对应的位置值是1。这个过程一直继续下去,直到我们给图像中的位置赋一个值,或迭代执行的次数多于指定的次数为止。”
        static void Main(string[] args)
        {
            //N的实数和虚数部分
            double realCoord, imagCoord;
            //存储计算过程中的临时信息
            double realTemp, imagTemp, realTemp2, arg;
            //记录在参数N(arg)等于或大于2之前的迭代次数
            int iterations;
            //选择合适的边界值来显示Mandelbrot图像的主要部分,如果想放大这个图像,可以放大这些边界值。
            for (imagCoord = 1.2; imagCoord >= -1.2; imagCoord -= 0.05)
            {
                //两个for循环处理图像中的一个点,给N指定一个值。
                for (realCoord = -0.6; realCoord <= 1.77; realCoord += 0.03)
                {
                    //初始化变量
                    iterations = 0;
                    realTemp = realCoord;
                    imagTemp = imagCoord;
                    arg = (realCoord * realCoord) + (imagCoord * imagCoord);

                    //2是4的平方根,所以仅计算x^2+y^2的值,while循环执行迭代,
                    while ((arg < 4) && (iterations < 40))
                    {
                        //N*N-N的实数部分
                        realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp)
                              - realCoord;
                        //N*N-N的虚数部分
                        imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                        realTemp = realTemp2;
                        arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                        //当前点的值存储在iterations中
                        iterations += 1;
                    }

                    //选择要输出的字符
                    switch (iterations % 4)
                    {
                        case 0:
                            Console.Write(".");
                            break;
                        case 1:
                            Console.Write("o");
                            break;
                        case 2:
                            Console.Write("O");
                            break;
                        case 3:
                            Console.Write("@");
                            break;
                    }
                }
                //内层循环结束后需要结束一行,所以输出换行符。
                Console.Write("\n");
            }
            Console.ReadKey();
        }
    }

演示结果为:

章节习题要求用户输入图像的边界,并显示选中的图像部分。当前代码输出的字符应正好能放在控制台应用程序的一行上,考虑如何使每个选中的图像正好占据

大小相同的空间,以最大化可视区域。

  class Program
    {
        //Mandelbrot图像中的每个位置都对应于公式N=x+y*i中的一个复数。其实数部分是x,虚数部分是y,i是-1的平方根。图像中各个位置的x和y坐标对应于虚数的x和y部分
        //图像中的每个位置用参数N来表示,它是x*x+y*y的平方根。如果这个值大于或等于2,则这个数字对应的位置值是0。如果参数N的值小于2,就把N的值改为N*N-N(N=(x* x-y* y-x)+(2*x* y-y)*i)),并再次测试这个新N值。如果这个值大于或等于2,则这个数字对应的位置值是1。这个过程一直继续下去,直到我们给图像中的位置赋一个值,或迭代执行的次数多于指定的次数为止。”
        static void Main(string[] args)
        {
            //N的实数和虚数部分
            double realCoord, imagCoord;
            double realMax = 1.77;
            double realMin = -0.6;
            double imagMax = -1.2;
            double imagMin = 1.2;
            double realStep;
            double imagStep;
            //存储计算过程中的临时信息
            double realTemp, imagTemp, realTemp2, arg;
            //记录在参数N(arg)等于或大于2之前的迭代次数
            int iterations;
            //选择合适的边界值来显示Mandelbrot图像的主要部分,如果想放大这个图像,可以放大(其实是减小)这些边界值。
            while (true)
            {
                //设定跨度以保证每个选中的图像正好占据大小相同的空间,以最大化可视区域。
                realStep = (realMax - realMin) / 79;
                imagStep = (imagMax - imagMin) / 48;
                for (imagCoord = imagMin; imagCoord >= imagMax; imagCoord += imagStep)
                {
                    //两个for循环处理图像中的一个点,给N指定一个值。
                    for (realCoord = realMin; realCoord <= realMax; realCoord += realStep)
                    {
                        //初始化变量
                        iterations = 0;
                        realTemp = realCoord;
                        imagTemp = imagCoord;
                        arg = (realCoord * realCoord) + (imagCoord * imagCoord);

                        //2是4的平方根,所以仅计算x^2+y^2的值,while循环执行迭代,
                        while ((arg < 4) && (iterations < 40))
                        {
                            //N*N-N的实数部分
                            realTemp2 = (realTemp * realTemp) - (imagTemp * imagTemp)
                                  - realCoord;
                            //N*N-N的虚数部分
                            imagTemp = (2 * realTemp * imagTemp) - imagCoord;
                            realTemp = realTemp2;
                            arg = (realTemp * realTemp) + (imagTemp * imagTemp);
                            //当前点的值存储在iterations中
                            iterations += 1;
                        }

                        //选择要输出的字符
                        switch (iterations % 4)
                        {
                            case 0:
                                Console.Write(".");
                                break;
                            case 1:
                                Console.Write("o");
                                break;
                            case 2:
                                Console.Write("O");
                                break;
                            case 3:
                                Console.Write("@");
                                break;
                        }
                    }
                    //内层循环结束后需要结束一行,所以输出换行符。
                    Console.Write("\n");
                }
                //当前边界值
                Console.WriteLine("Current limits:");
                Console.WriteLine("realCoord:from {0} to {1} ", realMin, realMax);
                Console.WriteLine("imagCoord:from {0} to {1} \n", imagMin, imagMax);

                //输入新的边界值
                Console.WriteLine("Enter new limits:");
                //实数
                Console.WriteLine("realCoord:from:");
                realMin = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("realCoord:to:");
                realMax = Convert.ToDouble(Console.ReadLine());
                //虚数
                Console.WriteLine("imagCoord:from:");
                imagMin = Convert.ToDouble(Console.ReadLine());
                Console.WriteLine("imagCoord:to:");
                imagMax = Convert.ToDouble(Console.ReadLine());

            }
        }
    }

原边界(-0.6,1.2)  (1.77,-1.2)

现边界(-0.6,1.2) (0,0)

相当于放大了原来的图像的一部分:大概是这一部分?目前只能理解到这个程度了

时间: 2024-12-31 03:39:59

C#入门经典 Chapter4 流程控制的相关文章

Shell入门教程:流程控制(1)命令的结束状态

在Bash Shell中,流程控制命令有2大类:“条件”.“循环”.属于“条件”的有:if.case:属于“循环”的有:for.while.until:命令 select 既属于“条件”,也属于“循环”.不管是哪一种,均需进行条件测试,再根据测试结果,决定程序流程进行的方向. 以下逐一说明这些命令的用法. 第一节:命令的结束状态 Bash Shell Script 可由许多命令组成.每一个命令执行后,都会传回一个结束状态值,如果执行成功,传回0,如果执行失败,则传回非0值.执行失败,也分成许多状

Shell入门教程:流程控制(5)for 循环

for循环的运作方式,是将 串行 的元素的元素一一取出,依序放入制定的变量中,然后重复执行含括的命令区域(在 do 与 done 之间),直到所有元素取尽为止. 其中,串行是一些字符串的组合,彼此用 $IFS 所定义的 分隔符(如空格符)隔开,这些字符串称为字段. for的语法结构如下: for 变量 in 串行 do     命令区域 done 举例: for i in 1 2 3 4 do echo $i done for循环的语法中,“in串行”这段可以省略不写,此时,Bash会由命令行读

【重点】Shell入门教程:流程控制(3)条件判断式的真假值

之前曾提到,在Bash中什么是真什么是假,是以命令的结束状态是否为0来做判断.传回0,即为真:传回非0,即为假. 在Bash中,这种可以影响程序流程的式子,称为条件判断式.判断式的操作数分成“单元”及“二元”两种.如“-f 文件”可测试文件是否存在,运算符 -f 后接一个操作数“文件”,这种判断式称为“单元”:如“参数 1 -gt 参数2”可测试“参数1”的值是否大于“参数2”,运算符 -gt 的左右各接一个要比较的参数,这种判断式称为“二元”.大多数“单元”的判断式用于判断文件的相关属性,少数

Shell入门教程:流程控制(6)while 循环

while循环的语法: while 条件测试 do     命令区域 done 举例: #!/bin/bash declare -i i=1 declare -i sum=0 while ((i<=10)) do let sum+=i let ++i done echo $sum 使用while, 读取文件内容 while循环,经典的用法是搭配转向输入,读取文件的内容,做法如下: #!/bin/bash while read line do echo $line done < cvsfile

Java入门教程三(流程控制)

概述 程序有 3 种结构:顺序结构.选择结构和循环结构.分别为:if elseswitch case,while与do while,for, foreach,return,break ,continue if else if 选择结构是根据条件判断之后再做处理的一种语法结构.默认情况下,if 语句控制着下方紧跟的一条语句的执行.不过,通过语句块,if 语句可以控制多个语句. public static void main(String[] args) { int a=1,b=2; if(a>b)

Cg入门4:流程控制

知识点: 1.If...else 2.while 3.Do...while 4.for if-else,while,Do-while,for :与C语言语法一样 switch/case  : 不支持 模型x,y 值范围:[-0.5,0.5] 起始位置为模型左下角 注意: while.Do-while.for :循环上线为1024,只能循环1023此

【重点】Shell入门教程:流程控制(2)条件判断的写法

第三节:条件判断的写法 if条件判断中,if的语法结构中的“条件判断”可以有多种形式.测试结果是真是假,就看其传回的值是否为0. 条件测试的写法,有以下10种: 1.执行某个命令的结果 这里的命令,可包括管道命令,例如:命令1 | 命令2 | 命令3,称为 pipeline,其结束状态为最后一个命令执行的结果. 举例: #!/bin/bash if grep -q "rm" fn.sh; then echo "find in command." else echo

Shell入门教程:流程控制(4)case 条件判断

case的语法结构: case 待测项 in 样式串1] 命令区域1 ;; (样式串2) 命令区域2 ;; 样式串3) 命令区域3 ;; *) 命令区域 ;; esac 命令区域,可以是单一指令或多行指令,但最后一个指令要以 ;; 结束. 样式串行可用字符串和通配符组成,默认会区别大小写. 如果样式串行有好几个字符串要对比,要使用 | 隔开.字符 | 有 “或”的意思,意即:只要符合其中之一,就算比较成功. 样式串行可写成‘(样式串行)’,或省略左边的括号,写成 '样式串行)'.一般,以后面这个

Shell入门教程:流程控制(7)break和continue

第一节:breank命令 4种循环 for.while.until.select,如果想要提早结束循环,可在循环中使用break命令.执行break时,会跳出一层的循环,如果想跳出多层循环,可在break命令之后加上层数n(n一定要大于或等于1). #!/bin/bash for ((i=1;i<=10;i++)) do if [ $i -eq 6 ]; then break fi echo $i done 行5,如果i的值等于6,就跳出循环,即结束循环. 第二节:continue命令 cont