1 完成命令解析程序
1.1 問題
有命令解析程序,該程序提供三個功能選項供用戶選擇,用戶選擇某功能後,程序在界面上輸出用戶所選擇的功能名稱。程序的交互效果如圖-1所示:函數
圖-1網站
由上圖能夠看出,程序提供的功能有:顯示所有記錄、查詢登陸記錄和退出。若是用戶在控制檯輸入1,則表示用戶選擇的功能爲「顯示所有記錄」,此時,須要在界面上輸出該功能的名稱。spa
若是用戶在控制檯輸入2,則表示用戶選擇的功能爲「查詢登陸記錄」,此時,也須要在界面上輸入該功能的名稱,交互效果如圖-2所示:對象
圖-2遊戲
若是用戶在控制檯輸入0,則表示用戶選擇的功能爲「退出」。此時,在界面上輸出「歡迎使用」,表示程序結束。交互效果如圖-3所示:ip
圖-3ci
若是用戶輸入除0、一、2之外的其它數字,則表示選擇錯誤,此時,在界面上輸出「輸入錯誤「。程序交互狀況如圖-4所示:數學
圖-4string
1.2 步驟
實現此案例須要按照以下步驟進行。it
步驟一:定義變量
變量command,用於保存用戶從控制檯輸入的命令。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int command = 0;
- return 0;
- }
步驟二:從控制檯輸入命令
首先,使用printf函數輸出一行提示。
而後,使用scanf函數輸入一個整數到變量command。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int command = 0;
- printf("請選擇功能:1.顯示所有記錄 2.查詢登陸記錄 0.退出\n");
- scanf("%d", &command);
- return 0;
- }
步驟三:使用switch解析命令
將switch結構配合break語句一塊兒使用,判斷用戶的選擇操做,並輸出解析結果。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int command = 0;
- printf("請選擇功能:1.顯示所有記錄 2.查詢登陸記錄 0.退出\n");
- scanf("%d", &command);
- switch (command) {
- case 1:
- printf("顯示所有記錄\n");
- break;
- case 2:
- printf("查詢登陸記錄\n");
- break;
- case 0:
- printf("歡迎使用\n");
- break;
- default:
- printf("輸入錯誤\n");
- break;
- }
- return 0;
- }
1.3 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- int command = 0;
- printf("請選擇功能:1.顯示所有記錄 2.查詢登陸記錄 0.退出\n");
- scanf("%d", &command);
- switch (command) {
- case 1:
- printf("顯示所有記錄\n");
- break;
- case 2:
- printf("查詢登陸記錄\n");
- break;
- case 0:
- printf("歡迎使用\n");
- break;
- default:
- printf("輸入錯誤\n");
- break;
- }
- return 0;
- }
2 求圓周率
2.1 問題
圓周率,通常以π來表示,是一個在數學及物理學廣泛存在的數學常數。它定義爲圓形之周長與直徑之比,也等於圓形面積與半徑的平方之比,是精確計算圓周長、圓面積、球體積等幾何形狀的關鍵值。
圓周率是一個無限不循環小數。在平常生活中,一般都用3.14來表明圓周率去進行近似計算。若是須要精確計算圓周率的值,則可使用以下公式:
π/4=1-1/3+1/5-1/7+1/9-1/11+……
本案例要求使用上述公式計算圓周率π的值。爲保證必定的精確度,要求計算至10億次後的結果。程序運行效果如圖-5:
圖-5
2.2 方案
計算π值的公式爲:
π=4*(1-1/3+1/5-1/7+1/9-1/11+1/13-1/15……)
有上述公式能夠看出,若是須要計算π的值,必須先計算表達式1-1/3+1/5-1/7+1/9-1/11+1/13-1/15……的值。分析此表達式,不難發現,此表達式中的每一個計算因子的構成相似,能夠總結出以下規律:flag * 1.0 / n。其中,flag表示每一個計算因子前面的正號或負號。好比,1能夠表示爲1*1.0/1;-1/3能夠表示爲-1*1.0/3;1/5能夠表示爲1*1.0/5。
對於表達式flag * 1.0 / n,flag和n是變化的數值,所以,能夠分別聲明變量來表示它,併爲其賦初始值,代碼以下:
- int flag = -1;
- int n = 1;
每次計算時,flag和n的值都會發生變化,其變化規律如表-1:
爲保證必定的精確度,要求計算至10億次後的結果,所以,須要使用for循環構建10億次的計算,而每次循環中,須要修改flag值,而後累加表達式flag*1.0/n的結果,並將n的數值加上2,用於下一次計算。程序流程圖如圖-6:
圖-6
2.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:定義變量
定義變量pi,用於存儲計算出的π值。
定義變量flag,用於存儲計算過程當中的正號和負號。
代碼以下:
- #include <stdio.h>
- int main()
- {
- double pi = 0;
- int flag = -1;
- return 0;
- }
步驟二:構建循環
結合變量n,使用for循環構建10億次計算。每次循環中,改變flag的值,並累加計算結果。
代碼以下:
- #include <stdio.h>
- int main()
- {
- double pi = 0;
- int flag = -1;
- for (int n = 1; n < 1000000000; n +=2)
- {
- flag *= -1;
- pi += flag * 1.0 / n;
- }
- return 0;
- }
步驟三:輸出結果
代碼以下:
- #include <stdio.h>
- int main()
- {
- double pi = 0;
- int flag = -1;
- for (int n = 1; n < 1000000000; n +=2)
- {
- flag *= -1;
- pi += flag * 1.0 / n;
- }
- printf("pi = %.15lf\n", pi * 4);
- return 0;
- }
2.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- double pi = 0;
- int flag = -1;
- for (int n = 1; n < 1000000000; n +=2)
- {
- flag *= -1;
- pi += flag * 1.0 / n;
- }
- printf("pi = %.15lf\n", pi * 4);
- return 0;
- }
3 猜數字遊戲
3.1 問題
有猜數字遊戲,其遊戲規則爲:程序內置一個1~100之間的數字做爲猜想的結果,由用戶猜想此數字。用戶每猜想一次,由系統提示猜想結果:大了、小了或者猜對了;直到用戶猜對結果,則提示遊戲結束。
本案例要求使用交互的方式實現此遊戲,交互過程爲:
1) 遊戲剛開始,提示用戶在控制檯輸入所猜想的數字(爲1~100之間的整數),交互過程如圖-7所示:
圖-7
2) 用戶錄入所猜想的數字後,程序進行判斷:若是用戶所猜想的數字大於結果,則提示太大了;若是用戶所猜想的數字小於結果,則提示過小了。每次提示猜想結果後,提醒用戶繼續猜想。交互過程如圖-8所示:
圖-8
3) 直到用戶猜想正確,則由系統提示「恭喜,你猜對了!」,遊戲結束。交互過程如圖-9:
圖-9
3.2 方案
首先,此案例中,須要產生一個1~100之間的隨機整數,該數值就是用戶要猜想的結果;而後,提示用戶進行第一次猜想,並獲得用戶從界面所輸入的數字。
由於猜想的次數不肯定,則使用do-while循環來構建猜想的過程:判斷用戶所猜想的數字是否與結果相同,只有猜想不正確,則繼續循環。每次循環中,根據比較結果輸出提示信息(「太大了」或者「過小了」),並提示用戶進行下一次猜想。
若是用戶猜想正確,則循環結束,並提示用戶「恭喜,你猜對了!」,程序結束。程序流程圖以下圖-10:
圖-10
3.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:定義變量
定義變量num,用於存儲系統生成的隨機數,即猜想對象。
定義變量guess,用於存儲用戶輸入的猜想值。
代碼以下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- return 0;
- }
步驟二:產生隨機數
srand和rand()配合使用產生僞隨機數序列。rand函數在產生隨機數前,須要系統提供的生成僞隨機數序列的種子,rand根據這個種子的值產生一系列隨機數。若是系統提供的種子沒有變化,每次調用rand函數生成的僞隨機數序列都是同樣的。srand(unsigned seed)經過參數seed改變系統提供的種子值,從而可使得每次調用rand函數生成的僞隨機數序列不一樣,從而實現真正意義上的「隨機」。一般能夠利用系統時間來改變系統的種子值,即srand(time(0)),能夠爲rand函數提供不一樣的種子值,進而產生不一樣的隨機數序列。
使用rand()函數返回一個0到RAND_MAX之間的隨機數。RAND_MAX爲2147483647。而後,將隨機數整除100求餘數,則能夠生成一個0~99之間的隨機數(包含0,也包含99),再加上數值1,則能夠獲得1~100之間的隨機整數(包含1,也包含100)表示要猜想的數字。
注意:rand()函數與srand()函數須要在程序開頭包含stdlib.h頭函數;time()函數須要在程序開頭包含time.h頭函數。
代碼以下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- return 0;
- }
步驟三:讀取猜想結果
提示用戶輸入猜想的數字,做爲一次猜想。代碼以下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- printf("請輸入你猜想的數字(1~100):");
- scanf("%d", &guess);
- return 0;
- }
步驟四:判斷結果
使用if-else結構判斷用戶猜想的數字和實際數字的大小,並根據比較結果輸出提示信息(「太大了」或「過小了」)。代碼以下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- printf("請輸入你猜想的數字(1~100):");
- scanf("%d", &guess);
- if (guess > num)
- printf("太大了\n");
- else if (guess < num)
- printf("過小了\n");
- return 0;
- }
步驟五:構建循環
若是用戶猜想的數字和實際數字不相等,則反覆要求用戶猜想,直到猜對爲止。
代碼以下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- do
- {
- printf("請輸入你猜想的數字(1~100):");
- scanf("%d", &guess);
- if (guess > num)
- printf("太大了\n");
- else if (guess < num)
- printf("過小了\n");
- }while(num != guess);
- return 0;
- }
步驟六:遊戲結束
若是用戶猜想的數字和實際數字相等,則表明用戶猜想正確,終止循環,並提示用戶正確信息「恭喜,你猜對了!」。
代碼以下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- do
- {
- printf("請輸入你猜想的數字(1~100):");
- scanf("%d", &guess);
- if (guess > num)
- printf("太大了\n");
- else if (guess < num)
- printf("過小了\n");
- }while(num != guess);
- printf("恭喜,你猜對了!\n");
- return 0;
- }
3.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main()
- {
- int num;
- int guess;
- srand((unsigned)time(0));
- num = rand() % 100;
- do
- {
- printf("請輸入你猜想的數字(1~100):");
- scanf("%d", &guess);
- if (guess > num)
- printf("太大了\n");
- else if (guess < num)
- printf("過小了\n");
- }while(num != guess);
- printf("恭喜,你猜對了!\n");
- return 0;
- }
4 登陸合法判斷程序
4.1 問題
建立C語言程序,模擬網站的登陸驗證過程。需求爲:從控制檯輸入密碼,由程序判斷密碼是否正確,若是密碼正確,則登陸成功,程序交互過程如圖-11:
圖-11
若是密碼不正確,則反覆要求輸入密碼,程序交互過程如圖-12:
圖-12
4.2 方案
本案例的實現方案如圖-13所示:
圖-13
4.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:定義變量
變量password,用於保存用戶從控制檯輸入的密碼。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int password;
- return 0;
- }
步驟二:從控制檯輸入密碼
首先,使用printf函數輸出一行提示,提示輸入一個密碼。
而後,使用scanf函數輸入一個整數到變量password。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int password;
- printf("請輸入密碼:");
- scanf("%d", &password);
- return 0;
- }
步驟三:構建循環
構建循環,循環的終止條件是用戶輸入的密碼不正確,循環體爲步驟二的輸入密碼。代碼以下:
- #include <stdio.h>
- int main()
- {
- int password;
- do {
- printf("請輸入密碼:");
- scanf("%d", &password);
- } while (password != 123456);
- return 0;
- }
步驟四:輸入的密碼正確,顯示登陸成功
代碼以下:
- #include <stdio.h>
- int main()
- {
- int password;
- do {
- printf("請輸入密碼:");
- scanf("%d", &password);
- } while (password != 123456);
- printf("登陸成功\n");
- return 0;
- }
4.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- int password;
- do {
- printf("請輸入密碼:");
- scanf("%d", &password);
- } while (password != 123456);
- printf("登陸成功\n");
- return 0;
- }
5 輸入整數,輸出全部整數的和
5.1 問題
編寫一個求和程序。用戶從控制檯輸入的整數的個數不受限制,直到輸入整數0爲止。將輸入的整數逐個相加後,把結果輸出。控制檯交互狀況如圖-14:
圖-14
5.2 方案
本案例的實現方案如圖-15所示:
圖-15
5.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:定義變量
變量num,用於保存用戶從控制檯輸入的整數。
變量sum,用於保存輸入的整數的累加和。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int num;
- int sum = 0;
- return 0;
- }
步驟二:從控制檯輸入整數
首先,使用scanf函數輸入一個整數到變量num。
而後,將輸入的整數累加到變量sum中。
代碼以下:
- #include <stdio.h>
- int main()
- {
- int num;
- int sum = 0;
- scanf("%d", &num);
- sum += num;
- return 0;
- }
步驟三:構建循環
構建循環,循環的終止條件是用戶輸入的整數爲0,循環體爲步驟二的輸入整數和將輸入的整數求累加和。代碼以下:
- #include <stdio.h>
- int main()
- {
- int num;
- int sum = 0;
- do
- {
- scanf("%d", &num);
- sum += num;
- }while(num != 0);
- return 0;
- }
步驟四:輸出累加和
代碼以下:
- #include <stdio.h>
- int main()
- {
- int num;
- int sum = 0;
- do
- {
- scanf("%d", &num);
- sum += num;
- }while(num != 0);
- printf("sum = %d\n", sum);
- return 0;
- }
5.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- int num;
- int sum = 0;
- do
- {
- scanf("%d", &num);
- sum += num;
- }while(num != 0);
- printf("sum = %d\n", sum);
- return 0;
- }
6 打印10之內的整數,跳過5
6.1 問題
在控制檯上打印0、一、二、三、四、六、七、八、9,注意5不打印,效果如圖-16所示:
圖-16
6.2 方案
本案例的實現方案如圖-17所示:
圖-17
6.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:構建循環
構建循環,循環10次,循環體爲輸出循環變量i。代碼以下:
- #include <stdio.h>
- int main()
- {
- for (int i = 0; i < 10; i++)
- {
- printf("%d ", i);
- }
- printf("\n");
- return 0;
- }
步驟二:循環變量i爲5時,循環體不打印循環變量
在循環體中插入代碼,代碼的功能是判斷循環變量是否爲5,若是是將繼續循環,再也不打印循環變量。
代碼以下:
- #include <stdio.h>
- int main()
- {
- for (int i = 0; i < 10; i++)
- {
- if (5 == i)
- continue;
- printf("%d ", i);
- }
- printf("\n");
- return 0;
- }
6.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- for (int i = 0; i < 10; i++)
- {
- if (5 == i)
- continue;
- printf("%d ", i);
- }
- printf("\n");
- return 0;
- }
7 用for循環嵌套打印各類圖形(矩形,三角)
7.1 問題
在控制檯上打印矩形圖形,效果如圖-18所示:
圖-18
在控制檯上打印三角形,效果如圖-19所示:
圖-19
7.2 方案
此方案須要使用嵌套循環來實現。
由圖-20可知,矩形一共須要輸出5行10列星:
圖-20
5行須要一個循環5次的循環,代碼以下所示:
- for (int i=0; i<5; i++) {
- }
在輸出每行中的內容時,還須要一個循環10次的循環,在一行中輸出10列,即10個星,代碼以下所示:
- for (int i=0; i<5; i++) {
- for (int j=0; j<10; j++) {
- }
- }
由下圖可知,三角形一共須要輸出5行,第1行先輸出4個空格,再輸出一顆星,第2行先輸出3個空格,再輸出3顆星,第3行先輸出2個空格,再輸出5顆星,第4行先輸出1個空格,再輸出7顆星,第5行不輸出空格,直接輸出9顆星,詳見圖-21:
圖-21
打印5行星,須要一個循環5次的循環來完成,代碼以下:
- for (int i=0; i<5; i++) {
- }
在輸出每行中的內容時,首先須要打印空格,行數每增長1行,空格就少打一個,因此打印空格也須要一個循環來完成。而後打印星,行數每增長1行,星就多打兩個,因此打印星還須要一個循環來完成。這樣,在輸出每行時,實際上須要兩個循環分別打印空格和星。代碼以下所示:
- for (int i = 0; i < 5; i++)
- {
- for (int j = 4; j > i; j--)
- {
- }
- for (int j = 0; j < i * 2 + 1; j++)
- {
- }
- printf("\n");
- }
7.3 步驟
實現此案例須要按照以下步驟進行。
步驟一:打印矩形
在main方法中,構建兩層嵌套的for循環:外層循環用於控制行,內層循環用於控制某行上的星。須要注意的是,每行輸出完畢後,須要換行。代碼以下所示:
- #include <stdio.h>
- int main()
- {
- for (int i=0; i<5; i++) {
- for (int j=0; j<10; j++) {
- printf("*");
- }
- printf("\n");
- }
- printf("---------------------------\n");
- return 0;
- }
步驟二:打印三角形
在main方法中,構建兩層嵌套的for循環:外層循環用於控制行,內層循環有兩個,一個用於控制某行上輸出的空格,一個用於控制某行上輸出的星。須要注意的是,每行輸出完畢後,須要換行。代碼以下所示:
- #include <stdio.h>
- int main()
- {
- printf("---------------------------\n");
- for (int i = 0; i < 5; i++)
- {
- for (int j = 4; j > i; j--)
- printf(" ");
- for (int j = 0; j < i * 2 + 1; j++)
- printf("*");
- printf("\n");
- }
- return 0;
- }
7.4 完整代碼
本案例的完整代碼以下所示:
- #include <stdio.h>
- int main()
- {
- for (int i=0; i<5; i++) {
- for (int j=0; j<10; j++) {
- printf("*");
- }
- printf("\n");
- }
- printf("---------------------------\n");
- for (int i = 0; i < 5; i++)
- {
- for (int j = 4; j > i; j--)
- printf(" ");
- for (int j = 0; j < i * 2 + 1; j++)
- printf("*");
- printf("\n");
- }
- return 0;
- }