C语言程序流程设计之循环【程序流程设计】(13)
- 循環
- 循環三要素
- 死循環
- 可控循環
- 可控循環的三要素
 
- while “當”型循環
- 語法結構及流程
- 解析
- 代碼演示
 
- do while“直到”型循環
- 語法及流程
- 解析
- 代碼演示
 
- while/do while 綜合案例
- do while 代碼演示
- while 代碼演示
 
- do while 的爭議
- for “列表”型循環
- 語法結構及流程
- 解析
- 代碼演示
- for(;;)是 for 嗎?
- for 與逗號表達式
 
- 循環的嵌套
- 嵌套的語法格式
- 循環嵌套while 版
- 循環嵌套do while 版
- 循環嵌套for 版
 
- 循環建議
- 先外后內的循環嵌套寫法
- 半開半閉區間寫法
 
- 嵌套的優化
- 循環小結
循環
需要多次重復執行一個或多個任務的問題考慮使用循環來解決。
 
三大循環樣式不一樣,但是本質是一樣的。
循環三要素
死循環
#include <stdio.h> #include <windows.h> int main() {while (1) {printf("xxxxxxxxxxxxx\n");Sleep(1000);}return 0; }運行結果為:
可控循環
#include <stdio.h> #include <windows.h> int main() {int i = 10; //循環變量初始化while (i > 0) //循環終止條件{printf("xxxxxxxxxx\n");Sleep(1000);i--; //有使循環趨于結束的語句}return 0; }運行結果為:
打印十次之后就會跳出循環。
可控循環的三要素
循環三要素:
 循環變量初始化, 循環變量的變化(趨向終止條件), 循環終止條件。
 要做到可控三個條件缺一不可。
while “當”型循環
只有條件為真,才可能向下執行。有可能一次都不執行
語法結構及流程
while (表達式) { 語句; }解析
計算表達式的值,當值為真(非 0)時,執行循環體語句,一旦條件為假,就停止執行循環體。如果條件在開始時就為假,那么不執行循環體語句直接退出循環。
代碼演示
用 while 語句求 1~100 所有整數的和。
 #include <stdio.h>
 int main(void)
 {
 int i; int sum = 0;
 i = 0;
 while (i <= 100)
 {
 sum += i;
 i++;
 }
 printf(“sum = %d\n”, sum);
 return 0;
 }
 運行結果為:
do while“直到”型循環
直到條件為假,才終止循環。
 do while循環至少執行一次。
語法及流程
do {語句; } while (表達式) ;解析
它先執行循環體中的語句,然后再判斷條件是否為真,如果為真則繼續循環;如果為假,則終止循環。
代碼演示
用 do-while 語句求 1~100 所有整數的和。
#include <stdio.h> int main(void) {int i; int sum = 0;i = 0;do{sum += i;i++;} while (i <= 100);printf("sum = %d\n", sum);return 0; }運行結果為:
 
while/do while 綜合案例
while 與 dowhile 的區別
 如下代碼,表示求和,求輸入 1 和 11 的比較。
do while 代碼演示
#include <stdio.h> int main() {int sum = 0;int i;scanf_s("%d", &i);do{sum += i;i++;} while (i <= 10);printf("sum= %d\n", sum);return 0; }運行結果為:
while 代碼演示
#include <stdio.h> int main() {int sum = 0;int i;scanf_s("%d", &i);while (i <= 10){sum += i;i++;}printf("sum= %d\n", sum);return 0; }運行結果為:
 
結論是,當輸入 1 時兩個運算的求和,是相等的,但是當輸入 11 是,while 版本輸出的 sum = 0。而 do while 版本輸出的則是 11。
所以,do while 至少執行一次,而 while 可能一次都不執行。
do while 的爭議
do while 特點是,循環體至少執行一次,這個是比較可怕的。在沒有收到任何限制條件的情況下,就開始執行循環體。很可能會帶來不可挽回的后果。比如,先格式化了你的 c 盤,然后再來問要不要格式化。
do while 曾一度提議廢除,但是他在輸入性檢查方面還是有點用的。比如,輸入 Y/y 設置標志位,退出,執行標志位操作,輸入 N/n 直接退出,輸入其它,循環輸入。
代碼演示:
#include <stdio.h> int main(void) {char select;do{printf("同意協議請輸入 y/Y,不同意請輸入n/N\n");scanf_s("%c", &select);getchar();if (select == 'n' || select == 'N')exit(-1);} while (!(select == 'y' || select == 'Y'));printf("next\n");return 0; }運行結果為:
只有輸入y/Y,n/N才向下執行,否則繼續循環
#include <stdio.h> int main() {int name;int passwd;do{printf("name:");scanf_s("%d", &name);printf("passwd:");scanf_s("%d", &passwd);} while (!(name == 10 && passwd == 20));printf("wellcome\n");return 0; }運行結果為:
直到輸入合適的用戶名和密碼才能夠進行下一步操作。
for “列表”型循環
語法結構及流程
for( 表達式 1 ; 表達式 2 ; 表達式 3 ){語句;}解析
1 、計算表達式 1 的值,通常為循環變量賦初值。
2 、計算表達式 2 ,的值,即判斷循環條件是否為真,若值為真則執行循環體一次,
 否則跳出循環。
