個人項目——四則運算題目的隨機生成


任務:實現一個自動生成小學四則運算題目的命令行程序。


 

一、時間預估及實際花費時間

 

PSP2.1

Personal Software Process Stages

Time

Planning

計划

 

  · Estimate

  · 估計這個任務需要多少時間

15h

Development

開發

 

  · Analysis

  · 需求分析 (包括學習新技術)

2h

  · Design Spec

  · 生成設計文檔

0.5h

  · Design Review

  · 設計復審 (和同事審核設計文檔)

0.5h

 · Coding Standard

  · 代碼規范 (為目前的開發制定合適的規范)

1h

  · Design

  · 具體設計

3h

  · Coding

  · 具體編碼

3h

  · Code Review

  · 代碼復審

1h

  · Test

  · 測試(自我測試,修改代碼,提交修改)

3h

Reporting

報告

 

  · Test Report

  · 測試報告

1h

  · Size Measurement

  · 計算工作量

1h

  · Postmortem & Process Improvement Plan

  · 事后總結, 並提出過程改進計划

0.5h

 

合計

16.5h

 


 

二、項目分析與設計

  這項任務要求我們能夠隨機,不重復的生成小學四則運算表達式。在生成的同時能夠計算出這些表達式的標准答案,並能對已有的作答文件進行對錯判斷。

        從項目的需求進行如下分析:

    1.既然是隨機生成表達式,必然會用到隨機型變量。

    2.對標准答案有需求,所以計算表達式是一個重要的模塊。

    3.對錯評判涉及到兩個文件內容的比較。

    

    由項目需求及分析可作出如下大致的設計方案:

    1.可構造一個表達式類,類中主要有隨機生成表達式的方法。

    2.需要一個計算表達式的函數。而中綴表達式通常需要轉換為后綴表達式然后再進行計算,這就設計到了兩個函數。

    3.項目需要進行文件的讀寫,每次運行時要檢查文件的狀態,在進行新的生成時要清空上一次數據。

 

    使用較多的中綴表達式轉后綴表達式函數:

   

  

public static ArrayList toBehind(string mid)
        {
            ArrayList arr=new ArrayList();
            int top=-1;
            char p=' ';
            char[] a=new char[10];
            int math = 0;
            Boolean sign = false;
            for(int i=0;i<mid.Length;i++)
            {
                Boolean continuesign = false;
                p=mid[i];     //取表達式中一個元素
                while(p>='0'&&p<='9')   //如果是運算數則直接輸出
                {
                    if (sign)
                    {
                        math = math * 10 + (p - '0');
                        continuesign = true;
                        break;
                    }
                    else
                    {
                        math = p - '0';
                        sign = true;
                        continuesign = true;
                        break;
                    }
                }
                if (continuesign)
                    continue;
                if (sign)
                {
                    arr.Add(math);
                    math = 0;
                    sign = false;
                }
                switch(p)
                {
                    case '#' :
                        while(top>=0)
                            arr.Add(a[top--]);
                        return arr;
                    case ')' :
                        while (a[top]!='(')
                        {
                            arr.Add(a[top]);
                            top--;
                        }
                        top--;  //放棄讀到的')',並且棧頂‘(’退棧
                        break;
                    default :
                        if(top==-1)
                        {
                            a[++top]=p;
                            break;
                        }
                        if(Program.adv(a[top],p)==1) // 若當前運算符優先級低則取代棧頂運算符,原運算符出棧
                        {
                            arr.Add(a[top]);
                            a[top]=p;
                        }
                        else   //若當前運算符優先級高於棧頂運算符,進棧
                            a[++top]=p;
                        break;
                    }
            }
            return null;
        }

 


三、性能分析圖

  為了了解這個程序的性能,使用了VS的性能分析工具,得到了以下兩張性能分析圖。

  

  

  

 


四、測試實例
  

  1/4 ÷ 3/9
  4/7 × 1/3
  2/5 ÷ 4/6
  4 + 8 + 2
  5/6 + 5/8
  (5 × 4) × 1 × 8
  2 × 9 + (4 × 3)
  2/4 + 5/7
  8/9 × 1/3
  3 + (2 × 5)

  在Answers.txt能夠准確得出答案:

  

  3/4
  4/21
  3/5
  14
  11/24
  160
  30
  1'3/14
  8/27
  13


五、個人項目總結

    通過這次個人項目,我學到了很多經驗和教訓:

  1. 簡單的題目往深處去探討往往並不簡單。這次個人項目的生成四則運算表達式看似很簡單,實際上蘊含着查重,分數等諸多復雜的問題,需要我們做好充分的設計。
  2. 設計對於一個項目十分重要。以前經常喜歡拿到題目,構思好算法就直接碼代碼。結果在過程中才發現自己寫的代碼邏輯不盡人意。
  3. 麻雀雖小,五臟俱全。這雖然僅是一個為期一周的個人項目,卻包含了項目的各個要素。諸如設計,測試等步驟必不可少,否則便會遇到難以預料的問題。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM