前言:
本篇為你講解分支陳述句和回圈陳述句的使用,把分支與回圈清晰化,
分支和回圈陳述句篇:
- 一、陳述句
- 二、分支陳述句
- 1.分支陳述句(選擇結構)
- 2.if陳述句
- 3.switch陳述句
- 三、回圈陳述句
- 1.回圈
- 2.while陳述句
- 1.break和continue的區別
- 3.for陳述句
- 4.do while陳述句
- 5.小練習
- 四、goto陳述句
- 五、猜數字小游戲
一、陳述句
c語言是結構化的程式語言,c語言中有三種結構:
- 順序結構(從頭到底)
- 選擇結構(if、switch)
- 回圈結構(while、for、do…while)
那什么是陳述句?
在c語言中規定,在寫完一條陳述句的時候在后面加上分號; 就是一條陳述句,也就是說C語言中由一個分號 ; 隔開的就是一條陳述句,
比如:
int main()
{
int a = 5;//這就是一條陳述句
printf("%d", a);//這也是一條陳述句
;//這還是陳述句,這是空陳述句
return 0;
}
二、分支陳述句
1.分支陳述句(選擇結構)
什么是分支呢,就是從總體或一個系統中分出部分,而選擇結構,就是你進行了某種操作之后從而得到不一樣的結果,
比如說你考上了大學,如果你好好學習,那么在畢業就可以拿到好offer;如果你不好好學習,那你畢業之后就老老實實回家養豬了,
這樣子:
又或者是:
2.if陳述句
if陳述句就是用來判斷某件事情是否成立,如果成立則執行以下操作,它還可以搭配else,else if進行組合,從而將幾種判斷可能都可以表示,
if陳述句的語法結構:
1. if(運算式)
陳述句;
2. if(運算式)
陳述句1;
else
陳述句2;
3. if(運算式1)//多分支
陳述句1;
else if(運算式2)
陳述句2;
else
陳述句3;
第一種就是最基本的if陳述句:
基礎判斷一件事情是否真偽,實際上,if陳述句中運算式真正決定的是運算式的值,比如下面的money >= price,如果成立,那運算式值為1,如果不成立,運算式值為0,在c語言中,0表示假,非0表示真,但真的事件轉換為數字時是默認轉換為1,
int main()
{
int price = 39;//價格
int money = 50;//余額
if (money >= price)//判斷余額是否大于價格
{
printf("余額充足,可以購買!");//如果成立,就輸出這個陳述句
}
return 0;
}
第二種是可以進行分支的if else陳述句:
if else陳述句就像它英語釋義一樣,如果…其他,就是if陳述句判斷某種事情的一種結果,然后其他結果的執行else陳述句,
int main()
{
int age = 18;
if (age >= 18)//大于等于18則運算式為1
{
printf("您已成年");
}
else//除了上面的可能其余結果均是未成年
{
printf("您未成年");
}
return 0;
}
第三種if else if else陳述句:
if else if else就是前面兩個的組合體,可以判斷多種可能和其余可能,實作多個分支選擇,
int main()
{
float rec = 12.91;//奧運會110米欄奧運會記錄
float your_ach = 13.22;//奧運成績
if(your_ach<rec)//判斷成績是否比奧運會記錄小
{
printf("你的成績打破了奧運會記錄!\n");
}
if (your_ach <= 13.02)//拿金牌的成績
{
printf("恭喜你,獲得金牌!");
}
else if (your_ach <= 13.20 && your_ach > rec)//前三名成績范圍
{
printf("恭喜你,獲得獎牌!");
}
else//其他成績
{
printf("很遺憾,未能獲得獎牌,但已經很棒了!");
}
return 0;
}
這里需要注意:
if…else if陳述句中,如果if判斷為真,則不會再執行判斷else陳述句,兩者是二選一關系,而if為假才會再去判斷else里面的if陳述句,
<>
而if…if…陳述句的話,則是按順序執行,執行完上面的if陳述句,無論真偽,繼續執行下面的if陳述句,
還有些代碼可能是這樣子的:
int main()
{
int a = 5;
if (a > 10)
{
printf("yes");
}
else
printf("no");//加個{ }更好
}
int main()
{
int a = 15;
if (a > 10)
printf("yes");
return 0;//加上else { }更好
}
這些代碼也可以運行,但是整體不夠美觀,在這些代碼的基礎上加上花括號對稱顯示,這樣邏輯更加清晰,不容易出錯,
比如下面代碼就讓人容易以為列印的是1:
int main()
{
int a = 1;
int b = 2;
if (a == 0)
if (b == 2)
printf("1");
else
printf("0");
return 0;
}
最后,了解了if陳述句之后是不是就可以把一開始的分支的流程圖寫出來了?
int main()
{
char ch = 0;
printf("你上大學了,是否想好好學習?");
printf("請輸入Y/N:>\n");
scanf("%c", &ch);
if (ch == 'Y')
{
printf("我要好好學習!\n");
printf("三年后...\n");
printf("你拿到了好offer!\n");
}
else if (ch == 'N')
{
printf("我不想好好學習\n");
printf("三年后...\n");
int a = 0;
printf("家大業大/普通人:1/2:>\n");
scanf("%d", &a);
if (a == 1)
{
printf("你還是拿到了offer\n");
}
else if (a == 2)
{
printf("回家養豬去吧\n");
}
}
return 0;
}
3.switch陳述句
接下來到我們的switch陳述句,switch陳述句也是一種分支陳述句, 常常用于多分支的情況,
有了if分支還又多一個switch干嘛,下面用一個代碼來進行說明:
//假設我要列印今天是星期幾
int main()
{
int day = 0;
scanf("%d", &day);
if (day == 1)
{
printf("今天是星期一");
}
else if (day == 2)
{
printf("今天是星期二");
}
else if (day == 3)
{
printf("今天是星期三");
}
//..........還要寫幾個
return 0;
}
這樣子是不是代碼有點拖泥帶水呢,那這時候就應該使用switch了:
switch陳述句的語法結構:
switch(整形運算式)
{
case 整形常量運算式:
陳述句;
}
//附帶產品:
break;
//跳出,當執行完某個陳述句后,跳出整個回圈
default
//分支中沒有switch整形運算式,執行default子句
用switch陳述句就可以更清晰簡單的多分支:
int main()
{
int day = 0;//整形
scanf("%d", &day);
switch(day)//day必須是整形運算式
{
case 1:
//case入口也需要是整形常量運算式
printf("星期一\n");
break;//跳出
//case就好像分支入口,而break就是分支出口
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
default:
printf("輸入有誤,無法識別");
//當輸入的數字不是1-7的時候執行這個陳述句
}
return 0;
}
在上面的代碼中,swicth(day)就相當于非誠勿擾的擇偶要求,如果day是1,那我就去case 1那里,然后執行case 1里面的內容,如果是2,那么就選擇去了case 2那里,而break相當于出口,就是執行完case 1的內容就跳出去了,如果case 1最后沒有break,那他就會自動執行下去case 2,但不是所有的switch陳述句都用上break,這要看代碼的邏輯,
比如我想知道今天需不需要上課:
int main()
{
int day = 0;
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("今天是上學日,加油上學人!\n");
break;
case 6:
case 7:
printf("今天是休息日,要好好休息哦!\n");
break;
default:
printf("輸入有誤,無法識別\n");
break;
}
注意:
if ,switch陳述句都可以進行嵌套,可以在分支進入之后再分支,完成更復雜的判斷,switch陳述句中,在最后一個 case 陳述句的后面加上一條 break陳述句,之所以這么寫是可以避免出現在以前的最后一個 case 陳述句后面忘了添加 break陳述句,
三、回圈陳述句
1.回圈
但我們認識上面的選擇陳述句中,我們來認識回圈陳述句,if陳述句中,當條件滿足的情況下,if陳述句后的陳述句執行,否則不執行,但是這個陳述句只會執行一次,那我們需要多次判斷呢?就需要我們的回圈陳述句了,
2.while陳述句
while 陳述句語法結構:
while(運算式)
回圈陳述句;
//附贈
continue;
//用于終止本次回圈的,也就是continue后的代碼在本次不在執行下去
while陳述句中,運算式結果為真,就進入回圈,執行一次,再回來判斷運算式結果,如果運算式為1,那么代碼將進入無限回圈,
比如:


