C語言探索之旅 | 第一部分第十課:練習題+習作

1240

-- 簡書作者 謝恩銘 轉載請註明出處

第一部分第十課:練習題+習作


上一課是C語言探索之旅 | 第一部分第九課:函數

第一部分課程已經全部結束,在開始第二部分的探索之旅之前,我們必須鞏固好第一部分學到的知識

所以爲大家準備了一些練習題:

15道選擇題+一個小小的習作。

15道題目(單選)在本課最後有附答案,但是希望大家先做完再對答案。

練習題


  1. 負責將源代碼轉換成二進制碼的程序叫什麼?
    A. 揚聲器
    B. 編譯器
    C. 轉碼器

  2. 下面哪一個不是IDE(集成開發環境)?
    A. NotePad++
    B. Visual Studio
    C. Code::Blocks
    D. Xcode

  3. C語言將哪一個值視爲布爾值的false(假)?
    A. 1
    B. 0
    C. -1
    D. -2

  4. 下面這段代碼中的 return 0; 意味着什麼?

    #include <stdio.h>
    int main()
    {
     printf("Hello world!\n");
     return 0;
    }

    A. 程序沒有執行操作
    B. 程序沒有正常運行
    C. 程序正常運行

  5. 以下哪一個是C語言中的換行符?
    A. \t
    B. \n
    C. 按一下鍵盤上的回車鍵就夠了

  6. 如果我有一個變量bankAccount(銀行賬戶),類型是long,其值爲6500000(土豪啊),那下面的代碼會輸出什麼?

    printf("您的銀行賬戶上有 %ld 元\n", bankAccount);

    A. 您的銀行賬戶上有 %ld 元
    B. 您的銀行賬戶上有 6500000 元
    C. 您的銀行賬戶上有 ld 元, bankAccount

  7. 以下哪一種存儲器是在電腦關閉之後不會被清空的?
    A. 寄存器
    B. 高速緩存
    C. 內存
    D. 硬盤

  8. 經過這個操作,result變量的值是多少?

    result = (8 / 3) - 2;

    A. -2
    B. 0
    C. 1
    D. 2

  9. 以下switch語句的問題是什麼?

    switch (variable)
    {
     case 5:
       printf("Hello");
     case 12:
       printf("你好");
     default:
       printf("再見");
    }

    A. 少了break語句
    B. 在switch的最後的大括號後面少了一個分號
    C. 對每一個case下面的指令需要用一個大括號括起來
    D. default應該寫成case default

  10. 用哪一個for循環可以在屏幕上顯示以下信息?

    Line n°1
    Line n°3
    Line n°5
    Line n°7

    A. for (count = 1 ; count < 9 ; count += 2)
    B. for (count = 1 ; count <= 7 ; count++)
    C. for (count = 0 ; count < 9 ; count += 2)
    D. for (count = 1 ; count < 8 ; count++)

  11. 以下代碼會顯示多少次“Hello”?

    int count = 14;
    while (count < 15)
    {
      printf("Hello\n");
    }

    A. 0
    B. 1
    C. 14
    D. 15
    E. 這是一個無限循環

  12. 在哪種情況下return語句不是必須的?
    A. 函數沒有參數
    B. 函數的類型是void
    C. 函數需要返回0值

  13. 什麼是函數的參數?
    A. 標明函數的名字
    B. 標明函數的返回值
    C. 我們傳給函數使它用來工作的變量

  14. 以下函數存在什麼問題?

    int square(int number)
    {
      int result = 0;
      result = number * number;
    }

    A. 函數沒有返回任何值
    B. 函數運行不了,因爲我們在某處忘了一個分號
    C. 完全沒有問題

  15. 在一個程序中可以包含多少個函數?
    A. 只有一個,就是main函數
    B. 最多100個
    C. 最多1024個
    D. 沒有限制

練習題答案


  1. B. 編譯器

  2. A. NotePad++

  3. B. 0

  4. C. 程序正常運行

  5. B. \n

  6. B. 您的銀行賬戶上有 6500000 元

  7. D. 硬盤

  8. B. 0

  9. A. 少了break語句

  10. A. for (count = 1 ; count < 9 ; count += 2)

  11. E. 這是一個無限循環

  12. B. 函數的類型是void

  13. C. 我們傳給函數使它用來工作的變量

  14. A. 函數沒有返回任何值

  15. D. 沒有限制

題目都不難,認真複習一下肯定能得高分,你都答對了嗎?
有什麼疑問可以在公衆號裏直接留言提問,或者聯繫我,謝謝!

習作: 完善“或多或少”這個小遊戲


前面一個我們編寫了第一個C語言小遊戲,雖然很簡單,沒有好看的圖形界面(之後會有的,牛奶和麪包都會有的),但是也可以小小自豪一下!

