1. 程式人生 > >2016012006小學四則運算練習軟件項目報告

2016012006小學四則運算練習軟件項目報告

span post 擴展 練習題 ron fin size 程序 所有

項目源碼地址:https://coding.net/u/cuixh998/p/java.week2work2

目錄中的result.txt文件見測試效果。

1.需求分析

軟件基本功能要求如下:

Ⅰ程序可接收一個輸入參數n,然後隨機產生n道加減乘除(分別使用符號+-*÷來表示)練習題,每個數字在 0 和 100 之間,運算符在3個到5個之間。

Ⅱ每個練習題至少要包含2種運算符。所出的練習題在運算過程中不得出現負數與非整數。

Ⅲ練習題生成好後,將學號與生成的n道練習題及其對應的正確答案輸出到文件“result.txt”中,不要輸出額外信息,文件目錄與程序目錄一致。

軟件附加功能要求如下:

Ⅰ支持有括號的運算式,包括出題與求解正確答案。註意,算式中存在的括號必須大於2個,且不得超過運算符的個數。

Ⅱ擴展程序功能支持真分數的出題與運算(只需要涵蓋加減法即可)。註意在實現本功能時,需支持運算時分數的自動化簡,比如 1/2+1/6=2/3,而非4/6,且計算過程中與結果都須為真分數。

2.功能設計

Ⅰ基本功能:滿足軟件基本功能要求的前提下,實現四則運算的功能,並能夠將題目輸出到文本文件中。

Ⅱ擴展功能:可以生成可以真分數的運算表達式,且分數可以自動化簡。

3.設計實現

編碼過程中只用了一個類通過調用不同的方法處理問題,實現程序的功能。

4.算法詳解

部分代碼如下,加入了一些註釋,主要是采用了邊生成邊計算的方法。

  1 flag=0;//上一個符號為乘除,賦值1
  2         temp=0;//
