第2章-分支語句和迴圈語句
阿新 • • 發佈:2021-11-11
C語言是結構化的程式設計
順序結構 —— 選擇結構 (分支語句 if、switch)—— 迴圈結構(迴圈語句 while、
for、do while)
一、語句
C語言中由一個分號(;)隔開就是一條語句。
二、分支語句(選擇結構)
1. if語句
注、C語言是如何表示真和假的?
非0就是真,0就是假
(1)語法形式
Ⅰ 型別1
if(表示式) 語句;
#include<stdio.h> int main() { int age =20; if (age < 16) printf("未成年\n"); return 0; }
Ⅱ 型別2——雙分支
if(表示式) 語句1; else 語句2;
#include<stdio.h> int main() { int age = 20; if (age < 18) printf("未成年\n"); else printf("成年\n"); return 0; }
Ⅲ 型別3——多分支語句
if(表示式1) 語句1; else if(表示式2) 語句2; else 語句3;
#include<stdio.h> int main() { intage = 20; if (age < 18) printf("未成年\n"); else { if (age >= 18 && age < 25)//(18<=age<28)錯誤 //&& -- 邏輯與 // a&&b,a和b都為真時 式子才返回true,否則就返回false printf("青年\n"); else if (age >= 28 && age < 50) printf("壯年\n"); else (age >= 50) printf("老年\n"); } return 0; }
#include<stdio.h> int main() { int age = 20; if (age < 18) printf("未成年\n"); else if (age >= 18 && age < 25)//(18<=age<28)錯誤 printf("青年\n"); else if (age >= 28 && age < 50) printf("壯年\n"); else (age >= 50) printf("老年\n"); return 0; }
注:程式碼塊,執行多條語句,使用{ }將語句組成一個整體
(2)懸空else
#include<stdio.h> int main() { int a = 0; int b = 0; if (a == 1)//a=0,未進去,後面不存在 if (b == 2) printf("hehe\n");//不列印 else//與最近的未匹配的if匹配 printf("haha\n");//不列印 return 0; }
修改後
#include <stdio.h> int main() { int a = 0; int b = 2; if(a == 1) { if(b == 2) { printf("hehe\n"); } } else { printf("haha\n"); } return 0; }
(3)if書寫形式的對比
//程式碼1 if (condition) { return x; } return y; //程式碼2 if(condition) { return x; } else { return y; } //本質一樣,程式碼2更容易理解
//程式碼1 int num = 1; if(num == 5) { printf("hehe\n"); } //程式碼2 int num = 1; if(5 == num) { printf("hehe\n"); } //程式碼2更好 //兩個整型變數比較 //常量放左邊 //更容易檢驗出是賦值還是比較
(4)練習
1. 判斷一個數是否為奇數
2. 輸出1-100之間的奇數
#include<stdio.h> int main() { //判斷一個數是否為奇數 //輸出1-100之間的奇數 int i = 1; for (i=1; i<= 100;i++) { if (i % 2 == 1) printf("%d,", i); i++; } return 0; }
//while語句 #include<stdio.h> int main() { int i = 1; while (i <= 100) { if (i % 2 == 1) printf("%d,", i); i++; } return 0; }
2.switch語句
switch語句,用於多分支
(1)語法形式
switch(整型表示式) { 語句項; }
//語句項 //是一些case語句: case 整形常量表達式: 語句;
例
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int day = 0; scanf("%d", &day);//2 switch(day) { case 1: printf("星期一\n"); break; case 2://從這裡進,入口 printf("星期二\n"); break;//跳出,停止,出口 case 3: printf("星期三\n"); break; case 4: printf("星期四\n"); break; case 5: printf("星期五\n"); break; case 6: printf("星期六\n"); break; case 7: printf("星期天\n"); break; } return 0; }
注:break語句,是把語句列表劃分為不同的分支部分
在最後一個 case 語句的後面加上一條 break語句,避免出現忘了新增 break語句。
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> //1. 輸入1-5,輸出的是“工作日y”; //2. 輸入6-7,輸出“休息日” int main() { int day = 0; scanf("%d", &day); switch(day) { case 1: case 2: case 3: case 4: case 5: printf("工作日\n"); break; case 6: case 7: printf("休息日\n"); break; } return 0; }
(2)default子句
對不匹配所有標籤的表示式的值,進行報錯
#include<stdio.h> int main() {switch (n) { case 1: ...... default: break; } return 0; }
(3)練習
#include<stdio.h> int main() { int n = 1; int m = 2; switch (n) { case 1: m++;//3 case 2: n++;//2 case 3: switch (n)//n=2 {//switch允許巢狀 case 1: n++; case 2: n++;//3 m++;//4 break; } case 4: m++;//5 break; default: break; } printf("m=%d,n=%d\n", m, n);//5,3 return 0; }
三、 迴圈語句
1. while迴圈
(1)語法形式
while(表示式)//表示式為真,迴圈語句執行 迴圈語句;
例、在螢幕上列印1-10的數字
#include<stdio.h> int main() { int i = 1; while (i<=10) { printf("%d",i); i++; } return 0; }
(2)break和continue
#include<stdio.h> int main() { int i = 1; while (i<=10) { if (i == 5) break;//在while中,break是終止,停止後期所有迴圈,直接終止迴圈 //continue;//continue是迴圈,終止本次迴圈,跳過後面程式碼,到判斷部分,進入下一次迴圈入口 printf("%d",i);//1234( break);1234,後面是死迴圈(continue) i++; } return 0; }
(3)練習
#include<stdio.h> int main() { int ch = 0; //getchar讀取一個從標準輸入(鍵盤)的字元,返回整型int(ASCII和-1) //正確讀取,返回ASCII,錯誤讀取,返回EOF //EOF-end of file檔案結束標誌,本質為-1 while ((ch = getchar()) != EOF) //getchar讀取的字元,放入ch //不等於(!=)EOF,輸出ch putchar(ch);//putchar--輸出一個字元 return 0;//就讀取結束,敲CTRL+Z }
輸入函式(例:getchar)和鍵盤之間存在一個緩衝區,從緩衝區獲取資料。
//問題程式碼 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char password[20] = { 0 }; printf("請輸入密碼:>"); scanf("%s", password);//輸入密碼,並存放在password陣列中 //緩衝區還剩餘一個“/n” printf("請確認(Y/N):>");//問題出在敲出密碼後,回車“\n”,ASCII為10,應該清除資料或者清空 int ret = getchar();//Y/N if (ret == 'Y') { printf("確認成功\n"); } else { printf("放棄確認\n"); } return 0; }
修改後
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { char password[20] = { 0 }; printf("請輸入密碼:>"); scanf("%s", password); //清除緩衝區 //新增getchar();可消除 getchar(); printf("請確認(Y/N):>"); int ret = getchar();//Y/N if (ret == 'Y') { printf("確認成功\n"); } else { printf("放棄確認\n"); } return 0; }
優化
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int ret = 0; char password[20] = { 0 }; printf("請輸入密碼:>"); scanf("%s", password); int ch = 0; //能夠消除緩衝區的多個字元"\n" while((ch=getchar())!='\n') { ; } printf("請確認(Y/N):>"); ret = getchar();//Y/N if (ret == 'Y') { printf("確認成功\n"); } else { printf("放棄確認\n"); } return 0; }
#include <stdio.h> int main() { char ch = '\0'; while ((ch = getchar()) != EOF) { if (ch < '0' || ch > '9') //只打印數字字元,跳過其他字元的 //輸入a,不列印 continue; putchar(ch); } return 0; }
2. for
//while 迴圈的缺點 //間距過長,容易失誤 #include<stdio.h> int main() { int i = 0;//初始化 while (i < 10)//判斷 { i++;//調整 } return 0; }
(1)語句形式
for(表示式1; 表示式2; 表示式3) 迴圈語句;
- 表示式1為初始化部分,用於初始化迴圈變數的。
- 表示式2為條件判斷部分,用於判斷迴圈時候終止。
- 表示式3為調整部分,用於迴圈條件的調整。
例:列印1-10的數字
#include<stdio.h> int main() { int i = 0; // 初始化 判斷 調整 for (i = 1; i <= 10; i++) { printf("%d", i); } return 0; }
(2)break和continue
#include <stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i == 5) break;//1234後,跳出迴圈 //continue;//1234後,跳到i++,即調整部分 printf("%d ", i);//1234(break);1 2 3 4 6 7 8 9 10(continue) } return 0; }
(3)迴圈控制變數
1.不可在for迴圈內修改迴圈表裡,防止for迴圈失去控制
#include<stdio.h> int main() { int i = 0; for (i = 1; i <= 10; i++) { if (i = 5)//這裡禁止修改 printf("%d", i); //i=5;//這裡禁止修改變數 //迴圈內部改變迴圈變數,會出現死迴圈 } return 0; }
2.建議for語句的迴圈控制變數的取值採用“前閉後開區間”寫法
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; ///前閉後開 for (i = 0; i < 10; i++) { printf("%d", arr[i]);//12345678910 } return 0; }
#include<stdio.h> int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; int i = 0; ///前閉後閉 for (i = 0; i <= 9; i++) { printf("%d", arr[i]);//12345678910 } return 0; }
更容易看出迴圈10次
(4)一些for迴圈的變種
#include<stdio.h> int main() { for (;;)//判斷省略,條件恆為真,造成死迴圈 { printf("hehe\n"); } return 0; }
#include<stdio.h> int main() { int i = 0; int j = 0; //這裡列印多少個hehe? //10*10個 for (i = 0; i < 10; i++) { printf("%d", i); int j = 0; for (j = 0; j < 10; j++) { printf("hehe\n"); } } return 0; }
#include<stdio.h> int main() { int i = 0; int j = 0; //這裡列印多少個hehe? //10個 //省略掉初始化部分 for (; i < 10; i++) { //int j = 0; for (; j < 10; j++) { printf("hehe\n"); } } return 0; }
#include<stdio.h> int main() { //使用多餘一個變數控制迴圈 //2個hehe int x, y; for (x = 0, y = 0; x < 2 && y < 5; ++x, y++) { printf("hehe\n");//hehe hehe } return 0; }
( 5)筆試題
//迴圈幾次 0次 #include<stdio.h> int main() { int i = 0; int k = 0; for (i = 0, k = 0; k = 0; i++, k++)//k=0,把0賦值給k,0為假 k++; return 0; }
3.do while()迴圈
(1)語句形式
do 迴圈語句; while(表示式);
例:列印1、2、3、4、5、6、7、8、9、10
#include <stdio.h> int main() { int i = 1; do { printf("%d", i);//12345678910 i++; } while (i <= 10); return 0; }
和while的區別:
- while先判斷在執行
- do while是先執行後判斷
(2)break和continue
#include <stdio.h> int main() { //1-10 int i = 1;//1、建立變數 do { if (i == 5) break;//1,2,3,4 //continue 1.2.3.4死迴圈,跳過後面程式碼 printf("%d\n", i);//3. i++;//4 } while (i <= 10);//2. return 0; }
4. 練習
1. 計算 n的階乘。
//計算階乘 //n!=1*2*...*(n-1)*n #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; scanf("%d", &n);//100 for (i = 1; i <= n; i++) { ret *= i; } printf("ret =%d\n", ret); return 0; }
2. 計算 1!+2!+3!+……+10!
//方法 1 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; //1+2+6=9 for (n = 1;n <= 3; n++) { ret = 1;//不賦值,會變 for (i = 1; i <= n; i++)//產生1-n的數 { ret = ret * i;//將i累乘賦值給ret } sum = sum + ret; } //ret=1*1 //ret=1*1*2 //ret=1*1*2*3 printf("sum=%d\n", sum); return 0; }
//方法2 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() { int i = 0; int n = 0; int ret = 1; int sum = 0; //1+2+6=9 for (n = 1; n <= 3; n++) { ret = ret * n; sum = sum + ret; } printf("sum=%d\n", sum); return 0; }
3. 在一個有序陣列中查詢具體的某個數字n。(講解二分查詢)
//查詢7 #include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k = 7; int i = 0; int sz = sizeof(arr) / sizeof(arr[0]);//求陣列長度 for (i = 0; i < sz; i++) { if (k == arr[i]) { printf("找到了,下標是:%d\n", i); break; } } if (i == sz) printf("找不到\n"); return 0; }
//二分法查詢演算法、折半查詢演算法——複雜度-log以2為底的n #include<stdio.h> int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int k =7; int sz = sizeof(arr) / sizeof(arr[0]);//計算元素個數 int left = 0;//左下標 int right = sz - 1;//右下標 int mid = (left + right) / 2; while (left<=right)//存在條件 { if (arr[mid] > k) { right = mid - 1; } if (arr[mid] < k) { left = mid + 1; } else { printf("找到了,下標是:%d\n", mid); break; } } return 0; }
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;//strlen求字串長度 //或者sizeof(arr1) / sizeof(arr1[0])-2 //arr[]="abc"; //[a b c \0] // 0 1 2 3 //4-2 while (left<=right) { arr2[left] = arr1[left]; arr2[right] = arr1[right]; printf("%s\n", arr2); Sleep(1000);//休息一秒 system("cls");//執行系統命令的一個函式-cls清空螢幕 left++; right--; } printf("%s\n", arr2); return 0; }
5. 編寫程式碼實現,模擬使用者登入情景,並且只能登入三次。(只允許輸入三次密碼,如果密碼正確則 提示登入成,如果三次均輸入錯誤,則退出程式
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> int main() { int i = 0; char password[20] = { 0 }; for (i = 0; i < 3; i++) { printf("請輸入密碼:>"); scanf("%s", password); if (strcmp(password , "123456")==0)//庫函式-strcmp //password大於字串,返回大於0的值 //password小於字串,返回小於0的值 //if (password == "123456") //==不能用來判斷兩個字串是否相等 { printf("登陸成功\n"); break; } else { printf( "密碼錯誤\n" ); } } if (i == 3) printf("三次密碼均錯誤,退出程式\n"); return 0; }
6.猜數字遊戲實現
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib.h>//rand #include <time.h>//time void menu()//列印選單函式,函式無返回值 { printf("**********************************\n"); printf("*********** 1.play **********\n"); printf("*********** 0.exit **********\n"); printf("**********************************\n"); } //RAND_MAX--rand函式能返回隨機數的最大值。 void game() { int random_num = rand() % 100 + 1; //rand產生一個0 - 0x7fff的隨機數,最大是32767 //生成1-100 int guess = 0; while (1) { printf("請輸入猜的數字>:"); scanf("%d", &guess); if (guess > random_num) { printf("猜大了\n"); } else if (guess < random_num) { printf("猜小了\n"); } else { printf("恭喜你,猜對了\n"); break; } } } int main() { int input = 0; srand((unsigned)time(NULL));//srand設定隨機起點 //新增隨機值,新增時間戳,設定隨機數生成起點 //使用time函式,NULL空指標 //unsigned整型無符號 do//do while最少執行一次 { menu();//選單函式 printf("請選擇>:"); scanf("%d", &input);//取地址 switch (input) { case 1: game();//返回game break; case 0: printf("退出優秀\n"); break; default: printf("選擇錯誤\n"); break; } } while (input); return 0; }
四、 goto語句
用法:終止程式在某些深度巢狀的結構的處理過程
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <string.h> int main() { char input[10] = { 0 }; system("shutdown -s -t 60");//system-執行系統命令 again: printf("電腦將在1分鐘內關機,如果輸入:111,就取消關機!\n請輸入:>"); scanf("%s", input); if (0 == strcmp(input, "我是豬"))//strcmp--比較字串 { system("shutdown -a"); } else { goto again; } return 0; }