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

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


  • 相关阅读:
    leetcode 122. Best Time to Buy and Sell Stock II
    leetcode 121. Best Time to Buy and Sell Stock
    python 集合(set)和字典(dictionary)的用法解析
    leetcode 53. Maximum Subarray
    leetcode 202. Happy Number
    leetcode 136.Single Number
    leetcode 703. Kth Largest Element in a Stream & c++ priority_queue & minHeap/maxHeap
    [leetcode]1379. Find a Corresponding Node of a Binary Tree in a Clone of That Tree
    正则表达式
    十种排序算法
  • 原文地址:https://www.cnblogs.com/linyiman/p/9827457.html
Copyright © 2011-2022 走看看