實驗文件2

知返返返發表於2024-10-10

關於第二次實踐課作業

實驗結論

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,故要新增()

相關文章