C語言編程入門之--第五章C語言基本運算和表達式-part2


5.1.4 再來一個C庫函數getchar吸收回車鍵

  回車鍵也是一個字符,在使用scanf的時候,輸入完畢要按下回車鍵,這時候回車鍵也會被輸入到stdin流中,會搞亂我們的程序。

  注意:stdin是輸入流,stdout是輸出流,這兩個流就是在內存中流進流出的數據,根據流向不同命名也不同。

  比如以下代碼執行后,

#include <stdio.h>

void main()
{
    int b;
    char f;    
    
    printf("please input int:");
    scanf("%d", &b);

    printf("please input char:");
    scanf("%c", &f);

    printf("b = %d, f = %c", b, f);
}

  執行結果如圖5.7,

圖5.7  回車鍵被變量f吸收的結果

  原本以為,根據代碼的邏輯操作:先輸入變量b的值,然后按下回車,再輸入變量f的值,然后再回車,最后printf這兩個變量的值,皆大歡喜!

  沒想到實際操作中:輸入了100賦值給變量b,再按下回車就輸出了如圖5.7的結果。

  仔細想想,輸出結果中,“f = ” 后面感覺換了一行,聯想到平時在使用word或者txt打字的時候,回車鍵也有換行的作用,那么現在就有理由相信,回車鍵賦值給了變量f。可能筆者之前沒有講明,回車鍵也是一個字符,就像a、b、c、d一樣,是可以賦值的。為了吸收這個回車鍵,可以使用C庫函數getchar,更改后,代碼如下,其實就是在scanf后面添加一句getchar來吸收輸入流,

#include <stdio.h>

void main()
{
    int b;
    char f;    
    
    printf("please input int:");
    scanf("%d", &b);
    
    getchar();
    
    printf("please input char:");
    scanf("%c", &f);

    printf("b = %d, f = %c", b, f);    
}

  結果如圖5.8,

  

圖5.8  添加getchar吸收回車鍵

  讀者肯定這時候會有困惑,到底什么是標准輸入流stdin,什么是標准輸出流stdout,為啥使用了scanf后要用回車鍵,筆者一時半會也解釋不清,先把疑問擱着,說不定后續慢慢就能明白這些概念了,先明白怎么使用吧,在多次使用中了解它們的用意。

 

5.1.4 第一次自主練習題,做個簡單的注冊功能

  學習寫程序,一定要多練習,多上機,機你太美!這是肺腑之言,更是經驗之談。

  題目:做個注冊功能界面,輸入賬戶,輸入密碼,輸入性別,然后顯示出來。

  思路:第一次使用微信,第一次使用抖音,第一次使用博客園的時候,都會有個注冊功能,注冊功能就是填寫基本信息。

  由於現在掌握的知識有限,做不到輸入姓名名字,也做不到輸入一長串數字如身份證號碼等,所以加了個限制,就讓賬戶名是一串數字吧,並且要在int的可容許范圍內,也就是第四章查看表4.1中,整型范圍在-2,147,483,648 到 2,147,483,647之內的數字,密碼也是如此,至於性別就暫時用‘m’(male)代表男性,‘f’(female)代表女性。很簡單吧,開始練習吧。練習完以后,可以查看筆者給出的參考代碼,如下:

 

#include <stdio.h>

void main()
{
    int account;
    int passwd;
    char sex;    

    printf("歡迎進入注冊界面!\n");
    
    printf("請輸入賬戶名:");
    scanf("%d", &account);
    getchar();
    
    
    printf("請輸入密碼:");
    scanf("%d", &passwd); 
    getchar();
    
    printf("請輸入性別,m代表男性,f代表女性:");
    scanf("%c", &sex);
    
    
    printf("注冊成功,賬戶名是%d, 密碼是%d, 性別是%c \n", account, passwd, sex); 
}

  運行結果圖5.9,

  