那么他將進入瘋狂點贊我的行為當中且無法自拔,
言歸正傳,那while陳述句什么時候使用呢? 比如你要列印1到10的數字的時候,總不能說printf()上10個吧,那10000個數的時候呢?所以在一件事情沒有完成之前都繼續執行下去,我們就可以用while陳述句:
int main()
{
int count = 1;
while (count<10)
{
printf("我真帥!第%d次呼喊\n",count);
count++;
}
return 0;
}

這里怎么才呼喊9次啊,我們要看到我們的條件運算式上寫的是count<10,所以當count加到10那一次,我就不再進去了,因為while陳述句是先判斷后執行,
1.break和continue的區別
前面有個break跳出,這里又來一個continue跳出,那兩者有什么區別呢?
我們可以來比較下面的代碼:
//1.break版
int main()
{
int count = 1;
while (count<10)
{
if (count == 5)
{
break;
}
printf("我真帥!第%d次呼喊\n",count);
count++;
}
printf("呼喊完畢\n");
return 0;
}
//2.continue版
int main()
{
int count = 1;
while (count<10)
{
if (count == 5)
{
continue;
}
printf("我真帥!第%d次呼喊\n",count);
count++;
}
printf("呼喊完畢\n");
return 0;
}
代碼只在if陳述句中不同,那運行結果是什么呢?
我們可以看到,break版在while回圈本應回圈9次的時候,只呼喊了4次,然后跳出去呼喊完畢,而continue版呼喊了4次之后不在呼喊又不說完畢,
那我們先來了解一下break和continue的定義:
break在while回圈中的作用:
其實在回圈中只要遇到break,就停止后期的所有的回圈,直接終止回圈, 所以:while中的break是用于永久終止回圈的,
continue在while回圈中的作用就是:
continue是用于終止本次回圈的,也就是本次回圈中continue后邊的代碼不會再執行,而是直接跳轉到while陳述句的判斷部分,進行下一次回圈的入口判斷,
所以,當上面的代碼count==5的時候在while陳述句中碰見break,就直接跳出了while回圈并不再進來,而碰見continue的時候只是這一次不再執行下面的代碼,然后又回去給while的運算式判斷,當count==5的時候碰見continue,又回去判斷,又count==5又回去判斷又… 就導致了死回圈,
所以當我們需要跳出回圈的時候,要注意區分這兩者的功效,千萬不要用錯,在呼喊自己帥的時候欲言又止,

