寒光博客

[java]小项目 四则运算训练系统 基础练习
项目说明 MathematicsTraining 该项目是前几天接的学妹的java期末设计,顺便也自己复习了一下j...
扫描右侧二维码阅读全文
23
2020/06

[java]小项目 四则运算训练系统 基础练习

项目说明

MathematicsTraining
该项目是前几天接的学妹的java期末设计,顺便也自己复习了一下java的一些基础知识。
按照老师的要求 我估计至少有个95吧.
欢迎大佬提出意见
数学计算能力训练系统是对用户的四则运算能力进行训练的独立系统。
该系统能够随机出题,用户输入答案,经系统判断对错后给出结论。

GitHub:https://github.com/Dxoca/MathematicsTraining/

基本功能:系统封面显示学号、姓名及主要功能选择菜单。在选择相关功能号后,系统根据用户选择,随机出50以内整数的加、减法计算题。用户解答后由系统判断对错。用户输入-1时中止训练。
中级功能:在完成基本功能基础上,添加50以内的乘法、除法题(整数除法)出题、答题功能。
高级功能:在完成中级功能的基础上,新增记录做题过程、统计正确率及耗时功能,并在中止训练时显示。

该项目涉及知识点:

类、对象、多态、异常try catch、封装、形参传递、全局变量,静态类,静态常量、抽象类、抽象类的继承、抽象方法、接口、继承、异常、创建异常、输入流Scanner、输出sout模块化、构造函数、重写@Overload、自动转型、强制转型、小数点保留BigDecimal、随机数Math.Random、临时对象、对象地址、GC、System.exit()、迭代器Iterator、集合ArrayList、获取系统时间System.currentTimeMillis().

项目考核要求

本项目完成基本功能,运行正确,使用说明书撰写规范,可评价为及格或良好;完成中级功能,运行正确,使用说明书规范、说明详细,可评为良好;完成高级功能,运行正确,使用说明书撰写规范、逻辑清晰,指导性强,相关技术有所运用且运用恰当(如多态、集合、异常处理等)可评为优秀。

项目需求

这些需求是自己完善的
(1)良好的界面,给人一种简约且美观的效果。包括自己的学号姓名
(2)实现加减乘除,加:add 减:sub 乘Mul 除:Div。
(3)界面显示,用户输入加减乘除的序号
1表示加 2表示减 3表示乘 4表示除 0表示退出整个系统。
(4)如果4选项除不尽,要求保留小数两位,且大于5 要进位。其他选项结果均为整数。
(5)用户输入0的时候,要求判断是否真的结束,如果不退出保留原界面。
(6)运算完成后,继续提示训练选项(用户界面) 。
(7)自动生成题目的数字范围是[0,50],且不重复。
(8)训练过程中输入-1 终止训练 。

系统流程图

大概的流程图 参考一下。 是我们专业期末论文的 汇编语言中王硕哥画的图 俩系统功能查的不多。

代码

Algorithm.java//抽象类
Algorithms.java//四种算法实现抽象类的
Model.java//常用方法
Main.java//系统入口

Algorithm.java

/**
 * 四种算法的抽象类 抽出像的部分
 * <p>
 * 公共部分
 * 出题 答案计算 获取题目 获取题目及答案 检查答案
 * 变量 ab 和计算符号
 */
abstract class Algorithm {
    //接口内部封装私有的变量
    private int a, b;//计算数
    private char operator;//运算符
    //需要继承实现

    /**
     * 产生题目
     */
    public abstract void CreateProblems();

    /**
     * 计算两个数的答案
     *
     * @return 运算后的结果
     */
    public abstract double getAns();

    //可以直接调用
    //赋值
    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    /**
     * 获取运算符
     *
     * @return
     */
    public char getOperator() {
        return operator;
    }

    /**
     * 设置运算符
     *
     * @param operator
     */
    public void setOperator(char operator) {
        this.operator = operator;
    }

    /**
     * 获取题目及答案
     * 除了除法 都是整数
     * 除法重写
     */
    public void getProblemsAndAns() {
        System.out.print(getA() + " " +
                getOperator() + " " + getB() + " =  " + (int) getAns());
    }

    /**
     * 便于记录做题数据 答案后续自己写入
     *
     * @return
     */
    @Override
    public String toString() {
        return getA() + " " + getOperator() + " " + getB() + " =  ";
    }

    /**
     * 获取题目
     */
    public void getProblems() {
        System.out.print(getA() + " " +
                getOperator() + " " + getB() + " =  ");
    }

    /**
     * 检查答案
     *
     * @param ans
     * @return
     */
    public boolean checkAns(double ans) {
        boolean flag = ans == getAns();
        if (flag) Main.isTrue++;//计算正确率
        else Main.isFalse++;
        return flag;
    }
}

Algorithms.java

import java.math.BigDecimal;

/**
 * 加法
 */
class Sum extends Algorithms {

