自动生成小学四则运算题目升级版

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.代码运行结果

 

posted @ 2020-09-27 21:24  偷心大圣  阅读(124)  评论(0编辑  收藏  举报