現在我們重新給出它的源代碼:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main (int argc, char** argv)
{
  int mysteryNumber = 0, guessNumber = 0;
  const int MAX = 100, MIN = 1;

  // 生成隨機數
  srand(time(NULL));

  mysteryNumber = (rand() % (MAX - MIN + 1)) + MIN;

  /* 程序的循環部分, 如果用戶沒猜中數字,就一直進行循環 */
  do
  {
    // 請求用戶輸入所猜數字
    printf("這個數字是什麼 ? ");

    scanf("%d", &guessNumber);

    // 比較用戶輸入的數字和神祕數字
    if (mysteryNumber > guessNumber)
      printf("猜小了 !\n\n");
    else if (mysteryNumber < guessNumber)
      printf("猜大了 !\n\n");
    else
      printf ("太棒了,你猜到了這個神祕數字 !!\n\n");
  } while (guessNumber != mysteryNumber);

  return 0;
}

程序的解釋(從上到下的順序):

  1. 預處理指令:就是開頭的那三行,以#開始,include是英語“包含,引入”的意思。所以表示引入什麼庫。之前我已經給大家這部分的代碼了,所以如果你的程序運行起來出錯是在這部分的話,那也是夠夠的了 :P

  2. 變量:這個遊戲中,不需要太多變量,只有一個用於記錄用戶輸入的數字的變量guessNumber,和一個電腦隨機抽取的數字mysteryNumber。 同時也定義了兩個常量(const變量,其實叫只讀變量比較準確)MAX和MIN,值分別是100和1。這樣定義的好處是,如果你後面要改這兩個數值,會 很方便,直接改這一行的兩個值就好了。如果沒有用MAX和MIN而是在程序裏每一個地方寫100和1的話,那如果以後要改數值,工作量就大了。

  3. 隨機數:srand和rand那兩行,產生在1和100之間的一個隨機數,值賦給mysteryNumber。

  4. 循環:我選擇了用do...while循環。理論上一個while循環也可以做到,但我覺得這裏用do...while可能更合邏輯。爲什麼呢?還記得 do...while循環的特點嗎?就是循環體裏的指令至少會執行一次,不像while循環可能一次也不執行。這裏我們至少要讓用戶輸入一次數字,不可能 用戶一次也不輸入就猜到了數字。

  5. 在每一次進入循環體裏運行時,我們都請求用戶輸入一個數字,並且把這個數字的值賦給guessNumber變量,接下來就比較guessNumber和mysteryNumber(需要猜的數字)的大小:
    mysteryNumber大於guessNumber,那麼輸出“猜小了”,繼續循環
    mysteryNumber小於guessNumber,那麼輸出“猜大了”,繼續循環
    mysteryNumber等於guessNumber,也就是else語句的情況,即是說我們猜對了,輸出“太棒了,你猜到了這個神祕數字!”,結束循環

  6. 循環也需要一個條件,我們給出的條件是:只要猜的數字和神祕數字不一樣,循環就繼續。

現在這個遊戲還是很基礎很簡單的,但是可以有以下的改進方案:

  1. 增加一個記錄步數的計數器,在你猜對的時候輸出:“太棒了,你用**步猜到了這個神祕數字!”

  2. 目前的程序只進行一輪就結束了,如果玩家不過癮,還想繼續下一輪怎麼辦呢?可以加入一個問題:“你還想繼續玩嗎?”,等待用戶輸入數字來回答。定義一個布爾 值continue來存儲用戶輸入的回答,比如continue的默認值是1,就是用戶默認是繼續玩下一輪的,但如果用戶輸入0,那麼程序停止,遊戲結束

  3. 增加一個模式:兩人模式。可以你出題我來猜。但是我希望你能夠在程序一開始就讓用戶選擇是玩哪一種模式,是經典的人機對戰,還是人人對戰。如果是兩人模式的人人對戰,那麼就不是用srand和rand來產生神祕數字了,而是讓玩家一通過scanf來輸入這個數字

  4. 設置幾個難度級別,讓玩家選擇:初級(1-100中的一個數),中級(1-1000中的一個數),高級(1-10000中的一個數)。如果你這樣設計,就需 要改寫MAX值了,而此時MAX就不能再是一個const變量了,必須要把MAX前面的const去掉,MIN的還能保留。

大家可以自己改進和擴充這個小遊戲,使之更具可玩性和難度

完善好的源代碼可以用公衆號直接發給我,或者發到我的郵箱([email protected])中,歡迎交流,謝謝!

下回預告:第二部分開始了!


C語言探索之旅 | 第二部分第一課:模塊化編程

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