c語言基礎語法二——迴圈控制條件語句(完節)

zw1996發表於2016-12-09

前面那篇部落格介紹了c語言的一些基本語法,那些可能不能 打出有意思的程式,但是學好這節,那就是很有成就的哦,並且也會激情你對c語言的興趣的。但是這章還是比較麻煩的,我用我自認為很好的方法介紹這節;
第一篇c語言基礎語法部落格連結;
http://blog.csdn.net/zw1996/article/details/53314096

這節的兩個關鍵就是;
1;看懂迴圈,就是看懂是怎麼執行的,執行的步驟是怎麼的順序,我下面的程式都會標記出來的;
2;懂得設計,懂得利用控制語句完成一些簡單的功能,例如打乘法表,用*打三角形

直接進入主題吧;
ps;下面,
語句的意思就是表示式等有值的;並且後面不需要分號的;
程式碼塊;就是很多c語句(由分號結束的)組成;

這裡先說一個小知識點;
就是if,。。。。等下面結束的所以關鍵詞都是預設包含他自己的下一條語句,如果要這個關鍵詞包含多個語句就要使用{
//將這些語句包含起來;
//等下還是舉個例子,這個在國二里面還是比較重要的;
}

1;條件語句

//注意條件語句都是執行一次的,不是迴圈語句,是不是去迴圈的,執行完一次之後就沒了;

缺else的if語句
這裡寫圖片描述

if else
這裡寫圖片描述

沒有花括號的if else語句,
說明了,if預設包含語句只有一條;
說明else要緊接著if預設語句後(或者是其花括號後)
這裡寫圖片描述
這裡寫圖片描述
突然發現有的知識點我到現在為止就寫了很多遍了,不過我在後面可能還會繼續寫,讓仔細看的一次就記住這個知識點,這個方法應該不錯,畢竟多看幾次就熟悉了嗎;

if elseif else
這裡寫圖片描述

來個巢狀的if elseif等等的組合吧;
有分層的;
這裡寫圖片描述
無分層的;
這裡寫圖片描述

關於條件語句就到這了,
敲個程式碼吧;
題目;
y = x 當x<1時;
= 2*x-1 當1=< x < 10時
= 3*x - 11 當x>=10時;
用scanf輸入x的值求出y的值;
題目應該看懂了吧,就是x在不同的範圍內利用不同的表示式求出y;
這裡寫圖片描述

#include<stdio.h>
int main()
{
    int x,y;
    scanf("%d",&x);//輸入x ;
    if(x<1){
        y = x;
        printf("%d\n",y);//輸出y; 
    }
    else if(x >= 1 && x < 10){//注意這裡用到了之前的邏輯運算子 ;
        y = 2*x-1;//這裡用到了之前的算術運算子; 
        printf("%d\n",y);
    }
    else{
        y = 3*x-11;
        printf("%d\n",y);
    }

} 

尷尬;寫了將近2個小時了;只寫完條件語句,不說話了、、、太耗時間了;

2;開關語句;
在條件語句中的if elseif…….else就是實現多路選擇的情況,但是在c語言中它特意提供了專門的switch開關語句來處理多路分之的情形;但是在實際應用中儘量還是選擇if吧,因為switch有點小麻煩,怕出語法錯誤,等哈就介紹;
2.1;switch語句的一般格式;
switch(表示式)
{
case 常量表示式 1: 語句組1;break;
case 常量表示式 2: 語句組2;break;
case 常量表示式 3: 語句組3;break;
.
.
.
.
.
case 常量表示式n:語句組n;break;

default:語句組n+1;

}
先介紹一下怎麼實現多分支語句吧;
switch裡面的表示式的值;
這程式就會跳到那個有相同值的case語句那裡去,
——並且在順序執行;則是執行相應的語句組,
——然後再可能遇到break,則跳出switch語句了,程式執行跳到switch花括號後面;繼續執行其他語句;
——但是如果沒有遇到break則會繼續順序執行case語句,知道遇到break或者執行到switch的花括號處,則跳出switch,跳到switch後的花括號處執行其他語句了;
但是若沒有相同的case語句,則跳到default語句處,執行語句組n+1;

break的作用
break的功能就是是程式控制退出到該結構的花括號之外,

