zoukankan      html  css  js  c++  java
  • 自动生成小学四则运算题目升级版

    1. 项目要求

    题目要求

    在上一次作业的基础上进行一次升级,如下,至少选择一个升级方向:

    1)功能升级

    2)性能升级

    3)界面升级

    4)使用不同语言升级

    2. 项目成果展示

    2.1 GitHub地址:https://github.com/yyp-30/-/blob/%E7%AC%AC%E4%BA%8C%E6%AC%A1%E4%BD%9C%E4%B8%9A/zy2.java

    2.2 相比上一版本的改进之处

    • 改变了编写的语言,上回用的Python,这次结合java实训课程所学的内容,挑战用java语言进行编写
    • 增加输入模式的错误判断
    • 增加了难度的选择,例如真分数的计算,乘除法等。
    • 改进参数的选择范围,对出现的算式有了参数范围的选择,避免出现太高难度的计算
    • 改进分数的表示形式和标准答案,约分简化了结果也可进行判别
    • 题库的制作更加规范,形成一套试卷并进行打分

    3.代码实现

      
    import java.text.DecimalFormat;
    import java.util.Scanner;
    import java.util.regex.Pattern;
    import java.math.RoundingMode;
    public class zy2{
        public static void main(String[] args){
     String[] userAnser=new String[max];// 用户输入的答案
            String[] staticAnser=new String[max];// 标准答案
            int sign; 
            float left,right;
            int f=0;// 控制输出真分数的操作符
            int count=0;// 统计答题正确的数量
            DecimalFormat decimal=new DecimalFormat("#.##");
            decimal.setRoundingMode(RoundingMode.HALF_UP);
            int s1=1;
            int ss1=1;
            int s2=1;
            int result=0;
            int gys;// 最大公约数
        char opp;// 判断是否需要乘除法
            char real;// 判断是否需要真分数的题目
            int[] cs={ 1, 100 };// 数值范围
            int ff=0;
        int fff=0;
            int max=10;
            char[] op={ ' ', '+', '-', '*', '/' };// 操作符
            int[] no=new int[4];
            int useno=0;
            int n=3;
            int[] num1=new int[10];
            String zjfz=new String();// 最简分子
            String zjfm=new String();// 最简分母
            Pattern pattern=Pattern.compile("[0-9]*");
            Scanner in=new Scanner(System.in);
            System.out.print("请输入需定制的算式数量:");
            do{
                String str=in.nextLine();
                if(pattern.matcher(str).matches()){
                    max=Integer.parseInt(str);
                    break;
                }
                else{                 
                    System.out.print("你输入的不是数字,请重新输入:");
                }
            } while (true);
            System.out.print("是否需要乘除法(Y/N):");
            do{
                opp=in.next().charAt(0);
                if(opp=='Y'||opp =='y'){
                    useno=4;
                    break;
                } 
                else if(opp=='N'||opp=='n'){
                    useno=2;
                    break;
                }
                else{
                    System.out.print("输入错误,重新输入");
                }
            }while(true);
            System.out.print("参数范围(eg:1,100):");
            String str=new String();
            int sr=0;
            in.nextLine();
            do{
                try{
                    
                    str=in.nextLine();
                    String[] ss=new String[2];
                    ss=str.split(",");
                    cs[0]=Integer.valueOf(ss[0]);
                    cs[1]=Integer.valueOf(ss[1]);
                    sr=1;
                }catch(Exception e){
                    System.out.print("输入错误,重新输入:");
                }
            }while(sr!=1);
            System.out.print("是否增加真分数练习题(Y/N):");
            do{
                
                real=in.next().charAt(0);
                if (real=='Y'||real=='y'){
                    break;
                }
                else if(real=='N'||real=='n'){
                    break;
                }
                else{
                    System.out.print("输入错误,重新输入:");
                }
            }while(true);
            System.out.println();
            for (int i=0;i<max;i++){ 
                System.out.print("("+(i+1)+")");
                n=(int)(Math.random()*3+2);
                for(int j=0;j<n;j++){
                    num1[j]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);
                }
                for(int k=0;k <n-1;k++){
                    no[k]=(int)(Math.random()*useno+1);
                    if(no[k]==4&&num1[k+1]==0){
                        do{
                            num1[k+1]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);
                        }while(num1[k+1]==0);
                    }
                }
                for(int h=0;h<n;h++){
                    if (h!=n-1){
                        System.out.print(num1[h]);
                        System.out.print(op[no[h]]);
                    }
                    else{
                        System.out.print(num1[h]+"=");
                    }
                }
                System.out.println();
                left=0;
                right=num1[0];
                sign=1;
                for(int g=0;g<n-1;g++){
                    switch(op[no[g]]){
                    case '+':
                        left=left+sign*right;
                        sign=1;
                        right=num1[g + 1];
                        break;
                    case '-':
                        left=left+sign*right;
                        sign=-1;
                        right=num1[g+1];
                        break;
                    case '*':
                        right=right*num1[g+1];
                        break;
                    case '/':
                        right=right/num1[g + 1];
                        break;
                    }
                }
                staticAnser[i]=String.valueOf(decimal.format(left+sign*right));
            }
            System.out.println("###################答题分割线######################");
            for(int i=0;i<max;i++){
                System.out.print((i+1)+":");
                userAnser[i]=in.next();
                if(userAnser[i].equalsIgnoreCase(staticAnser[i])) {
                    count++;
                }
            }
            System.out.println("标准答案为:");
            for(int i=0;i<max;i++){
                System.out.println((i+1)+":"+staticAnser[i]);
            }
            System.out.println("答题正确率为:"+String.valueOf(decimal.format(((float)count/(float)max)*100))+"%");
            if (real=='Y'||real=='y'){
                System.out.println("二、请计算下列真分数算式。");
                System.out.println();
                for(int i=0; i<max;i++){
                    System.out.print("("+(i+1)+") ");
                    for(int j=0;j<2;j++)
                    {
                        num1[j]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);
                        if (j==1){
                            while(num1[j-1]>num1[j]||num1[j]==0){
                                num1[j]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);
                            }
                        }
                    }
                    for(int j=2;j<4;j++)
            {
                        num1[j]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);
                        if(j==3){
                            while(num1[j-1]>num1[j]||num1[j]==0){
                                num1[j]=(int)(Math.random()*(cs[1]-cs[0])+cs[0]);// 控制随机数数值
                            }
                        }
                    }
                    for(int k=0;k <1;k++){// 符号个数
                         no[k]=(int)(Math.random()*useno+1);// 随机产生操作符
                     }
                    for(int h=0;h<4;h++){// 2个真分数
                        if(h%2==0)
                            System.out.print(("("+num1[h]+"/"));
                        else if (h%2==1){
                            System.out.print(num1[h]+")");
                            if (f<1){// 控制只输出一个操作符                             
                            System.out.print(op[no[f]]);
                                f++;
                            } 
                            else
                                System.out.println("="); 
                        }
                    }
                    f=0;
                    count=0;
                    for (int g=0;g<1;g++){
                        s1=num1[0]*num1[3];
                        s2=num1[1]*num1[3];//分母
                        ss1=num1[1]*num1[2];
                        ff=0;
                        fff=0;
                        switch(op[no[g]]){
                        case '+':
                            result=s1+ss1;
                            gys=countMaxSubmultiple(result,s2);// 除以公约数得到最简分数
                            zjfz=String.valueOf(result/gys);
                            zjfm=String.valueOf(s2/gys);
                            break;
                        case '-':
                            result=s1-ss1;
                            gys=countMaxSubmultiple(result, s2);
                            zjfz=String.valueOf(result/gys);
                            zjfm=String.valueOf(s2/gys);
                            break;
                        case '*':
                            result=num1[0]*num1[2];
                            gys=countMaxSubmultiple(result, s2);
                            if(num1[0]==0||num1[2]==0)
                            {
                                fff=1;
                            }
                            zjfz=String.valueOf(result/gys);
                            zjfm=String.valueOf(s2/gys);
                            break;
                        case '/':// 乘以倒数
                            result=num1[0]*num1[3];
                            s2=num1[1]*num1[2];
                            gys=countMaxSubmultiple(s1,s2);
                            if(num1[0]==0||num1[2]==0){
                                ff=1;
                            }
                            zjfz=String.valueOf(result/gys);
                            zjfm=String.valueOf(s2/gys);
                            break;
                        }
                    }
                    if(ff==1){
                        staticAnser[i]="null";
                    }
                    else if(fff==1){
                        staticAnser[i]="0";
                    }
                    else if(zjfz==zjfm){
                        staticAnser[i]="1";
                    }
                    else if(zjfm.equalsIgnoreCase("1")){
                        staticAnser[i]=zjfz;
                    }
                    else{
                        staticAnser[i]=zjfz+"/"+zjfm;
                    }
                }
                System.out.println("######################答题分割线#####################");
                for(int i=0;i<max;i++){
                    System.out.print((i+1)+":");
                    userAnser[i]=in.next();
                    if(userAnser[i].equals(staticAnser[i])){
                        count++;
                    }
                }
                System.out.println("标准答案为:");
                for(int i=0;i<max;i++){
                    System.out.println((i+1)+":"+staticAnser[i]);
                }
                System.out.println("答题正确率为:"+String.valueOf(decimal.format(((float)count/(float)max)*100))+"%");
            }
        }
        private static int countMaxSubmultiple(int n1, int n2){// 求最大公约数
            int maxSubmultiple=1;
            n1=Math.abs(n1);
            n2=Math.abs(n2);
            int min=Math.min(n1, n2);
            for (int i=min;i>=1;i--){
                if (n1%i==0&&n2%i==0){
                    maxSubmultiple=i;
                    break;
                }
            }
            return maxSubmultiple;
        }
    }

    4.Psp表格:

    PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
    Planning 计划  20  20
    · Estimate · 估计这个任务需要多少时间  20  20
    Development 开发 270  290
    · Analysis · 需求分析 (包括学习新技术) 30  35
    · Design Spec · 生成设计文档 20  35
    · Design Review · 设计复审 (和同事审核设计文档)  20  30
    · Coding Standard · 代码规范 (为目前的开发制定合适的规范)  20  20
    · Design · 具体设计 30   30
    · Coding · 具体编码 90   100
    · Code Review · 代码复审  25  25
    · Test · 测试(自我测试,修改代码,提交修改)  40  45
    Reporting 报告  30  40
    · Test Report · 测试报告  40  50
    · Size Measurement · 计算工作量  20  20
    · Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 30   35
    合计   705 795

    5.代码运行结果

  • 相关阅读:
    CentOS 7搭建SVN服务器
    CentOS 配置MySQL允许远程登录
    使用nginx实现基于tcp协议的https协议多域名指向的分别转发功能
    centos7 设置内核启动顺序
    nginx 针对特定地区的ip进行规则匹配
    【转】golang 交叉编译
    linux修改用户id,组id
    etcd 增减节点
    [转]etcd 启用 https
    windows 多网卡路由设置
  • 原文地址:https://www.cnblogs.com/gyy-15768200938/p/13741441.html
Copyright © 2011-2022 走看看