-- 簡書作者 謝恩銘 轉載請註明出處
第一部分第十課:練習題+習作
上一課是C語言探索之旅 | 第一部分第九課:函數。
第一部分課程已經全部結束,在開始第二部分的探索之旅之前,我們必須鞏固好第一部分學到的知識
所以爲大家準備了一些練習題:
15道選擇題+一個小小的習作。
15道題目(單選)在本課最後有附答案,但是希望大家先做完再對答案。
練習題
-
負責將源代碼轉換成二進制碼的程序叫什麼?
A. 揚聲器
B. 編譯器
C. 轉碼器 -
下面哪一個不是IDE(集成開發環境)?
A. NotePad++
B. Visual Studio
C. Code::Blocks
D. Xcode -
C語言將哪一個值視爲布爾值的false(假)?
A. 1
B. 0
C. -1
D. -2 -
下面這段代碼中的 return 0; 意味着什麼?
#include <stdio.h> int main() { printf("Hello world!\n"); return 0; }
A. 程序沒有執行操作
B. 程序沒有正常運行
C. 程序正常運行 -
以下哪一個是C語言中的換行符?
A. \t
B. \n
C. 按一下鍵盤上的回車鍵就夠了 -
如果我有一個變量bankAccount(銀行賬戶),類型是long,其值爲6500000(土豪啊),那下面的代碼會輸出什麼?
printf("您的銀行賬戶上有 %ld 元\n", bankAccount);
A. 您的銀行賬戶上有 %ld 元
B. 您的銀行賬戶上有 6500000 元
C. 您的銀行賬戶上有 ld 元, bankAccount -
以下哪一種存儲器是在電腦關閉之後不會被清空的?
A. 寄存器
B. 高速緩存
C. 內存
D. 硬盤 -
經過這個操作,result變量的值是多少?
result = (8 / 3) - 2;
A. -2
B. 0
C. 1
D. 2 -
以下switch語句的問題是什麼?
switch (variable) { case 5: printf("Hello"); case 12: printf("你好"); default: printf("再見"); }
A. 少了break語句
B. 在switch的最後的大括號後面少了一個分號
C. 對每一個case下面的指令需要用一個大括號括起來
D. default應該寫成case default -
用哪一個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++) -
以下代碼會顯示多少次“Hello”?
int count = 14; while (count < 15) { printf("Hello\n"); }
A. 0
B. 1
C. 14
D. 15
E. 這是一個無限循環 -
在哪種情況下return語句不是必須的?
A. 函數沒有參數
B. 函數的類型是void
C. 函數需要返回0值 -
什麼是函數的參數?
A. 標明函數的名字
B. 標明函數的返回值
C. 我們傳給函數使它用來工作的變量 -
以下函數存在什麼問題?
int square(int number) { int result = 0; result = number * number; }
A. 函數沒有返回任何值
B. 函數運行不了,因爲我們在某處忘了一個分號
C. 完全沒有問題 -
在一個程序中可以包含多少個函數?
A. 只有一個,就是main函數
B. 最多100個
C. 最多1024個
D. 沒有限制
練習題答案
-
B. 編譯器
-
A. NotePad++
-
B. 0
-
C. 程序正常運行
-
B. \n
-
B. 您的銀行賬戶上有 6500000 元
-
D. 硬盤
-
B. 0
-
A. 少了break語句
-
A. for (count = 1 ; count < 9 ; count += 2)
-
E. 這是一個無限循環
-
B. 函數的類型是void
-
C. 我們傳給函數使它用來工作的變量
-
A. 函數沒有返回任何值
-
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;
}
程序的解釋(從上到下的順序):
-
預處理指令:就是開頭的那三行,以#開始,include是英語“包含,引入”的意思。所以表示引入什麼庫。之前我已經給大家這部分的代碼了,所以如果你的程序運行起來出錯是在這部分的話,那也是夠夠的了 :P
-
變量:這個遊戲中,不需要太多變量,只有一個用於記錄用戶輸入的數字的變量guessNumber,和一個電腦隨機抽取的數字mysteryNumber。 同時也定義了兩個常量(const變量,其實叫只讀變量比較準確)MAX和MIN,值分別是100和1。這樣定義的好處是,如果你後面要改這兩個數值,會 很方便,直接改這一行的兩個值就好了。如果沒有用MAX和MIN而是在程序裏每一個地方寫100和1的話,那如果以後要改數值,工作量就大了。
-
隨機數:srand和rand那兩行,產生在1和100之間的一個隨機數,值賦給mysteryNumber。
-
循環:我選擇了用do...while循環。理論上一個while循環也可以做到,但我覺得這裏用do...while可能更合邏輯。爲什麼呢?還記得 do...while循環的特點嗎?就是循環體裏的指令至少會執行一次,不像while循環可能一次也不執行。這裏我們至少要讓用戶輸入一次數字,不可能 用戶一次也不輸入就猜到了數字。
-
在每一次進入循環體裏運行時,我們都請求用戶輸入一個數字,並且把這個數字的值賦給guessNumber變量,接下來就比較guessNumber和mysteryNumber(需要猜的數字)的大小:
mysteryNumber大於guessNumber,那麼輸出“猜小了”,繼續循環
mysteryNumber小於guessNumber,那麼輸出“猜大了”,繼續循環
mysteryNumber等於guessNumber,也就是else語句的情況,即是說我們猜對了,輸出“太棒了,你猜到了這個神祕數字!”,結束循環 -
循環也需要一個條件,我們給出的條件是:只要猜的數字和神祕數字不一樣,循環就繼續。
現在這個遊戲還是很基礎很簡單的,但是可以有以下的改進方案:
-
增加一個記錄步數的計數器,在你猜對的時候輸出:“太棒了,你用**步猜到了這個神祕數字!”
-
目前的程序只進行一輪就結束了,如果玩家不過癮,還想繼續下一輪怎麼辦呢?可以加入一個問題:“你還想繼續玩嗎?”,等待用戶輸入數字來回答。定義一個布爾 值continue來存儲用戶輸入的回答,比如continue的默認值是1,就是用戶默認是繼續玩下一輪的,但如果用戶輸入0,那麼程序停止,遊戲結束
-
增加一個模式:兩人模式。可以你出題我來猜。但是我希望你能夠在程序一開始就讓用戶選擇是玩哪一種模式,是經典的人機對戰,還是人人對戰。如果是兩人模式的人人對戰,那麼就不是用srand和rand來產生神祕數字了,而是讓玩家一通過scanf來輸入這個數字
-
設置幾個難度級別,讓玩家選擇:初級(1-100中的一個數),中級(1-1000中的一個數),高級(1-10000中的一個數)。如果你這樣設計,就需 要改寫MAX值了,而此時MAX就不能再是一個const變量了,必須要把MAX前面的const去掉,MIN的還能保留。
大家可以自己改進和擴充這個小遊戲,使之更具可玩性和難度
完善好的源代碼可以用公衆號直接發給我,或者發到我的郵箱([email protected])中,歡迎交流,謝謝!