3 、計算表達式 3 的值,這里通常寫更新循環變量的賦值表達式,然后轉回第 2步重復執行。
代碼演示
用for循環求 1~100 所有整數的和。
#include <stdio.h> int main(void) {int i; int sum = 0;for (int i = 0; i <= 100; i++){sum += i;}printf("sum = %d\n", sum);return 0; }運行結果為:
 
for(;;)是 for 嗎?
上面for循環仍然成立,等價于while(1)。
 代碼演示:
運行結果為:
for 與逗號表達式
打印 10 的所有加法組和,格式如下:
 10 = 1 + 9;
 10 = 2 + 8;
 10 = 3 + 7;
 10 = 4 + 6;
 10 = 5 + 5;
 10 = 6 + 4;
 10 = 7 + 3;
 10 = 8 + 2;
 10 = 9 + 1;
代碼演示:
#include <stdio.h> int main(void) {int i; int j;for (i = 1, j = 10 - i; i < 10 && j>0; i++, j--){printf(" 10 = %d + %d\n", i, j);}return 0; }運行結果為:
 
循環的嵌套
一重循環解決線性的問題,而二重循環和三重循環就可以解決平面和立體的問題了。比如打印如下的圖形:
****** ****** ****** ****** **********嵌套的語法格式
三種語法格式,是一種 嵌套的結構, 不可以交叉。三者都可以實現上述的功能,但是比較傾向于使用第三種,為什么呢,因為第三種,循環的初始化不在循環體外,循環變量的改變不在循環體內。整體呈現會更清晰簡潔。
循環嵌套while 版
#include <stdio.h> int main(void) {int i = 0;while (i < 4){int j = 0;while (j < 6){printf("*");j++;}putchar(10);i++;}return 0; }運行結果為:
 
循環嵌套do while 版
#include <stdio.h> int main(void) {int i = 0;do {int j = 0;do{printf("*");j++;} while (j < 6);i++;putchar(10);} while (i < 4);return 0; }運行結果為:
 
循環嵌套for 版
#include <stdio.h> int main(void) {for (int i = 0; i < 4; i++){for (int j = 0; j < 6; j++){printf("*");}putchar(10);}return 0; }運行結果為:
 
循環建議
先外后內的循環嵌套寫法
循環的嵌套,先寫外重循環,外重循環的循環變量,可能作為內重循環的循環終止條件。
半開半閉區間寫法
建議 for 語句的循環控制變量的取值采用“半開半閉區間”寫法。 這樣的作法,跟后面的數組下標,是完全吻合的。但,這并非絕對。
循環變量屬于半開半閉區間
for ( x=0; x<N; x++){}循環變量屬于閉區間
for ( x=1; x<=N; x++){}嵌套的優化
在多重循環中,如果有可能,應當將最長的循環放在最內層,最短的循環放在最外層,以減少 CPU 跨切循環層的次數。
低效率:長循環在最外層
for (row=0; row<100; row++) {for ( col=0; col<5; col++ ){sum = sum + a[row][col];} }高效率:長循環在最內層
for (col=0; col<5; col++ ){for (row=0; row<100; row++){sum = sum + a[row][col];}}循環小結
一種循環可以解決的問題,使用另外兩種同樣可行,只是方便程度不同。
while 循環一般用于循環次數不定的情況,for 循環一般用于循環次數確定的情況(也可以用于循環次數不定的情況),do-while 循環一般用于至少需要執行一次的情況。
for 循環和 while 循環是先判斷條件是否為真,再執行循環體,因此,可出現循環一次也不執行的情況;do-while 循環是先執行循環體,再判斷條件是否為真,因此,循環體至少執行一次。
總結
以上是生活随笔為你收集整理的C语言程序流程设计之循环【程序流程设计】(13)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C语言程序流程设计之跳转【程序流程设计】
- 下一篇: 类型转换:隐式转化(算数转换,整型提升,
