一、需求分析
1. 使用 -n 參數控制生成題目的個數,例如
Myapp.exe -n 10 -o Exercise.txt
-
将生成10個題目。
2. 使用 -r 參數控制題目中數值(自然數、真分數和真分數分母)的範圍,例如
Myapp.exe -r 10
将生成10以内(不包括10)的四則運算題目。該參數可以設定為1或其他自然數。該參數必須給定,否則程式報錯并給出幫助資訊。
3. 生成的題目中如果存在形如e1 ÷ e2的子表達式,那麼其結果應是真分數。
4. 每道題目中出現的運算符個數不超過3個。
5. 程式一次運作生成的題目不能重複,即任何兩道題目不能通過有限次交換+和×左右的算術表達式變換為同一道題目。例如,23 + 45 = 和45 + 23 = 是重複的題目,6 × 8 = 和8 × 6 = 也是重複的題目。3+(2+1)和1+2+3這兩個題目是重複的,由于+是左結合的,1+2+3等價于(1+2)+3,也就是3+(1+2),也就是3+(2+1)。但是1+2+3和3+2+1是不重複的兩道題,因為1+2+3等價于(1+2)+3,而3+2+1等價于(3+2)+1,它們之間不能通過有限次交換變成同一個題目。
生成的題目存入執行程式的目前目錄下的Exercises.txt檔案,格式如下:
1. 四則運算題目1
2. 四則運算題目2
……
其中真分數在輸入輸出時采用如下格式,真分數五分之三表示為3/5,真分數二又八分之三表示為2’3/8。
6. 在生成題目的同時,計算出所有題目的答案,并存入執行程式的目前目錄下的Answers.txt檔案,格式如下:
1. 答案1
2. 答案2
特别的,真分數的運算如下例所示:1/6 + 1/8 = 7/24。
7. 程式應能支援一萬道題目的生成。
8. 程式支援對給定的題目檔案和答案檔案,判定答案中的對錯并進行數量統計,并會輸出所有題目中重複的題目,輸入參數如下:
Myapp.exe -e <exercisefile>.txt -a <answerfile>.txt -o Grade.txt
二、功能設計
- 基本功能
- 每個數字定義為一個包含分子、分母、符号的結構體
- 随機生成數字
- 随機生成四則運算符号
- 随機生成括号
- 在重新定義的數字上實作通分、約分、以及加減乘除的基本操作
- 并将統計結果儲存到txt檔案
- 通過指令行傳遞參數
三、設計實作
- 整體思路上就是生成表達式後,結果形式使用分數來表示,是以主要在于分子分母的計算以及約分,最後的結果我隻記錄了一個結果總數。
四、代碼說明
void Question_CreateAndPrint(int count, char ** answer, int range)
{
srand(time(NULL));
for(int i = 0; i < count; i++)
{
//生成數值
int array[4];
Array_Num_Create(array, range);
int tmp = rand()%4;
switch (tmp)
{
case 0:
{
printf("%d. %d/%d+%d/%d\n", i+1, array[0], array[1], array[2], array[3]);
int n1 = array[0]*array[3]+array[1]*array[2];
int n2 = array[1]*array[3];
if (n1%n2 == 0) {
sprintf(answer[i], "%d", n1/n2);
}
else {
yuefen(n1, n2);
sprintf(answer[i], "%d/%d", n1, n2);
}
break;
}
case 1:
{
printf("%d. %d/%d-%d/%d\n", i+1, array[0], array[1], array[2], array[3]);
int n1 = array[0]*array[3]-array[1]*array[2];
int n2 = array[1]*array[3];
if (n1 > 0) {
if (n1%n2 == 0) {
sprintf(answer[i], "%d", n1/n2);
}
else {
yuefen(n1, n2);
sprintf(answer[i], "%d/%d", n1, n2);
}
}
else if (n1 < 0) {
n1*=-1;
if (n1%n2 == 0) {
sprintf(answer[i], "-%d", n1/n2);
}
else {
yuefen(n1, n2);
sprintf(answer[i], "-%d/%d", n1, n2);
}
}
else if (n1 == 0) {
sprintf(answer[i], "%d", 0);
}
break;
}
case 2:
{
printf("%d. %d/%d*%d/%d\n", i+1, array[0], array[1], array[2], array[3]);
int n1 = array[0]*array[2];
int n2 = array[1]*array[3];
if (n1%n2 == 0) {
sprintf(answer[i], "%d", n1/n2);
}
else {
yuefen(n1, n2);
sprintf(answer[i], "%d/%d", n1, n2);
}
break;
}
case 3:
{
printf("%d. %d/%d/%d/%d\n", i+1, array[0], array[1], array[2], array[3]);
int n1 = array[0]*array[3];
int n2 = array[1]*array[2];
if (n1%n2 == 0) {
sprintf(answer[i], "%d", n1/n2);
}
else {
yuefen(n1, n2);
sprintf(answer[i], "%d/%d", n1, n2);
}
break;
}
default: break;
}
}
}

五.PSP展示(機關:天)
PSP2.1 | Personal Software Process Stages | Time Senior Student | Time |
Planning | 計劃 | 1.5 | 1 |
· Estimate | 估計這個任務需要多少時間 | ||
Development | 開發 | 1.2 | 0.8 |
· Analysis | 需求分析 (包括學習新技術) | 10分鐘 | |
· Design Spec | 生成設計文檔 | 5分鐘 | 0分鐘 |
· Design Review | 設計複審 | ||
· Coding Standard | 代碼規範 | 2分鐘 | |
· Design | 具體設計 | 20分鐘 | |
· Coding | 具體編碼 | 1天 | 0.8天 |
· Code Review | 代碼複審 | ||
· Test | 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | ||
· | 測試報告 | ||
計算工作量 | |||
并提出過程改進計劃 | 50分鐘 | ||
六、小結
簡單寫了一下作業,之前那篇沒寫實際内容,這篇補上。
最後附上代碼位址:https://git.coding.net/helloc14/Demo.git