四则运算题目生成程序3.0

项目成员:邱文鑫 201421123043 + 念其锋 201421123045

码市地址:https://git.coding.net/qwx_hh/java-szys.git

一、需求分析

      随着课余娱乐项目的增加,现在的小孩子在学习上变得越来越不自觉,需要老师、家长在背后催着才会做作业,因此需要实现一个计时功能,以时间的流逝来给孩子一些紧迫感。另外,在经过长期的运算训练之后,如何才知道学生的运算水平是否有显著提高呢?将做题过程进行计时可以解决这个问题,从花费时间的长短就可以看出是否取得进步。同时,老师、家长也可以利用计时功能设立奖励机制。例如,规定在二十秒内完成十道题目的学生可以得到一个大大的奖励,激励学生一次又一次地挑战这个时间。

      为了让这个四则运算自动生成器的使用人群跨越国界,就需要我们实现语言切换功能。不仅让中国大陆的小孩可以简单上手这个小程序,同时还能让中国台湾以及外国的小孩同样可以使用。实现这样一个小小的功能,就可以让我们这个自动生成器的受众面遍布世界各地,不受语言的障碍,何乐而不为呢?

      大多数的时候我们都不能要求这些小孩子在一个时间段内持续不断地做计算题,而是让他们分次来完成。举个例子,当老师布置小孩子一周之内要完成200道的四则运算,并记录做对多少题,做错多少题时,绝大部分学生肯定会选择一天做几次,一次做几题,极少同学会选择一次性把这200道题做完。这样子就存在一个问题,如果分次做的话那每一次做对多少题做错多少题都要登记下来吗?这也太麻烦了。因此就需要我们能够记录用户做题的总数,即使在用户退出又再次启动时,可以做到把以前的对错数量保存并在此基础上进行增量计算。

二、程序设计

(1)、基础功能

         1、有计时功能,能显示用户开始答题后的消耗时间;

         2、界面支持中文简体/中文繁体/英语,用户可以选择一种;

(2)、扩展功能

           3、记录用户的对错总数,程序退出再启动的时候,能把以前的对错数量保存并在此基础上增量计算;

        4、对用户输入题数的内容设置了容错功能,只可以输入1~10之间的数字,输入字母或者不在范围内的数字将无法点击确定按钮;

(3)、高级功能

           5、实现了错题复习功能,可以将用户使用以来做错的题目保存在文档中,点击“复习”按钮,生成的题目将全部是之前用户做错的题目,达到用户复习的目的。

(4)、思维导图

                              

(4)、团队合作

                 

代码规范:

 

Arithmetic类

astr            返回答案字符串

qstr            返回问题字符串

int_operation()        整数计算函数

fra_operation()        分数计算函数

common_divisor(int m,int n)

公约数计算函数

toString()        输出函数

Frame类

hs            实例化History

hh            实例化QA_List

timer            实例化Work_Time

Time            计时器动态窗口

answer1~10        输入窗口

Review            复习按钮

question1~10        题目显示标签

Right_answer1~10    正确答案显示标签

Tip1~10         提示正确与否标签

Time_cost         所花时间显示标签

Right_percent        正确率显示标签

Set_question         开始按钮

jLabel5            历史正确题数

jLabel7            历史总题数

rn            单次正确题数

tot            单次总题数

Frame()            Frame构造函数

initComponents()    窗体显示

xxxClicked(KeyEvent evt)    

点击事件

KeyPressed(JLabel i,JLabel j,JLabel l,int x,JTextField k)

点击事件批量处理函数

Hide()            使不需要的输入窗口关闭

Tip(String answer,int i)提示对错并计入

Histroy类

qstr            问题字符串

astr            答案字符串

str            答案+问题字符串(写入文件)

str2            正确题数+总题数字符串(写入文件)

tot            总题数

rn            正确题数

qstrlist        问题字符串列(读入文件)

astrlist        答案字符串列(读入文件)

scan(String qstr,String astr)

qstr+" "+astr

scan2(int tot,int rn)

tot+" "+rn

Histroy_create()    历史文档生成

Histroy_save()        存储历史题目与答案

Histroy_saveNum()    存储历史题目数目

Histroy_read()        读入历史题目与答案

History_num()        读入历史题目数目

QA_List类

i            加入列题目个数

Qusetion        问题字符串列

Answer            答案字符串列

QA_List()        QA_List构造函数

Test_Number类

i            显示Test_Number窗体次数

l            语言转化参数标识

Cancel_Button        取消按钮

Sure_Button        确定按钮

English            英文界面标签

Simplified_Chinese    简体中文界面标签

Traditional_Chinese    繁体中文界面标签

Number            所需题数

Test_Number()        Test_Number构造函数

initComponents()    Test_Number窗体显示

xxxClicked(KeyEvent evt)    

点击事件

Test类

main(String[] args)    

Work_Time类

x            00:00.x

y            00:y.00

z            z:00.00

 

 

 

(5)、psp表格

PSP2.1

Personal Software Process Stages

Time (m) Senior Student

Time (m)

Planning

计划

4

6

· Estimate

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

4

6

Development

开发