語法需注意地方;
1;一般情況下還是在每條case語句後加上break;
2;注意cese後面接的表示式一定要是常量;(注意)
3;case後面是冒號:
4,default是表示其他情況,當沒有case語句想匹配的時候就執行這個語句,注意他可以省略;

練手程式設計題;
輸入一個等級,將其轉換成對應的一個百分制的成績範圍,具體轉換規則如下:
A為90~100;
B為80~89;
C為70~79;
D為60~69;
E為0~59;

直接利用switch語句做吧?
沒有加break時;
這裡寫圖片描述
沒有加default時;
這裡寫圖片描述
case也是預設一條語句,但是執行完後仍然是順序執行,因此是否加花括號是一樣的道理;
這裡寫圖片描述

switch就到這了,下面就是進入真正的主題迴圈語句了;吃早中飯去了。睡到10點多不解釋;花了半個小時左右敲完 switch吧;

3;迴圈語句;
迴圈結構就是在給定的條件成立時,反覆執行的某個程式段。
給定的條件稱為迴圈條件,反覆執行的程式段稱為迴圈體;
c語言有三種迴圈流程控制語句;while語句,do-while語句,for語句;
他們的迴圈體可以是複合語句,也可以是單一語句;
同樣與之前的if…等一樣的預設包含一條語句,如果要包括多條,那麼則要使用花括號括起來;
3.1;while語句;
while語句 的一般格式;
while(表示式){
迴圈體;//注意,多條則必須打花括號,因為while只預設包含一條語句;
}

執行過程;
先計算表示式的值,
若表示式為真則進入while迴圈執行迴圈體;執行完後再次返回執行表示式;
再計算表示式,如果為真則繼續執行迴圈體;
之後又返回計算表示式的值,若為真則又執行迴圈體,直達表示式的值為假(也就是0)時才不進入while迴圈,執行while迴圈後面的其他語句;
意思就是,只要表示式為真則不斷進入while迴圈執行迴圈體,直達表示式的值為假才不執行迴圈體,執行while後面的其他語句,程式執行指標直接到結束花括號後面,

這裡寫圖片描述

while語句的特點就是,先判斷後執行;
因此若當表示式的初值為0時,則表示迴圈體將一次也不執行;
又強調一遍,若迴圈體包含一條以上的語句時,必須用{}花括號括起來;否則只預設while後的第一條為迴圈體,而其餘的都是while以後的其他語句了;

//**小程式;編寫1到100的和;使用while語句編寫;**
#include<stdio.h>
int main()
{
    int i = 1;//i初始化為1;則sum先加i,之後i再自增; 
    int sum = 0;
    //注意這裡一定要記得初始化;因為後面直接使用的是sum=sum+i;
    //直接使用sum,若是沒有賦初值的話,則程式會出現混亂,這個再第一篇部落格裡面說過,
    //c語言對於變數的使用一定要先賦值再使用;若是沒有賦值直接使用則程式沒有完成任務,因為初始值是隨機的;

    while(i <= 100){//while的表示式;在這裡就是控制迴圈的結束,當i大於100時就結束; 
        sum += i;//累加; 
        i++;//i自增,達到1到100的過程 
    }
    //當表示式的值為假後程式才會執行while以後的其他語句; 
    printf("1+2+3+.......+100 = %d\n", sum);//輸出和; 

    return 0;
} 
這樣的小程式最好自己可以敲一遍的;
/*
    程式功能;輸入int型變數n;計算從1的階乘到n的階乘之和;
    sum  = 1! + 2! + ......  + n!;這就是從1的階乘到n的階乘之和;並將其輸出;
    因為階乘數可能比較到20幾的階乘就不能再使用int儲存了,因此我們的輸入不能很大,否則將出現超出儲存資料型別的情況;
    如果你沒有敲過單個n的階乘;那麼可以先敲出n的階乘,再看看這個例子; 
*/ 
#include<stdio.h>
int main()
{
    int n, t, tt, cj;
    int sum;
    scanf("%d",&n);//輸入變數n; 
    t = 1;//因為要從1的階乘到n的階乘;因此將t初始化為1; 
    sum = 0;//這裡是與之前例子同樣的道理,計算和,並且要先賦值再使用,則賦值為0; 
    while(t <= n){
        tt = 1;//計算階乘,階乘是從1累乘到n因此將tt初始化為1; 
        cj = 1;//這裡與sum初始化一樣,因為是累乘,因此要賦初始值為1; 
        while(tt <= t){//這個while迴圈的作用就是計算t的階乘; 
            cj *= tt;
            tt++;
        }
        sum += cj;//進行累加; 
        t++; 
    }
    printf("計算從1的階乘到n的階乘和 = %d",sum);

    return 0;
}