    @Override
    public void CreateProblems() {
        int[] nums = new Model().randomNumber();//获取随机数
        setOperator('+');
        setA(nums[0]);//输入 a
        setB(nums[1]);//输入b
        getProblems();//输出问题
//        System.out.print(getA() + " " +
//                getOperator() + " " + getB() + " =  ");
    }

    @Override
    public double getAns() {
        return getA() + getB();
    }
}

/**
 * 减法
 */
class Sub extends Algorithm {
    @Override
    public void CreateProblems() {
        int[] nums = new Model().randomNumber();//获取随机数
        setOperator('-');
        setA(nums[0]);//输入 a
        setB(nums[1]);//输入b
        getProblems();//输出问题
    }

    @Override
    public double getAns() {
        return getA() - getB();
    }
}

/**
 * 乘法
 */
class Mul extends Algorithm {

    @Override
    public void CreateProblems() {
        int[] nums = new Model().randomNumber();//获取随机数
        setOperator('*');
        setA(nums[0]);//输入 a
        setB(nums[1]);//输入b
        getProblems();//输出问题
    }

    @Override
    public double getAns() {
        return getA() * getB();
    }
}

/**
 * 除法
 */
class Div extends Algorithm {

    @Override
    public void CreateProblems() {
        int[] nums = new Model().randomNumber();//获取随机数
        setOperator('/');
        setA(nums[0]);//输入 a
        setB(nums[1]);//输入b
        getProblems();//输出问题
    }

    @Override
    /**
     * 要转型为double
     * 计算f2 保留两位小数
     */
    public double getAns() {
        double f = (double)getA() / getB();
        BigDecimal f1 = new BigDecimal(f);
        double f2 = f1.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        return f2;
    }

    @Override
    /**
     * 重写抽象类方法
     * 获得double值
     */
    public void getProblemsAndAns() {
        System.out.print(getA() + " " +
                getOperator() + " " + getB() + " =  " + getAns());
    }
}

Model.java

import java.util.ArrayList;
import java.util.Scanner;

/**
 * 各种小的常用模块
 */
public class Model {
    /**
     * 默认构造函数
     */
    Model() {

    }

    /**
     * 个人信息及菜单输出:
     * <p>
     * 数学计算能力训练系统
     * <p>
     * 学号:XXXX      姓名:XXX
     * <p>
     * 1--加法    2--减法   3--除法   4--乘法    0--退出
     * <p>
     * 请输入训练的项目:
     *
     * @param title   项目标题
     * @param classID 学号
     * @param name    姓名
     */
    public void menu(String title, String classID, String name) {
        String head = title + "\n\n学号:" + classID + "\t\t姓名:" + name;
        String algorithm = "1--加法\t2--减法\t3--乘法\t4--除法\t 0--退出";
        System.out.print(head + "\n\n" + algorithm + "\n\n");
    }

