目錄
3.3 do...while()回圈
3.3.1 do陳述句的語法:
3.3.2 執行流程
3.3.3 do陳述句的特點
3.3.4 do while回圈中的break和continue
3.4 練習
3.4.1. 計算 n的階乘,
3.4.2. 計算 1!+2!+3!+……+10!
3.4.3. 在一個有序陣列中查找具體的某個數字n,
3.4.4. 撰寫代碼,演示多個字符從兩端移動,向中間匯聚,
3.4.5. 撰寫代碼實作,模擬用戶登錄情景,并且只能登錄三次,(只允許輸入三次密碼,如果密碼正確則 提示登錄成,如果三次均輸入錯誤,則退出程式,
3.4.6.猜數字游戲實作
4.goto陳述句
一個關機程式
3.3 do...while()回圈
3.3.1 do陳述句的語法:
do
回圈陳述句;
while(運算式);
3.3.2 執行流程
3.3.3 do陳述句的特點
回圈至少執行一次,使用的場景有限,所以不是經常使用,一般常常用在某些專案或者游戲的開始界面,因為無論用戶做出怎樣的選擇,選單或者游戲的開始頁面至少會顯示一次,
下面代碼給大家展示一下:
#include <stdio.h> int main() { int i = 10; do { printf("%d\n", i); } while (i < 10); return 0; }
3.3.4 do while回圈中的break和continue
break:同while與for回圈,執行break后直接跳出回圈,下面給大家代碼展示一下:
#include <stdio.h> int main() { int i = 0; do { if (5 == i) break; printf("%d\n", i); i++; } while (i < 10); return 0; }
在i = 0 到4 的時候程式正常執行,當i = 5的時候,執行break陳述句回圈退出結束,因此在螢屏上值列印了0 1 2 3 4,
continue:當do while回圈體陳述句中遇到continue之后,就會跳轉到條件判斷陳述句,
#include <stdio.h> int main() { int i = 0; do { if (5 == i) continue; printf("%d\n", i); i++; } while (i < 10); return 0; }
程式在i=5的時候if條件判定成立,執行continue陳述句,跳轉到條件判定陳述句while(i<10)成立,陷入了死回圈,此時i的值始終為5,
3.4 練習
3.4.1. 計算 n的階乘,
#include<stdio.h> int main() { int n = 0; int i = 1; int ret = 1;//ret用來存放階乘的結果 scanf("%d", &n); for (i = 1; i <= n; i++) { ret *= i; } printf("%d", ret); return 0; }
通過for回圈即可實作求階乘,
3.4.2. 計算 1!+2!+3!+……+10!
#include<stdio.h> int main() { int n = 10; int i = 1; int ret = 1;//ret用來存放階乘的結果 int sum = 0; for (i = 1; i <= n; i++) { ret *= i; sum += ret; } printf("%d", sum); return 0; }
求階乘的和時,此處用了一個比較巧妙的方法,即n的階乘等于(n-1)的階乘再乘n即可得出,當然,也可以用其它的方法,此處需要注意的是,如果用兩個for回圈求的話不要忘記ret的初始化!
3.4.3. 在一個有序陣列中查找具體的某個數字n,
#include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int left = 0; int right = sizeof(arr) / sizeof(arr[0]) - 1; int key = 7; int mid = 0; while (left <= right) { mid = (left + right) / 2; if (arr[mid] > key) { right = mid - 1; } else if (arr[mid] < key) { left = mid + 1; } else break; } if (left <= right) printf("找到了,下標是%d\n", mid); else printf("找不到\n"); }
二分查找法主要是弄明白原理,只要原理弄清楚了就能很容易的寫出代碼,其原理為:定義首元素下標記為left,尾元素下標記為right,中間元素下標記為mid,拿我們向要查找的元素即mid下標對應的元素進行比較,如果比中間元素小,就將mid元素的前一個元素的下標記為right,反之,就將mid的后一個元素的下標記為left,重復這個程序即可,即構成一個回圈,另外,需要記住這個回圈終止的條件,當left>right時就表明中間已經沒有中間元素供我們進行查找,在退出回圈之后,如果left仍然小于right,就說明已經找到了我們想要查找的元素,即mid下標所對應的元素,mid即為其對應的下標,
3.4.4. 撰寫代碼,演示多個字符從兩端移動,向中間匯聚,
#include <stdio.h> #include<string.h> #include<windows.h> int main() { char arr1[] = "welcome to bit"; char arr2[] = "##############"; int left = 0; int right = strlen(arr1) - 1; printf("%s\n", arr2); //while回圈實作 while (left <= right) { Sleep(1000); arr2[left] = arr1[left]; arr2[right] = arr1[right]; left++; right--; printf("%s\n", arr2); } return 0; }
這段代碼并不復雜,就是將我們給出的字串的左右元素逐個賦值到新建的字串中即可,同樣的,需要注意的是回圈終止的條件,因為每次賦值完后,left下標+1,right下標-1,當left下標大于right下標即停止,此時中間已經沒有元素了,就無法從兩端向中間移動了,
3.4.5. 撰寫代碼實作,模擬用戶登錄情景,并且只能登錄三次,(只允許輸入三次密碼,如果密碼正確則 提示登錄成,如果三次均輸入錯誤,則退出程式,
#include<stdio.h> #include<string.h> int main() { char psw[10] = ""; int i = 0; int j = 0; for (i = 0; i < 3; ++i) { printf("please input:"); scanf("%s", psw); if (strcmp(psw, "password") == 0) break; } if (i == 3) printf("exit\n"); else printf("log in\n"); }
這個題中需要注意的是兩個字串不能直接進行比較,只能利用string.h庫函式中的strcmp()進行比較,當兩個字串的每一個元素都相等的時候,給函式的回傳值為0,即可進行判斷,
3.4.6.猜數字游戲實作
#include <stdio.h> #include <stdlib.h> #include <time.h> void menu() { printf("**********************************\n"); printf("*********** 1.play **********\n"); printf("*********** 0.exit **********\n"); printf("**********************************\n"); } void game() { int random_num = rand() % 100 + 1; int input = 0; while (1) { printf("請輸入猜的數字>:"); scanf("%d", &input); if (input > random_num) { printf("猜大了\n"); } else if (input < random_num) { printf("猜小了\n"); } else { printf("恭喜你,猜對了\n"); break; } } } int main() { int input = 0; srand((unsigned)time(NULL)); do { menu(); printf("請選擇>:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 0: break; default: printf("選擇錯誤,請重新輸入!\n"); break; } } while (input); return 0; }
猜數字游戲并不復雜,但運用了函式模塊化的思想,其中生成亂數用到了rand()函式和時間戳進行搭配,需要注意的是,時間戳只需要在主函式中宣告或者運行一次即可,不需要在每次生成亂數時都進行宣告,
4.goto陳述句
C語言中提供了可以隨意濫用的 goto陳述句和標記跳轉的標號,
從理論上 goto陳述句是沒有必要的,實踐中沒有goto陳述句也可以很容易的寫出代碼, 但是某些場合下goto陳述句還是用得著的,最常見的用法就是終止程式在某些深度嵌套的結構的處理程序,
例如:一次跳出兩層或多層回圈, 多層回圈這種情況使用break是達不到目的的,它只能從最內層回圈退出到上一層的回圈,當然,利用多個break也可以跳出回圈,不過要加很多條件進行限制,代碼會變得過于冗長,且容易出錯,
goto語言真正適合的場景如下:
for (...) { for (...) { if (disaster) goto error; } } error : if (disaster) //處理錯誤情況
下面是使用goto陳述句的一個例子,然后使用回圈的實作方式替換goto陳述句:
一個關機程式
#include <stdio.h> int main() { char input[10] = { 0 }; system("shutdown -s -t 60"); again: printf("電腦將在1分鐘內關機,如果輸入:我是豬,就取消關機!\n請輸入:>"); scanf("%s", input); if (0 == strcmp(input, "我是豬")) { system("shutdown -a"); } else { goto again; } return 0; }
而如果不想用goto陳述句,則可以使用回圈:
#include <stdio.h> #include <stdlib.h> int main() { char input[10] = { 0 }; system("shutdown -s -t 60"); while (1) { printf("電腦將在1分鐘內關機,如果輸入:我是豬,就取消關機!\n請輸入:>"); scanf("%s", input); if (0 == strcmp(input, "我是豬")) { system("shutdown -a"); break; } } return 0; }
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/357209.html
標籤:其他
上一篇:C語言代碼 模塊化實作三子棋




