Github地址:https://github.com/wulezha/JDXM/blob/master/jdxm

1、需求分析

(1)该项目要求程序有人机交互界面,由计算机从题库文件中随机选择若干道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,且可评判成绩;

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

(3)可为用户提供百以内整数算式、带括号算式、真分数算式三种练习;

(4)可为进行多轮测试并记录成绩生成柱状图并且记录用户消耗的时间。

2、功能分析

  • 可实现基本要求,即可生成数字在 0 和 100 之间,运算符在3个到5个之间的计算表达式,并计算出表达式的结果。
  • 随机可生成带括号的运算式。

3、设计实现

 

 

4、运行测试

  • 登录页面

 

  • 登陆成功后,跳转主页面,选择题目。

 

  • 选择试题类型后,进行答题,并可查看错误答案

 

  • 答题结束后,提交并获取分数,绘柱形图

 

5核心代码

 

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

import javax.swing.JFrame;

public class ChartPrint extends JFrame{

    //绘制柱形统计图
    private Random ran;
    public ChartPrint(){
        super();
        ran = new Random();
        setTitle("绘制得分柱形图");
        setBounds(100, 100, 400, 271);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
    @Override
    public void paint(Graphics g){
        int Width = getWidth();
        int Height = getHeight();
        int leftMargin = 20;//柱形图左边界
        int topMargin = 50;//柱形图上边界
        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.cyan);
        for(int i=0;i<4;i++){//绘制柱形图
            int value = ran.nextInt(Height-topMargin-10)+10;//随机产生柱形的百分比
            int step = (i+1)*40;//设置每隔柱形图的水平间隔为40
            //绘制矩形
//            g2.drawRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10);
            g2.fillRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10);
            //列出产品的编号
            g2.drawString("练习次数"+(i+1), leftMargin+step*2, Height-value-5);
        }
    }
    public static void main(String[] args) {
        ChartPrint demo = new ChartPrint();
        demo.setVisible(true);
    }
}

柱形图







import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
public class Login {    
    private JFrame frame = new JFrame("四则运算");    
    private Container c = frame.getContentPane();    
    private JTextField username = new JTextField();    
    private JPasswordField password = new JPasswordField();    
    private JButton ok = new JButton("确定");
    private JButton cancel = new JButton("取消");    
    public Login(){       
        frame.setSize(300,200);        
        c.setLayout(new BorderLayout());    
        initFrame();    
        frame.setVisible(true);
        }    
    private void initFrame() 
    {                //顶部
        ok.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                new chuti();
                }
        });
        JPanel titlePanel = new JPanel();    
        titlePanel.setLayout(new FlowLayout());    
        titlePanel.add(new JLabel("学生登录"));    
        c.add(titlePanel,"North");            
        //中部表单        
        JPanel fieldPanel = new JPanel();        
        fieldPanel.setLayout(null);        
        JLabel l1 = new JLabel("学   号:");        
        l1.setBounds(50, 20, 50, 20);    
        JLabel l2 = new JLabel("密    码:");        
        l2.setBounds(50, 60, 50, 20);    
        fieldPanel.add(l1);        
        fieldPanel.add(l2);        
        username.setBounds(110,20,120,20);    
        password.setBounds(110,60,120,20);    
        fieldPanel.add(username);    
        fieldPanel.add(password);    
        c.add(fieldPanel,"Center");                //底部按钮        
        JPanel buttonPanel = new JPanel();    
        buttonPanel.setLayout(new FlowLayout());    
        buttonPanel.add(ok);    
        buttonPanel.add(cancel);        
        c.add(buttonPanel,"South");
        }    
    public static void main(String[] args){       
        new Login(); 
        }    
    }



登录界面









import java.util.Random;


public class chuti {
    int a,b,c,d;
    int an[]=new int [5];
    String bn[]=new String [5];
    Random cn =new Random();
    chuti(){
        int i=0;
        do{    
        a=cn.nextInt(100);
        b=cn.nextInt(100);
        d=cn.nextInt(100)%4+1;
        switch(d){
            case 1:
                an[i]=a+b;
                bn[i]=String.valueOf(a)+"+"+String.valueOf(b)+"=";
                i++;
                break;
            case 2: 
                an[i]=a-b;
                bn[i]=String.valueOf(a)+"-"+String.valueOf(b)+"=";
                i++;break;
            case 3:an[i]=a*b;
            bn[i]=String.valueOf(a)+"*"+String.valueOf(b)+"=";
            i++;
                break;
            case 4:an[i]=a/b;
            bn[i]=String.valueOf(a)+"/"+String.valueOf(b)+"=";
            i++;break;
        }
        }while(i<5);
        for(int j=0;j<bn.length;j++)
            {System.out.println(bn[j]);System.out.println(an[j]);
            }
        new yunsuan(an,bn);
    }
    
}

出题



import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;


public class yunsuan extends JFrame{
    JLabel l1 = new JLabel("答对题数:");

    private JFrame frame = new JFrame("四则运算");    
    private Container c = frame.getContentPane();    
    private JButton KO = new JButton("确定");
    private JTextField A = new JTextField(6);
    private JTextField AA = new JTextField(4);
    private JTextField AAA = new JTextField(4);
    private JTextField B = new JTextField(6);
    private JTextField BB = new JTextField(4);
    private JTextField BBB = new JTextField(4);
    private JTextField C = new JTextField(6);
    private JTextField CC = new JTextField(4);
    private JTextField CCC = new JTextField(4);
    private JTextField D = new JTextField(6);
    private JTextField DD = new JTextField(4);
    private JTextField DDD = new JTextField(4);
    private JTextField E = new JTextField(6);
    private JTextField EE = new JTextField(4);
    private JTextField EEE = new JTextField(4);
    
    private JPasswordField password = new JPasswordField();    
    private JButton ok = new JButton("确定");
    private JTextField QQ = new JTextField(6);
    
    
int num=0;
    int an[]=new int [5];
    String bn[]=new String [5];
    String cn[]=new String [5];
     yunsuan(int a[],String b[]) 
    {    
         an=a;
         bn=b;
     
        JPanel fieldPanel = new JPanel();
    
        fieldPanel.add(A);A.setBounds(30, 10, 100, 20);
        A.setVisible(true);
        fieldPanel.add(AA);AA.setBounds(40, 10, 100, 20);
        fieldPanel.add(AAA);AAA.setBounds(50, 10, 100, 20);
        fieldPanel.add(B);B.setBounds(30, 15, 50, 20);
        fieldPanel.add(BB);BB.setBounds(40, 15, 100, 20);
        fieldPanel.add(BBB);BBB.setBounds(50, 10, 100, 20);
        fieldPanel.add(C);C.setBounds(30, 20, 50, 20);
        fieldPanel.add(CC);CC.setBounds(40, 20, 100, 20);
        fieldPanel.add(CCC);CCC.setBounds(50, 10, 100, 20);
        fieldPanel.add(D);D.setBounds(30, 25, 50, 20);
        fieldPanel.add(DD);DD.setBounds(40, 25, 100, 20);
        fieldPanel.add(DDD);DDD.setBounds(50, 10, 100, 20);
        fieldPanel.add(E);E.setBounds(30, 30, 50, 20);
        fieldPanel.add(EE);EE.setBounds(40, 30, 100, 20);
        fieldPanel.add(EEE);EEE.setBounds(50, 10, 100, 20);
        fieldPanel.add(KO);KO.setBounds(30, 50, 20, 20);
        fieldPanel.add(l1);l1.setBounds(20, 60, 100, 20);
        fieldPanel.add(QQ);QQ.setBounds(40, 70, 100, 20);
    
        KO.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                cn[0]=AA.getText();
                cn[1]=BB.getText();
                cn[2]=CC.getText();
                cn[3]=DD.getText();
                cn[4]=EE.getText();
                AAA.setText(String.valueOf(an[0]));
            BBB.setText(String.valueOf(an[1]));        
            CCC.setText(String.valueOf(an[2]));                
            DDD.setText(String.valueOf(an[3]));
            EEE.setText(String.valueOf(an[4]));
                for(int i=0;i<an.length;i++)
                if(String.valueOf(an[i]).equals(cn[i]))num++;
                QQ.setText(String.valueOf(num));
                }
        });
        fieldPanel.setVerifyInputWhenFocusTarget(true);
        
        
        A.setText(bn[0]);
        B.setText(bn[1]);
        C.setText(bn[2]);
        D.setText(bn[3]);
        E.setText(bn[4]);
        
this.add(fieldPanel);
this.setBounds(400, 400, 250, 270);
this.setVisible(true);

    }
     }




文本框

 

6结对编程过程

我们首先根据项目要求进行分析,确定了三个主要的部分:绑定事件、计时器、画流程图。经过详细的探讨和分析,我们设计了软件的整体框架,然后进行分工完成项目。

 

 

7、展示PSP

PSP2.1

任务内容

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

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

Planning

计划

30

30

 Estimate

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

50

50

Development

开发

300

360

Analysis

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

30

30

 Design Spec

生成设计文档

40

60

Design Review

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

20

10

Coding Standard

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

10

10

Design

具体设计

60

40

Coding

具体编码

180

150

Code Review

代码复审

10

20

est

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

40

60

Reporting

报告

30

45

Test Report

测试报告

25

30

Size Measurement

计算工作量

10

6

Postmortem & Process

Improvement Plan

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

10

20

8、对小伙伴的评价

        首先,我要谢谢我的小伙伴,我觉得她是一个能静下心来的姑娘,欣赏她的能在一堆代码中认真调试的心境,这一点非常值得我学习。其次,我认为我们的编码习惯真的是有待改进。在整个项目的实现过程中,她都表现的都很积极,共同设计、写代码、查找资料以及最后的界面和代码优化她都很积极很认真,比起她感觉自己总是对自己要求不够高,做的差不多感觉就做好了,没有做的更好的想法,这让我很惭愧,在与她合作的过程中我也发现了我自己的很多不足之处,以后我也会尽最大的努力把事情做到最好。总之,这是一个很愉快的合作。

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

        通过这次编程,我觉得能够带来1+1>2的效果,之前一个人做的时候,遇到不懂得问题时,就会陷入迷茫。当两个人一起编程时,有不懂的还可以一起讨论,说出自己的意见,也为整个编程过程节约了时间,除此之外,两个人一起合作时就会产生更多更好的想法,可以更好的优化整个项目的设计,遇到问题时可以相互帮助解决问题,效率也比较高。两个人合作还可以发现多方身上的优点,找出自己身上的不足,并能相互监督让彼此变得更好,还可以彼此分享好的学习经验,所以我们认为两个人合作的效率远远大于一个人。