201571030129/201571030122 《小学生四则运算》 结对项目

本文介绍了一个用于小学生四则运算训练的系统,该系统能够自动生成题目并提供GUI界面供用户答题,支持计时功能及多轮测试的成绩统计。

一、项目源码

  GitHub的链接地址:https://github.com/13993013291/Shiyan3.git

二、项目报告

1、需求分析

  (1)程序能够从题库随机选择20道混合运算,用户输入答案,程序检查答案是否正确,每道题正确计5分,测试结束后给出总分;

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

           

  (3)程序提供三种练习功能选择:百以内整数算式(必做)、带括号算式、真分数算式练习;

  (4)程序允许进行多轮测试,并用柱状图显示多轮测试分数;示例如下:

             

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

  (6)测试有计时功能,测试时动态显示用户开始答题后的消耗时间;

  (7)程序人机交互界面是GUI界面(WEB页面、APP页面都可),界面支持中文简体(必做)/中文繁体/英语,用户可以进行语种选择。

2、软件设计

       程序设计类图如下:

       

3、程序核心代码

public static void One() throws IOException {
        hehe=9;
        for (int i = 0; realCount < number; i++) {// 当已产生的题目个数<共需要的题目个数
            if (realCount == 0) {// 题目数=0时
                One[0][0] = new Random().nextInt(range);// 产生第一个元素
                twoPlus(remainmember);// 执行后,产生一个运算符和一个元素
                used[realCount]=(remainmember*2-1);
                realCount++;// 题目数+1
                File file = new File("Exercises.txt");
                FileWriter fw = new FileWriter(file, true);
                PrintWriter pw = new PrintWriter(fw);
                pw.print(
                        realCount + "." + One[realCount - 1][0] + (char) One[realCount - 1][1] + One[realCount - 1][2]);
                pw.println();
                pw.close();
                
            } else {
                temp[0] = new Random().nextInt(range);
                tempPlus(remainmember);// 用数组temp[]存放一个"待查重的题目"
                if (!compare2()) {
                    One[realCount][0] = temp[0];// 将temp[]里的题目放入“已查重数组 One[]”
                    twoWithTemp(remainmember);// 将temp[]里的题目放入“已查重数组 One[]”
                    used[realCount]=(remainmember*2-1);//2-3  3-5  4-7 5-9
                    realCount++;// 题目个数+1
                    File file = new File("Exercises.txt");
                    FileWriter fw = new FileWriter(file, true);
                    PrintWriter pw = new PrintWriter(fw);
                    pw.print(realCount + "." + One[realCount - 1][0] + (char) One[realCount - 1][1]
                            + One[realCount - 1][2]);
                    pw.println();
                    pw.close();
                }
            }
            if (i == 2) {
                remainmember++;
                oneMore(number - realCount);
            }
        }
        File file = new File("Exercises.txt");
        readFile(file);
    }

    // 产生多个运算符的题目
    public static void oneMore(int remainNumber) throws IOException {
        int index = 1;
        if (realCount == number)
            return;
        else {
            count = 0;
            for (int i = 0; count < remainNumber; i++) {
                if (i == 0) {
                    One[realCount][0] = new Random().nextInt(range);
                    twoPlus(remainmember);
                    count++;
                    used[realCount]=(remainmember*2-1);
                    realCount++;
                    File file = new File("Exercises.txt");
                    FileWriter fw = new FileWriter(file, true);
                    PrintWriter pw = new PrintWriter(fw);
                    pw.print(realCount + "." + One[realCount - 1][0]);
                    for (int i3 = 0; i3 < remainmember - 1; i3++) {
                        pw.print((char) One[realCount - 1][index]);
                        pw.print(One[realCount - 1][index + 1]);
                        index += 2;
                    }
                    pw.println();
                    pw.close();
                    index = 1;
                } else {
                    temp[0] = new Random().nextInt(range);
                    tempPlus(remainmember);
                    if (!compare2()) {
                        One[realCount][0] = temp[0];
                        twoWithTemp(remainmember);
                        count++;
                        used[realCount]=(remainmember*2-1);
                        realCount++;
                        File file = new File("Exercises.txt");
                        FileWriter fw = new FileWriter(file, true);
                        PrintWriter pw = new PrintWriter(fw);
                        pw.print(realCount + "." + One[realCount - 1][0]);
                        for (int i3 = 0; i3 < remainmember - 1; i3++) {
                            pw.print((char) One[realCount - 1][index]);
                            pw.print(One[realCount - 1][index + 1]);
                            index += 2;
                        }
                        pw.println();
                        pw.close();
                        index = 1;
                    }

                }
                if (i == 3) {
                    remainmember++;
                    oneMore(number - realCount);
                    break;
                }
            }
        }
    }
