作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097

 我的GitHub远程仓库的地址(即团队的地址):https://github.com/dujunlin/djl.git

结对伙伴:黄津霖 201606120060

一、题目要求

  从个人项目出发,将程序改装成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到:

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

二、扩展发现

  1. 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
  2. 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
  3. 用户答题结束以后,程序可以显示用户答题所用的时间
  4. 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数
  5. 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名 
  6. 程序可以出单个整数阶乘的题目:如:4!=24
  7. 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
  8. 程序可以设置皮肤功能,可以改变界面的颜色即可。

    三、详细设计

    开发工具:IntelliJ IDEA 2017.2.3 

    开发语言:java

    开发时间:2018.10.25-2018.10.29

四、项目的时间规划

PSP2.1 Personal Software Process Stages Time Senior Student Time
Planning 计划 35(minute) 50(minute)
· Estimate 估计这个任务需要多少时间 180(minute) 180(minute)
Development 开发 60(minute) 60(minute)
· Analysis 需求分析 (包括学习新技术) 30(minute) 35(minute)
· Design Spec 生成设计文档 10(minute) 10(minute)
· Design Review 设计复审 30(minute) 45(minute)
· Coding Standard 代码规范 30(minute) 30(minute)
· Design 具体设计 20(minute) 22(minute)
· Coding 具体编码 120(minute) 200(minute)
· Code Review 代码复审 50(minute) 60(minute)
· Test 测试(自我测试,修改代码,提交修改) 30(minute) 30(minute)
Reporting 报告 5(minute) 8(minute)
· 测试报告 15(minute) 15(minute)
· 计算工作量 2(minute) 1(minute)
· 并提出过程改进计划 3(minute) 3(minute)

五、部分主要代码:

 

复制代码
public static void exercise(){
Timu();
JFrame f=new JFrame();
f.setTitle("在线答题系统(保留一位小数)");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setExtendedState(JFrame.MAXIMIZED_BOTH);
f.setVisible(true);

//设置窗口的大小和位置
f.setSize(600,500);
f.setLocation(400,100);
f.setLayout(null);
JPanel pan1=new JPanel();
JLabel name1=new JLabel("题目");
pan1.add(name1);
JTextField nameTest7=new JTextField(15);
nameTest7.setBounds(10, 10, 180, 100);
nameTest7.setText(T);
// nameTest1.setPreferredSize(new Dimension(180,100));
pan1.add(nameTest7);
JLabel name2=new JLabel("请输入答案");
pan1.add(name2);
JTextField nameTest1=new JTextField(15);
// String Answer=nameTest1.getText();
//int DaAn=Integer.parseInt(Answer);
nameTest1.setBounds(10, 10, 180, 100);
// nameTest1.setPreferredSize(new Dimension(180,100));
pan1.add(nameTest1);
pan1.setBounds(10, 10, 200, 120);
f.add(pan1);


JPanel pan2=new JPanel();
JLabel name7=new JLabel("正确答案为:");
pan2.add(name7);
JTextField nameTest2=new JTextField(15);

nameTest2.setBounds(300, 10, 180, 100);
// nameTest2.setPreferredSize(new Dimension(180,100));
pan2.add(nameTest2);
pan2.setBounds( 300,10, 200, 120);
f.add(pan2);

JPanel pan3=new JPanel();
pan3.setLayout(null);
JTextField nameTest3=new JTextField(15);
nameTest3.setBounds(10, 60, 480, 200);
nameTest3.setPreferredSize(new Dimension(300,100));
pan3.add(nameTest3);
pan3.setBounds( 10,60, 500, 220);
f.add(pan3);

JPanel pan4 = new JPanel();
JButton btnStart=new JButton("下一题");
btnStart.setBounds(30, 300,30, 30);
btnStart.setPreferredSize(new Dimension(100,80));
btnStart.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int daan=0 ;
String Answer=nameTest1.getText();
if(Answer.equals("")){
nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 请先完成本题 ");
}
if(ID==2){
if(Answer.equals(d)){
nameTest2.setText(d);
Right++;
}else if(!Answer.equals(d) && !Answer.equals("")){
nameTest2.setText(d);
}
}
if(ID==1) {
daan = Integer.parseInt(Answer);
System.out.println(daan);
if (daan == DaAn) {
nameTest2.setText(String.valueOf(DaAn));
Right++;
} else {
nameTest2.setText(String.valueOf(DaAn));
}
}
int res=JOptionPane.showConfirmDialog(null,"是否结束本题","下一题",JOptionPane.YES_NO_OPTION);
if(res==JOptionPane.YES_OPTION){
z++;
if(z<i) {
Timu();
nameTest7.setText(T);
nameTest1.setText("");
nameTest2.setText("");
pan1.add(nameTest7);
pan1.setBounds(10, 10, 200, 120);
f.add(pan1);
}else {
nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 已经是最后一题 ");
}
} else {
nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 请继续做题 ");
}

}
});
pan4.add(btnStart);
pan4.setBounds(40, 350, 110, 90);
f.add(pan4);

JPanel pan5 = new JPanel();
JButton btnStart1=new JButton("提交");
btnStart1.setBounds(30, 300,30, 30);
btnStart1.setPreferredSize(new Dimension(100,80));
btnStart1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
int res=JOptionPane.showConfirmDialog(null,"是否提交","是否提交",JOptionPane.YES_NO_OPTION);
if(res==JOptionPane.YES_OPTION){
nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 提交成功 ");
}else {
nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 请继续做题 ");
}
}
});
pan5.add(btnStart1);
pan5.setBounds(190, 350, 110, 90);
f.add(pan5);


JPanel pan6 = new JPanel();
// pan4.setLayout(null);
JButton btnStart2=new JButton("查看分数");
btnStart2.setBounds(30, 300,30, 30);
btnStart2.setPreferredSize(new Dimension(100,80));
btnStart2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//计算用时

nameTest3.setFont(new Font("宋体", Font.PLAIN, 20));
nameTest3.setText(" 一共有"+i+"道题,共答对了:"+Right+"题,得分为:"+20*Right+"分");

}
});
pan6.add(btnStart2);
pan6.setBounds(340, 350, 110, 90);
f.add(pan6);

}

                }
复制代码

六、程序展示

程序刚开始的界面:

填写题数和类型后

填完答案后点击下一题才会显示当前题目的正确答案

 

当填写到最后一题的时候,会在文本框上提示你,并停止出题

点击查看分数按钮,会在文本框内显示你的答题情况

 

 七、结对伙伴

 姓名:黄津霖

黄津霖负责的内容:查看分数功能和出分数式子功能

 合作过程:

 

 

八、设计过程分析:

做了一个星期,好多功能都没法实现,我是真的尽力了。