3.for陳述句
for陳述句語法結構:
for(運算式1;運算式2;運算式3)
回圈陳述句;
其中,運算式1 運算式1為初始化部分,用于初始化回圈變數的, 運算式2 運算式2為條件判斷部分,用于判斷回圈時候終止, 運算式3 運算式3為調整部分,用于回圈條件的調整,

for回圈陳述句先執行運算式1,然后判斷運算式2,為真進入回圈陳述句,為假退出回圈,若進入回圈陳述句執行后,最后再執行運算式3調整變數,然后再次進入運算式2判斷進行回圈,
我們先對比一下while回圈和for回圈的區別與細節,下面我要實作列印1-10的數字用for:
//1.while回圈
int main()
{
int i = 1;//初始化部分
while (i <= 10)//判斷部分
{
printf("%d\n", i);
i++;//調整部分
}
return 0;
}
//2.for回圈
int main()
{
for(i=1; i<=10; i++) //合三為一
{
printf("%d\n",i);
}
}
可以發現在while回圈中依然存在回圈的三個必須條件,但是由于風格的問題使得三個部分很可能偏離較遠,這樣查找修改就不夠集中和方便,所以,for回圈的風格更勝一籌,for的使用頻率也最高,
而for回圈陳述句也比較容易理解:
int main()
{
int i = 0;
for (i = 0; i <= 10; i++)
//單次運算式;條件運算式;末尾回圈體
//初始化賦值;判斷條件;回圈陳述句
{
printf("%d", i);//回圈體
}
return 0;
}
for陳述句即在for的括號中,第一個;前的是作為某一變數的初始化賦值陳述句, 用來給回圈控制變數賦初值,第二個是判斷陳述句,用于判斷是否滿足條件進入回圈,第三個是回圈后調整回圈變數,避免無限回圈,
而for陳述句和while陳述句中的break是一樣的,但continue有所區別:
for回圈中的continue跳過continue后邊的代碼,去了調整部分,調整回圈變數,不容易造成死回圈,
while回圈中,continue跳過continue后邊的代碼,直接去到判斷部分,
4.do while陳述句
do陳述句的語法結構:
do
{
回圈陳述句
}while(運算式);
do…while回圈和while類似,但是區別在于do…while回圈會直接執行一次,不管運算式判斷真偽,先執行一次再到while處判斷,也就是先執行,后判斷,判斷真偽作為再次進入回圈的依據,
比如:
int main()
{
int i = 0;
do
{
i++;
} while (i <= 10);
// 與while回圈同樣的判斷條件但結果多1,證明在相同條件下
//do while陳述句比while陳述句多執行一次回圈體
printf("%d", i);//i=11
return 0;
}
do 陳述句在回圈中至少執行一次,使用場景局限,并不是經常使用,
5.小練習
知道了上面的內容,我們來寫一個練習:
1.撰寫代碼,演示多個字符從兩端移動,向中間匯聚,比如這樣子的:
//我要列印hello,那么就這樣子列印:
h o
he lo
hello
//從兩邊到中間
代碼:
#include <windows.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char arr1[] = "hello! today is a good day!";
//你想列印的內容
char arr2[] = " ";
//空螢屏
int right = strlen(arr1)-1;
//strlen計算字串長度,減1表示字串最后字符的下標
int left = 0;
//首字符下表標
while (left <= right)//回圈條件:最左下表和最右下表不等
{
arr2[left] = arr1[left];//跟空螢屏交換字符,然后列印
arr2[right] = arr1[right];
left++;//最左的交換列印后向右移一位
right--;//最右的交換列印后向左移一位
printf("%s\n", arr2);//列印
Sleep(1000);
//執行掛起一段時間,就是停頓時間,單位是毫秒,所以這里是1s
system("cls");
//system是庫函式,用來執行系統命令的,cls表示清屏
//所以上面的列印會清空然后再列印下一次內容
}
printf("%s\n", arr1);
//最后一次還是會清屏,那我跳出回圈后再列印一次就完整了,
return 0;
}
四、goto陳述句
從理論上 goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼,但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,例如一次跳出兩層或多層回圈,這種情況使用break是達不到目的的,它只能從最內層回圈退出到上一層的回圈,相當于一個任意門,
我們可以來寫一個讓電腦關機的程式:
#include <windows.h>
#include <string.h>
#include <stdlib.h>
int main()
{
char input[10] = { 0 };
//設定一個字串讓你輸入
system("shutdown -s -t 60");
//system是庫函式,用來執行系統命令的
//shutdown -s是關機,后面加上-t 秒數 是多少秒后關機
again:
printf("電腦將在1分鐘內關機,如果輸入:我是憨批,就取消關機!\n請輸入:>");
//提示你輸入
scanf("%s", input);//輸入
if (strcmp(input, "我是豬") ==0 )
//strcmp字串比較函式,如果相同就回傳0
{
system("shutdown -a");
//shutdown -a是取消關機
}
else//如果輸入不一樣
{
goto again;//跳轉回去再讓你輸入,1分鐘后就真的關機了
}
return 0;
}
這就是goto的用處,回傳某一處標記的地方,但不用goto陳述句我們同樣可以用while陳述句去實作這個功能,其實goto陳述句真正適用的地方在于深層回圈嵌套想出來的時候,比如
int main()
{
for ()
{
for ()
{
for ()
{
if ()
{
goto here;
}
}
}
}
here:
//重見光明
return 0;
}
五、猜數字小游戲
根據這一篇的內容,可以寫一個猜數字小游戲,下面是猜數字小游戲的鏈接,感興趣的小伙伴可以看一看哦:
【C語言】猜數字小游戲
好啦,本篇的內容就到這里,小白制作不易,有錯的地方還請xdm指正,互相關注,共同進步,
還有一件事:



轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292225.html
標籤:其他
上一篇:帶你搞定漢諾塔
