實現一個自動生成小學四則運算題目的命令列程式

ssscgf發表於2024-03-24

一.專案作者姓名:陳煒烽 麥潤澤
學號:3122004776 3122004785
Github專案地址:https://github.com/iFortheFuture/teamwork

二.PSP表格## Personal Software Process Stages

Personal Software Process Stages 預估時間 (分鐘) 實際時間 (分鐘)
Planning 30 30
Estimate 45 45
Development 120 140
Analysis 60 55
Design Spec 90 75
Design Review 45 50
Coding Standard 30 35
Design 120 135
Coding 180 175
Code Review 60 65
Test 90 95
Reporting 45 30
Test Report 30 25
Size Measurement 60 55
Postmortem 60 45
合計 1135 1055

三.效能分析

四.設計實現過程
在給定的程式碼中,主要有以下幾個函式:

  1. jianhua: 這個函式用於簡化分數,將分數化為最簡形式。

  2. chufa: 這個函式用於進行除法運算,包括整除、帶分數和真分數。

  3. chachong: 這個函式用於檢查生成的題目是否重複,避免生成重複的題目。

  4. shengcheng: 這個函式是主要的函式,用於生成題目。它根據輸入的數量和範圍,在指定範圍內生成不重複的題目,並同時計算出題目的答案。

  5. dayintimu: 這個函式用於列印題目到控制檯。

  6. dayindaan: 這個函式用於列印答案到控制檯。

這些函式之間的關係如下:

  • shengcheng 函式是整個程式的核心,它負責生成題目並呼叫其他函式來輔助生成答案和檢查重複。

  • chachong 函式在生成題目時用於檢查是否有重複的題目,避免生成相同的題目。

  • chufa 函式用於處理除法運算,包括整除、帶分數和真分數的情況。

  • jianhua 函式是 chufa 函式的一個輔助函式,用於簡化分數。

  • dayintimudayindaan 函式負責列印題目和答案到控制檯。

在進行修改的過程中,關鍵的函式是 shengcheng,因為它是整個程式的主要邏輯,負責生成題目和呼叫其他函式來輔助完成任務。
關鍵函式的流程圖見附件1.
五.程式碼說明
關鍵程式碼:
// 生成運算
void shengcheng(int n, int r, int daan[100], int timu[100][10]) {
if (n < 1 || r < 10 || n > 100) {
printf("規定:n應該大於0,小於100,r不能小於10");
return;
}
int i = 0;
float sum = 0;
while (i < n) {
// 生成隨機數和運算子
int num1 = rand() % r;
int num2 = rand() % r;
int fuhao[4] = {'+', '-', '*', '/'};
int f = rand() % 4;
int a[5] = {0, 0, 0, 0, 0};
switch (f) {
case 0:
// 加法
sum = num1 + num2;
a[0] = sum;
a[1] = '?';
break;
case 1:
// 減法
sum = num1 - num2;
a[0] = sum;
a[1] = '?';
break;
case 2:
// 乘法
sum = num1 * num2;
a[0] = sum;
a[1] = '?';
break;
case 3:
// 除法
chufa(num1, num2, sum, a);
break;
default:
break;
}
// 把答案和題目填入陣列
daan[i] = (int)sum;
timu[i][0] = num1;
timu[i][1] = fuhao[f];
timu[i][2] = num2;
timu[i][3] = '=';
timu[i][4] = a[0];
timu[i][5] = a[1];
if (a[1] != '?') {
timu[i][6] = a[2];
timu[i][7] = a[3];
if (a[3] != '?') {
timu[i][8] = a[4];
timu[i][9] = '?';
}
}
// 檢查重複
int flag = 0;
flag = chachong(i, daan, timu);
if (flag == 1) {
i--;
}
i++;
}
}
關鍵思路與註釋說明:
引數檢查: 首先,函式檢查輸入引數 n 是否大於 0 且小於 100, r 是否大於等於 10。若引數不符合規定,則輸出錯誤資訊並結束函式。
隨機數生成: 使用 rand() 函式生成兩個範圍在 0 到 r-1 之間的隨機整數 num1 和 num2,並生成一個隨機運算子。
運算和填充陣列: 根據隨機生成的運算子,計算運算結果 sum。如果是除法,則呼叫 chufa 函式處理分數情況。然後將題目和答案填入陣列 timu 和 daan 中。
檢查重複: 檢查當前生成的題目是否與之前的題目重複。如果有重複,則重新生成當前題目。
迴圈生成: 透過迴圈執行以上步驟,直到生成了 n 條不重複的題目為止。
六.測試執行






七.專案小結:
成功之處:
完成了基本功能,能夠生成指定數量、指定範圍的四則運算題目。
程式碼邏輯清晰,函式模組化,易於理解和維護。
使用了適當的註釋,提高了程式碼的可讀性。
結對合作促進了程式碼質量和效率的提升。
失敗或不足之處:
缺乏錯誤處理機制,對於無效輸入或異常情況處理不夠完善。
程式碼中可能存在潛在的漏洞或錯誤,需要進一步測試和除錯。
沒有考慮到生成的題目和答案可能會很大,導致陣列越界或記憶體溢位的風險。
結對感受:
在結對程式設計過程中,我學會了更好地傾聽和理解他人的意見,也學會了更有效地表達自己的想法
附件1:

graph TD; A(開始) --> B(檢查引數是否有效) B -->|無效| C[輸出錯誤資訊並結束程式] B -->|有效| D(初始化變數 i, sum) D --> E{i < n} E -->|是| F(生成隨機數 num1, num2, operator) F --> G(計算 sum) G --> H{sum是否整數} H -->|是| I(處理整數情況) H -->|否| J(處理分數情況) I --> K(填充答案和題目陣列) J --> K K --> L(檢查重複) L -->|是| M(重來) L -->|否| N{題目是否生成完成} N -->|是| O(輸出題目和答案) N -->|否| P(增加 i) P --> E O --> A

相關文章