誤人子弟的保姆級(jí)C語言教程(貳)

前言

上一篇講了變量,輸入輸出等基本的內(nèi)容。
不知道聰明的同學(xué)是否認(rèn)真完成作業(yè)了~


38.jpg

下面公布作業(yè)的答案~

  1. 設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),輸出這兩個(gè)數(shù)的加減乘除四則運(yùn)算的結(jié)果。


    image.png
  2. 設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),將兩個(gè)變量互換以后輸出。


    image.png

如果之前沒有寫出來,這里看完思路之后記得自己去重新寫一遍~

今天我們將會(huì)講一些新的概念。

分支

我們的賓館建好了,里面也有了各種房型以及形形色色的顧客,警示標(biāo)語也貼的到處都是,但是這個(gè)賓館還是評(píng)級(jí)不高,為啥啊?
你說為啥?你見過給你一塊地讓你建賓館,結(jié)果你建了一座筆直筆直的建筑?這不浪費(fèi)嗎?有的顧客想找房間還得走出好遠(yuǎn)~

所以這里引入一個(gè)新的概念,分支。

眾所周知,如果沒有特殊情況,程序是按順序從上至下一條一條執(zhí)行的。
而如果我們想改變一些程序的執(zhí)行順序,必然要有一些分支。
比如我們把昨天的作業(yè)題改一下。

  • 設(shè)計(jì)一個(gè)程序,讓用戶依次輸入兩個(gè)數(shù),然后再讓用戶輸入1、2、3、4四個(gè)數(shù)的其中一個(gè),當(dāng)用戶輸入這四個(gè)數(shù)中任意一個(gè)的時(shí)候,依次顯示a+b,a-b,a*b,a/b的值。當(dāng)用戶輸入其他數(shù)字的時(shí)候,輸出輸入錯(cuò)誤。

臥槽這是什么,怎么忽然變得這么難了?大佬放我走吧我不學(xué)了!


9.jpg

別急,我先隨便寫一下代碼,你再來感受一下這個(gè)是不是傳說中那么難。

    int a,b,operation;
    printf("請(qǐng)輸入數(shù)字a:");
    scanf("%d",&a);
    printf("請(qǐng)輸入數(shù)字b:");
    scanf("%d",&b);
    printf("請(qǐng)選擇你要執(zhí)行的運(yùn)算,1-加法,2-減法,3-乘法,4-除法:");
    scanf("%d",&operation);
    if (operation == 1){
        int d = a+b;
        printf("a+b=%d",d);
    }else if (operation == 2){
        int d = a-b;
        printf("a-b=%d",d);
    }else if (operation == 3){
        int d = a*b;
        printf("a*b=%d",d);
    }else if (operation == 4){
        int d = a/b;
        printf("a/b=%d",d);
    }else{
        printf("輸入有誤");
    }
image.png

怎么樣,根據(jù)你所學(xué)的知識(shí)理解一下,是不是也不難,只不過里面加了if else之類的語句。

if 和 else

在上面的程序中,我們也認(rèn)識(shí)了一個(gè)新朋友,if和else。
把這倆哥們好好組合起來,就可以成為最簡(jiǎn)單的分支結(jié)構(gòu)。

    if (條件){
        執(zhí)行的語句;
    }else{
        否則執(zhí)行的語句;
    }
image.png

當(dāng)然,有一些條件比較復(fù)雜,我們可以用else if來做銜接

    if (條件1){
        執(zhí)行的語句;
    }else if(條件2){
        不滿足條件1且滿足條件2執(zhí)行的語句;
    }else{
        否則執(zhí)行的語句;
    }
image.png

一些需要注意的

  • else和if是邏輯對(duì)立的,是互相排斥的。就像上面的圖,if和else剛好把紅色的圓給平分,且互相沒有交集。
  • else和if之間可以夾雜無限個(gè)else if 但是每個(gè)條件不能有交集
    比如
    if (貓){
        
    }else if(小白貓){
        
    }else{

    }

就是錯(cuò)誤的邏輯,因?yàn)樾“棕垖儆谪埖囊环N,所以不可以用else if。條件2里面的else已經(jīng)把條件1的貓給排除了。

  • 可以只有if沒有else。
    if (貓) {
        
    }
  • 多個(gè)if和else可以嵌套,else將會(huì)和距離他最近的if配對(duì)
    if (貓){
        if (小白貓){

        }else{
            //這個(gè)else和上面的if (小白貓)配對(duì)
        }
    }else if(狗){
        
    }else{
        //這個(gè)else和上面的 if (貓)以及else if(狗)配對(duì)
    }
  • 如果if里面只有一行語句,if后面的大括號(hào){}可以省略(但是我不建議這樣做,因?yàn)闀?huì)亂套)
if (貓) printf("喵");

所以if后面的條件咋寫???

寫了這么多偽代碼,只是希望聰明的同學(xué)能明白if的結(jié)構(gòu)。
那么現(xiàn)在我們來具體說一下if后面括號(hào)里的條件該怎么寫。

比較運(yùn)算符

我們用這些運(yùn)算符來比較變量的大小,從而作為條件

  • 大于號(hào)> ,小于號(hào)<
    if (a > 0) {
        //如果a大于0則執(zhí)行
    }
  • 大于等于>=,小于等于<=
    if (a >= 0) {
        //如果a大于等于0則執(zhí)行
    }
  • 相等 ==
    if (a == 0) {
        //如果a等于0則執(zhí)行
    }

這里相等是比較特殊的。據(jù)我所知,大部分編程語言都是用連等號(hào)來表示相等。用以和賦值區(qū)分。
比如上面的a==0是a等于0的意思,而a=0是把0賦值給a的意思。

  • 不等于 !=
    if (a != 0) {
        //如果a不等于0則執(zhí)行
    }

邏輯運(yùn)算符

我們用這些運(yùn)算符來進(jìn)行一些邏輯運(yùn)算,從而把比較運(yùn)算符關(guān)聯(lián)起來。

  • 邏輯且 &&
    if (a > 0 && b>0) {
        //如果a>0且b>0則執(zhí)行,必須要a>0和b>0兩個(gè)條件都滿足,才可以
    }
  • 邏輯或 ||
    if (a > 0 || b>0) {
        //如果a>0或b>0則執(zhí)行,滿足a>0或b>0任意一個(gè)條件即可
    }
  • 邏輯非 !
    if (!a > 0) {
        //如果不滿足a>0則執(zhí)行,說白了就是a不大于0,也就是a<=0
    }
注意事項(xiàng)
  • 邏輯與邏輯之間是可以嵌套的,也有一定的運(yùn)行優(yōu)先級(jí),不過我建議直接無視優(yōu)先級(jí),把單一的邏輯用括號(hào)括起來。
    比如
    if (a > 0 || (b == 0 && c > 0)) {
        //如果 a大于0 或 b等于0且c大于0 則執(zhí)行
    }

事實(shí)上 a > 0 || b == 0 && c > 0 不加括號(hào)和上面的結(jié)果是一樣的。&&的優(yōu)先級(jí)比||要高,不過我依然建議加括號(hào),方便自己看得更明白。

一些好玩的東西

//這兩個(gè)是等價(jià)的,是省略寫法
    if (a) {

    }
    if (a!=0) {

    }
//這兩個(gè)也是等價(jià)的,是省略寫法
    if (!a) {

    }
    if (a==0) {

    }

大括號(hào)與變量的作用域

我們?cè)賮砘乜匆幌卤酒_篇用于演示的代碼

    if (operation == 1){
        int d = a+b;
        printf("a+b=%d",d);
    }else if (operation == 2){
        int d = a-b;
        printf("a-b=%d",d);
    }else if (operation == 3){
        int d = a*b;
        printf("a*b=%d",d);
    }else if (operation == 4){
        int d = a/b;
        printf("a/b=%d",d);
    }else{
        printf("輸入有誤");
    }

