軟件工程網絡15結對編程作業(201521123115)
阿新 • • 發佈:2018-03-25
logs git 應用 down 正確答案 alt 程序 img set
結對編程
改進現有代碼2
團隊成員:
梁林 201521123119 碼雲地址:https://gitee.com/ll119
龔廈彬 201521123115 碼雲地址:https://gitee.com/handsomecat/events
clone項目,在開發環境中運行該應用程序,修改完畢最後上傳至碼雲,並在博客中給出鏈接
檢查大部分主要類之間的關系,畫出類圖
核心代碼展示
private static int GCD(int m, int n) {//最大公約數 // TODO Auto-generated method stub while (true) { if ((m = m % n) == 0) return n; if ((n = n % m) == 0) return m; } } public static int LCM(int m, int n) { //求最小公倍數 return m*n/GCD(m,n); } public static int[] createFraction(){ //隨機組成真分母 int[] fraction=new int[2]; int fraction1 = (int)(Math.random()*10+1);//避免分子出現零 int fraction2 = (int)(Math.random()*10+1);//避免分母出現零 if(fraction1!=fraction2){ //避免出現分子分母相同 if(fraction1<fraction2){ //避免出現假分數 fraction[0]=fraction1; fraction[1]=fraction2; return fraction; }else{ fraction[0]=fraction2; fraction[1]=fraction1; return fraction; } }else createFraction(); return fraction; } public main()//計算四則運算並輸出 { new Thread(myTimeRunable).start(); int n = 0; MainFrame ma= new MainFrame(); int m = (int)(Math.random()*n+1);//隨機整數題目和分數題目的題量 try{ //調用初始化方法 jbInit(); } catch(Exception exception){ exception.printStackTrace(); } try{ n= Integer.parseInt(ma.number); }catch(NumberFormatException e){ //利用消息對話框提示輸入失敗 JOptionPane.showMessageDialog(this,"輸入錯誤!請重新輸入"); } for(int j=0;j<(n-m);j++){//整數題目 String ans; int op=(int)(Math.random()*5+1);//隨機選擇計算符 int num1=(int)(Math.random()*10+1);//隨機兩個整數 int num2=(int)(Math.random()*10+1); if(op==1){//加法 Question.add(num1+"+"+num2+"="); Answer.add(num1+num2+""); } if(op==2){//減法,防止出現負數 if(num1>num2){ Question.add(num1+"-"+num2+"="); Answer.add(num1-num2+""); } else{ Question.add(num2+"-"+num1+"="); Answer.add(num2-num1+""); } } if(op==3){//乘法 Question.add(num1+"*"+num2+"="); Answer.add(num1*num2+""); } if(op==4){//除法 Question.add(num1+"÷"+num2+"="); if(num1%num2==0){ Answer.add(num1/num2+""); }else{ int num3=GCD(num1,num2); num1=num1/num3; num2=num2/num3; String a = num1+"/"+num2; Answer.add(a+""); } } if(op==5) {//乘方 Question.add(num1+"^"+num2+"="); Answer.add(Math.pow(num1,num2)+""); } } for(int j=0;j<m;j++){//分數題目 Scanner in = new Scanner(System.in);//真分數的計算 int op=(int)(Math.random()*4+1); int[] f1 =createFraction(); int[] f2 =createFraction(); int j1=GCD(f1[0],f1[1]); f1[0]=f1[0]/j1;//化簡分數 f1[1]=f1[1]/j1; j1=GCD(f2[0],f2[1]); f2[0]=f2[0]/j1; f2[1]=f2[1]/j1; int gbs = LCM(f1[1],f2[1]); if(op==1){//加法 Question.add("("+f1[0]+"/"+f1[1]+")+("+f2[0]+"/"+f2[1]+")="); int num1=f1[0]*f2[1]+f2[0]*f1[1]; int num2=f1[1]*f2[1]; int num3=GCD(num1,num2); num1=num1/num3; num2=num2/num3; String a=new String(); if(num1==num2) { a="1"; } else { a=num1+"/"+num2; } Answer.add(a+""); } if(op==2){//減法 int num1=f1[0]*f2[1]-f2[0]*f1[1]; if(num1>0){ //防止出現負數 Question.add("("+f1[0]+"/"+f1[1]+")-("+f2[0]+"/"+f2[1]+")="); int num2=f1[1]*f2[1]; String a=new String(); if(num1==0) { a="0"; } else { int num3=Math.abs(GCD(num1,num2)); num1=num1/num3; num2=num2/num3; if(num1==num2) { a="1"; } else { a=num1+"/"+num2; } } Answer.add(a+""); }else{ Question.add("("+f2[0]+"/"+f2[1]+")-("+f1[0]+"/"+f1[1]+")="); int num11=f2[0]*f1[1]-f1[0]*f2[1]; int num2=f1[1]*f2[1]; String a=new String(); if(num11==0) { a="0"; } else { int num3=Math.abs(GCD(num11,num2)); num11=num11/num3; num2=num2/num3; if(num11==num2) { a="1"; } else { a=num11+"/"+num2; } } Answer.add(a+""); } } if(op==3){//乘法 Question.add("("+f1[0]+"/"+f1[1]+")*("+f2[0]+"/"+f2[1]+")="); int num1= f1[0]*f2[0]; int num2 = f1[1]*f2[1]; int num3=GCD(num1,num2); String a=new String(); num1= num1/num3; num2 = num2/num3; if(num1==num2) { a="1"; } else { a=num1+"/"+num2; } Answer.add(a+""); } if(op==4){//除法 Question.add("("+f1[0]+"/"+f1[1]+")÷("+f2[0]+"/"+f2[1]+")="); int num1= f1[0]*f2[1]; int num2 = f1[1]*f2[0]; int num3=GCD(num1,num2); String a=new String(); num1= num1/num3; num2 = num2/num3; if(num1==num2) { a="1"; } else { a=num1+"/"+num2; } Answer.add(a+""); } } //輸出題目 JTextArea0.setText(""); for(String string : Question){ num ++; JTextArea0.append("("+num+")、"+string+"\n"); } } //計時器 private class MyRunable implements Runnable{ private int hour = 0; private int min = 0; private int sec = 0; private NumberFormat format = NumberFormat.getInstance(); private String nextSecond(){ ++sec; if(sec == 60) { ++min; sec = 0; } if(min == 60) { ++hour; min = 0; } return currentTime(); } private String currentTime(){ return format.format(hour)+":"+format.format(min)+":"+format.format(sec); } @Override public void run() { format.setMinimumIntegerDigits(2); format.setGroupingUsed(false); while(true) { if(rootPaneCheckingEnabled) { if(isRun) { nextSecond(); jLabel4.setText(currentTime()); } } try { Thread.sleep(1000); }catch (InterruptedException e) { } } } } @Override //菜單項事件對應的處理方法 public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub //點擊“系統”菜單下的“退出”菜單項 if(e.getSource()==jButton0) { int num1=0; JTextArea2.setText(""); for(String string : Answer){//輸出正確答案 num1 ++; JTextArea2.append("("+num1+")、"+string+"\n"); } //獲取答案並對比得正確率 String[] ans = JTextArea1.getText().split("\n"); for(int i = 0;i < ans.length;i++){ answer.add(ans[i]+""); } for(String str:answer) { if(Answer.contains(str)) { right++; } } int sum; sum=right*100/num1; JTextArea3.append(sum+"%"); isRun = false; } //計時開始 if(e.getSource()==jButton2) { isRun = true; } //繼續做題 if(e.getSource()==jButton1) { MainFrame MF=new MainFrame(); //移除主框架上原有的內容 this.remove(this.getRootPane()); this.dispose(); MF.setVisible(true); } }
需求分析:針對現有代碼的改進分析,新開發功能的分析。
針對現有代碼出現的種種bug進行改進,例如正確率不會重新清零,且有時比對答案不正確正確率錯誤,所有文本框中內容均可自己修改,開始界面捕捉異常失敗。
代碼規範
代碼風格的原則是:簡明,易讀,無二義性。
縮進用四個空格
行寬100字符
在復雜的條件表達式中,用括號清楚地表示邏輯優先級。
斷行時每個“{”和“}”都獨占一行。
分行不把多行語句放在一行上。
命名采用“匈牙利命名法”。
下劃線用來分隔變量名字中的作用域標註和變量的語義。
所有的類型/類/函數名都用Pascal形式,所有的變量都用Camel形式。
復雜的註釋應該放在函數頭,註釋(包括所有源代碼)只用ASCII字符,不用中文或其他特殊字符。
團隊討論照片
瀏覽所有代碼考慮代碼質量和測試覆蓋率
運行測試
PSP表格
小結感受:這次結對編程比較趕,兩個人的基礎不行,代碼都不能完完全全的看懂,只能是在其上面稍作修改,還要繼續自學java下去才能慢慢跟上來。
軟件工程網絡15結對編程作業(201521123115)