存儲乘除多項式臨時結果 3 int count=0;//目前在計算的是第count+1個多項式 4 for(i=0;i<number-1;i++) {//第一次循環,確定乘除號兩邊的數字 5 if(fh[i]==3||fh[i]==4) { 6 if(flag==0&&fh[i]==4) { 7 czs[i]=1+(int)(Math.random()*99); 8 while(judge(czs[i])==false
){ 9 czs[i]=1+(int)(Math.random()*99); 10 } 11 czs[i+1]=1+(int)(Math.random()*99); 12 while(czs[i]%czs[i+1]!=0) { 13 czs[i+1]=1+(int)(Math.random()*99); 14 } 15 flag=1; 16 temp=czs[i]/czs[i+1]; 17 } 18 else if(flag==0&&fh[i]==3){ 19 czs[i]=1+(int)(Math.random()*99); 20 czs[i+1]=1+(int)(Math.random()*99); 21 flag=1; 22 temp=czs[i]*czs[i+1]; 23 } 24 else if(flag==1&&fh[i]==3) { 25 czs[i+1]=1+(int)(Math.random()*99); 26 temp*=czs[i+1]; 27 } 28 else { 29 czs[i+1]=1+(int)(Math.random()*99); 30 while(temp%czs[i+1]!=0) { 31 czs[i+1]=1+(int)(Math.random()*99); 32 } 33 temp/=czs[i+1]; 34 } 35 } 36 else if(flag==1&&(fh[i]==1||fh[i]==2)){//初始化 37 ans[count++]=temp; 38 flag=0; 39 temp=0; 40 } 41 } 42 if(flag==1) {//若最後一個符號為乘除 43 ans[count++]=temp; 44 flag=0; 45 temp=0; 46 } 47 int finans=0;//最終結果 48 count=0; 49 for(i=0;i<number-1;i++) {//第二次循環,確定加減號兩邊的數字,並計算最終結果 50 if(fh[i]==1||fh[i]==2) { 51 if(i==0) { 52 czs[i]=1+(int)(Math.random()*99); 53 finans=czs[i]; 54 } 55 else if(i==number-2) { 56 if(fh[i-1]==1||fh[i-1]==2) { 57 czs[i]=1+(int)(Math.random()*99); 58 if(finans==0&&fh[i-1]==2) { 59 fh[i-1]=1; 60 } 61 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 62 while(finans<0) { 63 finans=finans+czs[i]+czs[i]; 64 czs[i]=1+(int)(Math.random()*99); 65 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 66 } 67 } 68 // 69 czs[i+1]=1+(int)(Math.random()*99); 70 if(finans==0&&fh[i]==2) { 71 fh[i]=1; 72 } 73 finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]); 74 while(finans<0) { 75 finans=finans+czs[i+1]+czs[i+1]; 76 czs[i+1]=1+(int)(Math.random()*99); 77 finans=((fh[i]==1)?finans+czs[i+1]:finans-czs[i+1]); 78 } 79 } 80 else { 81 if(fh[i-1]==1||fh[i-1]==2) { 82 czs[i]=1+(int)(Math.random()*99); 83 if(finans==0&&fh[i-1]==2) { 84 fh[i-1]=1; 85 } 86 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 87 while(finans<0) { 88 finans=finans+czs[i]+czs[i]; 89 czs[i]=1+(int)(Math.random()*99); 90 finans=((fh[i-1]==1)?finans+czs[i]:finans-czs[i]); 91 } 92 } 93 } 94 } 95 else { 96 if(i==0) { 97 while(fh[i+1]==3||fh[i+1]==4) { 98 i++; 99 if(i==number-2) { 100 break; 101 } 102 } 103 finans=ans[count++]; 104 } 105 else { 106 finans=(fh[i-1]==1)?finans+ans[count++]:finans-ans[count++]; 107 if(finans<0) { 108 fh[i-1]=1; 109 finans=finans+ans[count-1]+ans[count-1]; 110 } 111 if(i>=number-2) { 112 break; 113 } 114 while(fh[i+1]==3||fh[i+1]==4) { 115 i++; 116 if(i>=number-2) { 117 break; 118 } 119 } 120 } 121 } 122 }

5.測試運行

結果如圖。

技術分享圖片

技術分享圖片

6.部分代碼片段

首先是建立一個數組,其中包含0到100的所有素數,同時,通過數組滿足程序基本功能的限制,即 3到5的隨機數,最多5個操作數,乘除多項式結果,最多2個,最多四個運算符,符號若存在不同則改為1,並先行隨機生成,再讓符號保證不相同並隨機替換。

 1 public static void work(int x) {
 2 //        int sushu[] = {2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97};
 3 //        int length=sushu.length;
 4         int number=3+(int) (Math.random()*3);
 5         int[] czs=new int[5];
 6         int[] ans=new int[2];
 7         int[] fh=new int[4];
 8         int i;
 9         int flag=0;
10         int temp;
11         for(i=0;i<number-1;i++) {
12             fh[i]=1+(int) (Math.random()*4);
13             if(fh[i]!=fh[0]) {
14                 flag=1;
15             }
16         }
17         if(flag==0) {
18             while((temp=1+(int) (Math.random()*4))!=fh[0]) {
19                 fh[(int) (Math.random()*(number-1))]=temp;
20                 break;
21             }
22         }

7.總結

編程前:因為自己的java基礎不好,有一種畏難心理,小心謹慎的分析項目需求以及如何一步步去實現它,而且需要使用java語言,必須拾起課本重新走一遍,壓力挺大的,總覺得自己做不好。

編程過程中:可以說是困難重重了,接二連三的問題撲面襲來,主要體現在哪裏?1.編碼嚴重不足,動手能力沒有得到充分的鍛煉,導致“眼高手低”。2.java基礎差,不斷的去翻書,去百度,去請教舍友大佬們。3.項目經驗不足,不是很熟悉整個流程,僅保留在書本方面的知識。

測試階段:一步一步去檢查,測試,報錯之後一點點找原因,讓人頭大,甚至想回爐重造,幹脆重新弄算了,但也得到了舍友的很大幫助,有時就是這樣,或許自己發現不了的問題,在別人眼裏,一看就能看出來。怎麽說呢,最終成功運行的時候挺激動的,感覺增加了自己的經驗,心裏邊有了些自信,多了些動力,也是打算多做一些java的題來提高自己的編碼能力了。

8.PSP展示

技術分享圖片

2016012006小學四則運算練習軟件項目報告