日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2016012090+小学四则运算练习软件项目报告

發布時間:2025/3/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2016012090+小学四则运算练习软件项目报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

?

Coding.net原碼倉庫地址:https://git.coding.net/Ai_Code/Work.git

?

?

?目錄:

一、需求分析

二、功能設計

三、設計實現

四、算法詳解

五、測試運行

六、代碼

七、總結

八、PSP

九、不足

?


?

一、需求分析:

(一)功能需求

1、基本功能:

程序可接收一個輸入參數n,然后隨機產生n道加減乘除練習題。

2、擴展功能

支持有括號的運算式,包括出題與求解正確答案。

支持真分數的出題與運算。

(二)非功能需求

1、每個數字在 0 和 100 之間,運算符在3個到5個之間。

2、所出的練習題在運算過程中不得出現負數與非整數,比如3÷5+2=2.6,2-5+10=7等是不合法的。

3、算式中存在的括號必須大于2個,且不得超過運算符的個數。

4、真分數只需要涵蓋加減法

5、支持運算時分數的自動化簡,且計算過程中與結果都須為真分數。

6、格式要求如下:

當程序接收的參數為4時,以下為一個輸出文件示例。

2018010203

13+17-1=29

11*15-5=160

3+10+4-16=1

15÷5+3-2=4

(三)設計需求

1、只能使用Java語言。

2、生成文件時請使用相對路徑,生成的txt 文件需在項目的根目錄下,可直接查看演示示例。

3、使用的JDK版本為 jdk8u161。

4、使用的JRE版本為jre8u161。

5、不得使用除限定版本jdk與jre外的額外依賴包。

6、時間限制:15天。

二、功能設計:

(一)基本功能

1、能生成文件,假如文件生成有誤,會報錯,會有提示。為了方便用戶的查找錯誤和使用。

2、輸入的保證是數字,如果不是數字,會有提示,并且可以重新輸入。為了不用重新啟動程序,方便輸入。

3、輸入一個參數n,然后隨機產生n道加減乘除算術題。保證加減乘除四個運算符的相對平衡,出現的次數相對均等。盡量能出現連除,連減的算術題。且保證在算數過程中,不出現負數,和小數。

4、在沒仔細看要求之前,我打算生成一個窗口,同學可以輸入答案,并且可以進行判斷正誤,然后給出結果。

(二)擴展功能

1、在生成括號的過程中,打算隨機生成括號,并且保證括號的合法性。比如(3*8)+5=29; ?6+(7)*8=62; ?(2*3+4)=10; 等式子是不合法的。

2、在生成分數的過程中,保證生成真分數,并且化成最簡的。

3、在計算真分數的過程中,保證過程中不會出現假分數和負數。因為沒有乘除運算,所以不用考慮優先級,可以邊生成邊運算。且保證結果是最簡真分數。

三、設計實現

在設計實現中,我把總的程序分成三個模塊:兩個函數和一個主函數。便于實現功能,減少工作量。

(一)優先級類

功能:此類是一個帶參的有返回值的類,返回的是一個整數(int)。

目的:通過返回來的int的大小,從而來判斷符號的優先級。

關系:此類是一個內部類,可以直接調用使用。

此類較簡單,未畫流程圖。

(二)gcd 類

功能:此類是一個帶參的有返回值的類,返回的是一個整數,此整數是兩個數的最大公因數。

目的:此類通過輾轉相除法計算兩個數的最大公因數,為了生成最簡真分數和化簡最終結果。

關系:此類還是一個內部類,可以直接調用。

流程圖

(三)兩個函數相互獨立。

四、算法詳解

(一)文件生成

要求:能生成文件,假如文件生成有誤,會報錯,會有提示。

要完成這個功能,需要使用PrintStream類,為了生成的txt 文件需在項目的根目錄下,則需要直接使用"result.txt",不加任何路徑。

1 try { 2 PrintStream ps = new PrintStream("../result.txt");//生成文件 3 System.setOut(ps); 4 }catch(Exception e) { 5 System.out.println("文件生成錯誤");//提示 6 }

?

(二)輸入整數

要求:輸入的保證是數字,如果不是數字,會有提示,并且可以重新輸入。

要實現這個功能,需要使用Integer.parseInt(args[0]);語句,在命令行中輸入,如果有錯誤會有提示

1 try 2 { 3 n=Integer.parseInt(args[0]);//命令行輸入 4 if(n<=0)System.out.println("輸入的不是正整數,請重新輸入!"); 5 } 6 catch (Exception e) 7 { 8 System.out.println("輸入的不是正整數,請重新輸入!"); 9 }

?

?運行結果如下:

(三)隨機數的使用

要求:保證加減乘除四個運算符的相對平衡,出現的次數相對均等,不出現負數,和小數。需要使用“數組+隨機數”。

程序過程是:一個數組中存儲有('+','-','*','/'),然后隨機生成一個0-3的數,從而運算符可以隨機生成;當a%b≠0時,會進入循環,重新生成a,b,直到整除為止。負數的處理與之類似。

1 char[] arr= {'+','-','*','÷'}; 2 int temp=rand.nextInt(4);
3 charArr=arr[temp]; 4
5 int a0=rand.nextInt(100);//數字范圍 0-99 6 int a1=rand.nextInt(100); 7 while(a0%a1!=0)//為了保證整除 8 { 9 a0=rand.nextInt(100); 10 a1=rand.nextInt(99)+1;//為了保證不出現0 11 } 12 while(a0<a1)//保證不出現負數 13 { 14 a0=rand.nextInt(100); 15 a1=rand.nextInt(100); 16 }

如果不能整除或者a0-a1<0,則會重新生成隨機數。

(四)保證括號的合法性

為了不生成(3*8)+5=29; ?6+(7)*8=62; ?(2*3+4)=10;此類括號。我們需要對優先級進行判斷,如果前者優先級低于后者,則會生成括號。比如6-4*2;因為后者優先級高于前者,所以會生成括號,即(6-4)*2;

1 if(panduan(charArr)<panduan(charArr2))//優先級判斷 2 { 3 if(charArr2=='÷') 4 { 5 if(b0==0)b0++; 6 while(sum%b0!=0)//如果不能整除 重新生成隨機數 7 { 8 b0=rand.nextInt(99)+1; 9 } 10 sum=sum/b0;//計算 11 } 12 if(charArr2=='*')sum=sum*b0; 13 brr="("+brr+")"+""+charArr2+""+b0;//滿足條件 生成括號 14 }

【注釋】panduan()是一個內部類,用來判斷符號優先級。

(五)panduan——優先級類的實現

1 public static int panduan(char c)//判斷優先級 2 { 3 if(c=='(')return 0; 4 if(c=='+'||c=='-')return 1; 5 if(c=='*'||c=='÷')return 2; 6 return -1; 7 }

(六)最大公因數——gcd類

要求:在生成分數的過程中,保證生成真分數,并且化成最簡的。需要使用輾轉相除法求最大公因數,然后分子分母同除以最大公因數化簡。保證是真分數的代碼和保證非負數的代碼類似,就不寫出來了。(輾轉相除法就是,當a%b==0時,則b就是最大公因數,證明略)。

1 public static int gcd(int x,int y)//求最大公因數 2 { 3 while(true) 4 { 5 if(x%y==0)return y; 6 int temp=y; 7 y=x%y; 8 x=temp; 9 } 10 }

(七)符號的多樣性

題目要求:每道題的符號數至少2個,實現這個算法比較簡單,思路就是如果一道題中所有的符號都一樣,那么則題目重新生成

1 ...... 2 if (charArr != charArr2)//如果和前一個符號不相同,則標記為1.此式子合法,生成此式子 3 flag3 = 1; 4 charArr = charArr2; 5 } 6 if (flag3 == 1) 7 System.out.println(brr + "=" + sum);

?

?五、測試運行

?

六、代碼

整數運算

在計算值得過程中,用到了棧的思想。但是我的思路主要還是,邊生成邊運算。即生成完畢后,結果就直接出來了。首先保證第一個數和第二個數能夠整除或者相減大于0。如果是6-4,當下一個字符的優先級高于當前優先級時,即6-4*2,則會生成括號。保證在計算過程中不出現負數,即為(6-4)*2。在生成*2之前會用sum記錄下當前過程值,即sum=6-4;然后和下一個運算符進行運算,即sum=sum*2。當生成完畢之后,結果也就出來了。

1 for(int i=1;i<charCoun;i++) 2 { 3 int temp1=rand.nextInt(4); 4 char charArr2=arr[temp1]; 5 int b0=rand.nextInt(100); 6 if(panduan(charArr)<panduan(charArr2))//優先級判斷 7 { 8 if(charArr2=='÷') 9 { 10 if(b0==0)b0++; 11 while(sum%b0!=0)//如果不能整除 重新生成隨機數 12 { 13 b0=rand.nextInt(99)+1; 14 } 15 sum=sum/b0;//計算 16 } 17 if(charArr2=='*')sum=sum*b0; 18 brr="("+brr+")"+""+charArr2+""+b0;//滿足條件 生成括號 19 } 20 else 21 { 22 if(charArr2=='÷') 23 { 24 if(b0==0)b0++; 25 while(sum%b0!=0)//同上 保證整除 26 { 27 b0=rand.nextInt(99)+1; 28 } 29 sum=sum/b0;//計算 30 } 31 if(charArr2=='-') 32 { 33 while(sum<b0)//同上保證大于0 34 { 35 b0=rand.nextInt(100); 36 } 37 sum=sum-b0; 38 } 39 if(charArr2=='+')sum=sum+b0;//計算 40 if(charArr2=='*')sum=sum*b0;//計算 41 brr=brr+""+charArr2+""+b0; 42 } 43 charArr=charArr2; 44 }

?

真分數的運算

?

1 for(int i=1;i<charCoun1;i++) 2 { 3 temp1=rand.nextInt(2); 4 charArr=arr1[temp1]; 5 int num2x=rand.nextInt(20); 6 int num2y=rand.nextInt(19)+1;//同上 7 while(num2x>=num2y) 8 { 9 num2x=rand.nextInt(20); 10 num2y=rand.nextInt(19)+1;//分母不能大于0 11 g=gcd(num2x,num2y); 12 num2x/=g; 13 num2y/=g; 14 } 15 if(charArr=='-') 16 { 17 while(sumx*num2y-sumy*num2x<0)//相減之后,如果小于0,重新生成 18 { 19 num2x=rand.nextInt(20); 20 num2y=rand.nextInt(19)+1; 21 g=gcd(num2x,num2y); 22 num2x/=g; 23 num2y/=g; 24 } 25 sumx=sumx*num2y-sumy*num2x;//計算 分子 26 sumy=sumy*num2y;//計算分母 27 } 28 if(charArr=='+') 29 { 30 while(sumx*num2y+sumy*num2x>sumy*num2y) 31 { 32 num2x=rand.nextInt(20); 33 num2y=rand.nextInt(19)+1; 34 g=gcd(num2x,num2y); 35 num2x/=g; 36 num2y/=g; 37 } 38 sumx=sumx*num2y+sumy*num2x;//同上 39 sumy=sumy*num2y; 40 } 41 brr2=brr2+""+charArr+""+num2x+"/"+num2y;//生成式子 42 } 43 g=gcd(sumx,sumy); 44 if(sumx==0)System.out.println(brr2+"="+sumx); 45 else System.out.println(brr2+"="+sumx/g+"/"+sumy/g); 46

?

?

生成括號

1 if(panduan(charArr)<panduan(charArr2))//優先級判斷 2 { 3 if(charArr2=='÷') 4 { 5 if(b0==0)b0++; 6 while(sum%b0!=0)//如果不能整除 重新生成隨機數 7 { 8 b0=rand.nextInt(99)+1; 9 } 10 sum=sum/b0; 11 } 12 if(charArr2=='*')sum=sum*b0; 13 brr="("+brr+")"+""+charArr2+""+b0;//滿足條件 生成括號 14 }

七、總結

1、對任務進行逐步分解和細化,分成若干個子任務,每個子任務只完成部分完整功能,并且可以通過函數來實現;比如此四則運算中的panduan類和gcd類。通過生成兩個內部類,使程序模塊化,來簡化代碼。最后在主函數中進行調用實現。

2、降低耦合,控制了程序設計的復雜性,提高了代碼的重用性。但是由于個人編程習慣問題,仍有一些功能沒有進行模塊化。之后我會對博客和代碼進行更新。

3、此程序最大的難點在于,生成運算式;僅僅生成運算式很簡單,如果加上不能出現負數和小數等限制條件后,度就大大增加了。因為我們無法保證是否能整除,我們可以通過重新生成,保證整除;但是不一定保證沒有負數,雖然可以重新生成隨機數,使其大于0,但是你又不能保證是否可以整除了。所以這一點有點難。

4、有的同學會說,我先可以生成,如果滿足條件再讓其輸出。這樣的話,你很難保證字符均衡。意思就是說。你生成的算數式中,多以'+','*'為主,因為能整除的概率實在太小了。

5、還有一種方法,就是限制條件。就是讓'-','/'等運算符不能連續出現。這種方法的缺點在于:生成的式子不能多元化了,比較單一。

6、括號的生成也是一個難點,一是我們要括號的生成隨機化,二是我們要生成的括號合法化。很難保證兩者都很完美。

7、真分數,這個比較簡單。因為他只需要進行加減運算,所以在保證合法的情況下,可以邊生成邊運算,直接得到結果。

8、整數的計算也是一個難點。需要用到棧的思想,和優先級的判斷,如果在C++中,它直接有棧的容器,比較簡單。(java不太清楚)

八、PSP

PSP

任務內容

計劃時間(min)

完成時間(min)

Planning

計劃

3

3

? ?? Estimate

? ? 估計這個任務需要多少時間,并規劃大致工作步驟

3

3

Development

開發

150

310

? ? Analysis

? ? 需求分析

10

15

? ? Design Spec

? ? 生成文檔

0

0

? ? Design Review

? ? 設計復審

0

0

? ? Coding Standard

? ? 代碼規范

5

5

? ? Design

? ? 具體設計

30

50

? ? Coding

? ? 具體編碼

90

60

? ? Code Review

? ? 代碼復審

0

0

? ? Test

? ? 測試

15

180

Reporting

報告

123

213

? ? Test Report

? ? 測試報告

0

0

? ? Size Measurement

? ? 計算工作量

3

3

?  Postmortem& ProcessImprovement Plan

? ? 事后總結,?并提出過程改進計劃

120

210

1、因為沒有生成文件等一系列過程,導致在具體設計和代碼編寫的時候花了大量時間。尤其是測試,一直出現bug,調bug花了我大量時間。不是不能保證整除,就是出現負數。有時候還報除0異常,當時就要崩潰了。。。。

2、因為是個人項目,所以感覺自己能看懂就行,不用管其他人,所以一些過程就直接略過了。在以后團隊工作中,我會認真完成各項工作,方便未來的修改。

?九、不足

?此程序的不足之處在于:此程序無法生成這類式子:2+6*3=20。原因在于后者優先級高于前者,在生成過程中會產生(2+6)*3=24 種式子。之后我會繼續進行修改和更新,謝謝大家觀看!(求贊)。

?

轉載于:https://www.cnblogs.com/xia520/p/8615109.html

總結

以上是生活随笔為你收集整理的2016012090+小学四则运算练习软件项目报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。