精华内容
下载资源
问答
  • java小学生四则运算练习

    千次阅读 2019-03-27 19:58:25
    使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的软件。 软件基本功能要求如下: • 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号±÷来表示)练习题,每个数字在 0 和 100 之间,...

    软件工程导论第一次个人作业!

    0.0项目基本任务

    使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的软件。
    软件基本功能要求如下:

    • 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号±÷来表示)练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
    • 每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3÷5+2=2.6,2-5+10=7等算式。
    • 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
    • 当程序接收的参数为4时,以下为一个输出文件示例。
    2018010203
    13+17-1=29
    11
    15-5=160
    3+10+4-16=1
    15÷5+3-2=4
    软件附加功能要求如下:(请有余力的同学完成)
    • 支持有括号的运算式,包括出题与求解正确答案。注意,算式中存在的括号数必须大于2对,且不得超过运算符的个数。
    • 扩展程序功能支持真分数的出题与运算(只需要涵盖加减法即可),例如:1/6 + 1/8 + 2/3= 23/24。注意在实现本功能时,需支持运算时分数的自动化简,比如 1/2+1/6=2/3,而非4/6,且计算过程中与结果都须为真分数。

    1.0我的整体思路和基本模块:
    在百度了一些博客之后,我基本确定了思路:
    1.用两个数组结合来生成运算式中的数字和运算符,并按照一定格式插入左右括号;
    2.运用逆波兰算法将中缀表达式转换为后缀表达式,并使用栈对后缀表达式进行计算,并在运算过程中判断排除负数和小数中间结果的出现;
    3.最后在Main函数中将结果输出到指定文件;

    2.0我的学习和开发过程:
    阶段一:
    首先我参考了这篇博客,开始大概懂了几个方法后开始编码,还对这篇的方法和整体思路特别有自信,觉得弄懂他的方法就完成了,后来发现是我太天真了,在测试的时候有很多问题。在一边编码的时候由于没有从总体上理解清楚后再下手,使得开发效率低,花多时间调试,浪费很多时间,表达式生成后运算符和括号位置混乱并且没有结果,最后决定另寻他路。
    (https://www.cnblogs.com/Fuenli/p/8605497.html)
    阶段二:
    由于自身java基础很差,我花了很多时间研究别人的博客,而且第一阶段的开发又浪费很时间,所以这时距离交作业很近了,我就想赶紧再找一个思路相近的再学习学习,于是根据上课时老师的推荐找到了这个学姐的代码:(https://coding.net/u/wanghz499/p/2016012032week2-2/git/tree/master/src)
    Alt
    其中我没有实现"ProperFraction()",其余思路类似:

    很巧妙地产生运算式:

    //相当于固定了运算式的运算符位置,即格式固定
         switch (operatorCount){
                case 3:{
                    if(choose==0){
                        s=num[0]+operator[index[0]]+"("+"("+num[1]+operator[index[1]]+num[2]+")"+operator[index[2]]+num[3]+")";//1+((2×3)-4)型
                    }else s="("+num[0]+operator[index[0]]+num[1]+")"+operator[index[1]]+"("+num[2]+operator[index[2]]+num[3]+")";//(1+2)×(3+4)型
                    break;
                }
    
                case 4:{
                    if(choose==0){
                        s="("+num[0]+operator[index[0]]+num[1]+")"+operator[index[1]]+num[4]+operator[index[3]]+"("+num[2]+operator[index[2]]+num[3]+")";//(1+2)×3÷(4-1)型
                    }else s=num[4]+operator[index[3]]+"("+num[0]+operator[index[0]]+num[1]+")"+operator[index[1]]+"("+num[2]+operator[index[2]]+num[3]+")";//3×(1+2)+(4÷2)型
                    break;
                }
    
                case 5:{
                    if(choose==0){
                        s="("+num[0]+operator[index[0]]+num[1]+operator[index[4]]+num[5]+")"+operator[index[1]]+"("+num[4]+operator[index[3]]+num[2]+")"+operator[index[2]]+num[3];//(6+2×3)-(1+2)×3型
                    }else s="("+num[0]+operator[index[0]]+"("+num[1]+operator[index[1]]+num[2]+operator[index[2]]+num[3]+")"+")"+operator[index[3]]+"("+num[4]+operator[index[4]]+num[5]+")";//(1+(2×3+4))-(6÷3)型
                    break;
                }
            }
    
            
    

    并且 保证式子里至少有2个不同操作符的方法:

     private static int[] index(int n,int m){ //产生操作符的下标数组
            Random random = new Random();
            int similar=0;
            int[] a = new int[n];
            for(int j=0;j<n;j++){
                a[j] = random.nextInt(m);
            }
            for(int j=1;j<n;j++){
                if(a[0]==a[j]) similar++;
            }
            if(similar==n-1) return index(n); //保证一个式子里至少有2个不同的操作符,若所有操作符下标都一样,则重新产生操作符下标
            else {
                return a;
            }
    
        }
            
    

    虽然都是核心使用逆波兰表达式,但这个是在中缀转后缀的同时进行计算,
    对负数和小数的判断:
    (1)在计算时由最基本的运算单元返回的结果来实现,若不符合标准就(return -1;),

    
     case('-'):{
        res = a - b; //产生负数就不合格
         break;
    	}
    case('÷'):{
        if(b==0)
    		 return -1;
        else if(a%b!=0) //产生小数就不合格
    	 	 return -2;
    	  else
    		res = a / b;
    	break;
    		    		
    	}
            
    

    (2)这样在运算的方法中只要得到了小于0的返回值也返回状态值为-1,

    int a = stack1.pop();
    int b = stack1.pop();
    int sresulat =calculate (b, a, stmp);
      if(sresulat<0)
        return  -1;
     stack1.push(sresulat);
            
    

    (3)在生成运算式的方法中用一个if语句判断此时的结果,若为负数则递归调用生成函数一直到合格为止。

    		Calculator c = new Calculator();
            int sum = c.Cal(s);
            s += sum;
            if(sum>=0){ //判断式子是否符合要求,凡是返回负数的就是不合格的
                s+=sum;
            }else {
                return format(); //递归直到产生合格的式子
            }
    
            return s;
            
    

    后来我又觉得既然已经弄懂了她的想法,想自己改进一下,就又搜了搜中缀转后缀这里,然后找到了这篇让我感觉这个理解起来很透彻:
    (https://www.cnblogs.com/fuck1/p/5995857.html)
    理解清楚后自己练习一下,在改了很久以后发现这个方法只能处理像(2*3+5=?)这种只含有一位数字的运算,这里我也花了不少时间

    	Pattern pattern = Pattern.compile("\\d+||(\\d+\\.\\d+)");
           // 将后缀表达式分割成字符串数组,此处直接使用空白也可以对字符串进行分割!!
       String[] strings = exp.split("");
            
    

    主要问题是我发现这里的 split(" ") 会将 23 这样的数分割成 2 和 3,接下来就无法计算了;学习了用pattern 正则匹配的方法,我尝试着百度split()函数怎样将运算式中的运算符和数字分开,应该是知识储备不够,这个问题没有解决。。。

    阶段三:
    这时我想再好好研究一下第一次放弃的那个方法,再试试吧;
    最终的结果是我没有找到合适的方法排除小数和负数,当式子中没有出现"-" ," ÷"时计算是正确的,希望以后可以改进出来吧,多多学习和练习。

    学习到的小知识,也还算有收获:
    1.正则表达式:http://www.runoob.com/java/java-regular-expressions.html
    2.输出流:https://www.cnblogs.com/fnz0/p/5423201.html
    3.类型转换:https://blog.csdn.net/u010502101/article/details/79162587
    4.包括命令行cmd的使用也基本get了

    个人总结
    首先由于知识和编程经验不足,整个作业效率很低,而且大多数都是看别人的思路后一点点学习的,java学习基本空白,练习的又少;另一方面,我在真正去做的时候也有偷懒的心理,有的时候知其然而不知其所以然,项目整体构思不够清楚,到写的时候要花很多时间,然而编写完其实只是完成了20%的工作量,甚至是无用功,测试和修改的时间真的是比想象的多很多,要解决太多的问题了,因此以后开发时我会先分析清楚再下手;对于以后的学习我觉得还是要采用项目驱动式,一边做一边学,更有针对性,实践出真知!!!

    *主要花费的时间如下
    **
    任务内容 …… 计划与实际
    计划 : 10 --------》 20
    开发 : 685--------》 2238(~35h)
    具体设计 : 40 --------》 100
    具体编码 : 6
    60 --------》 (7+7+5)*60=1140
    测试与修改: 200--------》 420+300=720

    谢谢观看~

    展开全文
  • 一、背景阿超有个儿子上小学二年级,老师...C/C++、C#、Java、Python、VB、JavaScript、Perl……具体要求如下:能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)除了整数外,...

    一、背景

    阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来解决这个小问题,目前对于这个问题对于任何语言都不是问题,比如:

    C/C++、C#、Java、Python、VB、JavaScript、Perl……

    具体要求如下:

    能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!)

    除了整数外,还要支持真分数的四则运算

    请大家用任何一种自己擅长的语言来编写这段程序,并把程序的介绍和自己编写的过程写一个博客

    二、分析

    (一) 自己擅长的是c语言,准备用c语言,但是自己学的java,想用java试试,支持真分数运算,如果用C语言,我们可以这么考虑,a,b,c,d随机生成。

    a/b      c/d,

    (1)可能存在a,b,c,d;a和b存在公约数,c和d存在公约数。

    解 决办法:先求a和b的最大公约数m,先求c和d的最大公约数n,然后a=a/m;b=b/m;c=c/m;d=d/m;,然后就可以算加"+"法 (a*d+b*c)/(b*d);减“-”法(a*d-b*c)/(b*d);乘“*”法a*c/(b*d);除法“/”,判断一下分母是否为0,分数符 号直接输出;

    (2)可能存在a>b,c>d的情况,真假分数情况。输出直接输出符号“/”。

    (二)有判断正确和错误,每答一次就判断一次,回答正确和回答错误,一次性答对是10分,答两次才答对得5分,答三次才答对得3分。

    (三)输入一个数,知道出题的数目,随机产生的题数目,多输也会提示输入错误。

    三、代码部分

    我用的是java写的:

    importjava.util.InputMismatchException;

    importjava.util.Random;

    importjava.util.Scanner;

    import java.io.*;

    public classPratices {

    public static voidmain(String[] args) {

    newPratices().list_Pratices();

    }

    public int random_Num(intrange) {

    return (int) (Math.random() *range);

    }

    public voidlist_Pratices() {

    int right = 0;

    int wrongtimes = 0;

    intnum_1, num_2, temp;

    int type = random_Num(4);

    int score = 0;

    int count = 1;

    System.out.println("请输入题目数量:");

    Scanner sc = newScanner(System.in);

    int n =sc.nextInt();

    while (count <=n) {

    type = random_Num(2);

    num1 = random_Num(100); //100以内随机数

    num2 = random_Num(100); //100以内的随机数

    wrongtimes = 0;

    if (type == 0)

    {

    System.out.print("(" + count + ") " + num1 + " + " + num2+ " = ");//加法

    }

    else if(type == 1)

    {

    if ((num1

    {

    temp =num1;

    num1 =num2;

    num2 =temp;

    }

    System.out.print("(" + count + ") " + num1 + " - " + num2+ " = ");//减法

    }

    else if(type == 2)

    System.out.print("(" + count + ") " + num1 + " * " + num2+ " = ");//乘法

    }

    else if(type == 3)

    {

    if(num2!=0)

    System.out.print("(" + count + ") " + num1 + " / " + num2+ " = ");//除法

    elseSystem.out.println("分母为零");

    }

    int answer = this.getAnswer(count);

    boolean flag =check(num1, num2, type, answer, count);

    if(flag) {

    right++;

    System.out.println("回答正确");

    score += this.getScore(wrongtimes);

    } else{

    while (wrongtimes < 2) {

    wrongtimes++;

    System.out.println("回答错误 " + wrongtimes + " 次");

    answer = this.getAnswer(count);

    flag =check(num1, num2, type, answer, count);

    if(flag) {

    score += this.getScore(wrongtimes);

    right++;

    wrongtimes = 0;

    break;

    }

    }

    if (wrongtimes == 3)

    System.out.println("回答错误 ");

    elseSystem.out.println("回答正确");

    }

    count++;

    }

    System.out.println("回答正确 : " +right);

    System.out.println("回答错误: " + (10 -right));

    System.out.println("获得分数: " +score);

    System.out.println(getDegree(score));

    }

    public boolean check(int num_1, int num_2, int type, intmy_Answer,

    intcount) {

    int answer = 0;

    if (type == 1) {

    answer = num_1 -num_2;

    } else if (type == 0) {

    answer = num_1 +num_2;

    }

    return my_Answer ==answer;

    }

    public int getAnswer(intcount) {

    int my_Answer = 0;

    BufferedReader br = new BufferedReader(newInputStreamReader(System.in));

    try{

    my_Answer =Integer.parseInt(br.readLine());

    } catch(IOException e) {

    e.printStackTrace();

    } catch(NumberFormatException e) {

    System.out.println("输入有误");

    return 0;

    } finally{

    if (count >= n && (br != null)) {//不会超出输入的n

    try{

    br.close();

    } catch(IOException e) {

    e.printStackTrace();

    }

    br = null;

    }

    }

    returnmy_Answer;

    }

    public int getScore(intwrongtimes) {

    if (wrongtimes == 0) {

    return 10;

    } else if (wrongtimes == 1) {

    return 7;

    } else if (wrongtimes == 2) {

    return 5;

    } else

    return 0;

    }

    public String getDegree(int score) {

    if (score > 90)

    return "SMART";

    else if (score > 80)

    return "GOOD";

    else if (score > 70)

    return "OK";

    else if (score > 60)

    return "PASS";

    else

    return "TRY AGAIN";

    }

    }

    展开全文
  • 作业需求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正...

    github远程仓库的地址:https://github.com/mingbiaoleung/FourOperation

    第一部分:要求

    1.作业需求:任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。

    2.拓展要求:

    1) 要求能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

    2) 并且要求能处理用户的输入,并判断对错,打分统计。 要求能处理用户输入的真分数, 如 1/2, 5/12 等。

    初步拟定要实现的功能后,估计一下自己需要花多长时间。编程过程中记录自己实际用了多长时间。

    然后和同学们比较一下各自程序的功能、实现方法的异同等等。

    第二部分:设计

    1.需求分析

    (1)随机产生 100 之内的正整数或者真分数的题目。

    (2)答案不能是负数。

    (3)题目数根据用户而定。

    (4)运算式子必须至少有两个运算符。

    .    (5)判断用户输入值的对错,并给出用户的正确题目数和分数。

    2.功能设计

    1.根据用户要求的题目数,循环num次输出随机四则运算。

    2.判断用户输入值是否正确,并给出正确题目数。

    3.答案不能小于0,小于0就重新输出题目。

    4.能出和真分数 (二分之一, 十二分之五,等)相关的练习题。

    3.代码规范

    命名规范:使用匈牙利命名法

    程序风格:程序按照阶梯式编写,括号习惯使用其一个括号在语句后面,结尾括号另占一行

    注释规范:函数头的注释(“功能”,“返回值”),在一些关键的语句上面进行注释

    第三部分:代码实现

    总体设计:

    ◻随机产生100以内的正整数,运算符号以及正整数和运算符号的数量,通过调参可以调整生成正整数和运算符号的数量,四则运算乘除和加减优先级别:先乘除后加减,在计算函数中遍历运算符数组中乘除符号后进行优先计算,之后再对乘除计算之后的运算数进行相加减运算。

    ◻真分数设计:随机生成真分数,分子与分母大小范围在1-20随机生成,范围可以通过改变参数进行调整,分数约分后用对象进行存储。可以通过改变参数对分数运算数的数量(计算难度较大,这里使用生成两个运算数进行运算)。分数运算时,优先乘除后再相加减,会对最终计算结果进行约分到最简。

    ◻当随机产生的正整数运算题和真分数运算题计算结果为负数则递归重新生成运算题,直至结果是大于零时产生题目并打印在控制台上,用户输入答案,答案与结果匹配正确即统计正确题数,错误的输出打印正确结果,当全部运算题做完后输出统计结果以及分数。分数计算公式: 100 * (正确数 / 总题数)。

    主要代码:

    //生成运算公式并计算正确结果,将最终的存入List中

    public voidgenerateFormula() {

    Random random= newRandom();int operationNum = random.nextInt(3) + 3; //运算数的个数

    int operatorNum = operationNum - 1; //运算符的个数

    ListnewOperators;

    ListnewOperations;intnewAnswer;//计算运算式答案

    do{

    List operators =storeOpInList(operatorNum);

    List operations =operations(operationNum, operators);

    newOperators=deepCopy(operators);

    newOperations=deepCopy(operations);

    newAnswer=generateCorrectAnswer(operators, operations);

    }while (newAnswer < 0);

    StringBuilder stringBuilder= newStringBuilder();for (int i = 0; i < operationNum - 1; i++)

    stringBuilder.append(newOperations.get(i)+ " " + newOperators.get(i) + " ");

    stringBuilder.append(newOperations.get(operationNum- 1) + " = ");

    System.out.println(stringBuilder.toString());

    operatorExpressionList.add(stringBuilder.toString());

    correctAnswerList.add(String.valueOf(newAnswer));

    }

    /***@author: 梁铭标

    * @Date:2018.10.10

    * @Content:可序列化真分数对象*/

    public class Fraction implementsSerializable {private static final long serialVersionUID = -3245478690496182643L;private int numerator; //分子

    private int denominator; //分母

    public Fraction(int numerator, intdenominator) {this.numerator =numerator;this.denominator =denominator;

    }public intgetNumerator() {returnnumerator;

    }public intgetDenominator() {returndenominator;

    }public void setNumerator(intnumerator) {this.numerator =numerator;

    }public void setDenominator(intdenominator) {this.denominator =denominator;

    }

    }

    计算真分数运算式的正确结果

    1 //计算真分数运算式的正确结果

    2 public Fraction generateCorrectAnswer(List operators, Listoperations) {3 //遍历运算符容器,完成乘除运算

    4 for (int i = 0; i < operators.size(); i++) {5 String operator =operators.get(i);6 if (operator.equals("*") || operator.equals("/")) {7 operators.remove(i); //乘除符号将其从集合中移除

    8 Fraction fractionLeft = operations.remove(i); //拿运算符左侧的数字

    9 Fraction fractionRight = operations.remove(i); //拿运算符右侧的数字

    10 if (operator.equals("*"))11 operations.add(fractionMultiple(fractionLeft, fractionRight));12 else

    13 operations.add(fractionDivide(fractionLeft, fractionRight));14 i--; //运算符容器的指针回到原来的位置,防止跳过下一个运算符

    15 }16 }17

    18 //遍历运算符容器,完成加减运算,当运算符容器为空时,运算结束

    19 while (!operators.isEmpty()) {20 String operator = operators.remove(0);21 Fraction fractionLeft = operations.remove(0);22 Fraction fractionRight = operations.remove(0);23 if (operator.equals("+"))24 fractionLeft =fractionAdd(fractionLeft, fractionRight);25 else

    26 fractionLeft =fractionSubtract(fractionLeft, fractionRight);27 operations.add(0, fractionLeft);28 }29

    30 //返回计算结果

    31 return operations.get(0);32 }

    该作业的程序总引擎

    /***@author: 梁铭标

    * @Date:2018.10.10

    * @Content:正整数和真分数总引擎*/

    public classExecutionEengine {public static voidmain(String[] args) {

    SimpleFourOperation simpleFourOperation= newSimpleFourOperation();

    simpleFourOperation.init();

    FractionOperation fractionOperation= newFractionOperation();

    Scanner scanner= newScanner(System.in);

    System.out.print("请输入生成四则运算题目的个数:");int titleNum =handleUserInput(scanner);//随机生成正整数和分数的题目数量

    Random random = newRandom();int simpleFourOperationNum = random.nextInt(titleNum) + 1;int FractionOperationNum = titleNum -simpleFourOperationNum;//分别获取用户做对相应题目的正确数

    int simpleFourOpTrueNum =simpleFourOperation.generateSimpleFourOpExp(simpleFourOperationNum, scanner);int fractionOpTrueNum =fractionOperation.generateFractionOpExp(FractionOperationNum, scanner);//计算总分数

    int trueNum = simpleFourOpTrueNum +fractionOpTrueNum;int falseNum = titleNum -trueNum;int score = 100 * trueNum /titleNum;

    System.out.println("恭喜你完成这次练习,题目总数:" + titleNum + ", 你做对了" + trueNum + "道题,"

    + "做错了" + falseNum + "道题, " + "总分数为" + score + ", 继续加油!");

    }public static inthandleUserInput(Scanner scanner) {inttitleNum;do{

    titleNum=scanner.nextInt();if (titleNum > 0)break;else{

    System.out.println("输入有误,不能输入非法字符以及小于0,请重新输入!");

    System.out.println("请输入生成四则运算题目的个数:");

    }

    }while (!(titleNum > 0));returntitleNum;

    }

    }

    运行结果:

    98f179d3f7aea8a88e7af781b5fd849e.png

    第四部分:问题及解决方法

    1.怎么解决先乘除后加减的问题?

    先乘除后加减,在计算结果函数中遍历运算符数组中乘除符号后,在从存储运算数数组获取相对应的运算数进行优先计算,之后再对乘除计算之后的运算数进行相加减运算。

    2.结果可以为负数,试了很多方法,最终找了一个好的方法?

    定义一个在结果为负数和下一次循环的变量,用来控制题目数量,大于0就输出题目。

    3.分数怎么约分?

    将分子和分母的最小值的数值,从大到小去除分子和分母,如果能够同时被整除,则以此数值约分。

    总结:

    通过这次练习,明白了一个程序开发是一件不容易的事情,没有好的知识功底是无法创造出高质量高拓展的软件。天生我才必有用,千金散尽还复来,我会用这句话激励自己用功学习。

    第五部分:个人软件过程耗时估计与统计表

    PSP2.1

    Personal Software Process Stages

    预计hour

    实际hour

    Planning

    计划

    0.1

    0.3

    · Estimate

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

    5

    9.0

    Development

    开发

    0.3

    6.0

    · Analysis

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

    0.4

    0.4

    · Design Spec

    生成设计文档

    0.3

    0.3

    · Design Review

    设计复审

    0.2

    0.3

    · Coding Standard

    代码规范

    0.1

    0.5

    · Design

    具体设计

    0.3

    0.3

    · Coding

    具体编码

    2

    2

    · Code Review

    代码复审

    0.3

    0.5

    · Test

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

    0.3

    1.0

    展开全文
  • java实现随机四则运算

    2019-10-01 01:56:31
    使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习,软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。 为了让小学生...

    使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习,软件基本功能要求如下:

    • 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在3个到5个之间。
    • 为了让小学生得到充分锻炼,每个练习题至少要包含2种运算符。同时,由于小学生没有分数与负数的概念,你所出的练习题在运算过程中不得出现负数与非整数,比如不能出 3/5+2=2.6,2-5+10=7等算式。
    • 练习题生成好后,将你的学号与生成的n道练习题及其对应的正确答案输出到文件“result.txt”中,不要输出额外信息,文件目录与程序目录一致。
    • 当程序接收的参数为4时,以下为输出文件示例。
    2018010230
    13+17-1=29
    11*15-5=160
    3+10+4=1
    15/5+3-2=4
    

    Github项目地址:

    https://github.com/dushik/Athmetic

    需求分析:

    • 通过程序接受一个数字,产生N道加减乘除练习题。
    • 判断传入参数是否合法
    • 每个数字在0-100之间,运算符3-5个
    • 运算过程不能出现负数和非整数
    • 计算练习题
    • 所有信息输出到txt文件

    功能设计:

    • 编写主函数
    • 编写输入是否合法函数
    • 随机生成运算式
    • 编写计算运算式函数
    • 结果写入txt辅助类

    设计实现:

    • 编写主函数并通过命令行接收参数
    • 判断传入参数是否合法
    • 随机选择加减乘除运算符
    • 根据产生运算符的个数生成一定运算数的运算式并存入List集合
    • 当随机产生的运算符是“/”时,判断被除数是否能整除除数,如果不能,随机产生能够被整除的除数。
    • 遍历List集合通过函数计算集合中每个运算式的结果
    • 编写写入txt文件函数

    测试运行:

    1036158-20180316133112205-1082924382.png

    核心代码:

    随机产生num个运算式,并将产生的运算式存入List集合

    
    char[] operator=new char[]{'+','-','*','/'};
    Random random=new Random();
    ArrayList<String> expression=new ArrayList<String>();
    for(int i=0;i<num;i++){
        int n=random.nextInt(3)+3; //3-5个运算符
        int[] number=new int[n+1]; 
        String ex=new String();
        for(int j=0;j<=n;j++){
            number[j]=random.nextInt(100)+1; //4-5个数字
        }
        for(int j=0;j<n;j++){
            int s=random.nextInt(4);//随机选择某个运算符
            ex+=String.valueOf(number[j])+String.valueOf(operator[s]);///5+4+6+9
            if(s==3){number[j+1]=decide(number[j],number[j+1]);}
        }
        ex+=String.valueOf(number[n]);
        expression.add(ex);
    }
    

    当被除数不能整除除数时,随机生成能够整除的除数

    
    /**
     * 随即取x,y为1-100之间,x可以整除y的y值
     * @param x
     * @param y
     * @return
     */
    private static int decide(int x,int y){//通过递归实现整除
        Random random=new Random();
        if(x%y!=0){
            y=random.nextInt(100)+1;
            return decide(x,y);
        }
        else{
            return y; 
        }
    }
    
    

    通过javascript的eval函数计算字符串内的运算式

    
    /**
     * 计算每个等式的结果,并返回运算式
     * @param arrayList 
     * @return arrayList
     */
    static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");  
    private static ArrayList<String> calculate(ArrayList<String> arrayList){
        ArrayList<String> ArithExpress=new ArrayList<String>();
        for(String ax:arrayList){
            try {
                ax=ax+"="+jse.eval(ax);
                System.out.println(ax);
                ArithExpress.add(ax);
            } catch (ScriptException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return ArithExpress;
    }
    

    总结:

    本程序的主要难点在于运算式的随机生成和运算式的计算,后者借助于Javascript的eval函数通过求解字符串内的运算式得到解决,编程重点解决随机生成运算式部分

    PSP:

    PSP 任务内容 计划完成需要的时间(min) 实际完成需要的时间(min)
    计划 10 12
    Estimate 需求分析,函数实现 10 10
    开发 30 30
    Analysis 需求分析 5 10
    Design Spec 设计 5 5
    Design Review 设计复审 2 2
    Design 具体设计 5 5
    Coding 具体编码 20 20
    Code Review 代码复审,查找语法错误 2 2
    Test 测试 5 5
    报告 10 10
    Test Report 经测试,程序编译正确,运行结果正确,完全符合要求 2 2
    Size Measurement 由于程序功能较为简单,需求分析的工作量很小,故本次实验的主要工作主要在于编程 2 2
    Postmortem 对于此程序,计算部分还有大的改进空间,可以采用将中缀表达式转换为后缀表达式,通过正则判断运算符优先级来实现算式的结果,而不是另辟他法调用Javascript函数 2 2

    转载于:https://www.cnblogs.com/dushik/p/8580705.html

    展开全文
  • 使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的软件。 软件基本功能要求如下: 1、程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号±*÷来表示)练习题,每个数字在 0 和 100 之间...
  • 简单的四则运算题目生成及求值小程序程序发布至...尝试按照《构建之法》第2章中2.3所述PSP流程,使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习的命令行软件开发。题目参考:http...
  • 使用JAVA编程语言,采用结对编程方式实现四则运算出题小程序,软件基本功能要求如下: 1.由计算机从题库文件中随机选择20道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计5分,错误不计分...
  • 一、背景 阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来...能自动生成小学四则运算题目(注意是给小学生用的,...
  • 我们老师最近布置了一项作业,让每个人用Java语言实现整数或是分数的四则运算功能。 具体需求如下: 1、程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 ...
  • 四则运算

    2018-03-22 00:02:00
    使用JAVA编程语言,独立完成一个包含3到5个数字的四则运算练习的命令行软件开发。https://github.com/zhouheqh 软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 ...
  • 201571030310 四则运算 ...用Java编程语言随机产生n个小学生四则运算练习题。 二、个人项目报告展示 1、需求分析 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和...
  • 201571030314 四则运算

    2018-03-23 11:39:00
    即使用Java编程语言随机产生n个小学生四则运算练习题。 二、个人项目报告展示 1、需求分析 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和100之间,运算符在3个到5个之间。 为了...
  • 201571030305 四则运算

    2018-03-24 18:36:00
    Java编程语言随机产生n个小学生四则运算练习题 二个 人项目展示 1.需求分析: 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和100之间,运算符在3个到5个之间。 为了让小学生...
  • 小学四则运算

    2019-03-27 20:06:02
    使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的软件。 软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,...
  • 四则运算 201571030317

    2018-03-24 22:50:00
    1.需求分析:使用JAVA编程语言,完成一个包含3到5个数字的四则运算练习的命令行软件开发。软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘除练习题,每个数字在 0 和 100 之间,运算符在...
  • 四则运算出题机

    千次阅读 2018-05-02 14:31:47
    * @author 某公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道(100以内)四则运算题目给小学生做。 * 二柱立马就想到写一个小程序来做这件事。 这个事情可以用很多语言或者工具来实现: ...
  • 设计一个能够自动生成小学生四则运算试题的程序。使用C语言或者Java语言(这里使用的是C语言,编译器为vc++ 6.0) 设计功能: 基本功能: 自动生成10道100以内的2个操作数的四则运算算式(+-*/),运算...
  • 使用JAVA编程语言,独立完成一个3到5个运算符的四则运算练习的命令行软件开发 基本功能要求: 程序可接收一个输入参数n,然后随机产生n道加减乘除(分别使用符号+-*÷来表示)练习题,每个数字在 0 和 100 之间,...
  • 题目:某公司程序员二柱的小孩上了小学二年级,老师让家长每天出30道(100以内)四则运算题目给小学生做。 采用语言Java 结对对象: 张莲 博客地址:http://home.cnblogs.com/u/linuoxin/ 双方贡献比例:1:1 ...
  • 某公司程序员二柱的小孩上了小学二年级,老师让家长每天出100道(100以内)四则运算题目给小学生做。 二、结对对象:杨思思 博客地址:http://www.cnblogs.com/ciciCassie/ 双方贡献:1:1 结对编程照片...
  • 初次读到《构建之法》中用代码实现随机产生小学生四则运算,我也想过,用什么方法实现,但并没有结果,也不过是脑海中一闪而过,并没有深刻思考这个问题,当看到老师布置的作业时,感觉有点小兴奋,因为脑海中有过...
  • 一、需求分析  现在的小学生数学算术能力很差,老师想要每天都... 使用C或Java语言完成一个自动生成四则运算试题的程序。  拓展功能: (1)自动生成10道100以内的2个操作数的四则运算算式(+ - * /),要求...

空空如也

空空如也

1 2 3
收藏数 52
精华内容 20
关键字:

java语言小学生四则运算

java 订阅