天天看點

作業一

一、需求分析

         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

二、功能設計

  • 基本功能
  1. 每個數字定義為一個包含分子、分母、符号的結構體
  2. 随機生成數字
  3. 随機生成四則運算符号
  4. 随機生成括号
  5. 在重新定義的數字上實作通分、約分、以及加減乘除的基本操作
  6. 并将統計結果儲存到txt檔案
  7. 通過指令行傳遞參數

三、設計實作

  • 整體思路上就是生成表達式後,結果形式使用分數來表示,是以主要在于分子分母的計算以及約分,最後的結果我隻記錄了一個結果總數。

四、代碼說明

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