可以看到,每個(gè)大括號(hào)里都有一個(gè)整形變量d。
由此可見,在大括號(hào)里定義的變量,最大范圍只能在本括號(hào)里使用。
所以定義變量的時(shí)候需要格外注意,在最合適的地方定義,才是正確的選擇。

    int a;
    if (a){
        //這里可以調(diào)用a
        a = 0;
        int b;
    }
    //這里不能調(diào)用b
    b = 0;//這句會(huì)報(bào)錯(cuò)
72.jpg

三段式(我也不知道這玩意叫啥)

有一些簡(jiǎn)單的分支關(guān)系,用if來寫太麻煩了。
比如

    int a = 0
    if (a == 0){
        a = 1
    }else {
        a = 2
    }
    printf("%d",a);

有沒有簡(jiǎn)單一點(diǎn)的寫法呢?
事實(shí)上,我們可以這樣寫。

    int a = 0;
    a == 0 ? a = 1: a = 2;
    printf("%d",a);

這個(gè)就是三段式,可以寫一些很簡(jiǎn)單的分支結(jié)構(gòu)。
格式就是

條件?滿足條件執(zhí)行:不滿足條件執(zhí)行;

三段式可以簡(jiǎn)化代碼,但是會(huì)降低代碼的可讀性。所以建議分清使用場(chǎng)合。

switch 和 case

switch和case是另一種分支寫法。
一般用于變量的固定數(shù)值寫分支。

    switch (變量){
        case 數(shù)值1:{
              //變量為數(shù)值1則執(zhí)行
        }break;
        case 數(shù)值2:{
              //變量為數(shù)值2則執(zhí)行
        }break;
        default:{
              //變量的值上面沒包含,則執(zhí)行
        }break;
    }

比如還是開篇的那個(gè)問題,1-加法,2-減法,3-乘法,4-除法,更適合使用switch case來寫。

    int a,b,operation;
    printf("請(qǐng)輸入數(shù)字a:");
    scanf("%d",&a);
    printf("請(qǐng)輸入數(shù)字b:");
    scanf("%d",&b);
    printf("請(qǐng)選擇你要執(zhí)行的運(yùn)算,1-加法,2-減法,3-乘法,4-除法:");
    scanf("%d",&operation);
    switch (operation) {
        case 1:{
            int d = a+b;
            printf("a+b=%d",d);
        }break;
        case 2:{
            int d = a-b;
            printf("a-b=%d",d);
        }break;
        case 3:{
            int d = a*b;
            printf("a*b=%d",d);
        }break;
        case 4:{
            int d = a/b;
            printf("a/b=%d",d);
        }break;
        default:{
            printf("輸入有誤");
        }break;
    }
image.png
注意事項(xiàng)
  • 注意每條后面都要接一個(gè)break,如果不加break會(huì)有神奇的事情發(fā)生~
  • switch和if有各自的使用場(chǎng)景,在很多時(shí)候是也是可以通用的。
  • 結(jié)尾的default可以不寫。就像if沒有寫else一樣。



以上便是分支的全部?jī)?nèi)容。

這節(jié)課內(nèi)容雖然沒有上一節(jié)多,但是需要更多的練習(xí)才能做好。
這邊留幾個(gè)思考題~

  • 寫一個(gè)程序,判斷用戶輸入的年份是否是閏年,并輸出結(jié)果。
  • 寫一個(gè)程序,讓用戶給定月份,輸出該月有多少天。
    • 進(jìn)階:寫一個(gè)程序,讓用戶輸入年月日,輸出該天是當(dāng)年的第幾天。
  • 寫一個(gè)程序,判斷用戶輸入的數(shù)字是否是7的倍數(shù)或者含有7的數(shù)。
26.jpg
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容