产生运算式
public static void myGUI() throws IOException{
        //计时器代码
        class shishi3 extends Thread {
            private long noww = 0l;
            private long start = System.currentTimeMillis();// 程序启动时间的毫秒值
            private long time;
            public void run() {
                int i=0;
                while (true) {
                    noww = System.currentTimeMillis();// 获取一秒之后的毫秒值    
                    time=noww-start;
                    timetime=time;
                    String ssss=String.format("%02d:%02d:%02d\n",
                            time / (1000 * 60 * 60) % 60/**/, 
                            time / (1000 * 60)% 60/**/, 
                            (time / 1000 % 60)/**/);               
                        l1.setText(ssss);
                        i++;
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }              
                }
            }
        }
计时部分
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.*;
public class zhuzhuangtu extends JFrame 
{
    private static final int DEFAULT_WIDTH=500;
    private static final int DEFAULT_HEIGHT=600;
    int[] save = new int[4];
    public zhuzhuangtu()
    {        
        setSize(DEFAULT_WIDTH,DEFAULT_HEIGHT);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("小学生四则运算系统");
        setLocation(500,100);
        setVisible(true);
    }
    public void paint(Graphics g)
    {  
        File file = new File("tongji.txt");
        StringBuilder result = new StringBuilder();
        try
        {
            BufferedReader br = new BufferedReader(new FileReader(file));//构造一个BufferedReader类来读取文件
            String s = new String();
            do
            {//使用readLine方法,一次读一行
                for(int i=0;i<4;i++)
                {
                    s = br.readLine() ;
                    save[i] = Integer.parseInt(s);
                    System.out.println(save[i]);
                }
                
            }while((s = br.readLine())!=null);
            br.close();    
        }catch(Exception e){
            e.printStackTrace();
        }                                
        int Width = 400;
        int Height = 450; 
        Random ran = new Random();
        int leftMargin = 15;//柱形图左边界  
        int topMargin = 50;//柱形图上边界  
        Graphics2D g2 = (Graphics2D) g;
        g2.translate(50, 100);
        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)+"", 10, topMargin+rulerStep*i);//写下百分比  
            g2.drawLine(10, topMargin+rulerStep*i, Width, topMargin+rulerStep*i);//绘制灰色横线  
        }  
        g2.setColor(Color.PINK);  
        for(int i=0;i<4;i++){//绘制柱形图  
            int value =save[i]*4*5;// ran.nextInt(Height-topMargin-10)+10;//随机产生柱形的百分比  
            int step = (i+1)*35;//设置每隔柱形图的水平间隔为40  
            //绘制矩形  
            g2.fillRoundRect(leftMargin+step*2, Height-value-10, 40, value, 40, 10); 
            //g2.fillRoundRect(leftMargin+step*2, Height-value, 40, value, 40, 10);  
            //列出产品的编号  
            g2.drawString("测试"+(i+1), leftMargin+step*2, Height-value-15);    
        } 
        JPanel south = new JPanel();        
        JButton btn2 = new JButton("结束");
        south.add(btn2);
        add(south,BorderLayout.SOUTH);                          
         btn2.addActionListener(new ActionListener()
            {
                public void actionPerformed(ActionEvent event)
                {    
                    System.exit(0);
                }
            });                                    
    }      
}
柱状图

4、运行结果展示

     4.1 输入题目数与运算表达式的数字范围:

              

     4.2 开始答题:

              

     4.3 当一轮结束后,按“结束”按钮,系统给出答对的题数与答错的题数,并给出用时:

              

     4.4 当一轮结束后有相应的柱状图:

             

     4.5 完成四轮测试之后的结果分析统计图:

             

5、结对编程伙伴

6、PSP展

PSP2.1任务内容计划完成的时间(min)实际完成需要的时间(min)
PLanning计划6090
Estimate估计这个任务需要多少时间,并规划大致工作步骤6065
Developmet开发480600
Analysis需求分析(包括学习新技术)2030
Design Spec生成设计文档2030
Design Revie设计复审(和同事审核设计文档)3030
Coding Standard代码规范2030
Design具体设计6080
Coding具体编码300400
Code Review代码复审3050
Test测试(自我测试,修改代码,提交修改)2040
Reporting报告3040
Test Report测试报告2030
Size Measurement计算工作量510
Postmortem & Process Improvement Plan事后总结,并提出过程改机计划3035

 

7、小结

       本次实验中,我们一起对老师的要求进行分析,一起编程,感觉乐趣多多,收益也多多,相互补短。我对于代码规范很模糊,认为能够运行就可以,但我的partner对此要求很高。这让我认识到结对编程的重要性,它可以让我们写出质量更高的代码,产生1+1>2的效果。

转载于:https://www.cnblogs.com/Wangshenghai/p/8719082.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值