    /**
     * 选择训练的项目
     * 1:加法 2:减法 3:乘法 4:除法 0:退出
     *
     * @param way
     */
    public void switchAlgorithm(int way) {
        Scanner cin = new Scanner(System.in);
        double ans;
        switch (way) {
            //exit
            case 0:
                System.out.println("谢谢使用!");
                System.exit(0);//正常退出
                break;
            //sum
            case 1:
                Algorithm sum = new Sum();//多态
                sum.CreateProblems();//输出题目
                //输入答案规范
                try {
                    ans = cin.nextInt();//输入答案
                    boolean isAns = sum.checkAns(ans);//检测
                    if (isAns) {
                        sum.getProblemsAndAns();//输出题目及答案
                        System.out.println(" √");
                        Main.list.add(sum.toString() + (int) sum.getAns() + " √");//记录做题数据
                        Main.isTrue++;
                    } else {//包括-1 这样是因为 有可能-1也是结果
                        if (ans == -1) {
                            Main.flag = false;//结束外部循环
                            return;
                        }
                        System.out.println("错 正确答案:" + sum.getAns());
                        Main.list.add(sum.toString() + ans + " X" + "  正确答案:"+(int) sum.getAns());//记录做题数据
                    }
                } catch (Exception e) {
                    e = new Exception("答案格式输入错误");
                    System.out.println(e.getMessage());
                }
                break;
            //sub
            case 2:
                Algorithm sub = new Sub();//多态
                sub.CreateProblems();//输出题目
                //输入答案规范
                try {
                    ans = cin.nextInt();//输入答案
                    boolean isAns = sub.checkAns(ans);//检测
                    if (isAns) {//先判断答案是否合格
                        sub.getProblemsAndAns();//输出题目及答案
                        System.out.println(" √");
                        Main.list.add(sub.toString() + (int) sub.getAns() + " √");//记录做题数据
                    } else {//包括-1 这样是因为 有可能-1也是结果
                        if (ans == -1) {
                            Main.flag = false;//结束外部循环
                            return;
                        }
                        System.out.println("错 正确答案:" + sub.getAns());
                        Main.list.add(sub.toString() + ans + " X" + "  正确答案:"+(int) sub.getAns());//记录做题数据
                    }
                } catch (Exception e) {
                    e = new Exception("答案格式输入错误");
                    System.out.println(e.getMessage());
                }
                break;
            //mul
            case 3:
                Algorithm mul = new Mul();//多态
                mul.CreateProblems();//输出题目
                //输入答案规范
                try {
                    ans = cin.nextInt();//输入答案
                    boolean isAns = mul.checkAns(ans);//检测
                    if (isAns) {
                        mul.getProblemsAndAns();//输出题目及答案
                        System.out.println(" √");
                        Main.list.add(mul.toString() + (int) mul.getAns() + " √");//记录做题数据
                    } else {//包括-1 这样是因为 有可能-1也是结果
                        if (ans == -1) {
                            Main.flag = false;//结束外部循环
                            return;
                        }
                        System.out.println("错 正确答案:" + mul.getAns());
                        Main.list.add(mul.toString() + ans + " X" + "  正确答案:"+(int) mul.getAns());//记录做题数据
                    }
                } catch (Exception e) {
                    e = new Exception("答案格式输入错误");
                    System.out.println(e.getMessage());
                }
                break;
            case 4://div
                Algorithm div = new Div();//多态
                div.CreateProblems();//输出题目
                //输入答案规范
                try {
                    ans = cin.nextDouble();//输入答案
                    boolean isAns = div.checkAns(ans);//检测
                    if (isAns) {
                        div.getProblemsAndAns();//输出题目及答案
                        System.out.println(" √");
                        Main.list.add(div.toString() + div.getAns() + " √");//记录做题数据 除法不需要转为int
                    } else {//包括-1 这样是因为 有可能-1也是结果
                        if (ans == -1) {
                            Main.flag = false;//结束外部循环
                            return;
                        }
                        System.out.println("错 正确答案:" + div.getAns());
                        Main.list.add(div.toString() + ans + " X" + "  正确答案:"+ div.getAns());//记录做题数据
                    }
                } catch (Exception e) {
                    e = new Exception("答案格式输入错误");
                    System.out.println(e.getMessage());
                }
                break;
            default:
                System.out.println("格式输入错误!");
        }
    }
    /**
     * 生成两个随机数
     *
     * @return [0, 50]的数字
     */

    public int[] randomNumber() {
        int[] nums = new int[2];
        nums[0] = (int) (Math.random() * (51 - 0) + 0);
        nums[1] = (int) (Math.random() * (51 - 0) + 0);
//        System.out.println(Arrays.toString(nums)); 调试
        return nums;
    }

}

Main.java

import java.util.*;

public class Main {

    static String title = "数学计算能力训练系统";
    static String classId = "Q987284242";
    static String name = "寒光";
    static String inputError = "输入错误!";
    static String select = "请输入训练的项目:";
    public static boolean flag = true;
    static ArrayList<String> list = new ArrayList();//做题记录 27 + 36 =  63 ✖ ;  38 - 39 =  -1 √
    static double accuracy = 0, isTrue = 0, isFalse = -1;//计算正确率 统计对的个数 错的个数 输入-1中断也包括在里面 所以必须-1

    public static void main(String[] ages) {
        int way;
        Model model = new Model();
        Scanner cin = new Scanner(System.in);
        model.menu(title, classId, name);//菜单输出

        /** 获取当前系统时间*/
        long startTime = System.currentTimeMillis();

        /** 程序运行 processRun();*/
        while (flag) {
            System.out.print(select + "\n");//训练项目 提示
            try {
                way = cin.nextInt();
                model.switchAlgorithm(way);//选择算法,中断判断 加减乘除
            } catch (Exception e) {
                e = new Exception(inputError);
//            throw new Error(e);//抛出异常
                System.out.println(e.getMessage());//输出异常
            }
        }
        /** 获取当前的系统时间,与初始时间相减就是程序运行的毫秒数,除以1000就是秒数*/
        long endTime = System.currentTimeMillis();
        long usedTime = (endTime - startTime) / 1000;
        System.out.println("\n训练结束! 共计用时:" + usedTime + "秒!\n\n训练记录:\n");
        Iterator it1 = list.iterator();//迭代器
        while (it1.hasNext()) {//遍历ArrayList
            System.out.println(it1.next());
        }
        accuracy = isTrue / (isFalse + isTrue);//计算正确率
        System.out.println("\n" + name + ":正确率:" + accuracy * 100 + "%");
    }
}
本文作者:Author:     文章标题:[java]小项目 四则运算训练系统 基础练习
本文地址:https://dxoca.cn/java/366.html       百度已收录
版权说明:若无注明,本文皆为“Dxoca's blog (寒光博客)”原创,转载请保留文章出处。
Last modification:June 24th, 2020 at 01:44 pm
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment