GVKun编程网logo

结对项目 - 四则运算 “软件” 升级版

6

对于结对项目-四则运算“软件”升级版感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于201571030116/201571030106《小学四则运算练习软件》结对项目报告、20157103011

对于结对项目 - 四则运算 “软件” 升级版感兴趣的读者,本文将会是一篇不错的选择,并为您提供关于201571030116/201571030106《小学四则运算练习软件》结对项目报告、201571030117/201571030142 《小学四则运算练习软件》结对项目报告、201571030118/201571030128《小学四则运算练习软件》结对项目报告、201571030124/201571030130《小学生四则运算练习软件》结对项目报的有用信息。

本文目录一览:

结对项目 - 四则运算 “软件” 升级版

结对项目 - 四则运算 “软件” 升级版

 一。前提

(1)作业来源:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213

(2)GitHub 地址:https://github.com/linSeek/test2.git

(3)调试环境:Webstrom ,CHORME 浏览器,

 

二。作业要求

(1)基本要求

  • 自动生成题目,单个题目最多不能超过 4 个运算符,操作数小于 100。
  • 用户可以输入答案
  • 若用户输入答案正确,则提示正确;若答案错误,则提示错误,并要提示正确答案是多少。

(2)扩展要求

  1. 用户可以选择出题的个数(最多不能超过 5 个题目),答题结束可以显示用户答错的题目个数和答对的题目个数。
  2. 用户答题结束以后,程序可以显示用户答题所用的时间
  3. 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 
  4. 程序可以出单个整数阶乘的题目:如:4!=24。
  5. 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过 120 秒,若超过了答题时间未答题,则提示:时间已到,不能答题。

(3)结对成员

   姓名:冯斌 学号:201606120024 博客园地址:https://www.cnblogs.com/binguo666/

       姓名: 林海宏 学号:201606120028 博客园地址:https://github.com/linSeek/project01

      

 

三。时间估算

        结对项目软件过程耗时估计表与统计表

       (时间单位:小时)

PSP2.1

个人软件实现阶段

预计时间

实际时间

Planning

计划

10

12

· Estimate

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

10

10

Development

开发

10

11

· Analysis

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

0.5

2

· Design Spec

生成设计文档

0.5

0.5

· Design Review

设计复审

0.2

1

· Coding Standard

代码规范

0.1

1

· Design

具体设计

0.2

2

· Coding

具体编码

1

1

· Code Review

代码复审

0.5

2

· Test

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

1

1

Reporting

报告

2

1

·

测试报告

0.5

0.5

·

计算工作量

1

2

·

并提出过程改进计划

0.5

1

 

五。工作详情

    (一)工作:

    冯斌:          登陆界面设计,阶乘、判断结果算法计算等

    林海宏:       答题界面设计, 倒计时效果,用户信息保存,

 

    (二) 部分功能代码介绍:

  计算:

    (1)处理阶乘

function factorial(n, total) {
if (n === 1) return total;
return factorial(n - 1, n * total);
}

    

  (2)存储 cookie

复制代码
复制代码
function setCookie(cname,cvalue,exdays){
var d = new Date();
d.setTime(d.getTime()+(exdays*24*60*60*1000));
var expires = "expires="+d.toGMTString();
document.cookie = cname+"="+cvalue+"; "+expires;
}
function getCookie(cname){
var name = cname + "=";
var ca = document.cookie.split('';'');
for(var i=0; i<ca.length; i++) {
var c = ca[i].trim();
if (c.indexOf(name)==0) { return c.substring(name.length,c.length); }
}
return "";
}
window.onload=function () {
var user=getCookie("username");
if (user!=""){
alert("欢迎 " + user + " 再次访问");
}
}
复制代码
复制代码

 

 

   3. 页面设计

复制代码
复制代码
<div id="box">
<div class="hr1"></div>
<div class="hr2"></div>
<div class="title">
<p1 style="color: rgba(12, 11, 11, 0.81)">小学四则运算</p1>
<p2 href="">Background management system</p2>
</div>
<div class="input">
<form action="save.php" method="post">


<div class="id">
<em>用户名:</em>
<input type="text" name="myname" id=''user-name'' class="input1">
</div>
<div class="pass">
<em>密&nbsp&nbsp&nbsp&nbsp码:</em>
<input type="password" name="pass" class="input2">
</div>
<input type="button" value="注册并登陆" name="submitBtn2" class="button" id="logonbtn">
</form>
</div>
</div>
复制代码
复制代码

 

  4. 倒计时

复制代码
var  bin2 = setInterval(function(){
console.log(allTime--);
if(allTime == 0){
alert('' 时间到!提交题目! \n '' + '' 答题花费时间:'' + allTime2 );
document.getElementById("commit1").click();
clearInterval(bin2);
}else if(flag){
allTime2 -=allTime;
alert(''你已提交题目'' + ''花费答题时间:'' + allTime2 );
clearInterval(bin2);
}
}, 1000);
复制代码

 

    (三)运行与测试结果    

                    1. 登陆页面

                      

                    2、 登陆成功后,输入答题数目

                    

                     3、答题页面

                    

                    4、未到时间,提前交卷页面

                 

                    5. 时间到了,强制提交

                

 

 

  (四)结对照片

                            

 

 