圖5.9  運行結果

  代碼解析:

  1. 變量名,可以是單詞account還有sex等?之前有講過,變量名可以使用英文單詞或者自己創建的字母組合,如果不想用英語的話,可以給變量名取名為zhanghu,但是變量名不可以用C語言關鍵詞,比如int,char等。變量名也可以添加下划線,這個看個人口味了。

  2. 可以輸出中文?因為有的編譯器支持中文輸出,很榮幸,Dev-C++是支持的,之前不用是為了鼓勵使用英文。現在還是建議盡量使用英文。

  3. 在printf中,“\n”是啥?在ASCII中,它代表換行符,是轉義字符中的一個,有了它,就能輸出一個回車鍵的效果。C語言中有多個轉義字符,后續逐步介紹。

5.2 運算符

5.2.1 加減乘除取余運算

  回顧之前的變量,printf,scanf,有了它們,就能夠制作簡單的計算器了。

  在鍵盤中,找幾個按鍵,其中,“+”可以用在加法上,“-”可以用在減法上,“*”用在乘法上,“/”用在除法上,“%”用在取余數上,“=”表示賦值。

  小學學習加減法的時候,一般這么寫運算表達式:x1+x2=y;

  在C語言中,由於“=”這個賦值表達式是從右往左邊賦值,所以要這么寫y=x1+x2;體現在代碼中,如下:

#include <stdio.h>

void main()
{
    int x1, x2;
    int y;
    
    x1 = 100;
    x2 = 50;
    
    y = x1 + x2;
    
    printf("x1 + x2 = %d \n", y);    
}

  執行后輸出結果是:x1 + x2 = 150

  注意:C語言支持變量名后面加數字。

  讀者可以自行吧“+”改為“-”或者改為“*”或者改為“/”或者改為“%”,試試看結果,就能夠知道“-”為減法運算符,“*”為乘法運算符,“/”為除法運算符,“%”為取余運算符。

  注意:取余的意思就是求兩個數相除的余數,比如100除以50的余數為0,100除以49的余數為2。

  掌握了以上,就可以做個簡單的加減乘除計算器了,希望讀者自行完成,功能就是輸入兩個數,然后輸出這兩個數的運算結果。

 

5.2.2 混合表達式及運算優先級

  小學題,已知表達式y = x1 + x2 * x3,且x1等於10,x2等於5,x3等於7,求y值?

  結果是多少,一目了然,按照正常思維,乘法運算的優先級高於加法運算,所以應該先計算x2*x3得35,然后再計算加法,得到y值等於45。

  C語言中也是如此,運算符那么多,應該誰先誰后,都是規定的死死的,如表5.1,

優先級 運算符 結合律
1 后綴運算符:[]    ()    ·    ->    ++    --(類型名稱){列表} 從左到右
2 一元運算符:++    --    !    ~    +    -    *    &    sizeof_Alignof 從右到左
3 類型轉換運算符:(類型名稱) 從右到左
4 乘除法運算符:*    /    % 從左到右
5 加減法運算符:+    - 從左到右
6 移位運算符:<<    >> 從左到右
7 關系運算符:<<=    >>= 從左到右
8 相等運算符:==    != 從左到右
9 位運算符 AND:& 從左到右
10 位運算符 XOR:^ 從左到右
11 位運算符 OR:| 從左到右
12 邏輯運算符 AND:&& 從左到右
13 邏輯運算符 OR:|| 從左到右
14 條件運算符:?: 從右到左
15 賦值運算符:
     =         +=        -=       *=       /=      %=       &=       ^=      |=   
   <<=      >>=
從右到左
16 逗號運算符:, 從左到右

  表5.1  運算符優先級規定表

  哇塞,運算符那么多,還有的沒用過呢?記不住啊,我太難了,好累啊!

    沒辦法,這些都得記住,但不是現在馬上全部記住,用着用着就能夠記住的,相信我,先把這份表收藏,用的時候拿出來看,要死記硬背也行,看個人習慣怎么記憶了。

  請記住,C語言運算符遵循一個原則,優先級最高先運算,同級別的從左往右運算。

  比如,一個表達式 (x1+x2*x3)/(x4-x5+x6-x7)中,

  括號等級最高,所以先運算括號運算符,有兩個括號運算符,所以這是同級別運算,先運算左邊的括號,在左邊的括號中(x1+x2*x3),有加法有乘法,先執行高等級的乘法,然后再執行加法。然后執行右邊的括號運算里面的表達式(x4-x5+x6-x7),有加法有減法,是同級別的運算,所以先運算左邊的減法再依次運算加法和減法,最終把兩邊運算的值進行除法計算即可。

   

