關於第二次實踐課作業
實驗結論
task1.c
1 #include<stdio.h> 2 #include<time.h> 3 int main() 4 { 5 const int N = 5; 6 const int N1 = 397; 7 const int N2 = 476; 8 const int N3 = 21; 9 10 int cnt; 11 int random_major, random_no; 12 13 srand(time(NULL)); 14 15 cnt = 0; 16 while (cnt < N) { 17 random_major = rand() % 2; 18 19 if (random_major) { 20 random_no = rand() % (N2 - N1 + 1) + N1; 21 printf("20248329%04d\n", random_no); 22 } 23 else { 24 random_no = rand() % N3 + 1; 25 printf("20248395%04d\n", random_no); 26 } 27 28 cnt++; 29 } 30 31 return 0; 32 }
回答問題
question1:解釋random_no=rand()%(N2-N1+1)+N1;的功能
answer1:N2-N1+1是該專業的總人數,利用隨機數取餘可以得到【0,N2-N1)內任一整數,並加上該專業的初始學號N1,可得該專業內任意學生的學號
question2:解釋random_no=rand()%N3+1;的功能;
answer2:N3是該專業的總人數,利用隨機數取餘可以得到【0,N3-1)內任意整數,並加上該專業的初始學號N2,可得該專業內任意學生的學號
question3:解釋這個程式的功能
answer3:生成5個隨機學號,並且這些學號分為兩類,每類學號有不同的字首和範圍(其代表著不同的專業),透過隨機選擇專業(透過random_major的結果為0或為1決定if的走向從而選擇專業)並在該專業範圍內生成隨機學號並按照指定的格式列印出來
task2.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<math.h> 4 int main() 5 { 6 double a, b, c; 7 double delta, p1, p2; 8 while (scanf("%lf %lf %lf", &a, &b, &c) != EOF) { 9 if (a == 0) { 10 printf("a = 0,invalid input\n"); 11 continue; 12 } 13 delta = b * b - 4 * a * c; 14 p1 = -b / 2 /a; 15 p2 = sqrt(fabs(delta)) / 2 / a; 16 17 if (delta == 0) { 18 printf("x1 = x2 = %.2g\n", p1); 19 } 20 else if (delta > 0) { 21 printf("x1 = %.2g , x2 = %.2g\n", p1 + p2, p1 - p2); 22 } 23 else { 24 printf("x1 = %.2g + %.2gi,", p1, p2); 25 printf("x2 = %.2g - %.2gi\n", p1, p2); 26 } 27 } 28 return 0; 29 }
task3.c
1 #include<stdio.h> 2 int main() 3 { 4 char ch; 5 6 printf("請從鍵盤輸入字元用來表示交通訊號燈顏色:"); 7 printf("(輸入r表示red,輸入g表示green, 輸入y表示yellow)\n"); 8 9 while ((ch = getchar()) != EOF) { 10 getchar(); 11 12 if (ch == 'r') { 13 printf("stop!\n"); 14 } 15 else if (ch == 'g') { 16 printf("go go go\n"); 17 } 18 else if (ch == 'y') { 19 printf("wait a minute\n"); 20 } 21 else { 22 printf("something must be wrong...\n"); 23 } 24 25 } 26 27 return 0; 28 }
task4.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() 5 { 6 double x; 7 double max = 0; 8 double min = 20000.0; 9 double sum = 0.0; 10 11 printf("輸入今日開銷,直到輸入-1終止:\n"); 12 while (1) { 13 scanf("%lf", &x); 14 15 if (x == -1) { 16 break; 17 } 18 sum += x; 19 if (x > max) { 20 max = x; 21 } 22 if (x < min) { 23 min = x; 24 } 25 26 } 27 printf("今日累計消費總額:%.1lf\n", sum); 28 printf("今日最高一筆開銷:%.1lf\n", max); 29 printf("今日最低一筆開銷;%.1lf\n", min); 30 system("pause"); 31 return 0; 32 }
task5.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 int main() { 5 int a, b, c; 6 printf("輸入三角形三邊邊長:\n"); 7 8 while (scanf("%d %d %d", &a, &b, &c) != EOF) { 9 if (a + c <= b || a + b <= c || b + c <= a) { 10 printf("不能構成三角形"); 11 } 12 else if (a == b && b == c) { 13 printf("等邊三角形"); 14 } 15 else if (a == b || b == c || a == c) { 16 printf("等腰三角形"); 17 } 18 else if (a * a + b * b == c * c || a * a + c * c == b * b || b * b + c * c == a * a) { 19 printf("直角三角形"); 20 } 21 else { 22 printf("普通三角形"); 23 } 24 } 25 return 0; 26 }
task6.c
1 #define _CRT_SECURE_NO_WARNINGS 2 #include<stdio.h> 3 #include<stdlib.h> 4 #include<time.h> 5 int main() 6 { 7 srand(time(NULL)); 8 int day = rand() % 30 + 1; 9 int x; 10 printf("猜猜2024年11月哪一天會是你的lucky day\n"); 11 printf("開始嘍,你有三次機會,猜吧(1-30):"); 12 13 int cnt = 0; 14 int tr = 0; 15 for (cnt = 0; cnt < 3; cnt++) { 16 scanf("%d", &x); 17 if (x == day) { 18 printf("哇,猜中了:)"); 19 tr = 1; 20 } 21 else if (x > day) { 22 printf("你猜的日期晚了,你的lucky day在前面哦\n"); 23 } 24 else { 25 printf("你猜的日期早了,你的lucky day還沒到呢\n"); 26 } 27 if (tr==1) { 28 break; 29 } 30 if (cnt < 2) { 31 printf("再猜(1-30):"); 32 } 33 } 34 if (tr == 0&&cnt==3) { 35 printf("次數用光啦。偷偷告訴你,11月你的lucky day是%d號", day); 36 } 37 38 39 return 0; 40 }
實驗總結
1.可以透過設定變數並賦予其一定的計演算法則,實現單一出口
2.格式控制符%g,其用法是:如果資料值是整數,會自動按整數輸出, 如果資料值是小數,會自動按小數並按指定精度輸出
3.%0,其用法是輸出數值時指定左面不使用的空位置自動填0;%d,其用法是輸出一定資料長度d的資料,如果資料長度<d,左補空格
其中task1.c中%04d即實現了左補0,且資料長度為4的資料作為符合格式的學號
4.利用rand()生成隨機數時注意引入標頭檔案#include<stdlib.h>
此外為了確保每次執行程式時生成的隨機數序列不同,需引入標頭檔案#include<time.h>
引入時間庫,用於獲取當前時間,以當前系統時間作為隨機種子,作為隨機數生成的種子
並且要在主函式中加入srand(time(NULL))
<stdlib.h>用於呼叫rand()和srand()函式,以及<time.h>用於獲取當前時間
5.引用:
Tips: 與偽隨機數生成相關的兩個標準庫函式: rand(), srand()
int rand(void) 返回一個0~RAND_MAX之間的偽隨機數。 標頭檔案(也有的在) rand()函式原型及使用示例參考: https://en.cppreference.com/w/cpp/numeric/random/ra nd
void srand(unsigned int seed)
為rand()設定隨機種子。通常以時間作為隨機種子,即srand(time(NULL)) 標頭檔案(也有的在), srand()函式執行及使用示例參考: https://en.cppreference.com/w/cpp/numeric/random/sr and
6.單個字元需要用’ch‘引好,eg ch==’c‘
7.試圖實現字元型變數的多組輸入時
while()中(ch=getchar())!=EOF是正確寫法(既讀取了字元又檢查了是否到達檔案末尾)
而不能捨棄()寫成 ch=getchar()!=EOF的形式
在這種錯誤的形式下,使用了賦值運算子 = 而不是比較運算子 ==。此外,getchar() != EOF 的結果應該被用來控制迴圈,而不是賦值給 ch,故要新增()