结对编程1---四则运算---GUI

201421123003 黄建英 201421123004 黄美海

题目描述:

我们在个人作业1中,用各种语言实现了一个命令行的四则运算小程序。进一步,本次要求把这个程序做成GUI(可以是Windows PC 上的,也可以是Mac、Linux,web,手机上的),成为一个有基本功能、一定价值的程序。在下面的功能需求中实现两个:
1.记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算;
2.有计时功能,能显示用户开始答题后的消耗时间;
3.界面支持中文简体/中文繁体/英语,用户可以选择一种。
在软件开发中,我们需要大量使用工具来辅助设计,每个环节大家都要善于学习和使用工具。设计的时候,请使用思维导图设计你的模块之间的关系。

一、需求分析

1、用户输入数量可随机产生四则运算式
2、对用户输入的答案进行正确率分析
3、GUI界面:a、有计时功能,能显示用户开始答题后的消耗时间 b、界面支持中文简体/中文繁体/英语,用户可以选择一种;

二、思维导图

 

三、关键代码说明

a计时功能

 private void finishActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_finishActionPerformed
        // TODO add your handling code here:
        rightanswer.setText("");
        int correct = 0;
        int fault = 0;
        String[] anslist = enter2.getText().split("\n");
        for (int i = 0; i < Answer.size(); i++) {
            if (Answer.get(i).equals(anslist[i])) {
                correct++;
                rightanswer.append( "正确!答案是:"+Answer.get(i)+"\n"); 
            } else {
                rightanswer.append( " 错误!正确答案是:"+Answer.get(i)+"\n");
                fault++;
            }
        }
        String toDate = simpleFormat.format(new Date());
        try {
            to = simpleFormat.parse(toDate).getTime();
        } catch (ParseException ex) {
            Logger.getLogger(sizeyunsuan.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println((float) ((to - from) / (1000 * 60 * 60)));
        if (language == 1) {
            resultprintf.setText("答对" + correct + "题,正确率:" + (float) correct / (correct + fault) * 100 + "%,花费时间:" + (int) ((to - from) / (1000)) + "秒");
        } else if (language == 2) {
            resultprintf.setText("答對" + correct + "題,正確率:" + (float) correct / (correct + fault) * 100 + "%,花費時間:" + (int) ((to - from) / (1000)) + "秒");
        } else if (language == 3) {
            resultprintf.setText("Answer correct " + correct + "questions, correct rate:" + (float) correct / (correct + fault) * 100 + "%,Spend time:" + (int) ((to - from) / (1000)) + "s");
        }
        for (int i = 0; i < Answer.size(); i++) {
            Answer.remove(i);
            anslist = null;
        }
    }//GEN-LAST:event_finishActionPerformed

 b生成题目

private void startActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_startActionPerformed
        // TODO add your handling code here:
        String num = enter1.getText();
        int n = 0;
        try {
            n = Integer.parseInt(num);
        } catch (NumberFormatException e) {
            if (language == 1) {
                resultprintf.setText("输入错误!请重新输入");
            } else if (language == 2) {
                resultprintf.setText("輸入錯誤!請重新輸入");
            } else if (language == 3) {
                resultprintf.setText("input error! please enter again");
            }
        }
        int m = (int) (Math.random() * n);//随机整数题目和分数题目的题量
        for (int i = 0; i < (n - m); i++) {//先随机出整数题型
            Random random = new Random();
            int n1 = random.nextInt(10);
            int n2 = random.nextInt(10) + 1;
            int a = (int) (Math.random() * 4 + 1);//随机决定运算类型
            if (a == 1) {
                Question.add(n1 + "+" + n2 + "=");
                Answer.add(n1 + n2 + "");
            }
            if (a == 2) {
                Question.add(n1 + "-" + n2 + "=");
                Answer.add(n1 - n2 + "");
            }
            if (a == 3) {
                Question.add(n1 + "×" + n2 + "=");
                Answer.add(n1 * n2 + "");
            }
            if (a == 4) {
                Question.add(n1 + "÷" + n2 + "=");
                String n3 = (float) n1 / n2 + "";
                if (n3.indexOf(".0") != -1) {
                    n3 = n3.replace(".0", "");
                }
                Answer.add((n3));
            }
        }
        for (int i = 0; i < m; i++) {
            int[] fn1 = createFraction();
            int[] fn2 = createFraction();
            int a = (int) (Math.random() * 4 + 1);
            if (a == 1) {//
                Question.add("(" + Reduction(fn1[0], fn1[1]) + ")+(" + Reduction(fn2[0], fn2[1]) + ")=");
                Answer.add(Reduction(((fn1[0] * fn2[1]) + (fn2[0] * fn1[1])), (fn1[1] * fn2[1])));//化简结果并存储
            }
            if (a == 2) {//
                Question.add("(" + Reduction(fn1[0], fn1[1]) + ")-(" + Reduction(fn2[0], fn2[1]) + ")=");
                Answer.add(Reduction(((fn1[0] * fn2[1]) - (fn2[0] * fn1[1])), (fn1[1] * fn2[1])));
            }
            if (a == 3) {//
                Question.add("(" + Reduction(fn1[0], fn1[1]) + ")×(" + Reduction(fn2[0], fn2[1]) + ")=");
                Answer.add(Reduction(fn1[0] * fn2[0], fn1[1] * fn2[1]));//
            }
            if (a == 4) {//
                Question.add("(" + Reduction(fn1[0], fn1[1]) + ")÷(" + Reduction(fn2[0], fn2[1]) + ")=");
                Answer.add(Reduction(fn1[0] * fn2[1], fn1[1] * fn2[0]));
            }
        }
        int qn = 0;
        question.setText("");
        rightanswer.setText("");
        enter2.setText("");
        for (String string : Question) {
            qn++;
            question.append("[" + qn + "]" + string + "\n");
        }
        for (int i = 0; i < Question.size(); i++) {
            Question.remove(i);
        }
        String fromDate = simpleFormat.format(new Date());
        try {
            from = simpleFormat.parse(fromDate).getTime();
        } catch (ParseException ex) {
            Logger.getLogger(sizeyunsuan.class.getName()).log(Level.SEVERE, null, ex);
        }
    }//GEN-LAST:event_startActionPerformed

