菜鳥的C#學習之旅——C#三大結構總結
目錄
順序結構
一、順序執行
1.定義:程式中的語句按照其書寫順序執行,上一條語句執行完後自動的開始下一條語句的執行,稱為順序執行。
2.注意:順序執行的程式中的語句次序非常的重要,不能隨意調整順序執行的語句順序,這將會導致程式的結果出錯。
3.如果在順序執行的程式中出現了方法或函式的呼叫,當執行到方法或函式呼叫的語句時,會暫停當前程式的執行流程轉而進入到被呼叫方法或函式內部開始執行,當從被調方法或函式返回後繼續被暫停的流程。
4.舉例:輸入圓的半徑,計算圓面積並輸出。
程式碼展示:
const double PI = 3.1415926; double r, s; Console.WriteLine("請輸入您要計算的圓的半徑:"); r = Convert.ToDouble(Console.ReadLine()); s = PI * r * r; Console.WriteLine("圓的面積為:\n{0:F2}", s); Console.ReadKey();
二、跳轉執行
1.由於順序執行雖然能滿足很多的簡單問題求解需求,但是又很多的問題的解決僅僅依靠順序執行是不能滿足需求的,跳轉執行也是求解問題必需的執行機制。
2.跳轉執行的控制語句有:
(1)選擇語句:if語句、switch語句
(2)迴圈語句:while語句、do語句、for語句
(3)跳轉語句:goto語句、break語句、continue語句、return語句、throw語句
選擇結構
一、if語句
1.if語句可以根據給定表示式的結果選擇執行不同的語句。
if(表示式)......語句 if(表示式)......語句1......else......語句2
2.if語句的程式碼示例:
3.if語句中的子語句既可以是簡單的語句,也可以是任何種類的其他語句,使用複合語句時必須使用花括號括起來。
4.舉例:
(1)輸入實數的絕對值
程式碼展示:
Console.WriteLine("請輸入一個數:");
double R = Convert.ToDouble(Console.ReadLine());
if (R > 0)
Console.WriteLine("該實數的絕對值為:\n{0}", R);
else
Console.WriteLine("該實數的絕對值為:\n{0}", -1 * R);
Console.ReadKey();
(2)判斷輸入年份是閏年還是平年,閏年的年份滿足下面兩個條件之一:
A.年份值能被4整除,但是不能被100整除;
B.份值能被400整除。
程式碼展示:
Console.WriteLine("請輸入需要判斷的年份:");
int Year = Convert.ToInt32(Console.ReadLine());
if (Year % 4 == 0 && Year % 100 != 0 || Year % 400 == 0)
Console.WriteLine("該年是閏年!");
else
Console.WriteLine("該年是平年!");
Console.ReadKey();
二、if語句的巢狀
1.if語句和switch語句中,分支的子語句或語句序列中可以是任意的語句。當在if語句的子語句或switch語句的分支語句序列中出現了又一個if語句或switch語句時,就形成了巢狀的選擇結構。
2.if語句的巢狀形式:
(1)第一種:在else分支上巢狀if語句
if(表示式1)語句1
else if (表示式2)語句2
else if (表示式3)語句3
......
else if (表示式n)語句n
else 語句m
舉例:程式設計輸出成績分類,90以上為A,80——89為B,......,60分以下為E。
程式碼展示:
Console.WriteLine("請輸入你的成績:");
int Grade = Convert.ToInt32(Console.ReadLine());
if (Grade > 100)
{
Console.WriteLine("您的輸入有誤,請重新輸入:");
}
else if (Grade >= 90)
{
Console.WriteLine("A");
}
else if (Grade >= 80)
{
Console.WriteLine("B");
}
else if (Grade >= 70)
{
Console.WriteLine("C");
}
else if (Grade >= 60)
{
Console.WriteLine("D");
}
else if (Grade >= 0)
{
Console.WriteLine("E");
}
else
{
Console.WriteLine("您的輸入有誤,請重新輸入:");
}
Console.ReadKey();
3.第二種:在if和else分支上巢狀if語句
if(表示式1)
if(表示式2)語句1
else 語句2
else
if(表示式3)語句3
else 語句4
4.if語句巢狀的層數
沒有限制,可以形成多重巢狀,多重巢狀的使用,擴充套件了程式選擇的分支數目,適應了程式多分支選擇流程的需要。儘可能使用if語句的巢狀層數最少。
舉例:找幸運數
如果一個整數逆序後得到的數值和原來數值相同,則稱之為幸運數,輸入一個整數N(N<100000)判斷是否為幸運數,是的話輸出“Yes”,否則輸出“No”。
思路:
一位整數:迴文數
兩位整數:個位和十位相等是迴文數
三位整數:個位和百位相等時迴文數
四位整數:個位和千位,十位和百位相等是迴文數
五位整數:個位和萬位,十位和千位相等時迴文數
程式碼展示:
Console.WriteLine("請輸入一個整數:");
int Num = Convert.ToInt32(Console.ReadLine());
Num = Num >= 0 ? Num : -Num;//取num的絕對值進行判定
if (Num < 10)
{
Console.WriteLine("Yes");
}
else
{
if (Num < 100)
{
if (Num / 10 == Num % 10)
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
else
{
if (Num < 10000)
{
if (Num / 1000 == Num % 10 && Num % 1000 / 100 == Num % 100 / 10)
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
else
{
if (Num < 100000)
{
if (Num / 10000 == Num % 10 && Num % 10000 / 1000 == Num % 100 / 10)
{
Console.WriteLine("Yes");
}
else
{
Console.WriteLine("No");
}
}
}
}
}
Console.ReadKey();
三、switch語句
1.switch語句實現多路分支,它計算給定測試表達式的值,根據其結果選擇從多個分支中的一個分支入口執行。
2.switch語句的形式
switch(測試表達式)
{
case常量表達式1:語句序列1
break;
case常量表達式2:語句序列2
break;
......
case常量表達式n:語句序列n
break;
default:
預設語句序列
break;
}
3.switch語句包含零個、一個或多個分支,但是任意兩個分支的常量表達式值都不能相同。
4.每個分支以一個或多個分支標籤開始,每個分支必須以break語句或其他的跳轉語句結束,除非這個分支沒有相應的語句序列,最常用來結束每個分支的是break語句。
5.default分支是可以選的,表示當表示式的值與所有常量表達式的值不相等時,將會執行預設語句序列知道遇到break等跳轉語句
6.一般情況下,switch語句中都應該包含default分支,因為它的存在可以捕獲程式中潛在的錯誤。
7.舉例:將使用者輸入的百分制成績轉換為對應的五分製成績。
90——100 A
80——89 B
70——70 C
60——69 D
0——59 E
程式碼展示:
Console.WriteLine("請輸入您的成績:");
int score = Convert.ToInt32(Console.ReadLine());
switch (score / 10)
{
case 10:
case 9: Console.WriteLine("A");
break;
case 8: Console.WriteLine("B");
break;
case 7: Console.WriteLine("C");
break;
case 6: Console.WriteLine("D");
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0: Console.WriteLine("E");
break;
default: Console.WriteLine("Error!");
break;
}
Console.ReadKey();
四、switch語句的巢狀
1.當switch語句某個case分支中的語句序列裡出現了switch語句時,就實現了switch語句的巢狀,當連續使用多個switch語句時,就實現了switch語句的序列。
2.使用選擇結構巢狀時,應注意不要使得巢狀的層次太深或巢狀的結構太複雜,這會使得程式碼的編寫難度增大,程式碼的可讀性降低。
五、if語句與switch語句相互巢狀
1.在實際程式設計中,可將if語句和switch語句結合起來形成更加靈活的選擇結構。
2.判定物件有少數幾個確定值是考慮使用switch語句比較方便,判定物件有區間特徵時使用if語句方便。
3.使用一個switch語句只能判定一個判定物件,而使用一個if語句可藉助複雜的判定條件實現同時判定多個物件。
4.switch語句可以使用if語句取代,但是if語句不一定能使用switch語句取代。
迴圈結構
一、while語句
1.while迴圈是一個簡單的迴圈:
while(表示式)
語句
2.舉例:
計算從1累加到N的和,其中N為大於1的自然數。
程式碼展示:
int N, i = 1, sum = 0;
Console.WriteLine("請輸入您要計算的N值:");
N = Convert.ToInt32(Console.ReadLine());
while (i <= N)
{
sum = sum + i;
i = i + 1;
}
Console.WriteLine("sum:\n{0}", sum);
Console.ReadKey();
3.迴圈三要素:迴圈初始、迴圈條件和迴圈控制。
(1)迴圈初始:發生在迴圈之前,使得迴圈“就緒”;
(2)迴圈條件:是迴圈得以繼續或終止的判定;
(3)迴圈控制:是在迴圈內部實現迴圈條件的關鍵過程。
4.while語句的迴圈必須是“一個語句”的語法形式,while語句所形成的迴圈結構可以抽象為順序結構的一步。提示我們在程式設計時可以先抽象設計順序結構的一步,再使用迴圈結構細化。在迴圈中應該有使while表示式趨向假的操作,否則表示式恆為真,迴圈永不結束,成為死迴圈。
二、do語句
1.do語句先執行迴圈體的語句,然後再計算給定的表示式值,根據結果判定是否迴圈執行
do
語句
while(表示式);
2.舉例:計算從1累加到N的和,其中N為大於1的自然數。
程式碼展示:
int N, i = 1, sum = 0;
Console.WriteLine("請輸入您要計算的N值:");
N = Convert.ToInt32(Console.ReadLine());
do
{
sum = sum + i;
i = i + 1;
} while (i <= N);
Console.WriteLine("sum:\n{0}", sum);
Console.ReadKey();
三、for語句
1.for語句是實現迴圈功能的又一個語句:
for(初始化表示式;測試表達式;迭代表達式)
2.舉例:計算從1累加到N的和,其中N為大於1的自然數。
程式碼展示:
int N, i, sum;
Console.WriteLine("請輸入您要計算的數:");
N = Convert.ToInt32(Console.ReadLine());
for ( i = 1,sum =0; i <= N; i++)
{
sum = sum + i ;
}
Console.WriteLine("sum:\n{0}",sum );
Console.ReadKey();
3.對於迴圈問題的求解使用三個迴圈語句中的任何一個理論上來說都是可行的,重點是要正確的分析迴圈三要素:迴圈初始、迴圈控制、迴圈條件以及迴圈體。
4.迴圈語句的比較:
(1)共同點:
A.while、do、for迴圈在邏輯上是相同的,一般情況下可以相互轉換。
B.作為迴圈結構,while、do—while、for迴圈一般的都需要設定迴圈的初始值、迴圈結束條件的判定、迴圈增量(或減量)的計算。
(2)不同點:
如圖: