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语言也带来了很大的困扰。不得不一边翻书一边编程。我需要做的是花更多的时间来熟悉代码,希望在这学期的软件工程
    的学习中能取得进步。

  • 相关阅读:
    对于字符串的重复字符的去除
    487-3279
    队列设计(转)
    动态创建JS
    前端技巧:禁止浏览器static files缓存篇(转)
    cas与NGINX整合(转)
    秒杀场景下MySQL的低效(转)
    html禁用缓存
    MD5随机盐值生成法
    SVN There are unfinished transactions detected
  • 原文地址:https://www.cnblogs.com/chendaxiong/p/6509820.html
Copyright © 2011-2022 走看看