1. 程式人生 > 其它 >第2章-分支語句和迴圈語句

第2章-分支語句和迴圈語句

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()
{
    int
age = 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 1case 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;
}