zoukankan      html  css  js  c++  java
  • 第五次作业:小学四则运算系统升级版

    这个作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2232

    我结对同伴的姓名:郭晓莹    学号:201606120105    博客:https://www.cnblogs.com/kunnkkk/p/9809435.html

    本次作业的代码在我的同伴郭晓莹的github地址:https://github.com/kunnkkk/16rg

    开发环境:IntelliJ Idea。

    我们选取了5个方向,分别为:

    1. 用户答题结束以后,程序可以显示用户答题所用的时间;
    2. 用户可以选择出题的个数(最多不能超过5个题目),答题结束可以显示用户答错的题目个数和答对的题目个数;
    3. 程序可以出单个整数阶乘的题目:如:4!=24;
    4. 程序可以设置皮肤功能,可以改变界面的颜色即可;
    5. 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。

    分工:我负责Java用户界面设计以及第2、3、4方向的实现,我的同伴负责第1、5方向的实现以及调试、修改程序的一些小错误。除此之外,我们还尝试制作了web版本的系统,我的同伴运用JavaScript的知识对本次作业进行了网页设计和制作基本要求、答题数目选择和答案显示及阶乘的功能,而我负责运用JavaScript知识进行设置答题时间和倒计时功能的实现。本次作业最主要的文件是CalculationsSystem!另外一个是我们额外做的!助教可以打开两个文件进行运行。


    第一部分:需求分析

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

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

    第二部分:概要设计

    (1)Java Class类算法设计说明:

    public class FourCalculations {...}

    随机生成最多不能超过4个运算符,操作数小于100的单个四则运算式,并且能进行正确答案的计算。

    public class FactorialCalculations {...}

    设置随机数种子随机产生一个范围在1~20的数字,并且能进行正确的阶乘运算。

    public class JudgeLabel extends JLabel {...}

    创建一个JudgeLabel类用于显示图标“√”和“×”,若用户在答案区输入的答案正确,则图标为“√”,若用户在答案区输入的答案错误,则图标为“×”。

    public class Window extends JFrame implements Runnable {...}

    设计非控制台的用户界面,初始化各类按钮,主函数就在这个类里面,程序的执行从主函数里的代码语句开始。

    (2)Java Class类之间的调用关系:


     

     

    第三部分:详细设计

     (1)

     public int generateCorrectAnswer(List<String> operators, List<Integer> operations) {
            //遍历运算符容器,完成乘除运算
            for (int i = 0; i < operators.size(); i++) {
                String operator = operators.get(i);
                if (operator.equals("*") || operator.equals("/")) {
                    operators.remove(i);                    //乘除符号将其从集合中移除
                    int operateLeft = operations.remove(i);      //拿运算符左侧的数字
                    int operateRight = operations.remove(i);     //拿运算符右侧的数字
                    if (operator.equals("*"))
                        operations.add(i, operateLeft * operateRight);
                    else
                        operations.add(i, operateLeft / operateRight);
                    i--;  //运算符容器的指针回到原来的位置,防止跳过下一个运算符
                }
            }
    
            //遍历运算符容器,完成加减运算,当运算符容器为空时,运算结束
            while (!operators.isEmpty()) {
                String operator = operators.remove(0);
                int operateLeft = operations.remove(0);
                int operateRight = operations.remove(0);
                if (operator.equals("+"))
                    operateLeft = operateLeft + operateRight;
                else
                    operateLeft = operateLeft - operateRight;
                operations.add(0, operateLeft);
            }
            return operations.get(0);
        }
        

    这个方法的作用是计算四则运算式的正确结果,首先遍历存储在operators列表中的所有运算符,当有乘除时,就取出operations列表中位于此符号的左右两侧的操作数,然后进行四则运算。计算结束后要将此运算符和操作了的两个操作数从列表中移除,运算符容器的指针回到原来的位置。遍历完所有的乘号和除号后,再遍历operators列表中的所有加号和减号。

    (2)

    //随机产生的阶乘数字
        public int generateFormula() {
            Random random = new Random();
            int num = random.nextInt(19)+1;
            //计算阶乘结果
            int result = 1;
            for (int i = 1; i <= num; i++) {
                result*= i;
            }
            correctAnswerList.add(String.valueOf(result));
            return num;
        }

    这个方法的作用是产生一个范围在1~20的随机数,进行阶乘运算,将最终得到的int整型运算结果result转换成String字符串类型。

    (3)

     private void markingPapers() {
            if(fourCalculation == true) {
                for (int i = 0; i < answerArea.length; i++) {
                    //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i));
                    //System.out.println("input:"+answerArea[i].getText());
                    if (answerArea[i].getText().equals(fourCalculations.correctAnswerList.get(i))) {
                        judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png");   // 正确,显示“√”图标
                        numT++;
                    }
                    else {
                        //answerArea[i].setText("错");
                        judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png");   // 错误,显示“×”图标
                        answerArea[i].setText(fourCalculations.correctAnswerList.get(i));        //将用户输入的错误答案修改为正确答案
                        numF++;
                    }
                }
            }
            else{
                for (int i = 0; i < answerArea.length; i++) {
                    //System.out.println("answer:"+fourCalculations.correctAnswerList.get(i));
                    //System.out.println("input:"+answerArea[i].getText());
                    if (answerArea[i].getText().equals(factorialCalculations.correctAnswerList.get(i))) {
                        judgeLabel[i].setImageUrl("./FourOperations/src/main/img/right.png");   // 正确,显示“√”图标
                        numT++;
                    }
                    else {
                        //answerArea[i].setText("错");
                        judgeLabel[i].setImageUrl("./FourOperations/src/main/img/error.png");   // 错误,显示“×”图标
                        answerArea[i].setText(factorialCalculations.correctAnswerList.get(i));    //将用户输入的错误答案修改为正确答案
                        numF++;
                    }
                }
            }
        }

    这个方法主要是进行答案判断的。首先判断用户进行的是四则运算操作还是阶乘运算操作,接着从答题区answerArea[]中取出用户输入的答案与标准正确答案进行对比,若相同,则在图标区显示“√”,若不相同,则表示用户计算结果不正确,图标区显示“×”,并且将答题区用户原先输入的答案修改为正确答案。

    (4)

     public void run() {      //  完成时间计时
            int second = 0;
            int minute = 0;
            String time;
            timeLabel.setText("用时 00:00");    // 初始化用时
            while (true) {
                try {
                    Thread.sleep(1000);   //  按时间设置
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                second++;
                if (second == 60) {
                    second = 0;
                    minute++;
                }
                if (minute < 10) {
                    time = "用时 " + "0" + minute + ":";
                } else {
                    time = "用时 " + minute + ":";
                }
                if (second < 10) {
                    time = time + "0" + second;
                } else {
                    time = time + second;
                }
                if (minute == 2) {      //  如果时间到120s,用户还未答完题,提示信息
                    JOptionPane.showMessageDialog(this, "时间已到,不能答题!");
                    submit();
                    return;
                }
                timeLabel.setText(time);
            }
        }

    这个方法是设置时间线程显示用户答题时间,若用户在120s时仍未答题结束,则弹出提示框提示用户“时间已到,不能答题!”。

    (5)

     //  背景色按钮
            JButton changeButton = new JButton("背景色");
            changeButton.setBounds(startX, startY+step*5, width, height);
            changeButton.addMouseListener(new MouseListener() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    Color color = JColorChooser.showDialog(outPanel, "背景色", outPanel.getBackground());    // 弹出颜色界面供用户自由选择背景色
                    if (color != null) {
                       outPanel.setBackground(color);
                    }
                }

    这个方法是设置用户界面的背景色,当用户单击“背景色”按钮时,会显示一个颜色选择界面,用户选择合适的背景色之后单击“确认”按钮,背景色就会改变。


     

     

    第四部分:调试报告

    (1)问题:

        一开始我们两个成员都没有仔细看清楚作业题目的基本要求,于是就选取了四个方向在第一次作业的基础上进行完善修改。在我们大概要完成作业时,多亏一位同学发现我们采用Visual C++进行编程的,于是提醒我们用这个软件无法自行创建非控制台的用户界面,而作业明确要求是“非控制台”。因此,经过商量我们决定采用Idea进行Java编程,重头开始。

        在进行用户界面设计时,因为我设置的变量参数不当,导致许多按钮出现重合以及按钮排列顺序混乱等问题。经过我同伴的耐心指点,我才知道如何正确选取恰当的参数,并成功修正过来。其次,在做本次作业之前我还未运用Java语言进行过界面皮肤功能设置,因此刚开始是很迷茫的,询问了班上几个实力比较强的朋友也未能成功解决此问题。于是我便上网查资料,通过浏览网友的一些代码,再结合JDK文档我才发现其实改变背景色是很容易的。Java本身提供了JColorChooser.showDialog()类和方法,通过调用此方法便可以实现选择背景色和修改背景色的功能。

        最后,是我在运行程序时发现当用户选择阶乘运算,单击“提交”按钮后,在图标区无法显示“√”和“×”,也就是程序无法判断用户输入结果和标准答案是否一致。经过调试代码我发现是因为用户输入的值我将它放在JTextField类的setText()方法中,也就是说用户输入的结果是保存在String类型中的,而阶乘运算的正确运算结果是保存在int类型中,两个类型不一样的数无法进行比较。于是我在FactorialCalculations类中添加correctAnswerList.add(String.valueOf(result))代码,将阶乘运算的正确结果转化成String类型,问题得以解决。

    (2)程序调试结果:

     用户界面:

    用户单击“背景色”按钮,改变界面颜色:

    当用户在空白文本框中输入的题目数大于5时,文本框出现提示信息。当用户单击文本框时,文本框提示信息清空,用户可重新输入题目个数:

     

    用户选择“当前:四则运算”,单击“开始”按钮,进入答题界面,程序开始计时:

     

    当用户输入答案,单击“交卷”按钮时,程序会判断用户输入是否正确:

     

    当时间达到120s时,用户仍未单击“交卷”按钮,程序会出现提示框:

     

    用户选择“当前:阶乘”,单击“开始”按钮,进入答题界面,程序开始计时:

     

    当用户输入答案,单击“交卷”按钮时,程序会判断用户输入是否正确:

     

    web版首页选择答题数目与类型:

    web版选择题目数量进入简单运算,120秒倒计时开始,输入结果:

    web版选择题目数量进入阶乘运算,120秒倒计时开始,输入结果对比后判断对错和计算用时,确定返回主页:

    web版答题超过120秒时按确认返回主页:


    第五部分:统计表与总结

    (1)统计表:

    PSP2.1

    Personal Software Process Stages

    预估耗时(分钟)

    实际耗时(分钟)

    Planning

    计划

    420

    420

    · Estimate

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

    420

    420

    Development

    开发

    420

    420

    · Analysis

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

    30

    15

    · Design Spec

    生成设计文档

    0

    0

    · Design Review

    设计复审

    20

    40

    · Coding Standard

    代码规范

    120

    120

    · Design

    具体设计

    30

    35

    · Coding

    具体编码

    420

    400

    · Code Review

    代码复审

    100

    60

    · Test

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

    120

    120

    Reporting

    报告

    120

    125

    Test Report

    测试报告

    0

    0

    ·workload

    计算工作量

    420

    400

    ·correction

    并提出过程改进计划

    0

    0

    (2)结对工作的照片:

     

    (3)结对编程项目总结:

            在这次结对编程项目设计中,我和我的同伴都遇到了不少困难,但是在我们的坚持和虚心请教中都得到顺利解决。本次项目设计中,我发现理论必须和实践相结合,才能真正学会软件设计,才能完成一个课题。在这次设计中我查阅了网上许多关于Java编程的知识,反复看了JDK文档很多次,也参考了其他学生的相关博客,总结了自己与他们的经验,快速掌握了本次结对编程项目设计的整体思路。在完成这个项目的过程中,加深了我对Java语言知识的充分运用以及理解,使自己的编程水平得到了一定的提高,在处理问题方面的能力也提高了。

        更重要的是,我和我的同伴为了提升自我能力,在时间充裕的情况下进行了web版本项目设计,但是因为能力和时间有限,有关功能的模块没有来得及实现。但是在她制作网页的过程中我跟着她学到了很多前端的知识,和同伴在本次合作中十分愉快。我们合理分工,相互帮助,没有出现很大的分歧,也没有相互推卸责任等,这次合作让我获益匪浅,收获知识,更收获了友谊。

        我们在此项目上实现了最多四个运算符的四则运算操作,也就是针对助教在我第四次作业中提出的问题而进行完善。这个程序还存在诸多不足之处----在现实中许多功能现在还没有实现,还有不少需要进一步完善的操作等等,可能是因为经验不足,对问题预期不够等一些不可预见的原因所致,这些都是我和我同伴在接下来的学习和实践中要汲取的教训。


  • 相关阅读:
    Python 设置 IP 代理 访问网页 ( 用户名密码验证代理 )
    Squid 3.3 部署 HTTP代理服务器
    文件打开模式 w+ r+ a+ 区别和辨析
    Python 学习工具书
    Conference Related to social network.
    Linux 使用故障小记
    正则表达式学习连接
    再次被windows操作系统伤害之吐槽
    数据结构——线性表的顺序表示(1)
    斐波那契数列两种算法的时间复杂度
  • 原文地址:https://www.cnblogs.com/linyiman/p/9827457.html
Copyright © 2011-2022 走看看