3.2;do-while迴圈語句;(這種迴圈語句相對使用得是比較少的,介紹完你就會感覺的,個人認為這個用得比較少,但是國二選擇題還是比較喜歡出的;因此還是要掌握;)
do-while迴圈語句的一般格式;
do{
迴圈體;
}while(表示式);

//**do-while語句的執行過程;**
首先先執行一遍迴圈體,然後到達while表示式,
再判斷表示式的值,若為真則返回上面繼續執行迴圈體;然後再計算表示式的值;若為真則繼續返回執行迴圈體;直到表示式的值為假,才不返回執行迴圈體而是跳出do-while迴圈,執行下面的語句;

同樣在這裡仍然要注意do後面預設的迴圈體仍然是預設一條語句,因此要包含多條則要使用花括號,並且最好使用花括號;
這裡寫圖片描述
其特點;
do-while語句,先是執行一遍迴圈體,然後在計算表示式的值,因此至少會執行一次迴圈體的;

說明;
1do-while語句由do開始,用while結束,並且while語句後面的分號不能缺少;
2do-while語句和while語句都能實現迴圈控制的功能的,do-while結構的程式都可以轉化為while結構程式,但                 是while結構程式就不一定可以轉化為do-while結構;
3;迴圈語句只能是一條,若是要使用多條則必須使用花括號;
//do-whilewhile1;兩者都是隻有將迴圈條件為真時才執行迴圈體;
2do-while一定會執行一次迴圈體,
3do-while是先執行迴圈體再判斷;
     while是先判斷再看是否執行迴圈體;
/*
    程式目的;完成逆序輸出;
    輸入一個整形數n,然後逆序輸出來來
    例如;輸出n等於1234;則需輸出4321; 

*/ 
#include<stdio.h>
int main()
{
    int s, n; 
    s = 0;//這個初始化為0,與之前一樣;因為是累加,並且要先初始化再使用; 
    scanf("%d",&n);
    do{
        s = s*10+n%10; //這兩個步驟看不懂可以在紙上模擬一遍;
                        //注意這個是需要知道的,國二的時候是需要編寫這兩步的因此需要知道 
        n /= 10;
    }while(n);//判斷條件,當n等於0時則跳出來; 
    printf("其逆序數為 = %d\n",s);

    return 0;
} 
/*
    注意do-while程式設計可以不需要了解,但是需要看懂,知道程式是怎麼執行的;
    但是這個程式中的迴圈體一定需要知道的,因為這個經常使用到,
    你可以使用while編寫一下這個程式;

*/

3.3;for迴圈語句;(注意這個是最常使用的一種迴圈語句)其餘兩種迴圈結構都可以使用這種來完成
for語句是c語言所提供的功能更強,使用更廣泛的一種迴圈語句;
for語句的一般格式;
for(表示式1;表示式2;表示式3){
迴圈體;//同樣注意for語句預設包含一條語句;若是迴圈體是多條則必須使用花括號;
}
這裡寫圖片描述
注意for迴圈等效為while結構就是;
表示式1;
while(表示式2){
迴圈體;
表示式3;
}
是不是也是剛剛好;先執行表示1;判斷表示式2,再執行表示式3;再判斷表示式2;。。。。。。。

執行過程;
先執行表示式1;然後在判斷表示式2;若為真則執行迴圈體;
迴圈體執行完後,則返回到執行表示式3;之後再判斷表示式2;若為真則進行執行迴圈體,再執行表示式3再判斷表示式2;知道表示式2為假的時候才結束for迴圈,執行for迴圈之後的其他語句;
因此可以看出表示式2;其實就是一個條件語句,判斷是否再次進入迴圈執行迴圈體或者是跳出for迴圈;