c结果判断与输出

private void finishActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_finishActionPerformed
        // TODO add your handling code here:
        rightanswer.setText("");
        int correct = 0;
        int fault = 0;
        String[] anslist = enter2.getText().split("\n");
        for (int i = 0; i < Answer.size(); i++) {
            if (Answer.get(i).equals(anslist[i])) {
                correct++;
                rightanswer.append( "正确!答案是:"+Answer.get(i)+"\n"); 
            } else {
                rightanswer.append( " 错误!正确答案是:"+Answer.get(i)+"\n");
                fault++;
            }
        }
        String toDate = simpleFormat.format(new Date());
        try {
            to = simpleFormat.parse(toDate).getTime();
        } catch (ParseException ex) {
            Logger.getLogger(sizeyunsuan.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println((float) ((to - from) / (1000 * 60 * 60)));
        if (language == 1) {
            resultprintf.setText("答对" + correct + "题,正确率:" + (float) correct / (correct + fault) * 100 + "%,花费时间:" + (int) ((to - from) / (1000)) + "秒");
        } else if (language == 2) {
            resultprintf.setText("答對" + correct + "題,正確率:" + (float) correct / (correct + fault) * 100 + "%,花費時間:" + (int) ((to - from) / (1000)) + "秒");
        } else if (language == 3) {
            resultprintf.setText("Answer correct " + correct + "questions, correct rate:" + (float) correct / (correct + fault) * 100 + "%,Spend time:" + (int) ((to - from) / (1000)) + "s");
        }
        for (int i = 0; i < Answer.size(); i++) {
            Answer.remove(i);
            anslist = null;
        }
    }//GEN-LAST:event_finishActionPerformed

d中文简体/中文繁体/英语三种语言的切换 

 private void language1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language1ActionPerformed
        // TODO add your handling code here:
        language = 1;
        title1.setText("四则运算生成器");
        title2.setText("请输入产生四则算式的数量:");
        title3.setText("请选择语言");
        title4.setText("问题显示:");
        title5.setText("输入答案:");
        title6.setText("正确答案:");
        start.setText("生成");
        finish.setText("结束");
    }//GEN-LAST:event_language1ActionPerformed
 private void language2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language2ActionPerformed
        // TODO add your handling code here:

        language = 2;
        title1.setText("四則運算生成器");
        title2.setText("請輸入產生四則算式的數量:");
        title3.setText("請選擇語言");
        title4.setText("問題顯示:");
        title5.setText("輸入答案:");
        title6.setText("正確答案:");
        start.setText("生成");
        finish.setText("結束");
    }//GEN-LAST:event_language2ActionPerformed
private void language3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_language3ActionPerformed
        // TODO add your handling code here:
        language = 3;
        title1.setText("Arithmetic");
        title2.setText("enter number:");
        title3.setText("language");
        title4.setText("problem display:");
        title5.setText("Enter answer:");
        title6.setText("proofreader:");
        start.setText("enter");
        finish.setText("end");
    }//GEN-LAST:event_language3ActionPerformed

 e测试运行

简体中文:

繁体中文

英文

结对照片展示:

 

psp:

PSP2.1

Personal Software Process Stages

Estimated time

actual time

Planning

计划

15min

20min

· Estimate

估计这个任务需要多少时间

10h

12h

Development

开发

4h

3h

· Analysis

需求分析 (包括学习新技术)

5min

3min

· Design Spec

生成设计文档

10min

10min

· Design5 R20eview

设计复审

5min

5min

· Coding Standard

代码规范

30min

40min

· Design

具体设计

2h

2h

· Coding

具体编码

3h

4h

· Code Review

代码复审

20min

30min

· Test

测试(自我测试,修改代码,提交修改)

5min

10min

Reporting

报告

10min

10min

·

测试报告。

 -

 -

·

计算工作量

5min

5min

·

并提出过程改进计划

5min

6min

码市链接:https://coding.net/u/hjyaaa/p/zuoye2/git/blob/master/sizeyunsuan.java

小结:

1、这次结对编程实验是我和黄美海同学一起完成,首先我们一起讨论了总体的需求以及该如何设计实现,然后一致决定采用我上次的实验为基础来实现四则运算的GUI界面,黄美海同学负责代码的复审以及提出我的不足;

2、以前自己编程事总会有小小的不起眼的小毛病,这次结对编程是两个人一起做,在队友的提醒下,做起实验来格外顺手。但是要在上次实验的基础上增加两个功能并用图形界面实现,着实有点吃力,还好查了资料,顺利解决了。

汉堡包式评价:

  1. 先来一片面包:我们两人达成结对编程的共识,采用JAVA和GUI实现
  2. 再把肉放上:这次编程过程中,我负责主体编程,但是期间遇到了诸多问题和不足,我们经过讨论、查资料就都顺利解决。
  3. 然后再来一片面包: 两人编程中有领航员和驾驶员关系时确实能使工作更加顺利,这次编程让我们对对方的编程实力有了更深的了解,也发现了自己一些编程习惯不是特别好。
posted @ 2017-03-15 10:02  星期三  阅读(193)  评论(1编辑  收藏  举报