六。收获与感悟

  (一)遇到的问题及解决方案

    技术方面:

      (1)用户代码逻辑不行,不知道如何实现

解决方法:

     经过两个人艰难探索,最终在网上找到方法

    合作方面:

      (1)代码对接存在很多 bug

解决方法:在对方的电脑重新写过

201571030116/201571030106《小学四则运算练习软件》结对项目报告

201571030116/201571030106《小学四则运算练习软件》结对项目报告

Github项目地址:

https://github.com/dushik/AthmeticPlus

一、题目要求

使用JAVA编程语言,采用结对编程方式实现四则运算出题小程序,软件基本功能要求如下:

  • 由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分,20道题测试结束后给出测试总分
  • 题库文件可采用实验二的方式自动生成,也可以手工编辑生成
  • 程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习
  • 程序允许用户进行多轮测试,提供用户多轮测试分数柱状图
  • 程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试
  • 测试有计时功能,测试时动态显示用户开始答题后的消耗时间
  • 程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择

    二、需求分析:

    • 程序人机交互界面是GUI界面,界面支持中文简体
    • 程序能够随机从题库选择试题,由用户输入答案,自动检查对错,统计成绩
    • 题库文件可基于实验二生成,也可自定义题库文件
    • 用户可以选择三种四则运算模式:百以内整数算式(结果非负,必须整数),带括号运算,真分数算式练习
    • 系统允许用户进行多轮测试,并实现用户测试测试分数的数据可视化(柱状图)
    • 测试时提供计时功能

    三、功能设计:

    • 采用java Swing编程实现人机交互界面的设计
    • 编写运算式生成类
    • 编写运算式计算类
    • 编写真分数运算类
    • 编写文件操作读写类
    • 编写数据可视化实现类

      四、设计实现:

      类图:

      • 运算式的生成基于实验二,改进完成带括号的运算,真分数运算。使得主程序通过参数的不同来调用不同的方法生成不同的题库
      • 成绩的存储采用文件的写操作,将每次测试结果以追加的方式写入txt文件,保证不覆盖以前的成绩
      • 柱状图的绘制采用jFreeChart图表绘制类库实现,查看成绩时通过读取保存成绩txt文件的最后五行实现最近五次成绩的柱状显示
      • 文件操作类的功能应包括,按行写入文件,按行通过追加的方式写入文件,按行读取文件,按行读取文件的最后四行内容
      • 普通运算式计算类的功能包括,中缀表达式转后缀,计算后缀表达式
      • 分数运算式计算类的功能包括,分数的通分,分数的加操作,分数的减操作,分数的乘操作,分数的除操作

        四、运行结果

         

      • 六、核心代码:

        随机产生num个真分数运算式,计算结果,使得结果非负,并存入题库文件

         1 /**
         2          * 生成具有真分数运算式数的非负运算式
         3          * @param num
         4          */
         5         public void generateExpressionC(int num){
         6             char[] operator=new char[]{''+'',''-''};
         7             ArrayList<String> expression=new ArrayList<String>();
         8             for(int i=0;i<num;i++){
         9                 int n=random.nextInt(3)+2; //3-5个运算符
        10                 ProperFraction[] proList=new ProperFraction[n+1];
        11                 for(int j=0;j<=n;j++){
        12                     proList[j]=new ProperFraction();
        13                 }
        14                 char[] symbol=new char[n];
        15                 String ex=new String();
        16                 for(int j=0;j<n;j++){
        17                     char sm=operator[random.nextInt(2)];
        18                     ex+=proList[j].toString()+sm;
        19                     proList[0]=proper.calProperFraction(proList[j], proList[j+1],sm);
        20                 }
        21                 ex+=proList[n]+"="+proList[0].toString();
        22                 if(proList[0].getNuma()/proList[0].getNumb()<0){
        23                     i--;
        24                 }
        25                 else{
        26                     expression.add(ex);
        27                 }
        28             }
        29             doFile.WriteToFile("ArithmeticExpression.txt",expression);          
        30         }

         

        读取文件最后N行

         1 public ArrayList<String> readLastNLine(String path, long numRead)  
         2     {  
         3         File file=new File(path);
         4         ArrayList<String> result = new ArrayList<String>();  
         5         long count = 0;  
         6         if (!file.exists() || file.isDirectory() || !file.canRead()){  
         7             return null;  
         8         }  
         9         RandomAccessFile fileRead = null;  
        10         try{  
        11             fileRead = new RandomAccessFile(file, "r");  
        12             long length = fileRead.length();  
        13             if (length == 0L){  
        14                 return result;  
        15             }  
        16             else{  
        17                 long pos = length - 1;  
        18                 while (pos > 0){  
        19                     pos--;  
        20                     fileRead.seek(pos);  
        21                     if (fileRead.readByte() == ''\n''){    
        22                         String line = fileRead.readLine();
        23                         result.add(line);   
        24                         count++;  
        25                         if (count == numRead){  
        26                             break;  
        27                         }  
        28                     }  
        29                 }  
        30                 if (pos == 0){  
        31                     fileRead.seek(0);  
        32                     result.add(fileRead.readLine());  
        33                 }  
        34             }  
        35         }  
        36         catch (IOException e){  
        37             e.printStackTrace();  
        38         }  
        39         finally{  
        40             if (fileRead != null){  
        41                 try{  
        42                     fileRead.close();  
        43                 }  
        44                 catch (Exception e){  
        45                 }  
        46             }  
        47         }  
        48         return result;  
        49     }

        通过标准答案和测试结果,计算正确的题数

         1  /**
         2      * 通过标准答案和测试结果,计算正确的题数
         3      * @param resHm
         4      * @param ansHm
         5      * @return
         6      */
         7     private static int critical(HashMap<Integer, String> resHm,HashMap<Integer, String> ansHm){
         8         int count=0;
         9         for(Map.Entry<Integer, String> resentry:resHm.entrySet()){
        10             String resvalue = resentry.getValue() == null?"":resentry.getValue();
        11             String ansvalue = ansHm.get(resentry.getKey())==null?"":ansHm.get(resentry.getKey());
        12             if(resvalue.equals(ansvalue)){
        13                 count++;
        14             }
        15         }
        16         return count;
        17     }

        七、总结:

               本次实验说起来是实验二的拓展项目,但是难度较实验二又大了很多,举例来说:图形用户界面设计,过程很复杂,需要耗费很多心力、程序人机交互界面是GUI界面是难点、实现用户测试测试分数的数据可视化(柱状图)之前没有接触过,需要进行行的了解和学习等等。最重要的问题依然还是JAVA编程能力太差,在短期内查漏补缺但是离要求还相差甚远。还是要继续努力。

        八、PSP:

        PSP 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
          计划 50 50
        Estimate 需求分析,函数实现 50 50
          开发 100 100
        Analysis 需求分析 5 10
        Design Spec 设计 30 30
        Design Review 设计复审 30 30
        Design 具体设计 30 30
        Coding 具体编码 30 30
        Code Review 代码复审,查找语法错误 2 2
        Test 测试 5 5
          报告 30 30
        Test Report 经测试,程序符合实验要求,但严重脱离实际应用 20 20
        Size Measurement 主要工作量在GUI编程 20 20
           

        九、对小伙伴的评价

      • 这里手动@杜总,非常感谢杜世康同学在本次合作中非常耐心、不遗余力的帮助我这个编程水平和他相差甚远的学渣。他是个很爽快也很幽默的人,合作很愉快,对我来说合作的过程就是一个学习的过程,正所谓“三人行必有我师”。结对编程可以促进参与项目双方自身的提高,结对工作的时候,水平较低的一方会潜移默化地受水平略高的程序员影响,比如我在本次结对编程中就学到了很多新的并且实用的东西,这种学习比起从网站上找教学视频和自己抱着各种参考书啃是不一样的,更容易理解并且接受,而且更容易上手。对于小伙伴来说,他是水平高的一方,虽然带上我这个“菜鸟”玩家很吃力,但是也同样因为不断地把自己的想法说出来而整理了自己的思路,不至于在很大的工作量中把思路搞混。
      • 把实验结果做成GIF动图这个想法就是杜世康同学提出的,而且我们做的用户界面和大部分同学做的也不太一样。他是个很有想法的人,而且这些想法大部分都是精华,能够很高效地完成任务,并且能够把我们想展示的东西很直观的展示出来。这个也是我很佩服他的一点。
      • 合作过程中我也深刻的体会到了——有效的交流的重要性。因为我们不是随时都有时间能凑到一起的,所以除了当面互相交流想法之外,QQ/微信这些社交软件也起到了很大的作用,让我们彼此的交流更便捷更高效。

                          十、结对编程真的能够带来1+1>2的效果吗?通过这次结对编程,请谈谈你的感受和体会

                                 我觉得结对编程确实能够带来1+1>2的效果,但是对于合作双方来说,这个效果肯定会不尽相同。首先合作双方肯定得是能互相合得来并且性格和工作能力可以互补的人,这样两个志趣相投的人在一起敲代码做项目,要比一个人闷头写程序改bug要有趣的多,工作效率也相对来说会高一点;其次对于编程能力相对较弱的我来说,1+1>2的效果最大的体现就是我能从对方身上学到很多我之前运用不熟练或者根本不知道的新知识,这对我之后的学习起到了很积极的作用,也在很大程度上减轻了我的精神负担——如果给我一周半时间让我一个人做这个项目的话我肯定会不知所措。最后我想说这种编程方式也并不是百利而无一害的,比如结对编程对于目前的我们来说,每天还有很多的课程,并没有充分的条件能够完全抽出一两天整个的时间来结对编程,而且合作双方也需要一定的磨合时间,还有编程过程中可能会出现意见上的小冲突,这些都会造成完成作业的时间线拉长。不过大家也乐在其中,我始终相信合作才能共赢。

                                                                           

                          

201571030117/201571030142 《小学四则运算练习软件》结对项目报告

201571030117/201571030142 《小学四则运算练习软件》结对项目报告

一、guthub地址:https://github.com/iylong/sizeyunsuanlianxiruanjian

二、项目报告

1、需求分析

  (1)由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计

分,20道题测试结束后给出测试总分;

  (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:

(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式、带括号算式、真分数算式练习;

(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,如图2所示;

(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;

(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间;

(7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体/中文繁体/英语,用户可以进行语种选择。

3.设计实现

三.核心代码展示

1.计算式的产生

 1 public void createTest() {
 2         // 定义一个随机数
 3         Random random = new Random();
 4         /*
 5          * 定义两个个Fractions对象,分别为: 第一个运算数 第二个运算数
 6          */
 7         Fractions fractions_1 = new Fractions();
 8         Fractions fractions_2 = new Fractions();
 9         // 定义Caculate对象用于计算结果
10         Caculate caculate = new Caculate();
11         // 生成10道题
12         for (int i = 0; i < testNum; i++) {
13             // 分别随机 生成第一个和第二个运算数并储存到question字符串集里
14             fractions_1.setValue(random.nextInt(diffculty) + 1, random.nextInt(diffculty) + 1);
15             question_1[i] = fractions_1.getFraction();
16             fractions_2.setValue(random.nextInt(diffculty) + 1, random.nextInt(diffculty) + 1);
17             question_2[i] = fractions_2.getFraction();
18             caculate.setOperationNum(fractions_1, fractions_2);
19             // 随机生成符号并计算结果存储到result字符串集
20             switch (random.nextInt(4)) {
21             // 加法运算
22             case 0:
23                 operator[i] = "+"; // 储存运算符
24                 result[i] = caculate.addtion().getFraction(); // 获取运算结果
25                 break;
26             // 减法运算
27             case 1:
28                 operator[i] = "-";
29                 result[i] = caculate.subtraction().getFraction();
30                 break;
31             // 乘法运算
32             case 2:
33                 operator[i] = "*";
34                 result[i] = caculate.multiplication().getFraction();
35                 break;
36             // 除法运算
37             case 3:
38                 operator[i] = "÷";
39                 result[i] = caculate.division().getFraction();
40                 break;
41             }
42         }
43     }
44 
45     // 传入一组答案,校验答案
46     public String[] checkAnswer(String[] answers) {
47         for (int i = 0; i < testNum; i++) {
48             // 如果答错了记下题号
49             if (!result[i].equals(answers[i])) {
50                 scoresList.add(new Integer(i + 1).toString());
51             }
52         }
53         String[] str = new String[scoresList.size()];
54         scoresList.toArray(str);
55         return str; // 返回一个得分集
56     }
57 
58     // 获取完整的题目
59     public String[] getQuestions() {
60         String[] questions = new String[testNum];
61         for (int i = 0; i < testNum; i++)
62             questions[i] = question_1[i] + "   " + operator[i] + "   " + question_2[i] + "  =  ";
63         return questions;
64     }
65 
66     // 获取标准答案
67     public String[] getStandardAnswer() {
68         return result;
69     }
70 
71     
72     /**
73      * 保存成绩到文件
74      * @throws FileNotFoundException 
75      */
76     public static void addscore(Integer score) throws FileNotFoundException {
77         String form = date.format(new Date());
78         PrintWriter pw = new PrintWriter(new File("history/scores.txt"));
79         if (scores.size() >= 10) {//最多十次数据
80             scores.remove(0);
81         }
82         scores.add(form + "-----" + score);
83         for (String string : scores) {
84             pw.println(string);
85         }
86         pw.flush();
87         pw.close();
88     }
89
View Code

 2.同意校验答案,并统计错题号

 1 public void actionPerformed(ActionEvent e) {
 2         if (e.getSource() == btnSubmit) {
 3             isEnd = !isEnd; // 计时结束
 4             for (int i = 0; i < Background.testNum; i++) {
 5                 answers[i] = tfdAnswer[i].getText(); // 提取用户的答案
 6             }
 7             wrong = background.checkAnswer(answers); // 获得错题题号
 8             String l = String.valueOf(Background.testNum - wrong.length);
 9             count_array.add(l);
10             for (String e1 : count_array) {
11                 System.out.println(e1);
12             }
13             // 编辑反馈表
14             String s = null;
15             if (wrong.length == 0)
16                 s = tips.get(5);
17             else {
18                 s = tips.get(6) + "\n";
19                 String standardAnswer[] = new String[Background.testNum];
20                 standardAnswer = background.getStandardAnswer();
21                 for (int i = 0; i < wrong.length; i++) {
22                     s = s + new Integer(wrong[i]) + ":"
23                             + standardAnswer[new Integer(wrong[i]) - 1];
24                     s = s + "\n";
25                 }
26             }
27             JOptionPane.showMessageDialog(null, s, "report",
28                     JOptionPane.PLAIN_MESSAGE);
29 
30             int score = Background.testNum - wrong.length;
31             try {
32 
33                 Background.addscore(score * 10);
34             } catch (FileNotFoundException e2) {
35                 // TODO Auto-generated catch block
36                 e2.printStackTrace();
37             }
38         }
39         if (e.getSource() == btnReset) {
40             // this.dispose();
41             JFreeChartshow chart = new JFreeChartshow("成绩统计图");
42             chart.pack();// 以合适的大小显示
43             chart.setVisible(true);
44 
45         }
46     }
View Code

3.统计成绩通过柱状图显示

 1 public static CategoryDataset createDataset() // 创建柱状图数据集
 2     {
 3 
 4         DefaultCategoryDataset dataset = new DefaultCategoryDataset();
 5 
 6         int i = 0;
 7         for (String str : scores) {
 8             i++;
 9             String[] split = str.split("-----");
10             dataset.addValue(Integer.parseInt(split[1]), "得分", "第" + i + "次");
11         }
12 
13         return dataset;
14     }
15 
16     public static JFreeChart createChart() // 用数据集创建一个图表
17     {
18         JFreeChart chart = ChartFactory.createBarChart("分数统计图", "分数统计", "得分",
19                 createDataset(), PlotOrientation.VERTICAL, false, true, false); // 创建一个JFreeChart
20         
21         chart.setBorderPaint(Color.blue);
22         chart.setBackgroundPaint(Color.lightGray);
23         chart.setTitle(new TextTitle("成绩分析图", FONT));// 可以重新设置标题,
24         CategoryPlot plot = (CategoryPlot) chart.getPlot();// 获得图标中间部分,即plot
25         plot.setDomainCrosshairPaint(Color.orange);
26         CategoryAxis categoryAxis = plot.getDomainAxis();// 获得横坐标
27         categoryAxis.setLabelFont(FONT);// 设置横坐标字体
28         categoryAxis.setTickLabelFont(FONT); // x轴下标
29         categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.UP_45);// 分类标签以45度倾斜
30         ValueAxis rangeAxis = plot.getRangeAxis();// 获取柱状
31         rangeAxis.setLabelFont(FONT); // Y轴标题
32         
33         // plot.setBackgroundPaint(Color.orange);//图片背景
34         
35 
36         return chart;
37     }
38 
39     public static JPanel createPanel() {
40         JFreeChart chart = createChart();
41         return new ChartPanel(chart); // 将chart对象放入Panel面板中去,ChartPanel类已继承Jpanel
42     }
View Code

四.运行结果

登录界面:admin ,密码:123456;

 

 

 

 

五、PSP展示

PSP2.1 任务内容 计划完成的时间(min) 实际完成需要的时间(min)
PLanning 计划 60 100
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 60 60
Developmet 开发 480 600
Analysis 需求分析(包括学习新技术) 30 45
Design Spec 生成设计文档 10 20
Design Revie 设计复审(和同事审核设计文档) 30 30
Coding Standard 代码规范 20 30
Design 具体设计 60 80
Coding 具体编码 300 300
Code Review 代码复审 30 360
Test 测试(自我测试,修改代码,提交修改) 20 30
Reporting 报告 30 35
Test Report 测试报告 20 20
Size Measurement 计算工作量 5 5
Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 30 35

201571030118/201571030128《小学四则运算练习软件》结对项目报告

201571030118/201571030128《小学四则运算练习软件》结对项目报告

源码在 Github 的仓库主页链接地址

 https://github.com/devilwjy/Second

a. 需求分析:

(1)总体需求:由计算机从题库文件中随机选择 20 道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计 5 分,错误不计分,20 道题测试结束后给出测试总分;

 (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:

 

(3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

(4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:

 

(5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;

(6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。

(7)程序人机交互界面是 GUI 界面(WEB 页面、APP 页面都可),界面支持中文简体(必做)/ 中文繁体 / 英语,用户可以进行语种选择。

b. 软件设计:

 

各个模块的主要功能:

(1)Main () 类:利用 calculate 类生成表达式,调用选择模块,即 Select()类。

(2)Select () 类:让用户登录,并选择答整数题还是分数题。

(3)Test()类:生成用户答题的界面。

(4)Summer()类:显示本轮的分数并打印错误题目及答案,并让用户选择是做下一轮题还是看看做题情况。

(5)Histogram()类:画出每一轮的统计图。

(6)TimerThread () 类:产生计时功能。

 

c. 核心功能代码展示:

1、下面为画统计图的代码:主要方法为在 JFrame 内加入 Jpanel, 在 Jpane 加入矩形框,和 Label。

 

public Histogram(final ArrayList<String> summer) 
    {
        length = summer.size();
        count = new int[length];
        System.out.print(length);
        this.setLayout(null);
        for(int i=0;i<summer.size();i++)
        {
            count[i] = Integer.parseInt(summer.get(i));    
        }
        for(int i=1;i<summer.size();i=i+2)
        {
            JLabel  Label = new JLabel("第"+((i+1)/2)+"轮",JLabel.LEFT);
            Label.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18));
            Label.setBounds(30+(i-1)*30, 610, 60,50);
            JLabel  Label2 = new JLabel(count[i]+"",JLabel.CENTER);
            Label2.setFont(new Font("SansSerif", Font.BOLD + Font.ITALIC, 18));
            Label2.setBounds(25+(i-1)*30, 555-6*count[i], 60,50);
            label.add(Label);
            label.add(Label2);
            this.add(label.get(i-1));
            this.add(label.get(i));  
        }
    } 
     protected void paintComponent(Graphics g) 
     {
         int x=10;
         g.setColor(Color.red);
         for (int i = 0; i < count.length; i++) 
         {   
             g.fillRect(x, 600-6*count[i], 30,6*count[i] );
             x += 30; 
         }
     }

 

2、下面为显示答题时间的代码(新建了一个 JFrame 让它显示,但是必须设置它为最上面放置)。

public class TimerThread extends JFrame implements Runnable
{
     private JFrame frame;
     private JPanel timePanel;
     private JLabel timeLabel;
     private JLabel displayArea;
     private String DEFAULT_TIME_FORMAT = "HH:mm:ss";
     private int ONE_SECOND = 1000;
     int time = 1;    boolean isRun = true; 
     public TimerThread()
     {
         timePanel = new JPanel();
         timeLabel = new JLabel("您本次用时:");
         displayArea = new JLabel();
         timePanel.add(timeLabel);
         timePanel.add(displayArea);
         this.add(timePanel);
         this.setDefaultCloseOperation(EXIT_ON_CLOSE);
         this.setBounds(800, 100, 200, 80);
     }
     public void run()
     {
         while(isRun)
         {    
             try {
                 displayArea.setText(time+"s");
                 time++;
                 Thread.sleep(1000);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
     }
}

 

 

d. 程序运行:程序运行时每个功能界面截图。

1、输入学号和姓名,选择答分数还是整数:

 

2、如果选择整数,开始答题与计时(图片很大,放不下)。

 

3、查看得分和用时,并显示错误题目和答案(图片很大,放不下)。

 

4、再来一轮:

 

5、如果选择分数:

 

6、查看的分和用时:

 

7、经过多轮测试后,点总结,统计图如下:

   

 

 

 

e. 描述结对的过程,提供两人在讨论、细化和编程时的结对照片 (非摆拍)。

 

                       

 

 

f. 提供此次结对作业的 PSP

PSP2.1

任务内容

计划共完成需要的时间 (min)

实际完成需要的时间 (min)

Planning

计划

60

100

·       Estimate

・  估计这个任务需要多少时间,并规划大致工作步骤

60

100

Development

开发

890

1256

··       Analysis

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

6

10

·       Design Spec

・  生成设计文档

30

20

·       Design Review

・  设计复审 (和同事审核设计文档)

4

6

·       Coding Standard

  代码规范 (为目前的开发制定合适的规范)

30

20

·       Design

  具体设计

100

150

·       Coding

  具体编码

600

700

·       Code Review

・  代码复审

120

200

·       Test

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

100

150

Reporting

报告

38

32

··       Test Report

・  测试报告

3

2

·       Size Measurement

  计算工作量

5

10

·       Postmortem & Process Improvement Plan

・  事后总结 , 并提出过程改进计划

30

20

g. 请使用汉堡评价法给你的小伙伴一些点评。

  刚开始我们都说了各自设计本次项目的想法,基本差不多,稍微有点不一样的想法我们就择优选取了。可以说是配合的相当默契,并不是谁写谁的,而是一个人看一个人写,遇到问题商量,商量不出来就百度。刚开始我觉得分工比较好,效率高,但是合作后才发现并不是这样,一个人写会马虎或者想不明白,然后就卡在那了,而一起写会注意对方是否马虎写错了,或者遇到不会的时候可以商量,一经商量就迎刃而解了。重点是我的小伙伴相当有耐心,认真的听取我的想法,而且我打字很慢,容易打错,她总是一直提醒我。她动手能力很强,而且反应很快,我看她写的时候,有时候都跟不上节奏,每次我们约着写代码她都相当积极,总之就一句话,合作很好,小伙伴更好!很期待下次与她的合作!(注明:我们宿舍就在隔壁,天天在宿舍商量着写,所以在 github 基本没怎么传代码)

h. 结对编程真的能够带来 1+1>2 的效果吗?通过这次结对编程,请谈谈你的感受和体会。

     有,这个绝对有,举个例子,(1)我的小伙伴说,让我把我们写的代码写一部分后给她发一份,不然丢了咋办,我觉得没事,一般丢不了,结果第二天我们果真丢了一个类里面的代码,重新写了一遍。唯一的想法就是听她的该多好,(2)我在写代码的时候总是会马虎,一个小小的问题马虎了,类似于数组溢出的那种错误,程序报错了,因为程序代码量比较大,一查就是几个小时,有了小伙伴的提醒,我马虎出错的次数基本没有了,(3)有时候我写代码,运行的结果并不是我想象的结果,然后我就和小伙伴重新把代码审核一遍,一下子就找到问题出在哪了。如果我一个人审核,第一当局者迷,自己就又跟着错误的思路走了,第二,自己找着找着就反应不过来了。(4)在设计界面的时候因为组件特别多,一个人根本盯不住。(5)我写的反应不过来了或累了她接着写。不然一直写,会大脑跟不上节奏。再多的例子我就不举了,上面的一些例子足以说明我在这次写代码中因为有了小伙伴,节省了大量的时间。而且设计的界面我也很满意,我们一直在计算组件该放的位置,看起来算是比较简洁大方了。

201571030124/201571030130《小学生四则运算练习软件》结对项目报

201571030124/201571030130《小学生四则运算练习软件》结对项目报

Github 的仓库主页链接地址:https://github.com/Opalus-wangs/Pair-Programming

一、需求分析

任务 1:

在《实验二 软件工程个人项目》中,同学们实现了一个命令行四则运算出题小程序,本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能:

 (1)由计算机从题库文件中随机选择 20 道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计 5 分,错误不计分,20 道题测试结束后给出测试总分;

 (2)题库文件可采用实验二的方式自动生成,也可以手工编辑生成,文本格式如下:

 

 (3)程序为用户提供三种进阶四则运算练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

 (4)程序允许用户进行多轮测试,提供用户多轮测试分数柱状图,示例如下:

 

 (5)程序记录用户答题结果,当程序退出再启动的时候,可为用户显示最后一次测试的结果,并询问用户可否进行新一轮的测试;

 (6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间。

 (7)程序人机交互界面是 GUI 界面(WEB 页面、APP 页面都可),界面支持中文简体(必做)/ 中文繁体 / 英语,用户可以进行语种选择。

二、软件设计

  1. 流程图

  2. 类图

三、核心代码

 计时部分:

import java.util.Timer;
import java.util.TimerTask;

public  class time {
	public Timer timer=new Timer();
	public boolean is_pause=false;
	public timetask mytimetask=new timetask();
	public int hh,mm,ss;
	String a;	
	public time()
	{
		timer.scheduleAtFixedRate(mytimetask, 0, 1000);	
	}
	public class timetask extends TimerTask{
	public int count_time=0;
	public String date;
	@Override
	public void run() 
	{
		if(!is_pause)
		{
			count_time++;
			hh=count_time/3600;
			mm=(count_time%3600)/60;
			ss=count_time%60;
			date=hh+":"+mm+":"+ss;	
			a=date;	
		}
	}
}
	
	
}

结果计算:

//表达式计算
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Calculate {

	
	public static int arithmetic(String exp)
    { 
        String result = parseExp(exp).replaceAll("[\\[\\]]", ""); 
        return (int)Double.parseDouble(result); 
    } 


    public static String parseExp(String expression)
    { 
        expression=expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1"); 
        String checkExp="\\d"; 
        String minExp="^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$"; 
        //最小表达式计算 
        if(expression.matches(minExp))
        { 
            String result=calculate(expression); 
             
            return Double.parseDouble(result)>=0?result:"["+result+"]"; 
        } 
        //计算不带括号的四则运算 
        String noParentheses="^[^\\(\\)]+$"; 
        String priorOperatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))"; 
        String operatorExp="(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))"; 
        if(expression.matches(noParentheses))
        { 
            Pattern patt=Pattern.compile(priorOperatorExp); 
            Matcher mat=patt.matcher(expression); 
            if(mat.find())
            { 
                String tempMinExp=mat.group(); 
                expression=expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp)); 
            }
            else
            { 
                patt=Pattern.compile(operatorExp); 
                mat=patt.matcher(expression); 
                 
                if(mat.find())
                { 
                    String tempMinExp=mat.group(); 
                    expression=expression.replaceFirst(operatorExp, parseExp(tempMinExp)); 
                } 
            } 
            return parseExp(expression); 
       
        } 
        //计算带括号的四则运算 
        String minParentheses="\\([^\\(\\)]+\\)"; 
        Pattern patt=Pattern.compile(minParentheses); 
        Matcher mat=patt.matcher(expression); 
        if(mat.find())
        { 
            String tempMinExp=mat.group(); 
            expression=expression.replaceFirst(minParentheses, parseExp(tempMinExp)); 
        }        
        return parseExp(expression); 
    } 
    
     public static String calculate(String exp)
     { 
        exp=exp.replaceAll("[\\[\\]]", ""); 
        String number[]=exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(","); 
        BigDecimal number1=new BigDecimal(number[0]); 
        BigDecimal number2=new BigDecimal(number[1]); 
        BigDecimal result=null; 
          
        String operator=exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1"); 
        if("+".equals(operator))
        { 
            result=number1.add(number2);     
        }
        else if("-".equals(operator))
        { 
            result=number1.subtract(number2); 
        }
        else if("*".equals(operator))
        { 
            result=number1.multiply(number2); 
        }
        else if("/".equals(operator))
        { 
            result=number1.divide(number2,2, BigDecimal.ROUND_HALF_EVEN); 
        } 
       return result!=null?result.toString():null;        
    } 
	
}

柱状图:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Random;

import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JTextArea;
//绘制柱状图
public class Picture extends JFormattedTextField
{
		int [] a=new int[20];
		int j=0;
		int i=0;
		int x=0;
		int aa=0;
		//绘制柱形统计图
		private Random ran;
		public Picture(ArrayList<Student> students)
		{	
			super();
			for(Student e: students )
			 {
					a[j]=(e.getw());
					j++;	
			 }
			ran = new Random();
			setName("绘制柱形图");
			setBounds(100,85,270,210);
		}
		@Override
		public void paint(Graphics g){
			int Width = getWidth();
			int Height = getHeight();
			int leftMargin = 2;//柱形图左边界
			int topMargin = 5;//柱形图上边界
			Graphics2D g2 = (Graphics2D) g;
			int ruler = Height-topMargin-5;
			int rulerStep = ruler/10;//将当前的高度评分为10个单位
			g2.setColor(Color.WHITE);//绘制白色背景
			g2.fillRect(0, 0, Width, Height);//绘制矩形图
			g2.setColor(Color.LIGHT_GRAY);
			for(int i=0;i<=10;i++){//绘制灰色横线和百分比
				g2.drawString((100-10*i)+"%", 5, topMargin+rulerStep*i);//写下百分比
				g2.drawLine(5, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线
			}
			g2.setColor(Color.RED);

			for(i=0;i<j;i++){//绘制柱形图
				int value =(20-a[i])*10+5;
				int step = (i+1)*20;//设置每隔柱形图的水平间隔为40
				//绘制矩形
			
				g2.fillRoundRect(leftMargin+step*2, Height-value, 20, value, 20, 20);
				
				g2.drawString("C"+(i+1)+"-"+(20-a[i])*5+"%", leftMargin+step*2, Height-value-5);
			
			}
		}		
}

四、程序运行

  1. 首先是主界面:

  2. 点击简单后,出现用户登录的界面,用户登录完成后,点击确定:

  3. 出现做题界面:

 

  4. 点击开始计时时,并开始做题:

  5. 如果我们没有答完题,提交的时候才能提示信息:

  6. 做完点击提交,出现成绩和错误题号,并且画出柱状图:

   7. 点击继续,选择复杂计算:

  8. 显示结果:

  9. 点击查看:

 

 五、结对编程过程

 六、PSP

PSP2.1 任务内容 计划完成的时间 (min) 实际完成需要的时间 (min)
PLanning 计划 60 80
Estimate 估计这个任务需要多少时间,并规划大致工作步骤 60 80
Developmet 开发 450 520
Analysis 需求分析(包括学习新技术) 30 40
Design Spec 生成设计文档 10 20
Design Revie 设计复审(和同事审核设计文档) 30 30
Coding Standard 代码规范 30 30
Design 具体设计 60 60
Coding 具体编码 240 290
Code Review 代码复审 30 30
Test 测试(自我测试,修改代码,提交修改) 20 20
Reporting 报告 40 40
Test Report 测试报告 20 20
Size Measurement 计算工作量 5 5
Postmortem & Process Improvement Plan 事后总结,并提出过程改机计划 15 15

 七、对小伙伴的评价

   对于我的 partner,我想说一声谢谢。在本次结对编程中,我们并不是一帆风顺,遇到了很多的困难,但我们都没有选择放弃,而是在互相鼓励中,成功完成了实验。我的 partner 她是一个动手能力很强,且有自己独特想法的同学,在实验过程中,以其熟练的编程能力,删掉了我冗余代码,使得程序的结构更加清楚明了,代码也更加的规范,这一点值得我去学习,还有一点就是对待事情认真的态度,例如在每添加一个控件的时候,都极力的使其对称整体,可以说是一丝不苟。总的来说,这次的结对编程很快乐,在不知不觉中就完成了实验,没有往日做实验的枯燥,相反,更愿意讨论彼此对问题的想法。这也增加我们解决问题的信心和动力。谢谢我们都不曾放弃无所畏惧自己。

八、 结对编程真的能够带来 1+1>2 的效果吗?通过这次结对编程,请谈谈你的感受和体会。

  通过本次结对编程,我觉得是结对编程 1+1>2 的,因为在实验过程中,我确切的感受到了合作的重要性,当一个人的想法不正确的时候,你的同伴可以很快的提醒你,两个人一起讨论问题,可以更快的解决问题,可以有很多新的想法产生。而且当你遇到困难的时候,你也不会轻易的放弃,因为你的同伴还在努力尝试着。两个人一起编程,你感觉不到编程的枯燥与乏味,反而是很轻松,很愉快,很享受彼此讨论自己想法的过程。

我们今天的关于结对项目 - 四则运算 “软件” 升级版的分享已经告一段落,感谢您的关注,如果您想了解更多关于201571030116/201571030106《小学四则运算练习软件》结对项目报告、201571030117/201571030142 《小学四则运算练习软件》结对项目报告、201571030118/201571030128《小学四则运算练习软件》结对项目报告、201571030124/201571030130《小学生四则运算练习软件》结对项目报的相关信息,请在本站查询。

本文标签: