標籤:條件 沒有 img 放大 label 利用 賦值運算 參數 公式
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)
相當於放大了原來的映像的一部分:大概是這一部分?目前只能理解到這個程度了
C#入門經典 Chapter4 流程式控制制