• 小学四则运算结对项目


    Github地址:https://github.com/mazhongshan/demo2

    1.需求分析:

      (1)随机选择20道混合运算;

      (2)用户输入答案,给出结果;

      (3)程序检查答案结果,正确计5分,错误不计分;

      (4)20道测试题结束给出总分;

      (5)带括号算式,真分数算式;

      (6)程序允许用户进行多轮测试,给出多轮测试分数柱状图;

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

      (8)测试有记时功能,动态显示答题后的消耗时间;

      (9)程序人机交互界面是GUI界面;

    2.功能设计:

      (1)算式引用实验二的代码;

      (2)生成的题库显示在QuestionBank.docx 中;并随机产生20道算式;

      (3)调用包JfreeChart-1.0.13包;来生成柱状图;

      (4)倒计时用Thread.sleep和循环来完成;

      (5)多轮测试弹出框用JOptionPane类来完成;

    3.设计实现:

      (1)随机产生的20道算式放在ArrayList集合中,然后传参调入Gu类中;

      (2)倒计时时间设置为30分钟,以消耗的形式动态展现;

      (3)随机产生的算式得出的结果放在counter中,然后以传参形式放在Score类中,形成柱状图;

    4.核心代码:

      Gu类(界面)

    package cn.longteng.demo;
    
    import java.awt.BorderLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.FileNotFoundException;
    import java.util.ArrayList;
    
    import javax.swing.*;
    
    public class Gu extends JFrame {
        static JFrame j;
        static JPanel jp, p1, p2;
        JLabel[] lab = new JLabel[20];
        JLabel[] lab3 = new JLabel[20];
        static JTextField[] txt = new JTextField[20];
        static JButton btn;
        static JLabel lab1;
    
        String[] str = new String[200];
        int[] num = new int[200];
        String[] sr = new String[20];
        static int[] nm = new int[20];
        static long time = 1800;
        static Main m = new Main();
        static int[] res=new int[20];
        static int counter=0;
        static String[] srs=new String[20];
        static int n;
        static int w;
        static ArrayList<Integer> lis=new ArrayList();
        public Gu() {
                        
        }
        
        public void Jiemian(){
            j = new JFrame("小学生在线混合运算题库");
            j.setSize(1366, 735);
            jp = new JPanel();
            jp.setLayout(new BorderLayout());
            p1 = new JPanel();
            p1.setLayout(new BorderLayout());
            p2 = new JPanel();
            p2.setLayout(new GridLayout(10, 5, 10, 40));
            btn = new JButton("提交");
            lab1 = new JLabel();    
            
            for (int k = 0; k < 20; k++) {
                lab[k] = new JLabel("");
                txt[k] = new JTextField("   ");
                lab3[k] = new JLabel("                  ");
            }
    
            for (int i = 0; i < 20; i++) {
                p2.add(lab3[i]);
                p2.add(lab[i]);
                p2.add(txt[i]);
            }
    
            p1.add(lab1, BorderLayout.WEST);
            p1.add(btn, BorderLayout.EAST);
            j.add(jp);
            jp.add(p1, BorderLayout.NORTH);
            jp.add(p2, BorderLayout.CENTER);
            j.setVisible(true);
            j.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
        }
        
        public void SetLab(Main s) {
            try {
                s.Num();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            this.str = Main.ts;
            this.num = Main.s;
            int i = 0;
            for (int l = 0; l < 200; l = l + 10) {
                while (i < 20) {
                    sr[i] = str[l];
                    nm[i] = num[l];
                    lab[i].setText(sr[i]);
                    i++;
                    break;
                }
            }    
            }
        
        
        public  void Time() {
            while(time >0) {
                long mm = time / 60 % 60;
                long ss = time % 60;
                lab1.setText("剩余答题时间:" + mm + ":" + ss);
                time--;
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }        
            }
        }
    
        public void Chann(){
        
            btn.addActionListener(new ActionListener(){
                @Override
                public void actionPerformed(ActionEvent e) {
                    // TODO Auto-generated method stub
                    if(e.getSource()==btn){
                        for(int x=0;x<20;x++){
                            srs[x]=txt[x].getText().replaceAll(" ","");
                            if(srs[x].equals("")){
                                res[x]=0;
                            }
                            else{
                                res[x]=Integer.parseInt(srs[x].replaceAll(" ", ""));
                                if(res[x]==nm[x]){
                                    counter+=5;
                                }
                            }
                        }
                        lis.add(counter);
                        n=JOptionPane.showConfirmDialog(j, "是否提交?","系统提示",JOptionPane.INFORMATION_MESSAGE);
                        if(n==JOptionPane.YES_OPTION){
                            j.dispose();
                            w++;
                            new Score();    
                        }
                        else{
                            return;
                        }
                        
                    }
                }
                
            });    
        }
        
        public void Ch(){
            if(time==0){
                for(int k=0;k<20;k++){
                    srs[k]=txt[k].getText().replaceAll(" ","");
                    if(srs[k].equals("")){
                        res[k]=0;    
                        
                     }else{
                
                    res[k]=Integer.parseInt(srs[k].replaceAll(" ", ""));
                    if(res[k]==nm[k]){
                        counter+=5;
                    }
                }
            }
                lis.add(counter);
                j.dispose();
                w++;
                new Score();
            }
        }
    
    }

          Score类

    package cn.longteng.demo;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.util.ArrayList;
    
    import javax.swing.JFrame;
    import javax.swing.JOptionPane;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartPanel;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.CategoryAxis;
    import org.jfree.chart.axis.ValueAxis;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer3D;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    public class Score extends JFrame{
        ChartPanel frame1;
        static JFrame frame;
        static Gu gu=new Gu();
        static Main m = new Main();
        static ArrayList<Integer> lis=new ArrayList();
        public Score(){
            CategoryDataset dataset=getData(gu);
            
            JFreeChart chart=ChartFactory.createBarChart3D("小学生在线测试分数结果", "测试的次数", "分数", dataset,  PlotOrientation.VERTICAL, true, false,false);
            
            CategoryPlot plot=chart.getCategoryPlot();
            
            CategoryAxis domainAxis=plot.getDomainAxis(); 
            
            domainAxis.setLabelFont(new Font("黑体",Font.BOLD,14));         //水平底部标题
    
            domainAxis.setTickLabelFont(new Font("宋体",Font.BOLD,12));  //垂直标题
            
            domainAxis.setUpperMargin(0.2); 
            //设置距离图片右端距离 
            domainAxis.setLowerMargin(0.1); 
            //透明度
           // plot.setForegroundAlpha(1.0f); 
    
            ValueAxis rangeAxis=plot.getRangeAxis();//获取柱状
    
            rangeAxis.setLabelFont(new Font("黑体",Font.BOLD,15));
    
            chart.getLegend().setItemFont(new Font("黑体", Font.BOLD, 15));
    
            chart.getTitle().setFont(new Font("宋体",Font.BOLD,20));//设置标题字体
            
            BarRenderer3D renderer = new BarRenderer3D();//3D属性修改 
            
            plot.setRenderer(renderer);//将修改后的属性值保存到图中 
           
            renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator()); 
            
            renderer.setBaseItemLabelsVisible(true);
            
            renderer.setBaseItemLabelPaint(Color.BLUE);//
            
            frame1=new ChartPanel(chart,true); 
            
            frame=new JFrame("小学生在线混合运算测试统计图");
    
            frame.setLayout(new GridLayout(2,2,10,10));
    
            frame.add(getChartPanel());           //添加柱形图
    
            frame.setBounds(300, 50, 600, 650);
    
            frame.setVisible(true);
            Clos();
        }
    
        
        public CategoryDataset getData(Gu g) {
            // TODO Auto-generated method stub
             DefaultCategoryDataset dataset = new DefaultCategoryDataset();
             this.lis=g.lis;
             for(int i=0;i<g.w;i++){
                 dataset.addValue(lis.get(i),"","第"+i+"轮测试");
             }
             return dataset;
        }
        
        public ChartPanel getChartPanel(){
            return frame1;
        }
        
        public static  void Clos(){
             frame.addWindowListener(new WindowAdapter(){
                 public void windowClosing(WindowEvent e){
                     int i=JOptionPane.showConfirmDialog(null, "是否再次测试","系统提示",JOptionPane.INFORMATION_MESSAGE);
                     if(i==JOptionPane.YES_OPTION){
                        Gu g = new Gu();
                        g.Jiemian();
                        g.SetLab(m);
                        g.Chann();
                        frame.dispose();
                        //g.Time();
                        g.Ch();
                     }
                     else {
                         System.exit(0);
                     }
                 }
             });
        }
        
    }

    5.测试结果截图:

    结对时照片及评价:虽然我们两个编程能力不好,但是我们两个都积极的参与到其中了,尤其是我们两个在柱状图这一块,讨论的尤其激烈。我的小伙伴很固执(我只能呵呵一笑),最后还是采用了他的方法,果然在后期编程中很轻松。我觉得这小子还是一个有想法的人。

    6.PSP:

    PSP2.1 任务内容 计划完成需要的时间(min) 实际完成的时间(min)
    planning                                                 计划                                        

    20

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

    30

    45
    Development 开发

    100

    120
    Analysis 需求分析

    8

    10
    Design Spec 生成设计文档

    8

    19
    Design Review 设计审查

    5

    5
    Coding Standard 代码规范

    14

    9
    Design 具体设计

    20

    31
    Coding 具体编码

    60

    110
    Code Review 代码复审

    38

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

    8

    20
    Reporting 报告

    16

    14
    Test Report 测试报告

    10

    13
    Size Measurement 计算工作量

    4

    6

    Postmortem & Process

    Improvement

    事后总结 10 12

    7.总结:

      本次实验中同过结对编程,学到了很多东西,在以往的学习中没有体会到结对编程的快乐,两个人坐在一起,讨论,争辩,最后采用方法。在交流与学习的过程中,既掌握了知识,又学到了他人的一些思想与方法,这是我觉得本次实验中学到的最重要的东西。尼补了以往结对编程的空白。我也相信在以后的编程中,这种结对编程的方法与思想会一直持续下去。

  • 相关阅读:
    LeetCode91 Decode Ways
    LeetCode93 Restore IP Addresses
    LeetCode92 Reverse Linked List II
    LeetCode90 Subsets II
    LeetCode89 Gray Code
    最长公共子序列及其引申问题
    constexpr:编译期与运行期之间的神秘关键字
    I/O模型: 阻塞、非阻塞、I/O复用、同步、异步
    LeetCode86 Partition List
    maven 安装 过程
  • 原文地址:https://www.cnblogs.com/luo-cheng-blog-123/p/8719442.html
Copyright © 2020-2023  润新知