注意;
1;for裡面的迴圈體可以為空語句,則就是一個;什麼都不管,或者不接東西也是正確的哦;剛測試了一下;
2;for語句裡面的表示式可以省略,可以部分或者全部省略但是兩個分號不能省略;

for(;;)//這也是可以執行的;

3;for後面圓括號的中的表示式可以是任意有效的c語言表示式;

for(i=1,sum=0; i <= 10; sum+=i,i++);//後面直接一個分號表示空語句;不執行任何東西;
表示式1和表示式3都是逗號表示式;
/*
    程式完成了;輸入整數n,輸出n的階乘; 

*/
#include<stdio.h>
int main()
{
    int i, n,jc;
    scanf("%d",&n);
    jc = 1;//同樣只是一個初始化;因為是累乘則初始化為1;

    for(i = 1; i <= n; i++){//for表示式; 
        jc *= i; 
    }

    printf("n的階乘為 = %d\n",jc);

    return 0;
} 
具體流程如下圖;主要看程式執行的走向;我都標記的順序號的;剛開始做迴圈語句的時候最好都是這樣標記好順序號,這樣就不會出現錯誤了;

這裡寫圖片描述

4;兩個在迴圈控制中常見的關鍵字;continue和break;
這兩個稱為迴圈輔助手段;
一般來說,進入迴圈體以後在下次迴圈判斷之前程式執行迴圈體中的所有語句;
但是continue和break語句是您可以根據迴圈體內進行的判斷結果來忽略以後的迴圈體或者終止它;
4.1;continue;
該語句可以用於三種迴圈形式,當執行到該語句的時,它將導致剩餘的迴圈體被忽略,不執行,直接跳到下個表示式(for則跳到表示式3,while,dowhile則跳到條件判斷語句;)

意思總的就是跳過這次迴圈剩餘的迴圈體,開始下次迴圈;
continue的功能是
中斷迴圈體的本次執行(及跳過迴圈體中尚未執行的語句),立即開始執行下次迴圈,
注意;
whiledo-while迴圈的情況下,continue語句把程式控制轉到表示式計算處,即判斷是否開始下次迴圈;
for迴圈中則是轉至表示式3的計算,然後再判斷表示式2,判斷是否開始下次迴圈;

看事列;
這裡寫圖片描述

對於這個應該有了瞭解吧,

/*
    設計程式,輸出從1到整數n的奇數和;
    輸入數n;
    輸出sum= 1+3+5+.....n(n為奇數時)
            =1+3+5+.....n-1(n為偶數時) 

*/ 
#include<stdio.h>
int main()
{
    int sum, n, i;
    sum = 0;//與之前程式一樣初始化,因為累加,則sum=0; 
    scanf("%d",&n);
    for(i = 1; i <= n; i++){//從1遍歷到n; 
        if(i%2 == 0)//若為偶數則進入if條件語句; 
            continue;//若執行continue則下面迴圈體不執行,直接跳到i++; 
        sum += i; 
    }
    printf("從1到n的奇數和為; %d\n",sum);

    return 0;
} 

4.2;break語句;
迴圈中break語句導致程式終止包含它的迴圈,並進行這個迴圈後面的其他語句;類似於條件不滿足跳出迴圈一樣,只是這裡是,只要遇到break就跳出迴圈;

意思就是,只要遇到break,就要跳出迴圈;

看事列;
這裡寫圖片描述
注意一下,break除了用在迴圈之外,

1;還用在switch開關語句中;這個之前說過;
break的功能就是是程式控制退出到該結構的花括號之外,
2;用在迴圈的條件分支中,其功能是當做某個條件成立時,是程式控制從迴圈中退出,從而結束迴圈的過程,轉而執行迴圈語句後的其他語句;
/*
    設計一個程式,判斷一個整數n是否是素數; 
    素數的概念;除開1和到本身之外不被其他任何數整除;
    輸入整數n;
    輸出ture,or  false; 
    暫時先了解這種設計方法,還有很多好的方法; 
    思路;
     根據素數的概念來; 從2到n-1迴圈一遍,如果都不能被n整除則n為素數;

*/ 
#include<stdio.h>
int main()
{
    int n,i;
    scanf("%d",&n);
    for(i = 2; i < n; i++){// 迴圈,從2到n-1; 
        if(n%i == 0){//判斷是否可以被n整除; 
            break;
        }
    } 
    //因為上面是如果存在不可被整除的那麼則會跳出for迴圈,
    //那麼則不是正常不滿足for迴圈退出的,
    //則可以說明如果不是素數則不是正常退出,則i!=n;
    //若為素數則正常退出,則i=n的; 
    if(i == n){
        printf("ture\n");
    }
    else{
        printf("false\n");
    }


    return 0;
} 

