“知道做不到就是不知道”
一、條件循環
1. while
只要條件為真(true
),就會重復執行循環體內的代碼。
while (條件) {// 循環體(要重復執行的代碼)
}//示例
int i = 1;
while (i <= 5) {printf("%d\n", i);i++; // 讓 i 遞增,否則會無限循環
}輸出:
1
2
3
4
5
(1)檢查?
條件
是否為真(true
)。(2)如果為真,執行循環體代碼。
(3)再次檢查?
條件
,重復上述過程。(4)如果?
條件
為假(false
),退出循環。
2. do-while
do-while在進入循環的時候不做檢查,而是執行完一輪循環體的代碼之后,再來檢查循環的條件是否滿足,如果滿足,則繼續執行下一輪;不滿足,則結束循環。
do
{//循環體語句
}while(條件);
注意事項:
(1)不要忘記在while條件最后的分號!!
(2)while和do-while循環的區別就在于前者是先判斷條件再執行語句;后者是先執行1次語句,再判斷條件。
(3)對比判斷條件:if是一次性的,while是反復多次的。
(4)要求在循環體內有結束循環的機會,否則就會進入死循環。
3. 示例1-猜數游戲
讓計算機隨機產生一個數,然后讓用戶來猜。用戶每輸入一個數字,就告訴用戶是輸大了,還是輸小了,直到用戶猜中為止,最后再輸出計算機一共猜了多少次。
分析:可以知道,只要用戶輸入的數字a和計算機隨機生成的數字不相等,循環就應該繼續執行下去,所以a與隨機數相等就是循環的停止條件。
補充:每次使用rand()函數就得到一個隨機的整數。計算機隨機生成的數一般都比較大,為了獲取兩位整數,可以將數據在輸出的時候對100取余。a%n(得到的結果是0~n-1)
printf("猜數字游戲(1-100)開始!\n");while (1) {printf("請輸入你的猜測:");scanf("%d", &guess);attempts++;if (guess > target) {printf("太大了!\n");} else if (guess < target) {printf("太小了!\n");} else {printf("恭喜你猜中了!數字是 %d。\n", target);printf("你一共猜了 %d 次。\n", attempts);break;}
}return 0;
4. 示例2-整數逆序
基本的方法:先對10取余,得到個位數,再除以10,去掉個位數;按此方法,再得到十位數、百位數……
(1)要在寫程序之前就確定好需要哪些變量;
(2)不同的題目有不一樣的要求,700對應的是007還是7,其表達的意思都是不一樣的,但是前者就算使用printf(不換行)也是可以做到的;后者有個十百千……位具體的要求,需要乘以相應的倍數。
#include <stdio.h>int main() {//不保留前導零,計算數值int num, reversed = 0;printf("請輸入一個最多三位數的整數:");scanf("%d", &num);// 使用 while 循環計算逆序while (num > 0) {reversed = reversed * 10 + num % 10;num /= 10;}printf("逆序結果:%d\n", reversed);return 0;
}輸出:
輸入:700
輸出:7 // 因為 007 和 7 數值相同
二、for循環
for(初始動作(1);條件(2);每輪的動作(3))
{//語句塊(4)
}
1. 在條件為真的情況下,執行的順序是(1)-(2)-(4)-(3);如果不滿足條件(2),就直接停止;如果滿足條件(2),則一定會執行(4)、(3)?
2.?(1)和(3)可以分別放到for語句的前后,在括號中省略,此時相當于while語句。
初始動作(1)for( ;條件(2); )
{//語句塊(4)
}每輪的動作(3)
理解:for循環就像一個計數循環:設定一個計數器,初始化,然后在計數器達到某值之前,重復執行循環體,而每執行一輪循環,計數器值以一定的步進進行調整:++或者--
3. 注意事項
(1)求和的程序初始值設為0;求積的程序初始值設為1。
(2)循環控制變量只在循環里面被用到了,在循環外面是無法訪問的,因此可以把該變量的定義直接寫在for語句中去。
(3)通過控制for語句后面的條件,可以控制語句能否進入到循環中,進而簡化運算。比如說for(int i = 1;i<=i,i*i),這個語句就根本沒有意義,就可以改變判斷條件,讓過程跳過該語句。
4. 循環的選擇
(1)次數:i=0;i<5;i++ ? 相當于 ?i=1;i<=5;i++ ?初始值和條件判斷是互相關聯的!!
(2)選擇方法
????????a)如果有固定的次數——for
b)如果無論如何必須要執行一次——do-while
c)其他情況——while
三、循環嵌套
1. 嵌套的循環
(1)外層循環控制行數,內層循環實行具體的語句(計算、空格…)
注意:
(1)每一層循環里面的計數變量應該是有區別的
(2)注意在for循環里面聲明的變量,不一定非要出現在條件語句里面,只要能夠控制循環的結束即可
(2)具體案例(右側圖案)
#include <stdio.h>int main() {int rows = 4; // 金字塔的行數for (int i = 0; i < rows; i++) {// 打印前導空格(用于居中)for (int space = 0; space < rows - i - 1; space++) {printf(" ");}// 打印左半部分(遞減字母)for (int j = i; j >= 0; j--) {printf("%c ", 'A' + j);}// 打印右半部分(遞增字母,從第二個字母開始)for (int j = 1; j <= i; j++) {printf("%c ", 'A' + j);}printf("\n");}return 0;
}輸出:A B A B C B A B C
D C B A B C D
(3)提高程序效率的方法
????????a)在滿足題目條件的情況下,在for循環中,用“break”提前結束程序的循環部分;
b)利用if語句的特點,用0和非0來標志是否進入循環以及“返回值”。
2. 跳出嵌套訓循環
案例-湊硬幣:如何用1/2/5角的硬幣湊出10元以下的金額?
(1)接力break(傳統教材方式):因為break和continue只能控制最近的循環,所以單純地把break放在想要結束的語句后面是行不通的。故同樣需要一個變量來記錄語句的成功和失敗。1表示成功;0表示失敗。在判斷語句中給變量重新賦值,之后想要結束循環的時候就可以直接“if(exit==1) break;”
(2)“goto語句”:離開所有的循環!!跳到最外面去!!最好只是在有多重嵌套的環境下使用。很多人認為這個“goto”破壞了程序的結構性!!
四、其他“碎碎念”
- 進入循環之前盡可能的保留一份原有數據,輸出的時候可能會用到(新定義一個變量用于存儲);
- 循環條件決定了能不能進入循環體 : x>2?x>=2?
- 預先設定的用于計數的變量和循環進入的條件是互相影響的,要考慮能不能進,計數次數是多了還是少了,要實踐。剛開始的時候可以用表格/手寫的方式分析;
- 自加、自減,要注意放在語句中的位置!(會影響循環的開始和結束)
- 循環控制
- break:跳出最近的循環
- continue:跳過最近的循環內部剩余的語句,到達該次循環的最后,再進入下一輪的循環(或者開始外部代碼)!
6. 不借用第三個變量實現數值交換
//用其中一個變量保存和,可以作差互相計算int i=3;j=5;j=i+j; //j=3+5=8
i=j-i; //i=8-3=5
j=j-i; //j=8-5=3
寫在最后:
更新C語言學習筆記
如有錯誤,煩請多多批評指正!