zoukankan      html  css  js  c++  java
  • 四则运算题目生成程序(基于控制台)

    题目描述:
    从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:

    1.除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24
    2.运算符为 +, −, ×, ÷
    3.并且要求能处理用户的输入,并判断对错,打分统计正确率。
    4.要求能处理用户输入的真分数, 如 1/2, 5/12 等
    5.使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目
    Myapp.exe -n 10

    需求分析:
    1.能随机生成整数和真分数四则运算。
    2.要能判断用户答案的对错,对做错了的题目给出正确答案,并统计算出正确率。
    3.能用参数控制生成题目个数。
    4.能够处理用户输入的分数。
    5.可以让用户自行选择难度。

    设计实现:
    1.实现number类数字处理方式全部采用分数形式,整数作为分母为1的分数。
    2.实现calculate类,能够对数字进行加减乘除运算并实现最大公约数的计算。
    3.根据用户选择的难易程度,能随机生成整数的加减乘除题目(易),和随机生成分数的加减乘除题目(难)。
    4.对用户的答案进行判断并统计分数。

    部分代码:
    1.计算部分,对生成的题目进行加减乘除运算。

    class calculate{
    	number num1=new number();
    	number num2=new number();
    	calculate(number a,number b){
    		this.num1=a;
    		this.num2=b;
    	}
    	calculate(){}
    	int MaxGys(int a,int b){//求最大公约数
    		int i=1,t=1;
    		for(i=1;i<=a&&i<=b;i++){
    			if(a%i==0&&b%i==0){
    				t=i;
    			}
    		}
    		return t;
    	}
    	number add(){    //加法
    		int numD,num1N,num2N;
    		int MaxGys=MaxGys(num1.denominator,num2.denominator);
    		numD=num1.denominator*num2.denominator/MaxGys;
    		num1N=numD/num1.denominator*num1.numerator;
    		num2N=numD/num2.denominator*num2.numerator;
    		number result=new number();
    		result.denominator=numD;
    		result.numerator=num1N+num2N;
    		int x=MaxGys(result.denominator,result.numerator);//对所得结果进行化简
    		result.denominator=result.denominator/x;
    		result.numerator=result.numerator/x;
    		return result;
    	}
    	number sub(){    //减法
    		int numD,num1N,num2N;
    		int MaxGys=MaxGys(num1.denominator,num2.denominator);
    		numD=num1.denominator*num2.denominator/MaxGys;
    		num1N=numD/num1.denominator*num1.numerator;
    		num2N=numD/num2.denominator*num2.numerator;
    		number result=new number();
    		result.denominator=numD;
    		result.numerator=num1N-num2N;
    		int x=MaxGys(Math.abs(result.denominator),Math.abs(result.numerator));
    		result.denominator=result.denominator/x;
    		result.numerator=result.numerator/x;
    		return result;
    	}
    	number muti(){    //乘法
    		int numD,numN;
    		numD=num1.denominator*num2.denominator;
    		numN=num1.numerator*num2.numerator;
    		number result=new number();
    		result.denominator=numD;
    		result.numerator=numN;
    		int x=MaxGys(result.denominator,result.numerator);
    		result.denominator=result.denominator/x;
    		result.numerator=result.numerator/x;
    		return result;
    	}	
    	number div(){    //除法
    		int numD,numN;
    		numD=num1.denominator*num2.numerator;
    		numN=num1.numerator*num2.denominator;
    		number result=new number();
    		result.denominator=numD;
    		result.numerator=numN;
    		int x=MaxGys(result.denominator,result.numerator);
    		result.denominator=result.denominator/x;
    		result.numerator=result.numerator/x;
    		return result;
    	}	
    }
    

    2.main函数

     try{
          Scanner input=new Scanner(System.in);
          print print=new print();
          int questNum,i=0; //问题数
          int easyOrDifficult=0;
          char[] signal={'+','-','×','÷'};
          int trueCount=0;
          try{          //防止用户输入非数字的数而产生的异常
        	questNum=Integer.parseInt(args[0]);
          }
          catch(java.lang.NumberFormatException ex){
        	System.out.println("please input a number!");
        	questNum=Integer.parseInt(input.nextLine());
          }
          System.out.printf("u will test %d questions.
    ",questNum);
          System.out.println("easy or difficult?
    1、easy 2、difficult");
          try{
         	easyOrDifficult=Integer.parseInt(input.nextLine());
          }
          catch(java.lang.NumberFormatException ex){
         	System.out.println("please input 1 or 2!");
         	easyOrDifficult=Integer.parseInt(input.nextLine());
          }
          for(i=0;i<questNum;i++){
           	number num1=new number();
        	number num2=new number();
        	number result=new number();
        	calculate calculate=new calculate(num1,num2);
            int Num1IntergerOrFraction=0,Num2IntergerOrFraction=0;
            if(easyOrDifficult==1){//根据用户选择生成整数或分数,easyOrDifficult等于1时生成整数,等于2时生成分数
            	Num1IntergerOrFraction=Num2IntergerOrFraction=0;
            }
            if(easyOrDifficult==2){
            	int x=(int)(Math.random()*10)%2;
            	if(x==1){
            		Num1IntergerOrFraction=Num2IntergerOrFraction=1;
            	}
            	if(x==0){
            		Num1IntergerOrFraction=(int)(Math.random()*10)%2;
            		Num2IntergerOrFraction=1-Num1IntergerOrFraction;
            	}
            }
        	if(Num1IntergerOrFraction==1){
        		num1.setNumeratorAndDenominator();
        		int x=calculate.MaxGys(num1.denominator,num1.numerator);//对生成的数进行化简
        		num1.denominator=num1.denominator/x;
        		num1.numerator=num1.numerator/x;
        	}
        	else{
        		num1.setNumerator();
        		num1.denominator=1;
        	}
        	if(Num2IntergerOrFraction==1){
        		num2.setNumeratorAndDenominator();
        		num2.numerator++;
        		int x=calculate.MaxGys(num2.denominator,num2.numerator);
        		num2.denominator=num2.denominator/x;
        		num2.numerator=num2.numerator/x;
        	}
        	else{
        		num2.setNumerator();
        		num2.numerator++;
        		num2.denominator=1;
        	}
    	 int whichSig=(int)(Math.random()*100)%4;//随机生成符号
        	switch(signal[whichSig]){
        	case '+':result=calculate.add();break;
        	case '-':result=calculate.sub();break;
        	case '×':result=calculate.muti();break;
        	case '÷':result=calculate.div();break;
        	}
        	print.printNum(num1);
        	System.out.print(signal[whichSig]);
        	print.printNum(num2);
        	System.out.printf("=?
    ");
        	String answer=input.nextLine();
        	String resultStr=null;
        	if(result.numerator==0){
        		resultStr=0+"";
        	}
        	else if(result.denominator==1){
        		resultStr=result.numerator+"";
        	}
        	else{
        		resultStr=result.numerator+""+'/'+result.denominator;
        	}
        	if(answer.equals(resultStr)){//对用户的答案进行判断
        		System.out.println("ture");
        		trueCount++;
        	}
        	else{
        		System.out.println("false the true answer is "+resultStr);
        	}
       }
       System.out.printf("ture:%d false:%d Score:%d",trueCount,questNum-trueCount,100/questNum*trueCount);
       }
       catch(java.lang.NumberFormatException ex){
       	 System.out.println("please input a number!");
       }
     
    

    测试运行:
    1.正常运行

    2.用户输入非数字的字符

    PSP展示:PSP2.1 Personal Software Process Stages Time (%) Senior Student(/hour) Time (%)(/hour)
    • Planning 计划 2 1.5
    • Estimate 估计这个任务需要多少时间 48 36
    • Analysis 需求分析 (包括学习新技术) 5 6
    • Coding Standard 代码规范 0.5 0.5
    • Design 具体设计 1.5 3
    • Coding 具体编码 10 15
    • Test 测试(自我测试,修改代码,提交修改) 5 8
    Reporting 报告 1 1

    源代码地址:https://git.coding.net/cx873230936/calculator.git

    小结:写代码前的规划真的很重要,花了一下午的时间按照混乱的思维写了一堆后来全部废弃的代码,付出了巨大的时间代价。
    许久没用JAVA语言也带来了很大的困扰。不得不一边翻书一边编程。我需要做的是花更多的时间来熟悉代码,希望在这学期的软件工程
    的学习中能取得进步。

  • 相关阅读:
    python note 30 断点续传
    python note 29 线程创建
    python note 28 socketserver
    python note 27 粘包
    python note 26 socket
    python note 25 约束
    Sed 用法
    python note 24 反射
    python note 23 组合
    python note 22 面向对象成员
  • 原文地址:https://www.cnblogs.com/chendaxiong/p/6509820.html
Copyright © 2011-2022 走看看