5;巢狀的迴圈以及continue和break的使用;
巢狀迴圈就是for裡面巢狀while,for ,dowhile……..的;
while裡面也可以巢狀fwhile,for ,dowhile……..語句;
這裡都是可以的;

5.1;利用巢狀迴圈來處理資料
/*
    程式設計;利用巢狀迴圈,編寫從1的階乘到n的階乘之和;
    輸入 ;整數n;
    輸出;sum,sum=1!+2!+......+n!; 
*/
#include<stdio.h>
int main()
{
    int n, i, j, sum,jc;
    scanf("%d",&n);
    sum = 0;//初始化,因為累加則初始化為0; 

    for(i = 1; i <= n; i++){//從1迴圈到n,達到從1到n的目的 

        jc = 1;//初始化,因為累乘則初始化為1;注意要放到裡面,因為每次繼續i的階乘都要初始化1; 

        for(j = 1; j <= i; j++){//從1迴圈到i;並且裡面是累乘,達到計算i的階乘的目的; 
            jc *= j;
        }

        sum += jc;//將每次i的階乘的和累加起來;最後的結果就是1到n的階乘的和; 
    }
    printf("從1的階乘到n的階乘和為;%d\n",sum);

    return 0;
} 

這裡寫圖片描述

5.2;利用巢狀迴圈來直接輸出的;
/*
    設計程式;輸出乘法表;
    1*1=1 
    1*2=2 2*2 = 4; 
    ........
    ......
    等等; 
    輸出利用巢狀迴圈直接輸出的,而不是資料處理了 
*/
#include<stdio.h>
int main()
{
    int i, j;
    for(i = 1; i <= 9; i++){//從1依次迴圈到9;表示要迴圈9次; 
                            //在這裡表示 要輸出9行,第i次迴圈表示在第i一行裡面要做什麼 ;也就是迴圈體做的事情 
        //9行; 
        for(j = 1; j <= i; j++){// 從1到i,表示迴圈i次,表示執行i次迴圈體,又因為裡面是printf輸出;
                                //則在這裡表示第i行輸出i次,就是d第i行進行i次這個迴圈體; 

            printf("%d*%d=%2d  ",j, i, i*j); //注意這裡是先輸出j再i;因為第二個for中的j表示列數,i表示行數; 
            //第i行輸出i個乘法表示式 
        }
        printf("\n");
        //可以看出i表示行數;
        //j表示列數; 
    }
    //不知道這個註釋看不看得懂;尷尬; 

    return 0;
} 

這裡寫圖片描述

6;應用;都是簡單常見的程式設計題;最好獨立完成;並且我也寫出了思路;

6.1;列印n行的平行四邊形;
例如輸入3;
  ***
 *****
*******
輸出這個樣子的;
思路;
這個輸入巢狀迴圈裡面的輸入;
1。n行;則要最外層的迴圈是從1到n;
2。看每行裡面做了什麼,首先要列印空格個數是n-i個列印*,個數是2*i+1個,這個就要找規律的;
3;直接輸出就ok了;關鍵再迴圈的初末和迴圈體;
6.2;輸出1001000的水仙花數;
水仙花數是;水仙花數是指一個3位數 ,它的每個位上的數字的 3次冪之和等於它本身。
(例如:153 = 1^3 + 5^3+ 3^3 = 153);
思路;
這個輸出資料處理類的巢狀迴圈;
1;第一個迴圈肯定是從100迴圈到1000;(不包括1000);然後迴圈體要做什麼呢?
————完成將數字的每位分開進行三次冪並且進行相加如果相等則應該輸出這個數,否則進行下次迴圈
2;第一個迴圈迴圈體的編寫
——先完成將數字的每位分開;%10;/10%10;/100;這就分別得到每位的數(這個瓜分要知道的)
——然後在進行三次冪相加sum
——判斷sum是否與這個數相等,如果相等則輸出,否則進行下次迴圈;
6.3;列印菱形;
輸入n;
輸出
(當n=3;)
  *
 ***
