【C語言編程入門系列】—— 第六章,C語言基本運算和表達式(二)

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

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

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

比如以下代碼執行後,

#include 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 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 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語言中有多個轉義字符,後續逐步介紹。

 

6.1 運算符

6.1.1 加減乘除取餘運算

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

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

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

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

#include 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。

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

 

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

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

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

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

優先級運算符結合律

表5.1  運算符優先級規定表

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

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

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

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

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

 

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

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

#include 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 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數據運算了。


自學C/C++不易,此路應攜手前行。

如果你想跟着小編一起學編程的話!

可以來我的C語言/C++編程學習交流俱樂部,【點擊進入】!

還有(源碼,零基礎教程,項目實戰教學視頻),歡迎初學者和正在進階中的小夥伴們!   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章