70

82

· Analysis

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

6

6

· Design Spec

生成设计文档

5

6

· Design Review

设计复审

4

6

· Coding Standard

代码规范

3

3

· Design

具体设计

5

6

· Coding

具体编码

35

50

· Code Review

代码复审

5

5

· Test

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

7

5

Reporting

报告

10

14

·

测试报告

5

5

·

计算工作量

2

5

·

并提出过程改进计划

3

3

三、代码展示

(1)、计时功能

Work_Time类:

 
 1 import java.util.TimerTask;
 2 import javax.swing.JTextField;
 3 
 4 public class Work_Time extends TimerTask{
 5 
 6     static int y=0;
 7     static int z=0;
 8     @Override
 9     public void run() {
10         // TODO Auto-generated method stub
11         String str_second = Frame.Time.getText().substring(6);
12         int x = Integer.parseInt(str_second);
13         if(Frame.Time.getText().equals("00:00.00")){
14             x=0;y=0;z=0;
15         }
16         x++;
17         if(z<10){
18             if(y<10)
19             {
20                 if(x<100)
21                     Frame.Time.setText("0"+z+":0"+y+"."+x);
22                 if(x==100)
23                 {
24                     y++;
25                     Frame.Time.setText("0"+z+":0"+y+".0");
26                     x=0;
27                     
28                 }
29             }
30             if(y<60&&y>=10)
31             {
32                 if(x<100)
33                     Frame.Time.setText("0"+z+":"+y+"."+x);
34                 if(x==100)
35                 {
36                     y++;
37                     Frame.Time.setText("0"+z+":"+y+".0");
38                     x=0;
39                     
40                 }
41             }
42             if(y==60){
43                 y=0;
44                 x=0;
45                 z++;
46             }
47         }
48         if(z<60&&z>=10){
49             if(y<10)
50             {
51                 if(x<100)
52                     Frame.Time.setText(z+":0"+y+"."+x);
53                 if(x==100)
54                 {
55                     y++;
56                     Frame.Time.setText(z+":0"+y+".0");
57                     x=0;
58                     
59                 }
60             }
61             if(y<60&&y>=10)
62             {
63                 if(x<100)
64                     Frame.Time.setText(z+":"+y+"."+x);
65                 if(x==100)
66                 {
67                     y++;
68                     Frame.Time.setText(z+":"+y+".0");
69                     x=0;
70                     
71                 }
72             }
73             if(y==60){
74                 y=0;
75                 x=0;
76                 z++;
77             }
78             else
79             {
80                 Frame.Time.setText("都一小时了放弃吧");
81             }
82         }
83     }
84     
85 
86 }

 

在Frame类中的调用:

1 Time.setText("00:00.00"); 

2 timer.schedule(new Work_Time(), 10, 10);
 

(2)、语言切换功能

Test_Number类中:

 
 1 private void Simplified_ChineseMouseClicked(java.awt.event.MouseEvent evt) {                                                
 2         jLabel6.setText("语言:");
 3         jLabel1.setText("所需习题数:");
 4         jLabel2.setText("(1-10之内)");
 5         Cancel_Button.setText("取消");
 6         Sure_Button.setText("确定");
 7         l=0;
 8     }                                               
 9 
10     private void Traditional_ChineseMouseClicked(java.awt.event.MouseEvent evt) {                                                 
11         jLabel6.setText("語言:");
12         jLabel1.setText("所需習題數:");
13         jLabel2.setText("(1-10之內)");
14         Cancel_Button.setText("取消");
15         Sure_Button.setText("確定");
16         l=1;
17     }                                                
18 
19     private void EnglishMouseClicked(java.awt.event.MouseEvent evt) {                                     
20         jLabel6.setText("Language:");
21         jLabel1.setText("How many questions:");
22         jLabel2.setText("(1-10)");
23         Cancel_Button.setText("Cancel");
24         Sure_Button.setText("OK");
25         l=2;
26     }

 

 在Frame类中:

   
 1 if(Test_Number.l==1){
 2             Set_qusetion.setText("開始");
 3             jLabel2.setText("計時:");
 4             jLabel1.setText("正確率:");
 5             jLabel3.setText("用時:");
 6             Review.setText("複習");
 7             jLabel4.setText("正確:");
 8             jLabel6.setText("全部:");
 9         }
10         if(Test_Number.l==2){
11             Set_qusetion.setText("Start");
12             jLabel2.setText("Timing:");
13             jLabel1.setText("Correct rate:");
14             jLabel3.setText("Time cost:");
15             Review.setText("Review");
16             jLabel4.setText("Right:");
17             jLabel6.setText("All:");
18         }

 

(3)、储存&读取功能

 
  1 import java.io.File;
  2 import java.io.FileNotFoundException;
  3 import java.io.FileWriter;
  4 import java.io.IOException;
  5 import java.util.ArrayList;
  6 import java.util.List;
  7 import java.util.Scanner;
  8 
  9 public class Histroy {
 10     String qstr;
 11     String astr;
 12     String str;
 13     String str2="0 0";
 14     double tot=0;
 15     double rn=0;
 16     public List<String> qstrlist = new ArrayList<String>();
 17     public List<String> astrlist = new ArrayList<String>();
 18     public void scan(String qstr,String astr){
 19         str=(astr+" "+qstr);
 20     }
 21     public void scan2(int tot,int rn){
 22         str2=(tot+" "+rn);
 23     }
 24     public void Histroy_create(){
 25         String path = "d:\\Myapp";
 26         File f = new File(path);
 27         if(!f.exists()){
 28             f.mkdirs();
 29             String fileName="histroy.txt";
 30             File file = new File(f,fileName);
 31             if(!file.exists()){
 32                 try {
 33                 file.createNewFile();
 34                 } catch (IOException e) {
 35                 // TODO Auto-generated catch block
 36                 e.printStackTrace();
 37                 }
 38                 
 39             }
 40             f.mkdirs();
 41             String fileName2="histroy_num.txt";
 42             File file2 = new File(f,fileName2);
 43             if(!file2.exists()){
 44                 try {
 45                 file2.createNewFile();
 46                 } catch (IOException e) {
 47                 // TODO Auto-generated catch block
 48                 e.printStackTrace();
 49                 }
 50                 
 51             }
 52             Histroy_saveNum();
 53         }
 54         
 55     }
 56     public void Histroy_save(){
 57          FileWriter writer;
 58          String fileName = ("d:\\Myapp\\histroy.txt");
 59         try {
 60             writer = new FileWriter(fileName, true);
 61             writer.write(str);
 62             writer.write("\r\n");
 63             writer.close();
 64         } catch (IOException e) {
 65             // TODO Auto-generated catch block
 66             e.printStackTrace();
 67         }
 68         
 69     }
 70     public void Histroy_saveNum(){
 71         FileWriter writer2;
 72         String fileName2 = ("d:\\Myapp\\histroy_num.txt");
 73         try {
 74             writer2 = new FileWriter(fileName2, true);
 75             writer2.write(str2);
 76             writer2.write("\r\n");
 77             writer2.close();
 78         } catch (IOException e) {
 79             // TODO Auto-generated catch block
 80             e.printStackTrace();
 81         }
 82     }
 83     public void Histroy_read()  throws FileNotFoundException{
 84         Scanner in = new Scanner(new File("d:\\Myapp\\histroy.txt"));//为历史信息.tit这个File创建一个扫描器in
 85         while(in.hasNextLine()){
 86             String line = in.nextLine();//读出历史信息.txt的下一行
 87             Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
 88             lineScanner.useDelimiter(" ");//使用空格作为分隔符
 89             qstr = lineScanner.next();//问题
 90             astr = lineScanner.next();//答案
 91             qstrlist.add(qstr);
 92             astrlist.add(astr);
 93         }
 94         in.close();
 95     }
 96     public void History_num() throws FileNotFoundException{
 97         Scanner in = new Scanner(new File("d:\\Myapp\\histroy_num.txt"));
 98         while(in.hasNextLine()){
 99             String line = in.nextLine();
100             Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
101             lineScanner.useDelimiter(" ");//使用空格作为分隔符
102             tot = Integer.parseInt(lineScanner.next());
103             rn = Integer.parseInt(lineScanner.next());
104         }
105         in.close();
106     }
107 }

 

四、程序运行

程序开始界面,此时是中文简体状态:

 

当鼠标单击标签时,切换成中文繁体或英文状态:

 

 

英语状态下的运行界面:

 

繁体状态下的错题复习:

 

错题保存在指定路径的文档中:

 

保存用户做的总题数和正确题数:

 

 

五、小结

      这是我们第一次使用结对编程的合作模式,两个人一起做一个项目,难免出现一些问题,我们做了代码规范,两个人同时坐在同一台电脑前,一个人敲代码另一个帮忙复审和提建议,一段时间后再对调角色,经过不断地磨合,让我感受到了新的体会,具体有以下几点:

1、在结对编程期间两个人对同一段代码有不同的理解,可以有效地避免许多错误的产生,一个人的思考往往会局限于自己的思维跳不出自己的“死胡同”,正所谓当局者迷旁观者清;

2、在实现用户输入题目数后开始计时的功能的时候,我们的程序出现了一个“延迟”的问题。例如,我第一次输入的题数是5,第二次是10,第三次是8,结果我在第二次输入10之后它只显示了5题,而在我第三次输入8题的时候它却显示了第二次的10题。这个问题让我们想了很久都没有想出来,后来把代码给学霸看完之后才发现可能是循环嵌套的问题,这让我明白了有时候当局者迷旁观者清,当自己费尽千辛万苦都找不到的问题时,可以让同学帮忙看一下,很有可能一下子就找到问题所在。

3、在编程之前,对Java的GUI界面的编辑与事件的处理方面一直感到苦手,在度娘的帮助之下,攻克了一个又一个的技术屏障,在互联网上寻找符合自己要求的小段代码经过自己的改造在自己的程序上“开花结果”,由此可见,互联网拉近了我们与知识的距离。

 

posted @ 2017-03-15 08:37  qwx_hh  阅读(276)  评论(1编辑  收藏  举报