C#入門經典 Chapter4 流程控制

4.1布爾邏輯函數

  布爾比較運算符性能

  ==  !=   <   >    <=    >=測試

  處理布爾值的布爾值運算符spa

  ! & | ^(異或)code

  條件布爾運算符blog

  &&   ||  比&和|性能更好    好比&&只需判斷前面的布爾值爲false,總體值就爲false,不用計算後面的布爾值string

  1.布爾賦值運算符it

    &=  |=  ^=io

  2.按位運算符for循環

    &  |  ^  ~

    位移運算符 >>  <<

    位移賦值運算符>>=   <<=

  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)

至關於放大了原來的圖像的一部分:大概是這一部分?目前只能理解到這個程度了

 

 

 

相關文章
相關標籤/搜索