直到型循環的實現
特點:先執行,后判斷,不管條件是否滿足,至少執行一次。
**代表:**do…while,goto(已經淘汰,不推薦使用)
do…while
語法:
循環變量;
do
{循環體;
}while(循環條件);
說明:
①循環條件
的返回值必須是邏輯值(0和非0(計算機返回1))
②{}
包起來的內容稱之為循環體
③我們要在循環體
中控制循環條件
的變換,否則會產生死循環。
流程圖
**特點:**先執行,后判斷,不管是否滿足條件,循環體語句至少執行一次
案例
-
需求:求1~100以內的偶數和
-
分析
- 創建一個變量,用來存儲sum,sum=0
- 創建一個循環變量,i=2
- 創建一個do.while循環,在循環體中,校驗i%2==0,如果滿足,就實現sum+=i
- 計算完成,在循環體的末行,對循環變量進行更新i++
- 限制循環的出口:i <= 100
- 限制循環的出口:i <= 100
- 循環結束,打印輸出sum的值
-
代碼
/*************************************************************************> File Name: demo06.c> Author: 小劉> Description: 用do..while..累加1~100中的偶數> Created Time: 2025年05月09日 星期五 14時30分41秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[]) {// 創建一個變量,存儲偶數和int i = 2;// 創建一個循環變量int sum = 0;// 創建一個循環,實現偶數和的計算do{// 校驗偶數if(i % 2 == 0)// 更新循環變量,逼近出口sum += i;i ++;}while(i <= 100);// 打印輸出sumprintf("1~100以內的偶數和是%d\n",sum);return 0; }
案例:
- 需求:用C語言編寫簡單猜數字游戲代碼。游戲規則是程序隨機生成一個1到100之間的數字,玩家通過輸入猜測數字,程序會提示猜測是太大還是太小,直到玩家猜中為止。
- 代碼:
/*************************************************************************> File Name: demo07.c> Author: 小劉> Description: > Created Time: 2025年05月09日 星期五 14時39分37秒************************************************************************/#include <stdio.h>
#include <stdlib.h>//
#include <time.h>//隨機種子int main(int argc,char *argv[])
{int guess;int number ;int count = 0;srand(time(NULL));number = rand() % 100;printf("--------------------------\n");printf("-----猜數字小游戲---------\n");printf("--------------------------\n");printf("我已經想了0~99之間的數字,你猜猜是多少");do{printf("請輸入你猜的數字:\n");int result = scanf("%d",&guess);if(result != 1){while(getchar() != '\n');printf("請輸入數字!\n");continue;}count ++;if(guess > number)printf("太大了,再猜一次。\n");else if(guess < number)printf("太小了,在猜一次");else{printf("恭喜你,猜對了!\n");printf("你一共猜了%d次。\n",count);}}while(guess != number);return 0;
}
運行結果:
goto
語法:
goto 標簽(labe1)
標簽:標明目標代碼的位置,是一個不加 ""
的字符串。
案例:
- 需求:1~100以內的偶數和
- 代碼:
#include <stdio.h>
int main(int argc,char *argv[])
{//創建一個變量,用來存放偶數和int sum = 0;//創建一個循環變量int i = 2;//定義goto標簽,名字自己取,符合標識符命名即可loop://過濾偶數if (i % 2 == 0) sum += i; // 偶數和計算i++;//更新循環變量//循環條件if (i <= 100)gotoloop;//標簽loop由goto觸發printf("1~100以內的偶數和是%d\n",sum);return 0;
}
-
注意事項
1.可讀性:
goto
語句會破壞代碼的結構和可讀性,使得代碼難以理解和維護。因此,應盡量避免使用。2.替代方案:大多數情況下,可以使用循環、條件語句、函數等結構來替代
goto
語句,使代碼更加清晰和易于管理。3.嵌套限制:雖然
goto
語句可以跨函數跳轉(即跳轉到另一個函數中的標簽),但這種用法是不合法的,并且會導致編譯錯誤。goto
語句只能在同一函數內部跳轉。4.錯誤處理:在某些情況下,
goto
語句可以用于錯誤處理,例如從嵌套的多層循環中跳出。但即使在這種情況下,也應謹慎使用,并考慮是否有更好的替代方案。
總結
雖然goto
語句在C語言中是合法的,并且有時可能看起來很方便,但過度使用或不當使用會導致代碼質量下降。因此,建議盡量避免使用goto
語句,而是采用更結構化和可維護的編程方法。
循環化的嵌套
3種循環(while、for、do.while)可以相互嵌套的。在前一個循環結構中又嵌套一個循環結構。例如:
案例:
-
需求:九九乘法表
-
分析:
-
我們發現九九乘法表整體其實就是一個9行的直角三角形、
-
同時發現:每一行顯示的列數最多不超過行,第1行1列,第2行2列…第9行9列
假定:行用i表示,列用j表示,i和j的關系:j<=i
-
-
在實現的時候,我們發現需要同時控制行和列的變化,在編程中,行列式需要通過for雙層嵌套實現(雙重for循環)
-
代碼:
/*************************************************************************> File Name: demo09.c> Author: l小劉> Description: 求100~200之間的素數> Created Time: 2025年05月09日 星期五 15時57分37秒************************************************************************/#include <stdio.h>int main(int argc,char *argv[])
{int num = 100;int i=2;while(num <= 200){for (i = 2;i < num / 2;i ++){if(num % i == 0){break;}}printf("%d\n",num);num += 1;}return 0;
}
- 運行結果:
案例:
- 需求:
循環結構的典型應用場景
- 求累和:舉例:
1+2+3..+100的和,sum = 0
- 求累積:舉例:
1*2*3..*100的積,result = 1
- 求均值:舉例:
(1+2+3...+100)/100的值
- 求極值:舉例:
12,34,56,67中的最大值、最小值
- 元素遍歷:常用于數組元素的遍歷。
- …
基礎算法模型
1.累加和
- 定義一個變量(sum),并賦初值為0;
- 該變量累加(+=)每一個數據項(i);
- 當訪問完每一個數據項,此時該變量的取值就是累加和的結果。
- 累乘
- 定義一個變量,并賦初值為1;
- 用該變量累乘(*=)每一個數據項;
- 當訪問完每一個數據項,此時該變量的取值就是累乘的結果。
3.極值(多應用于數組)
- 定義一個變量,并賦初值為第一個數據項;
- 從第二個數據項開始,依次于該變量進行比較,如果大于/小于該變量,則將當前數據項的 數據賦值給該變量。
- 當訪問完每一個數據項,此時該變量的取值就是求極值的結果。