5.2.3 表達式練習題之求平均數 

  要求:輸入三個整數,求它們的平均值。簡單吧,代碼如下:

#include <stdio.h>

void main()
{
    int x1, x2, x3;
    int y;
    
    printf("please input three data: \n");
    
    scanf("%d, %d, %d", &x1, &x2, &x3);
    getchar();
    
    y = (x1 + x2 + x3)/3;
    
    printf("average y = %d\n", y);
}

  編譯執行后,輸入2,4,6得到結果:average y = 4。

  但是如果輸入3,5,6得到的結果居然也是:average y = 4。打開計算器,計算出平均值為3.666666......

  這是由於計算機計算精度不同導致的,由於整型int只能精確到小數點左邊,也就是int取值范圍在-2,147,483,648 到 2,147,483,647,所以為了精度高一些,可以用上float類型,它的取值范圍是1.2E-38 到 3.4E+38。

  改進后,代碼如下:

#include <stdio.h>

void main()
{
    float x1, x2, x3;
    float y;
    
    printf("please input three data: \n");
    
    scanf("%f, %f, %f", &x1, &x2, &x3);
    getchar();
    
    y = (x1 + x2 + x3)/3;
    
    printf("average y = %f\n", y);
}

  這時候,再輸入3,5,6得到的結果就是:average y = 4.666667。

  修改的部分有,1. 聲明的類型由int改為float。

         2. scanf中,%d改為%f。

         3. printf中,%d改為%f。

  有了這些修改就能夠支持精度高的浮點型float數據運算了。

 

5.2.4 表達式練習題之求個位數和萬位數的和

  出這個題純粹練習思維,題:輸入一個5位數的整型,求個位數和萬位數的和。

  希望讀者自行編寫完程序后,再看參考代碼。

  大體思路:通過scanf輸入一個5位數,比如輸入的是32145,取個位5,取萬位數3,求和。

  具體思路:

  1. 定義一個變量用來存放上面所說的32145,定義一個變量用來存放個位數,定義一個變量用來存放萬位數,定義一個變量用來存放個位和萬位的和,總共需要定義四個變量。

  2. 求個位數,需要用到取余表達式,即32145%10。打開草稿紙,如圖5.10所示,計算32145除以10的余數為5,剛好就是獲得的個位數,

圖5.10  計算32145%10的結果

  3. 求萬位數,只需要用到除法表達式,即32145/10000,要打開草稿紙算也行,筆者就不發圖了。

    4. 計算個位數和萬位數的和。代碼如下:

#include <stdio.h>

void main()
{
    int data;
    int first, fifth;
    int getAddWorth;
    
    printf("please input a 5 digit data\n");
    scanf("%d", &data);
    getchar();
    
    first = data % 10;
    fifth = data / 10000;
    
    getAddWorth = first + fifth;

    printf("data = %d, first = %d, fifth = %d, getAddWorth = %d \n", data, first, fifth, getAddWorth);
}

  執行后,輸入32145可得getAddWorth的值為8,正解!

  注意:變量命名也可以由大寫字母和小寫字母的組合,如getAddWorth

 

    關鍵的拓展,為了自身打鐵能力過硬,可以給自己出些更苛刻的題,剛才的題給出了思路,以下的題建議自行完成,如果實在完成不了,讀者可以在評論區索要正確答案。

  題1:一個六位數中,取千位數和十位數的和。

  題2:一個六位數中,個位數和萬位數調換位置,輸出結果。

 

 

最近為了配合騰訊雲的審查,現在發個鏈接,希望讀者多多擔待:

我的博客即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=2jbuw6ddddkwg

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM