簡體中文
、繁體中文
、English
因爲上週已經把大的框架設計好了、也實現了整數運算。故本週的主要任務爲真分數的添加、輸出題目到文件、從文件讀取題目並判題、多語言的實現、Junit測試。html
RandomFenshu
類返回形式正確的真分數getRational
類用於後綴轉結果計算時使用ZhongzhuiToHouzhui
、getResult
類,使其適配分數的計算ShuChuTimu
將隨機生成的題目輸出到文件sizeyunsuan
使其能從文件中讀題、判題、並將結果輸出到另外一個文件Language
實現多語言PrintStream
成功將題目寫入文件,但出現了以下的問題:\r\n
,成功解決了問題。FileInputStream
輸入流指向最開始生成題目的文件,而後用InputStreamReader
將字節流轉爲字符流,再用BufferReader
添加輔助功能。StringTokenizer
將公式以「:」和「=」分割,從而計算出結果。字符串名.split(" ")
的方法,故考慮使用StringTokenizer
將公式以空格分割開。後綴出結果:一樣使用StringTokenizer
將公式以空格分開,帶真分數的計算考慮將全部的數都化爲分數進行計算,即計算時將出棧的兩元素都轉化爲getRational
型,再進行計算,最後返回字符串型結果。java
遇到的問題:沒有考慮分母爲1的狀況,後來修改程序得以解決。git
Language
抽象類,用幾種語言繼承該抽象類實現多態ChooseLanguage
類,進行語言的選擇與識別equals
時發現比較產生異常,所以將字符串轉爲字符數組,進行比較,解決了問題~import java.util.*; import java.lang.*; public class getRandom { String s; String str[]=new String[100]; char a,b; //a:插入的數字,b:插入的符號 int x; //x:插入符號的個數 char flag1,flag3; //flag1:左括號,flag3:右括號 int flag2=0,flag4=0; //flag2:插入左括號的個數,flag4:控制不連續插入左右括號 public void storeRandom(int n) { for(int i=1;i<=n;i++) { //存儲隨機生成的的每一個公式 s=""; x=(int)(Math.random()*6)+3; Random r3=new RandomFuhao(); flag1=r3.getRandom(); for(int j=1;j<=x;j++) { //依次插入數字、公式 Random r1=new RandomNum(); a=r1.getRandom(); s=s+(int)a+" "; if(flag2>0&&flag4==0) { Random r6=new RandomFuhao(); flag3=r6.getRandom(); if(flag3=='#') { s=s+')'+" "; flag2--; } } flag4=0; Random r2=new RandomChar(); b=r2.getRandom(); s=s+b+" "; Random r4=new RandomFuhao(); flag1=r4.getRandom(); if(flag1=='#'&&j<x-1) { s=s+'('+" "; flag2++; flag4=1; } } RandomFuhao r7=new RandomFuhao(); if (r7.getRandom()=='#') { //控制隨機插入分數 Random r5 = new RandomNum(); s = s + (int) r5.getRandom() + " "; } else { RandomFenshu f=new RandomFenshu(); s=s+f.getFenshu()+" "; } while(flag2!=0) { s=s+")"+" "; flag2--; } str[i]=s; } } public String[] retRandom() { return str; } //返回隨機生成的公式 }
import javax.imageio.IIOException; import java.io.*; import java.util.*; public class ShuchuTimu { public static void main(String[] args) throws FileNotFoundException{ getRandom g=new getRandom(); String string[]; ChooseLanguage c=new ChooseLanguage(); Language l; l=c.choose(); System.out.println(l.getGeshu()); Scanner scanner=new Scanner(System.in); int n=scanner.nextInt(); g.storeRandom(n); string=g.retRandom(); PrintStream ps = new PrintStream("Exercises.txt"); for (int i=0;i<n;i++){ String s = l.getTimi() + (i+1) + ":" + string[i+1] + "\r\n"; System.out.println(s); ps.append(s); } ps.close(); ps.flush(); } }
import java.util.*; import java.lang.*; public class getResult { public String getResult(String s){ Stack<String> stack=new Stack<String>(); //新建棧 String a,b; StringTokenizer t=new StringTokenizer(s); while (t.hasMoreTokens()){ //依次遍歷元素,計算結果 String c=t.nextToken(); if (c.equals("+") || c.equals("-") || c.equals("*") || c.equals("÷")){ //遇到符號,彈出棧頂兩個元素,並計算結果 a=stack.pop(); b=stack.pop(); getRational g1=rational(a); getRational g2=rational(b); stack.push(jisuan(g2,g1,c)); //將計算後的結果從新壓入棧中 } else { //遇到數字,直接入棧 stack.push(c); } } String p=stack.pop(); StringTokenizer t2=new StringTokenizer(p,"/"); String token1=t2.nextToken(); String token2=t2.nextToken(); if (token2.equals("1")) return token1; else return p; } public getRational rational(String a){ int i1,i2; StringTokenizer t1=new StringTokenizer(a,"/"); String s1=t1.nextToken(); String s2; if (t1.hasMoreTokens()){ s2=t1.nextToken(); i1=Integer.parseInt(s1); i2=Integer.parseInt(s2); getRational g1=new getRational(i1,i2); return g1; } else { i1=Integer.parseInt(s1); i2=1; getRational g2=new getRational(i1,i2); return g2; } } public String jisuan(getRational r1,getRational r2,String c){ //計算結果 getRational g=new getRational(0,1); if (c.equals("+")) g=r1.add(r2); else if (c.equals("-")) g=r1.sub(r2); else if (c.equals("*")) g=r1.muti(r2); else g=r1.div(r2); return g.getNumerator()+"/"+g.getDenominator(); } }
import java.io.*; import java.util.*; public class sizeyunsuan { public static void main(String args[]) throws IOException{ ZhongzhuiToHouzhui z=new ZhongzhuiToHouzhui(); getResult r=new getResult(); FileInputStream fis = new FileInputStream("Exercises.txt"); InputStreamReader isr = new InputStreamReader(fis); BufferedReader in = new BufferedReader(isr); Language l; ChooseLanguage recognizeLanguage=new ChooseLanguage(); String s1,s2,s3,s4; String str,str1,str2; String s; String result=null; int count=0,n=0; PrintStream ps=new PrintStream("Result.txt"); while ((str=in.readLine())!=null){ StringTokenizer t1=new StringTokenizer(str,":"); s1=t1.nextToken(); l=recognizeLanguage.recognize(s1,n+1); s2=t1.nextToken(); StringTokenizer t2=new StringTokenizer(s2,"="); s3=t2.nextToken(); s4=t2.nextToken(); s=z.result(s3); result=r.getResult(s); if (s4.equals(result)){ str1=l.right(); count++; } else str1=l.wrong()+result; n++; str2=str+"\r\n"+str1+"\r\n"; ps.append(str2); } FileInputStream fis0 = new FileInputStream("Result.txt"); InputStreamReader isr0 = new InputStreamReader(fis0); BufferedReader in0 = new BufferedReader(isr0); str=in0.readLine(); StringTokenizer t3=new StringTokenizer(str,":"); s1=t3.nextToken(); l=recognizeLanguage.recognize(s1,1); str2=l.wancheng1()+n+l.wancheng2()+((double)count/n)*100+"%"; ps.append(str2); System.out.println(str2); } }
Planning | 計劃 | 預估耗時(分鐘) | 實際耗時 |
---|---|---|---|
Estimate | 預估這個任務須要多長時間 | 1110 | 1580 |
Development | 開發 | ||
Analysis | 需求分析(包括學習新技術) | 40 | 90 |
Design Spec | 生成設計文檔 | 30 | 30 |
Design Review | 設計複審 | 60 | 60 |
Coding Standard | 代碼規範(爲目前的開發制定合適的規範) | 40 | 40 |
Design | 具體設計 | 70 | 70 |
Coding | 具體編碼 | 700 | 1100 |
Code Review | 代碼複審 | 60 | 60 |
Test | 測試(自我測試、修改代碼、提交修改) | 40 | 60 |
Reporting | 報告 | ||
Test Report | 測試報告 | 20 | 20 |
Size Measurement | 計算工做量 | 10 | 10 |
Postmortem&Process Improvement Plan | 過後總結並提出改進計劃 | 40 | 40 |
合計 | 1110 | 1580 |