四则运算
2017-03-07 18:40 周迪89 阅读(283) 评论(1) 编辑 收藏 举报题目描述:
从《构建之法》第一章的 “程序” 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 “软件”,满足以下需求:
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.\n",questNum); System.out.println("easy or difficult?\n1、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("=?\n"); 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.oschina.net/dashboard/projects
小结:写代码前的规划真的很重要,花了一下午的时间按照混乱的思维写了一堆后来全部废弃的代码,付出了巨大的时间代价。
许久没用JAVA语言也带来了很大的困扰。不得不一边翻书一边编程。我需要做的是花更多的时间来熟悉代码,希望在这学期的软件工程
的学习中能取得进步。