<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
do語句的語法
do
迴圈語句;
while(表示式);
此處的迴圈語句可能不是一條語句,而是一段程式碼。
範例:利用do while迴圈實現列印1-10
#include <stdio.h> int main() { int i = 1; do { printf("%d ",i); i++; } while (i <= 10); return 0; }
列印結果為:1 2 3 4 5 6 7 8 9 10
執行流程:
#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語句的特點:迴圈至少執行一次,使用的場景有限,所以不是經常使用。
利用迴圈語句(while、for、do while)來完成下面的練習。
/練習一:計算n的階乘//
自己寫的程式碼如下:
利用for迴圈語句:
n這個數位自己來鍵入,從1開始作乘法,每次乘的數加一,直到乘到鍵入的數位n為止,列印此時的mux值。
int main() { int n = 0; int i = 0; int mux = 1; scanf("%d",&n); for (i = 1; i<n; i++) { mux *= (i + 1); } printf("mux = %d ",mux); return 0; }
執行結果如下:
比如5!=1x2x3x4x5=120,測試結果正確。
5
mux = 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!的值來測試一下
//其實是迴圈巢狀 int main() { int m = 0; int i = 0; int mux = 1; int sum = 0; for (m = 1; m < 5; m++) { for (i = 1; i <= m; i++) { mux *= i ; } //printf("mux = %dn",mux); sum += mux; } printf("sum = %d",sum); return 0; }
執行結果為303
如何修正程式呢?在每一次求階乘之前,都應該將mux的值置為1.
mux = 1;//在第二個for語句上面加上這條語句 //意思是在每一次求階乘之前,讓mux的初始值為1
這樣程式就可以執行成功,結果為33。
但是上述程式碼的效率不太高,每一次計算階乘都是從1x1!,1x2!(都是從1開始乘,直到乘到m)等開始一步一步算,但是我們知道,2!=2x1!,3!=3x2!…,所以有:
//相對於上一段程式碼,這段程式碼更高效。 int main() { int i = 0; int mux = 1; int sum = 0; for (i = 1; i <= 3; i++) { mux *= i ; sum += mux; } printf("sum = %d",sum); return 0; }
/ 練習三:在一個有序陣列中查詢具體的某個數位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次。
這種方法就在於不斷更新查詢範圍的左值和右值。
int main() { int arr[] = {1,2,3,4,5,6,7,8,9,10}; int k = 7;//要查詢的數位 //在arr這個有序陣列中查詢k的值 int sz = sizeof(arr) / sizeof(arr[0]);//求出陣列的元素個數以此來確定查詢範圍的下標右值 int left = 0; int right = sz - 1; int mid; while (left <= right) { int mid = (left + right) / 2;//第一次進來的時候,陣列元素中間值是arr[4] if (arr[mid] < k) { left = mid + 1;//範圍捨去左邊一半,從arr[5]開始 } else if (arr[mid] > k) { right = mid - 1;//範圍捨去右半邊,到arr[3]結束 } else { printf("找到了,下標為:%dn",mid); break;//找到元素之後就跳出迴圈 } } if (left > right) { printf("找不到n"); } return 0; }
執行結果為:
找到了,下標為:6
如果將k值改為17,再次執行程式,執行結果為“找不到”
//練習四:編寫程式碼,展示多個字元從兩端移動,向中間匯聚
方法就是先設定一個和想要列印的字串等長的字串陣列,全部寫為*,然後用想要列印的字串裡面的字元去逐步替換陣列2中的*,直到全部完整地將陣列1列印出來為止。在這個過程中,左邊的下標作加一操作,右邊的下標作減一操作,就實現了從兩端向中間移動的這個功能。
//比如列印 welcome to xi'an!!! // ******************* // 每一次列印的時候都放進去一對字元替換掉** //第一次列印:w************! //第二次列印:we**********!! #include <string.h> #include <stdio.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("%sn",arr2); left++; right--; } return 0; }
執行結果如下:
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("%sn",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")//這樣的寫法是錯誤的,兩個字串比較不能使用==來比較 //應該使用字串函數strcmp if(strcmp(arr,"2022")==0) { printf("密碼正確n"); printf("進入系統"); break; } else { printf("密碼錯誤n"); } } if (m == 3) { printf("退出系統n"); } return 0; }
執行結果如下:
請輸入密碼:2022
密碼正確
進入系統
請輸入密碼:20201
密碼錯誤
請輸入密碼:124r
密碼錯誤
請輸入密碼:12345
密碼錯誤
退出系統
寫一個猜數位遊戲,這個遊戲會
自動產生一個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-100 printf("%dn", 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語言範例講解do while迴圈語句的用法的文章就介紹到這了,更多相關C語言do while迴圈內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45