5四则运算系统结对
结对项目—小学生四则运算系统
首先,感谢队友~
一、Coding.Net项目地址:
https://git.coding.net/laolaf/nidayeproject.git
二、PSP表格
psp | 任务内容 | 计划共需要的时间(min) |
Planning | 计划 | 40 |
Estimate | 估计时间,规划流程 | 20 |
Development | 开发 | 1200 |
Analysis | 需求分析&学习技术 | 120 |
Design Spec |
生成设计文档 | 40 |
Design Review | 设计复审 | 20 |
Coding Standard | 代码规范 | 5 |
Design | 具体设计 | 30 |
Coding | 具体编码 | 800 |
Coding Review | 代码复审 | 45 |
Test | 测试(自我测试,修改代码,提交修改) | 30 |
Reporting | 报告 | 30 |
Test Report | 测试报告 | 20 |
Size Measurement | 计算工作量 | 20 |
三、接口设计
Information Hiding (信息隐藏)
防止修改程序的其他部分。提供一个稳定的接口保护程序的其余部分(最有可能改变的细节)。将所有的计算和展示模块进行类的封装,提高程序的安全性和稳定性。
Interface Design(接口设计)
模块化设计的思想,专注于每一个类,不同的类有不同的方法,使其相互独立,最后做统一调度,使其便于维护。
Loose Coupling(松耦合)
与紧耦合相对立,使程序内部不易相互错误影响。
四、计算模块接口的设计和实现
使用的类一览
Command.java
Cal.java
Arithmetic.java
Arithmetic Test.java
Athritic.java
Complex.java
English.java
Main.java
Timer.java
Timu2.java
视图如下
Command:参数抛出&提供测试
Create:制作题目,CreateQuestion
Cal:实现计算功能
GUI
GUI Time计算时间
GUI Judge进行判断,对错数目
GUI Create
另外,用到了按钮监听器和文件监听器
五、计算模块接口部分的性能改进
六、计算模块部分单元测试展示
七、计算模块部分异常处理说明
异常处理有五种,分别对参数输入错误(数字变字母),对m的输入大小范围有误,m后两个参数大小颠倒,对n的输入n的大小范围出问题,参数o的范围大小有问题(应该的范围:1到10),而这些代码的写法都差不多,因此就展示抛出参数错误的代码。(这里的抛出我是直接打印在黑窗上了,直接抛出可能会被当成Command本身出了问题。)
public static void parameter1Error(String ex,int i)throws Exception{ ArrayList<String> ma= new ArrayList<String>(); ma.add("-n");ma.add("-m"); ma.add("-o");ma.add("-c"); ma.add("-b"); if(!ma.contains(ex)){ System.out.println("参数错误,重新输入"); } }
八、界面模块设计过程
guijudge核心代码:通过buttton1及监听类addActionListener完成记录和判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
guicreate:
JButton btnSubmitAnswer = new JButton("Submit answer");
btnSubmitAnswer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String[] ans =textArea_1.getText().split("\n");
String strings[]=new String[list11.size()];
for(int i=0,j=list11.size();i<j;i++){
strings[i]=list11.get(i);
} int count=0;
for(int i = 0;i < list11.size();i++){
//answer.add(ans[i]+"");}
//for(String str1:answer)
//{
if(ans[i].equals(strings[i]))
{
print.add("Right\n");
count++;
}
else{print.add("Wrong\n");}
}
//for(int i=0,j=print.size();i<j;i++){
textArea_2.append(print+"\n");
double sum =((double)count/(double)(list11.size()))*100;
lblNewLabel.setText("Accuracy:"+sum+"%");
// String [] print1=print;
//}
}
});
btnSubmitAnswer.setBounds(30, 236, 124, 23);
contentPane.add(btnSubmitAnswer);
getContentPane().setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(20, 49, 146, 177);
contentPane.add(scrollPane);
scrollPane.setViewportView(textArea);
textArea.setBackground(UIManager.getColor("Button.background"));
textArea.setFont(new Font("MS Gothic", Font.PLAIN, 18));
JScrollPane scrollPane_1 = new JScrollPane();
scrollPane_1.setBounds(176, 49, 62, 177);
contentPane.add(scrollPane_1);
textArea_1.setFont(new Font("Monospaced", Font.PLAIN, 15));
scrollPane_1.setViewportView(textArea_1);
JScrollPane scrollPane_2 = new JScrollPane();
scrollPane_2.setBounds(265, 49, 62, 177);
contentPane.add(scrollPane_2);
textArea_2.setFont(new Font("Monospaced", Font.PLAIN, 18));
scrollPane_2.setViewportView(textArea_2);
textArea_2.setBackground(UIManager.getColor("Button.background"));
JButton btnCallTimer = new JButton("Call timer");
btnCallTimer.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
new timer().setVisible(true); }
});
btnCallTimer.setBounds(297, 238, 127, 23);
contentPane.add(btnCallTimer);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setForeground(Color.BLACK);
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JLabel lblQing = new JLabel("\u8BF7\u8F93\u5165\u9898\u76EE\u6570\u91CF");
lblQing.setBounds(78, 10, 103, 35);
contentPane.add(lblQing);
textField = new JTextField();
textField.setBounds(191, 17, 66, 21);
contentPane.add(textField);
textField.setColumns(10);
1
|
|
以及:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
JButton btnSubmitAnswer = new JButton( "Submit answer" ); btnSubmitAnswer.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { String[] ans =textArea_1.getText().split( "\n" ); String strings[]= new String[list11.size()]; for ( int i= 0 ,j=list11.size();i<j;i++){ strings[i]=list11.get(i); } int count= 0 ; for ( int i = 0 ;i < list11.size();i++){ //answer.add(ans[i]+"");} //for(String str1:answer) //{ if (ans[i].equals(strings[i])) { print.add( "Right\n" ); count++; } else {print.add( "Wrong\n" );} } //for(int i=0,j=print.size();i<j;i++){ textArea_2.append(print+ "\n" ); double sum =(( double )count/( double )(list11.size()))* 100 ; lblNewLabel.setText( "Accuracy:" +sum+ "%" ); // String [] print1=print; //} } }); btnSubmitAnswer.setBounds( 30 , 236 , 124 , 23 ); contentPane.add(btnSubmitAnswer); getContentPane().setLayout( null ); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds( 20 , 49 , 146 , 177 ); contentPane.add(scrollPane); scrollPane.setViewportView(textArea); textArea.setBackground(UIManager.getColor( "Button.background" )); textArea.setFont( new Font( "MS Gothic" , Font.PLAIN, 18 )); JScrollPane scrollPane_1 = new JScrollPane(); scrollPane_1.setBounds( 176 , 49 , 62 , 177 ); contentPane.add(scrollPane_1); textArea_1.setFont( new Font( "Monospaced" , Font.PLAIN, 15 )); scrollPane_1.setViewportView(textArea_1); JScrollPane scrollPane_2 = new JScrollPane(); scrollPane_2.setBounds( 265 , 49 , 62 , 177 ); contentPane.add(scrollPane_2); textArea_2.setFont( new Font( "Monospaced" , Font.PLAIN, 18 )); scrollPane_2.setViewportView(textArea_2); textArea_2.setBackground(UIManager.getColor( "Button.background" )); JButton btnCallTimer = new JButton( "Call timer" ); btnCallTimer.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e) { new timer().setVisible( true ); } }); btnCallTimer.setBounds( 297 , 238 , 127 , 23 ); contentPane.add(btnCallTimer); |
九、界面模块与计算模块的对接
调用Cal的cal方法,原先求值和现在通过了一次数据类型转换。
1
2
3
4
|
String c = (data1+operator[i]+data2+ "=" ); textArea.append(c+ "\n" ); String rightanswer=Cal.cal(data1,operator[i],data2); list11.add(rightanswer); |
Cal模块:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
BigDecimal jieguo; public BigDecimal Cal(String str) { if (str == null ) { return null ; } String fuhao = "" ; int index = 0 ; str = str.replaceAll( "--" , "+" ); // 等价替换; str = str.replaceAll( " " , "" ); // 去掉空格 fuhao = "(" ; index = str.lastIndexOf(fuhao); if (index >= 0 ) { int rightIndex = str.indexOf( ")" , index); String left = str.substring( 0 , index); String right = "" ; if (rightIndex + 1 < str.length()) { right = str.substring(rightIndex + 1 ); } BigDecimal middle = Cal(str.substring(index + 1 , rightIndex)); return Cal(left + middle + right); } fuhao = "+" ; index = str.lastIndexOf(fuhao); if (index > 0 ) { BigDecimal left = Cal(str.substring( 0 , index)); BigDecimal right = Cal(str.substring(index + 1 )); return left.add(right); } fuhao = "-" ; index = str.lastIndexOf(fuhao); if (index == 0 ) { // 负数处理 BigDecimal result = Cal(str.substring(index + 1 )); if (result.compareTo( new BigDecimal( "0" )) == - 1 ) { // 小于0 return result.abs(); // 绝对值 } else { return result.negate(); // 相反数 } } else if (index > 0 ) { BigDecimal left = Cal(str.substring( 0 , index)); BigDecimal right = Cal(str.substring(index + 1 )); return left.subtract(right); } fuhao = "*" ; index = str.lastIndexOf(fuhao); if (index > 0 ) { BigDecimal left = Cal(str.substring( 0 , index)); BigDecimal right = Cal(str.substring(index + 1 )); return left.multiply(right); } fuhao = "÷" ; index = str.lastIndexOf(fuhao); if (index > 0 ) { BigDecimal left = Cal(str.substring( 0 , index)); BigDecimal right = Cal(str.substring(index + 1 )); return left.divide(right); } return new BigDecimal(str); |
十、结对过程(照片)
十一、结对编程的优点和缺点
结对编程的优点:
结对编程是一个特殊的开发模式,开发复审一体化的模式。
结对编程是个渐进的过程,度过学习阶段后,开发的质量和效率大大提高。
两人结对,可以分工合作,提高效率,减轻负担。
结对编程的缺点:
结对编程需要和队友交流,需要较好的交流技巧。
考验合作的能力,需要有学习适应的过程。
队友的优点和缺点
队友coding水平还是可以的,
缺点,不是很擅长与人交流。
十二、在附录提供的PSP表格记录各个模块耗时