編寫環境: Eclipse
作業代碼:
import java.util.*; import java.io.*; import javax.swing.*; import java.awt.*; import javax.swing.event.*; import java.awt.event.*; class Expression//表達式類,存放表達式 { int a;//第一個數 int b;//第二個數 int c;//正確答案 int d;//輸入答案 char operator;//運算符 boolean is_right; public Expression() { a=b=c=0; d = -1; is_right = false; operator = '+'; } } class NumberTooBigException extends Exception { String message; public NumberTooBigException(String ErrorMessage) { message = ErrorMessage; } public String getMessage() { return message; } } public class fdgfg { Vector<Expression> v; public fdgfg() { v = new Vector<Expression>(); } public void produceExpression(int bit,char operator) { Expression temp = new Expression(); temp.operator = operator; temp.a = (int)(Math.random() * Math.pow(10,bit)); temp.b = (int)(Math.random() * Math.pow(10,bit)); switch (operator) { case '+': temp.c = temp.a + temp.b;break; case '-': temp.c = temp.a - temp.b;break; case '*': temp.c = temp.a * temp.b;break; case '/': temp.b = (temp.b == 0 ? //排除除法被除數為0的情況 temp.b = 1 +(int)(Math.random() * Math.pow(10,bit)-1): temp.b); temp.c = temp.a / temp.b;break; default : mixExpression(temp,bit);//混合運算 } v.add(temp); } //混合運算,產生隨機數 public void mixExpression(Expression temp,int bit) { int rand = (int)(Math.random()*4); switch(rand) { case 1: temp.c = temp.a + temp.b;temp.operator = '+';break; case 2: temp.c = temp.a - temp.b;temp.operator = '-';break; case 3: temp.c = temp.a * temp.b;temp.operator = '*';break; case 0: temp.b = (temp.b == 0 ? //排除除法被除數為0的情況 temp.b = 1 +(int)(Math.random() * Math.pow(10,bit)-1): temp.b); temp.c = temp.a / temp.b;temp.operator = '/';break; default : } } public void writeInfo(int num,String userName) { File myFile = new File(userName + ".his"); FileOutputStream fos; File saveUserNameAndScore = new File("UserNameAndScore.data"); try { fos = new FileOutputStream(myFile,true); PrintStream ps = new PrintStream(fos); double score = 0; ps.println(String.format("%5s%5s%5s%5s%5s%10s%5s","","","","","正確答案","你的答案","判斷")); ps.println(); for(int i = 0 ;i < num ;i++) { ps.println(String.format("%5d%5s%5d%5s%10d%10d%10s",v.get(i).a,"+", v.get(i).b,"=",v.get(i).c,v.get(i).d,(v.get(i).is_right ? "正確":"錯誤"))); ps.println(); if(v.get(i).is_right) { score += 100.0/num; } } ps.println("你的總分:" + score); ps.close(); fos.close(); //下面保存用戶名和得分到UserNameAndScore.data文件; fos = new FileOutputStream(saveUserNameAndScore,true); ps = new PrintStream(fos); ps.println(userName); ps.println(score); ps.close(); fos.close(); } catch (Exception ex) { System.out.println (ex.getMessage()); } } public static void main(String[] s) { OverAllFrame oaf = new OverAllFrame("小學生四則運算軟件V1.0羅凱旋&馬志磊 "); } } //主體框架 class OverAllFrame extends JFrame { TimeThread timer; //計時器線程 fdgfg ar ;//內部算法 JPanel headPanel;//頭面板 JLabel welcomeLabel;//歡迎信息 JLabel timeUse; //用時信息 StartPanel st; String userName; RunningPanel rp; EndPanel ep; Vector<Expression> v;//存放算式 public OverAllFrame(String s) { super(s); userName = JOptionPane.showInputDialog("請輸入用戶名",""); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.initialize(); setHeadPanel(); this.setLocation(400, 100); this.setLayout(new BorderLayout()); this.add(headPanel,BorderLayout.NORTH); this.add(st,BorderLayout.CENTER); this.setSize(500,400); this.setVisible(true); } public void initialize()//初始化控件 { ar = new fdgfg(); headPanel= new JPanel(); welcomeLabel = new JLabel("歡迎! 用戶:" + userName); st = new StartPanel(); rp = new RunningPanel(); ep = new EndPanel(); timeUse = new JLabel(); } public void setHeadPanel() { headPanel.setLayout(new FlowLayout()); headPanel.add(welcomeLabel); headPanel.add(timeUse); } //開始面板 class TimeThread extends Thread //計時器線程 { int min; int sec; int millis; long oldTime; long timeUsed; long timeSeted; JLabel display; boolean stop = false; public TimeThread(long timeSeted,JLabel display) { oldTime = System.currentTimeMillis(); this.display = display; this.timeSeted = timeSeted; // TODO Auto-generated constructor stub } @Override public void run() { // TODO Auto-generated method stub super.run(); do { timeUsed = System.currentTimeMillis() - oldTime; min = (int)(timeUsed/60000L); sec = (int)((timeUsed%60000L)/1000L); millis = (int)((timeUsed%60000L)%1000L); try { sleep(11); } catch (InterruptedException e) { // TODO: handle exception } display.setText("已用時:" + min+ ":" + sec +":" + millis ); display.setVisible(true); }while(timeUsed <= timeSeted && !stop); if(!stop)//如果不是手動停止的就運行complete rp.complete(); } public void setStop() { stop = true; } } class StartPanel extends JPanel { JPanel inputOptionPanel; //輸入選項面板① JPanel selectOperatorOptionPanel;//選擇運算符面板② JPanel bottomPanel; //底部面板③ JLabel inputBitLabel; //輸入位數提示①-1 JTextField inputBitField; //輸入位數區域①-2 JLabel inputNumLabel; //輸入題目個數提示①-3 JTextField inputNumField; //輸入題目個數區域①-4 JLabel inputTimeLabel; //輸入做題時間提示①-5 JPanel inputTimePanel; //輸入做題時間區域①-6 ButtonGroup operatorGroup; JRadioButton addButton ; //加法按鈕②-1 JRadioButton minusButton ; //減法按鈕②-2 JRadioButton multiplyButton ; //乘法按鈕②-3 JRadioButton divideButton ; //除法按鈕②-4 JRadioButton mixButton ; //混合運算按鈕②-5 JLabel errorInfo; //錯誤信息③-1 JButton startButton; //開始按鈕③-2 JTextField inputByminutes; //輸入分鐘區域①-6-1 JLabel printMinute; //打印提示“分”①-6-2 JTextField inputByseconds; //輸入秒鐘區域①-6-3 JLabel printSecond; //打印提示“秒”①-6-4 public StartPanel() { //this.setLayout(new GridLayout(0,1)); this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); this.initialize(); this.setInputOptionPanel(); this.setSelectOperatorOptionPanel(); this.setBottomPanel(); this.addStartEvent(); this.add(inputOptionPanel); this.add(selectOperatorOptionPanel); this.add(bottomPanel); } public void initialize() //初始化所有控件 { inputOptionPanel = new JPanel(); selectOperatorOptionPanel = new JPanel(); bottomPanel = new JPanel(); inputBitLabel = new JLabel("輸入題目位數:"); inputBitField = new JTextField("1");//默認一位 inputNumLabel = new JLabel("輸入題目個數:"); inputNumField = new JTextField("10");//默認產生10題 operatorGroup = new ButtonGroup(); addButton = new JRadioButton("加法"); minusButton = new JRadioButton("減法"); multiplyButton = new JRadioButton("乘法"); divideButton = new JRadioButton("除法"); mixButton = new JRadioButton("混合"); errorInfo = new JLabel(); startButton = new JButton("開始做題!"); inputTimeLabel = new JLabel("輸入做題時間:"); inputTimePanel = new JPanel(); inputByminutes = new JTextField(); printMinute = new JLabel("分"); inputByseconds = new JTextField(); printSecond = new JLabel("秒"); } //設置做題時間面板 public void setInputTimePanel() { inputTimePanel.setLayout(new GridLayout(1,0)); printMinute.setHorizontalAlignment(SwingConstants.CENTER); printSecond.setHorizontalAlignment(SwingConstants.CENTER); inputTimePanel.add(inputByminutes); inputTimePanel.add(printMinute); inputTimePanel.add(inputByseconds); inputTimePanel.add(printSecond); } //設置輸入選項面板 public void setInputOptionPanel() { inputOptionPanel.setLayout(new GridLayout(3,2)); inputBitLabel.setHorizontalAlignment(SwingConstants.CENTER); inputNumLabel.setHorizontalAlignment(SwingConstants.CENTER); inputTimeLabel.setHorizontalAlignment(SwingConstants.CENTER); inputOptionPanel.add(inputBitLabel); inputOptionPanel.add(inputBitField); inputOptionPanel.add(inputNumLabel); inputOptionPanel.add(inputNumField); inputOptionPanel.add(inputTimeLabel); setInputTimePanel(); inputOptionPanel.add(inputTimePanel); } //設置選擇運算符面板 public void setSelectOperatorOptionPanel() { //selectOperatorOptionPanel.setLayout(new GridLayout(1,0)); selectOperatorOptionPanel.setLayout(new BoxLayout(selectOperatorOptionPanel,BoxLayout.X_AXIS)); operatorGroup.add(addButton); operatorGroup.add(minusButton); operatorGroup.add(multiplyButton); operatorGroup.add(divideButton); operatorGroup.add(mixButton); selectOperatorOptionPanel.add(addButton); selectOperatorOptionPanel.add(minusButton); selectOperatorOptionPanel.add(multiplyButton); selectOperatorOptionPanel.add(divideButton); selectOperatorOptionPanel.add(mixButton); } public void setBottomPanel() { bottomPanel.setLayout(new GridLayout(0,1)); bottomPanel.add(errorInfo); bottomPanel.add(startButton); } //添加開始按鈕處理事件 public void addStartEvent() { startButton.addActionListener(new StartButtonListener()); } //內部類,實現開始事件 class StartButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { ar.v.clear();//清空向量 char operator = '+';//默認加法 if(minusButton.isSelected()) { operator = '-'; } else if(multiplyButton.isSelected()) { operator = '*'; } else if (divideButton.isSelected()) { operator = '/'; } else if (mixButton.isSelected())//混合運算 { operator = '.'; } try { int numOfEquation = Integer.parseInt(inputNumField.getText()); int bigOfEquation = Integer.parseInt(inputBitField.getText()); int minSeted = Integer.parseInt(inputByminutes.getText()); int secSeted = Integer.parseInt(inputByseconds.getText()); long millisSeted = (minSeted *60 + secSeted) * 1000; timer = new TimeThread(millisSeted,timeUse); timer.start(); if(numOfEquation > 100) throw new NumberTooBigException("這么多題,你做的完嗎?"); rp.getTotalPage(numOfEquation);//獲得總頁數 rp.setPageLabel(); if(bigOfEquation > 9) throw new NumberTooBigException("輸入的位數太高了"); else if (bigOfEquation == 0) throw new NumberTooBigException("位數不能為0"); while(ar.v.size() < numOfEquation) { ar.produceExpression(bigOfEquation,operator); } OverAllFrame.this.v = ar.v; rp.writeEquationToLabel(); OverAllFrame.this.st.setVisible(false);//開始面板調為不可見 OverAllFrame.this.add(rp,BorderLayout.CENTER); OverAllFrame.this.setVisible(true);//更新窗口 OverAllFrame.this.rp.setVisible(true);//顯示做題面板 } catch(NumberFormatException ex) { errorInfo.setText("輸入數據類型錯誤!你必須輸入數值數據!,請重新輸入:"); } catch(NumberTooBigException ex) { errorInfo.setText(ex.getMessage()); } catch(Exception ex) { } } } } //做題中的面板 class RunningPanel extends JPanel { JPanel contentPanel;//存放題目和答案① JPanel buttonsPanel;//存放按鈕② JLabel pageLabel; //顯示當前頁/所有頁 Vector<JLabel> expressionGroup;//顯示題目①-1 Vector<JTextField> answerGroup;//存放答案①-2 JButton backButton;//上一頁②-1 JButton nextButton;//下一頁②-2 JButton completeButton; //完成②-3 int totalPage = 1; //總頁數 int currentPage = 1;//當前頁 public RunningPanel() { this.setLayout(new BorderLayout()); this.initialize(); this.addItem(); this.setContentPanel(); this.setButtonsPanel(); } public void initialize()//初始化 { contentPanel = new JPanel(); buttonsPanel = new JPanel(); pageLabel = new JLabel(); expressionGroup = new Vector<JLabel>(); answerGroup = new Vector<JTextField>(); for(int i = 0; i < 10 ;i++) { expressionGroup.add(new JLabel()); answerGroup.add(new JTextField()); } backButton = new JButton("上一頁"); nextButton = new JButton("下一頁"); completeButton = new JButton("完成!"); backButton.addActionListener(new BackButtonListener()); nextButton.addActionListener(new NextButtonListener()); completeButton.addActionListener(new CompleteButtonListener()); } public void setContentPanel() { contentPanel.setLayout(new GridLayout(6,2)); for(int i = 0; i < 10; i++) { contentPanel.add(expressionGroup.get(i)); contentPanel.add(answerGroup.get(i)); } } public void setPageLabel() { pageLabel.setText("頁碼"+currentPage+'/'+totalPage); } public void setButtonsPanel() { buttonsPanel.add(backButton); buttonsPanel.add(nextButton); buttonsPanel.add(completeButton); } public void writeEquationToLabel()//寫入算式 { //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應 int numNeededToAdd = (currentPage-1)*10; for(int i = 0; i < 10 ; i++) { if( i+numNeededToAdd >= v.size())//沒有更多題目了 { expressionGroup.get(i).setText(String.format("%17s","N/A")); } else { String temp = String.format("%5d%5s%5d%5s",v.get(i+numNeededToAdd).a, v.get(i + numNeededToAdd).operator, v.get(i + numNeededToAdd).b,"="); expressionGroup.get(i).setText(temp); } } } public void addItem()//添加控件 { this.add(pageLabel,BorderLayout.NORTH); this.add(contentPanel,BorderLayout.CENTER); this.add(buttonsPanel,BorderLayout.SOUTH); } public void getTotalPage(int num)//獲得總頁數 { totalPage = num/10 + (num % 10 == 0 ? 0:1); } //設置當前頁為1,重做和繼續的時候用到 public void setCurrentPageToOne() { currentPage = 1; } public void writeInputToVector() throws NumberFormatException//寫入答案進向量 { //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應 int numNeededToAdd = (currentPage-1)*10; for (int i = 0; i < 10 && i+numNeededToAdd <v.size();i++) { try { if(!answerGroup.get(i).getText().equals(""))//如果不是啥也沒寫的話 { v.get(i+numNeededToAdd).d = Integer.parseInt(answerGroup.get(i).getText()); if(v.get(i+numNeededToAdd).d == v.get(i + numNeededToAdd).c) v.get(i+numNeededToAdd).is_right = true; } //否則就是默認的-1 } catch(NumberFormatException e) { answerGroup.get(i).setText("輸入數據類型錯誤!請重新輸入:"); throw e;//必須這么寫才能終止。。 } catch(Exception e) { answerGroup.get(i).setText("未知錯誤!請重新輸入:"); try { throw e; } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); }//必須這么寫才能終止。。 } } } public void clearAnswer()//清空答案 { for (int i = 0; i < answerGroup.size();i++) { answerGroup.get(i).setText(""); } } //寫入答案進輸入區,還原上下頁做過的答案用 public void writeAnswerTofield() { //因為只有十個標簽,n道題目,不能一一對應,下面是標簽要加上的數和題目號對應 int numNeededToAdd = (currentPage-1)*10; for(int i = 0; i < 10 && i+numNeededToAdd <v.size(); i ++) { if(v.get(i+numNeededToAdd).d != -1)//說明有輸入過值 { answerGroup.get(i).setText(Integer.toString(v.get(i+numNeededToAdd).d)); } } } public void complete()//完成做題,用戶點擊完成或者 是時間到了 { try { //因為第一句可能會產生異常,不過在句中已經處理,這里加上 //try是讓它停止進入下一頁 timer.setStop();//計時器線程停止 OverAllFrame.this.rp.writeInputToVector();//寫入答案進向量 OverAllFrame.this.ar.writeInfo(v.size(), userName); OverAllFrame.this.rp.setVisible(false);//設置做題界面不可見 OverAllFrame.this.ep.setDisplayAnswer(); //設置要顯示的結果 OverAllFrame.this.add(ep,BorderLayout.CENTER); OverAllFrame.this.setVisible(true); OverAllFrame.this.ep.setVisible(true);//顯示答案面板 } catch(Exception e) { //do nothing } } class CompleteButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { complete(); } } class BackButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { if(currentPage > 1) { writeInputToVector();//保存上頁數據 clearAnswer();//刪除上頁答案 currentPage --; setPageLabel();//更新頁碼 writeEquationToLabel();//讀入下頁算式 writeAnswerTofield();//讀入下頁已填寫答案 RunningPanel.this.setVisible(true);//更新窗口 } } } class NextButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { if(currentPage < totalPage) { writeInputToVector(); clearAnswer();//刪除上頁答案 currentPage ++; setPageLabel(); writeEquationToLabel(); writeAnswerTofield(); RunningPanel.this.setVisible(true); } } } } //顯示結果面板 class EndPanel extends JPanel { JScrollPane displayArea;//顯示區域 JPanel bottomArea; //底部區域,存放按鈕 JTextArea displayAnswer;//顯示答案和評分 JTextArea displayRank; //顯示排名和得分 JButton reDoButton;//重做 JButton continueButton;//繼續練習 JButton viewRankButton;//查看排名 Font answerFont ; //字體屬性 boolean isRankViewed = false;//是否查看過排名 boolean alreadyWrite = false;//已經寫入排名信息 public EndPanel() { this.setLayout(new BorderLayout());//邊界布局 this.initialize(); this.setBottomArea(); this.addItem(); } public void initialize()//初始化 { answerFont = new Font("宋體",Font.PLAIN,15); displayAnswer = new JTextArea(); displayAnswer.setFont(answerFont);//設置字體 displayArea = new JScrollPane(displayAnswer); displayRank = new JTextArea(); displayRank.setFont(answerFont); bottomArea = new JPanel(); reDoButton = new JButton("重做一遍"); continueButton = new JButton("繼續練習"); viewRankButton = new JButton("查看排名"); reDoButton.addActionListener(new ReDoButtonListener()); continueButton.addActionListener( new ContinueButtonListener()); viewRankButton.addActionListener(new viewRankButtonListener()); } public void setDisplayAnswer()//添加答案 { displayAnswer.setEditable(false);//只顯示答案,不可編輯 String temp ; int score = 0; temp = (String.format("%5s%5s%5s%5s%5s%10s%5s","","", "","","正確答案","你的答案","判斷")) + "\r\n"; displayAnswer.append(temp); for(int i = 0 ;i < v.size() ;i++) { temp = (String.format("%5d%5s%5d%5s%10d%10d%10s",v.get(i).a,v.get(i).operator, v.get(i).b,"=",v.get(i).c,v.get(i).d,(v.get (i).is_right ? "正確":"錯誤")))+ "\r\n"; displayAnswer.append(temp); if(v.get(i).is_right) { score += 100.0/v.size(); } } temp = ("你的總分:" + score +"\r\n"); displayAnswer.append(temp); } public void setDisplayRank() { if(alreadyWrite)//如果已經執行過了 return; alreadyWrite = true; viewRankButton.setText("查看答案"); displayRank.setEditable(false); FileReader file ; BufferedReader bf ; String tempString;//臨時用戶名 String tempIntedString;//臨時分數的String形式 double tempInt;//臨時分數 //用戶名和用戶最高分的映射關系 HashMap<String,Double> map = new HashMap<String,Double>(); try { file = new FileReader("UserNameAndScore.data"); if(!file.ready()) { displayRank.setText("無有效數據"); } bf = new BufferedReader(file); tempString=bf.readLine(); tempIntedString=bf.readLine(); while( tempString!= null && tempIntedString != null) { tempInt = Double.parseDouble(tempIntedString); //確保顯示的為每個人歷史所得最高分 if(!(map.containsKey(tempString) && tempInt <= map.get(tempString))) { map.put(tempString, tempInt); } tempString=bf.readLine(); tempIntedString=bf.readLine(); } } catch (Exception e) { System.out.println(e.getMessage()); viewRankButton.setText("文件異常"); } Vector<UserRankInfo> v = new Vector<UserRankInfo>(); Iterator<String> it = map.keySet().iterator(); UserRankInfo temp; while(it.hasNext()) { tempString = it.next(); temp = new UserRankInfo(tempString,map.get(tempString)); v.add(temp); } Collections.sort(v,new UserRankInfo()); int rank = 1; displayRank.append(String.format("%10s%10s%10s", "排名","用戶名","得分")+ "\r\n"); for(UserRankInfo u:v) { displayRank.append(String.format("%10d%15s%15f", rank++,u.userName,u.score)+ "\r\n"); } } public void setBottomArea()//添加底部按鈕 { bottomArea.setLayout(new FlowLayout()); bottomArea.add(reDoButton); bottomArea.add(continueButton); bottomArea.add(viewRankButton); } public void addItem()//添加組件 { this.add(displayArea,BorderLayout.CENTER); this.add(bottomArea,BorderLayout.SOUTH); } public void recoverAnswerArea()//恢復答案區域 { viewRankButton.setText("查看排名"); displayArea.setViewportView(displayAnswer); displayAnswer.setVisible(true); isRankViewed = false; } class ReDoButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { OverAllFrame.this.rp.setCurrentPageToOne();//設置當前頁碼 為1 OverAllFrame.this.ep.setVisible(false);//隱藏結果面板 OverAllFrame.this.rp.clearAnswer();//先清除做題面板的內容 OverAllFrame.this.rp.setVisible(true);//顯示做題面板 if(isRankViewed) recoverAnswerArea(); } } class ContinueButtonListener implements ActionListener { public void actionPerformed(ActionEvent ae) { OverAllFrame.this.rp.setCurrentPageToOne();//設置當前頁碼 為1 OverAllFrame.this.rp.clearAnswer();//先清除做題面板的內容 OverAllFrame.this.ep.setVisible(false);//隱藏結果面板 OverAllFrame.this.st.setVisible(true);//顯示開始面板 if(isRankViewed) recoverAnswerArea(); } } class viewRankButtonListener implements ActionListener { @Override public void actionPerformed(ActionEvent e) { if(!isRankViewed ) { setDisplayRank();//寫入排名信息 displayAnswer.setVisible(false); displayArea.setViewportView(displayRank); displayRank.setVisible(true); isRankViewed = true; } else { recoverAnswerArea(); } } } //實現比較接口的用戶排名類 class UserRankInfo implements Comparator<UserRankInfo> { public String userName; public double score; public UserRankInfo(String userName,double score) { this.userName = userName; this.score = score; } public UserRankInfo() { //none } @Override public int compare(UserRankInfo arg0, UserRankInfo arg1) { if(arg0.score < arg1.score) return 1; else if(arg0.score > arg1.score) return -1; return 0; } } } }
總結:
合作同伴32馬志磊:http://www.cnblogs.com/mac54321/
因為之前的四則運算是用C語言寫的,這次的結對要做界面,所以為了做界面方便,就推到了之前的代碼重新做java版本的四則運算,在本次的java版本上 構思吸取了 之前C語言版本的想法,仍然是讓用戶選擇加法還是減法還是其他。因為這樣模塊性比較好,邏輯比較清晰。在做這個版本的時候框架和界面花了比較長的時間,但是還是一部分占比比較大的就是考慮容錯性的問題,起碼30%的時間都在考慮用戶會怎么輸錯,雖然實際應用中可能用不到,但是這也是很必須的,最后添加的排名功能,雖然只是一點小小的改進,但是結合了用戶帳號輸入的功能,使得其發揮應有的作用,不然用戶帳號輸入就沒有什么意義了。進過此次學習之后,發覺了,兩個人編程的精巧之處,畢竟如果是單獨寫代碼,自己錯了自己是很難看出來的,兩個人寫的話,有問題能及時提出來,使得不會陷入泥潭,等麻煩大了才反映過來,那就晚了,而且這次本來是預計一個星期的時間完成的,但是考慮到時間的緊迫性,我們還是提前完成了,對于其他組,我也去看了看,很多是因為做的順序導致了時間的延緩甚至回爐重做,比如說先寫了很多功能,然后再寫界面才發現很多適配性的問題,又要根據界面去改功能,對于此,我們組的策略還是按照現代軟件工程里介紹的,先做可行性分析,再敲代碼,而不是一上來就寫代碼,所以我們的彎路少走了一些,時間自然提前了一點。經過這次之后,發覺了很多時候不是技術性的問題,畢竟技術性的問題請教一下,或者上網看看,都能解決,很多時候是經驗不足,還有缺少規范化而導致了種種小問題,然而很多小問題不能及時處理,最后導致了出現瓶頸,所以以后我還是要注意一下這方面。
這個四則運算程序擴展的方向主要有:
1.計時,還有自由限定做題提示,還有完成時候提醒用時多少。
2.答題完成的時候顯示做對哪道題,做錯哪道題,正確答案多少,當初自己寫的答案多少。
3.設置了用戶登陸名,這有個好處,可以記錄其他用戶的做題記錄,并且構成一個排行,內部用hashmap實現,提升趣味。
4.整個界面清晰易懂
缺點:1.沒有做到多個運算符,使得題目難度無法提升
2.沒有做到計算到小數,主要是當初定義為整型,這個在后面沒有修改。
3.沒有做界面換膚功能。
時間分析:http://www.cnblogs.com/kasion/p/4398918.html
文章列表