*****
 ***
  *
  這就是n=3時候的輸出;
思路;
這是巢狀迴圈的輸出;
這個與之前的平行四邊形差不多;主要難點應該是不知道怎麼控制輸出;然後就獨立編吧;
提示;先輸出3行,再輸出2行;分上下兩部份就思路清晰一點;
6.4;記得我學迴圈就是去年聖誕之前,因此我也還用巢狀迴圈的輸出列印聖誕樹;
輸入n;
輸出(假設n=2;)表示上面有兩個三角形;並且也表示樹根的長寬;
  *
 ***
  *
 ***
*****
 ***
 ***
 ***
6.5;求輸入的兩個正整數a和b的最大公約數(即最大公因子)和最小公倍數;
可以利用輾轉相除法;
    即當b!=0時;r=a%b;a=b;b=r;
    直到b=0時,a即為最大公約數;
    最小公倍數;k/a;(k為剛開始a*b)

這5個列子的程式碼下次補上;

哈哈,基本上完成了,要斷網了,剛剛好;
下篇部落格可能要跳躍一下,先打結構體部分;因為要打資料結構的程式碼,因此這幾天把結構體重新看了一下,因此趁熱打鐵,先把結構體打完再說,也就塊期末了;該複習了,因此關於c語言基礎的其他知識就寒假在補上了;
從7點敲到現在,中間和一個大四的學長聊了會天;總結出一句話就是
趁著現在大學時間多,多學點東西;現在的牛人太多了;
所以現在只能加油了,ok,睡覺了;

下午沒課,趁著中午睡覺之前的時間八上面程式碼的碼一下吧;
6.1;
這裡寫圖片描述
6.2;
這裡寫圖片描述
6.3;
這裡寫圖片描述
6.4;

/*
    程式設計;列印聖誕樹;
    輸入n;
輸出(假設n=2;)表示上面有兩個三角形;並且也表示樹根的長寬;
  *
 ***
  *
 ***
*****
 ***
 ***
 *** 
其中n代表;樹根上面有n個三角形;並且樹根的長寬是2*n-1;
                        注意這裡 這個與之前說的有點小的不同;下面都標有註釋了;
            具體思路;
            1;先列印n個三角形;就是第一個迴圈從1到n;具體在裡面實現輸出三角形;第i次迴圈就列印第i個三角形;
            2;在第一個迴圈所屬的迴圈體裡面列印三角形;
                2.1;與之前列印的三角形一下,先考慮行數,從1迴圈到i+1,
                    這個迴圈體裡面列印列印每行應該做什麼,
                    使得這個迴圈完畢後輸出一個三角形 、
            3;列印完三角形之後;再另起迴圈輸出樹根; 
*/ 
#include<stdio.h>
int main()
{
    int n, i, j, k;
    scanf("%d",&n);//輸入的n代表是樹根上面有n個三角形; 
    for(i = 1; i <= n; i++){// 迴圈n次表示輸出n個三角形; 
        //在迴圈體裡面輸出三角形,達到每次迴圈就輸出一個三角形; 
        for(j = 1; j <= i+1; j++){//三角形的輸出,還是迴歸到每行要輸出什麼,但這個迴圈結束就要列印一個完整的三角形;
            //在迴圈體裡面,輸出第i個三角形的第j行應該做什麼; 
            for(k = 1; k <= n-j+1; k++)//先列印空格 
                printf(" ");

            for(k = 1; k <= 2*j-1; k++)//列印*; 
                printf("*");

            printf("\n");//每行做的事,則應該輸出換行; 
        } 
    }
    for(i = 1; i <= 2*n; i++){//輸出樹根,有2*n行; 
        printf(" ");//列印一個空格,從第二列開始列印; 
        for(j = 1; j <= 2*n-1; j++){//在每行輸出2*n-1個*; 
            printf("*");
        }
        printf("\n");
    } 

    return 0;
} 

這裡寫圖片描述
6.5;
這裡寫圖片描述

相關文章