c语言---15 循环语句do while()
1、do while()循環-------先執行后判斷
do語句的語法
do循環語句; while(表達式);此處的循環語句可能不是一條語句,而是一段代碼。
示例:利用do while循環實現打印1-10
打印結果為:1 2 3 4 5 6 7 8 9 10
執行流程:
2、do while中的break以及continue
#include <stdio.h> int main() {int i = 1;do{if (i == 5)break;printf("%d ",i);i++;} while (i <= 10);return 0; }打印結果為:1 2 3 4
將代碼中的break換成continue的時候,查看運行結果,可以看到:1 2 3 4 _(4后面的光標持續閃爍),因為它會跳過continue后面的部分,直接來到while中的判斷部分,判斷是否<=10,滿足條件,又返回回去執行do語句,但是它等于5,就會又跳過continue后面的語句,又去判斷while里面的條件是否滿足,滿足就又進去do語句,等于5跳過continue后面的語句,如此循環往復,所以會出現光標閃爍的情況。
do語句的特點:循環至少執行一次,使用的場景有限,所以不是經常使用。
3、練習
利用循環語句(while、for、do while)來完成下面的練習。
/練習一:計算n的階乘//
自己寫的代碼如下:
利用for循環語句:
n這個數字自己來鍵入,從1開始作乘法,每次乘的數加一,直到乘到鍵入的數字n為止,打印此時的mux值。
運行結果如下:
比如5!=1x2x3x4x5=120,測試結果正確。
利用while語句實現
int main() {int i = 0;int n = 0;int mux = 1;scanf("%d",&n);while (i < n){i++;mux *= i;}printf("mux=%d",mux);return 0; }測試運行結果:
8 mux=40320利用do while語句
int main() {int i = 0;scanf("%d", &i);int mux = i;do {mux *= (i-1);i--;if (i != 1)continue;printf("mux=%d ", mux);} while ((i -1) != 0);return 0; }測試結果如下:
6 mux=720//練習二:計算1!+2!+ …+10!///
這里的第一個for循環里面將條件設置為m<5,意思是求1!+2!+3!+4!的值來測試一下
運行結果為303
如何修正程序呢?在每一次求階乘之前,都應該將mux的值置為1.
這樣程序就可以運行成功,結果為33。
但是上述代碼的效率不太高,每一次計算階乘都是從1x1!,1x2!(都是從1開始乘,直到乘到m)等開始一步一步算,但是我們知道,2!=2x1!,3!=3x2!…,所以有:
/ 練習三:在一個有序數組中查找具體的某個數字n ///
編寫int binsearch(int x, int v[], int n);功能:在v[0]<=v[1]<=…<=v[n-1]的數組中查找x
題目的大意是:假如有一組數字[1 2 3 4 5 6 7 8 9 10],然后從這一組數字里面找出數字7.有個思路就是從頭到尾遍歷,直到找到為止。但是題目里面還有一個關鍵詞語“有序”,如果采用從前往后遍歷的方法程序處理效率就太低了。采用什么方法比較合理呢?采用二分查找比較高效一些。
第四步:這個范圍它的左下標是6,右下標也是6,左右下標的平均值還是6,所以由6所確定的下標對應的元素剛好是7,就是所要找的元素。如果這時候的數字“7”還不是我們要找的數字的時候,那在這個數組里就找不到要找的元素了。
按照這種尋找元素的辦法,最壞的情況下找了四次就找到了,而如果從前往后遍歷的話最壞的情況下需要找10次,可見折半查找(二分查找)的效率是很高的。它所需要的查找的次數為log2n次。
這種方法就在于不斷更新查找范圍的左值和右值。
運行結果為:
找到了,下標為:6如果將k值改為17,再次運行程序,運行結果為“找不到”
//練習四:編寫代碼,展示多個字符從兩端移動,向中間匯聚
方法就是先設置一個和想要打印的字符串等長的字符串數組,全部寫為*,然后用想要打印的字符串里面的字符去逐步替換數組2中的*,直到全部完整地將數組1打印出來為止。在這個過程中,左邊的下標作加一操作,右邊的下標作減一操作,就實現了從兩端向中間移動的這個功能。
運行結果如下:
w*****************! we***************!! wel*************!!! welc***********n!!! welco*********an!!! welcom*******'an!!! welcome*****i'an!!! welcome ***xi'an!!! welcome t* xi'an!!! welcome to xi'an!!!將代碼中加入睡眠命令以及清空屏幕命令,可以在運行結果窗口看到程序的“動態”執行效果。
#include <string.h> #include <stdio.h> #include <Windows.h> int main() {char arr1[] = "welcome to xi'an!!!";char arr2[] = "*******************";int left = 0;int right = strlen(arr1) - 1;while (left <= right) {arr2[left] = arr1[left];arr2[right] = arr1[right];printf("%s\n",arr2);Sleep(1000);//1000毫秒,也就是1秒,這樣我們就可以看到它逐步打印的過程了system("cls");//清空屏幕left++;right--;}return 0; }///練習五:編寫代碼實現模擬用戶登錄情景,并且只能登錄三次(只允許輸入3次密碼),如果密碼正確,則提示登錄成功,如果三次均輸入錯誤,則退出程序///
#include <string.h> #include <stdio.h> int main() {char arr[20] = { 0 };//假設正確的密碼是字符串“2022”,如何比較呢int m = 0;for (m = 0; m < 3; m++){printf("請輸入密碼:");scanf("%s", arr);//if (arr == "2022")//這樣的寫法是錯誤的,兩個字符串比較不能使用==來比較//應該使用字符串函數strcmpif(strcmp(arr,"2022")==0){printf("密碼正確\n");printf("進入系統");break;}else{printf("密碼錯誤\n");}}if (m == 3){printf("退出系統\n");}return 0; }運行結果如下:
請輸入密碼:2022 密碼正確 進入系統 請輸入密碼:20201 密碼錯誤 請輸入密碼:124r 密碼錯誤 請輸入密碼:12345 密碼錯誤 退出系統4、猜數字游戲
寫一個猜數字游戲,這個游戲會
- 自動產生一個1-100之間的隨機數
- 然后去猜一下這個數字
如果猜對了,就會輸出恭喜猜對了
猜錯了會告訴是猜大了還是小了,讓你繼續猜,直到才對為止 - 游戲可以一直玩,除非退出游戲
要解決這種問題,應該在調用rand函數之前調用srand函數,這樣一來再次運行程序的時候就發現第一次執行的隨機數字是365而不是41了,但是再多執行幾次,發現每次的值都是365,這就也不對了。
這就要求srand處的參數就是隨機的,是一直在發生變化的值,否則生成的隨機數也會是定值。時間是一直在發生變化的,就可以把時間放進srand函數里面,這個地方傳進去的實際上是時間戳。一番設置之后,發現雖然比較不一樣了,但是它們之間離得很近,甚至選擇的“1/0”數字太快的時候,它們甚至有可能生成的隨機值還是一樣的。因為srand確實應該在rand之前調用,但是隨機數起點的設置只需要調用一次就可以了,不用開始一次游戲game函數調用并設置一次。在整個工程里面設置一次就行了,把它放進主函數里面就行。
修正過的:(生成的數字很隨機了)srand((unsigned int)time(NULL));(放在main函數里面)
想要生成1-100之間的隨機數,可以將rand函數%100,0-32767的數字對100進行取余之后的結果是0-99,然后加一,范圍就是1-100了
int random = rand()%100 +1;//%100的余數是0-99,再+1就是1-100
來吧,展示。代碼如下:
#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <stdio.h> void menu() {printf("***********************\n");printf("***********************\n");printf("****** 1.play *******\n");printf("********0.exit*********\n");printf("***********************\n");printf("***********************\n"); }void game() {//猜數字游戲,將猜數字的功能封裝到這個game函數里面去//先生成隨機數,用rand函數,它需要的頭文件是stdlib.h//srand(100);//srand((unsigned int)time(NULL));//時間---時間戳,時間轉換出來的一個數字//(此時的時間相較于計算機的起始時間之間的差值,換算成以秒為單位的數字)//用time函數(需要包含頭文件time.h)來獲取時間戳,time函數的返回類型是time_t,而time_t是64位的整型//srand需要的是unsigned int 類型,那就將time的類型強制轉換一下//int random = rand();//查詢資料,可以發現rand函數返回了一個0-32767之間的數字//但是這個數字不夠隨機 要在調用rand之前使用srand功能去設置隨機數的生成器int random = rand() % 100 + 1;//%100的余數是0-99,再+1就是1-100printf("%d\n", random);int guess = 0;while (1){printf("猜數字:");scanf("%d", &guess);if (guess < random){printf("猜小了\n");}else if (guess > random){printf("猜大了\n");}else{printf("猜對了,恭喜\n");break;}} } int main() {int input = 0;srand((unsigned int)time(NULL));do{menu();//打印菜單printf("請選擇:");scanf("%d", &input);switch (input){case 1://printf("猜數字\n");game();break;case 0:printf("退出游戲");break;default:printf("輸入錯誤,請重新選擇");break;}} while (input);return 0; }運行結果如下:
總結
以上是生活随笔為你收集整理的c语言---15 循环语句do while()的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: es入门 和 dsl语法部分讲解
- 下一篇: Hive正则表达式regexp_repl