个人项目-小学四则运算 “软件”之初版

作业要求来源于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186

我的远程库地址:http://github.com/Hgg07195613/12123

 


 

一、题目要求

像《构建之法》的人物阿超那样,写一个能自动生成小学四则运算题目的命令行 “软件”。

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

23 - 3 * 4 = 11 

扩展要求:

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

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

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

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

写博客纪录自己实现的过程和思路。

 

二、需求分析

        具体要求:①任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。

                          ②运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。

三、功能设计

   1、根据用户输入的数字自动产生相应数目的三项式四则运算式;

   2、根据用户输入的答案,判断用户输入的答案是否正确;

   3、程序所产生的符号和数字均为随机数字


 

四、详细设计

public class Calculator {
//全局变量定义
int Result;//变量:记录所出题目的答案
int Num1, Num2, Num3;//变量:记录随机生成的三个数
int Time;//变量:记录用户答对题目的次数

public static void main(String[] args) {
Calculator t = new Calculator();

int n;
Scanner s = new Scanner(System.in);
System.out.println("请输入题目的数量(1-99):");
n = s.nextInt();
//判断输入的次数是否在范围内
while(n>99){
System.out.println("请重新输入题目的数量(1-99):");
n = s.nextInt();
}
t.Motivation(n);
}
//四则运算的实现
public int Add(int n1,int n2){
return n1 + n2;
}
public int Sub(int n1, int n2){
return n1 - n2;
}
public int Mul(int n1, int n2){
return n1 * n2;
}
public int Div(int n1, int n2){
return n1 / n2;
}

public void Motivation(int n){
int Op1,Op2;
double x;
for (int i = 0; i < n; i++) {
Num1 = new Random().nextInt(99)+1;
Num2 = new Random().nextInt(99)+1;
Num3 = new Random().nextInt(99)+1;
//1=加,2=减,3=乘,4=除
Op1=new Random().nextInt(4)+1;
Op2=new Random().nextInt(4)+1;

//加法
if(Op1 == 1){
String str = Num1 + "+" + Num2;
if(Op2 == 1){
Result = Add(Num1, Num2);
Result = Add(Result, Num3);
str = str + "+" + Num3;/*++*/
}
else if(Op2 == 2){
Result = Add(Num1, Num2);
//确保此Num1+Num2值大于等于Num3,从而保证最终答案不为负数
while(Result < Num3){
Num3 = new Random().nextInt(99)+1;
}
Result = Sub(Result, Num3);
str = str + "-" + Num3;
}
//乘除法优先处理
else{
str = Judge(Op1,Op2);
}
Print(str);
}

//减法
else if(Op1 == 2){
// String str = Num1 + "-" + Num2;
String str = "";
if(Op2 == 1){
Result = Sub(Num1, Num2);
//确保Num1-Num2的绝对值小于等于num3的绝对值,从而保证最终答案不为负数
while(Math.abs(Result) > Math.abs(Num3)){
Num3 = new Random().nextInt(99)+1;
}
Result = Add(Result, Num3);
str = Num1 + "-" + Num2 + "+" + Num3;
}
else if(Op2 == 2){
//确保Num1-Num2的值为正数
while(Num1 < Num2){//算法不优先,把num1的取值范围缩小了
Num1 = new Random().nextInt(99)+1;
}
Result = Sub(Num1, Num2);
// str = Num1 + "-" + Num2;
//确保Num1- Num2大于等于num3
while(Result < Num3){
Num3 = new Random().nextInt(99)+1;
}
Result = Sub(Result, Num3);
}
//乘除法优先处理
else{
str = Judge(Op1,Op2);
}
Print(str);
}

//乘法
else if(Op1 == 3){
String str = Num1 + "*" + Num2 +"*" + Num3;
Result = Mul(Num1, Num2);
Result = Mul(Result, Num3);
// str = DivisionOps(Op1,Op2,str);
Print(str);
}

//除法
else if(Op1 == 4){
String str = Num1 + "÷" + Num2;
Result = Div(Num1, Num2);
str = DivisionOps(Op1,Op2,str);
Print(str);
}

else {
System.out.println("运算式子生成出错,请重启");
}
}
x=100 * Time / n ;
System.out.println("共生成题目"+n+"题,"+"您答对了"+ Time +"题,准确率为"+x+"%");
}

//判断优先级
public String Judge(int Op1, int Op2){
String str = "";

//乘法
if(Op2 == 3){
Result = Mul(Num2, Num3);
str = comPri(Op1,Op2,str);
str = str + "*" + Num3;
}

//除法
if(Op2 == 4){
Result = Div(Num2, Num3);
str = comPri(Op1,Op2,str);
str = str + "÷" + Num3;
}

return str;
}
public String comPri(int Op1,int Op2,String str){
if(Op1 == 1){
Result = Add(Num1, Result);
str = Num1 + "+" + Num2;
}
if(Op1 == 2){
//while循环确保最终答案不为负数
while(Num1 < Result){
Num2 = new Random().nextInt(99)+1;
Num3 = new Random().nextInt(99)+1;
Result = Mul(Num2, Num3);
}
Result = Sub(Num1, Result);
str = Num1 + "-" + Num2;
}
return str;
}

//对除法运算中的第三个数做判断
public String DivisionOps(int Op1, int Op2, String str){
//先除后加
if(Op2 == 1){
Result = Add(Result, Num3);
return str + "+" + Num3;
}
//先除后减
else if(Op2 == 2){
//确保最终答案不为负数
while(Result < Num3){
//重新生成num1,Num2
Num1 = new Random().nextInt(99)+1;
Num2 = new Random().nextInt(99)+1;
Result = Div(Num1, Num2);
str = Num1 + "÷" + Num2;
}
Result = Sub(Result, Num3);
return str + "-" + Num3;
}
//先除后乘
else if(Op2 == 3){
Result = Mul(Result, Num3);
return str + "*" + Num3;
}
//两步除法
else{
//由于随机生成的数范围是1-99,所以排除了除数为0的可能性
Result = Div(Result, Num3);
return str + "÷" + Num3;
}
}


public void Print(String str){

Scanner s = new Scanner(System.in);
System.out.print(str + "=");
int input = s.nextInt();
if(input == Result){
Time = Time +1;
System.out.println("答案正确");
}
else {
System.out.println("答案错误!正确答案为:" + str + "=" + Result);
}
}

}

五、实验结果

①规范性的输入:

    

结果:成功

②数量输入不规范:

    

结果:达到规范用户输入的效果


 

六、过程耗时估计统计表

 

PSP2.1

Personal Software Process Stages

Time Senior Studenh

Timeh

Planning

计划

0.5

0.5

Estimate

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

6

5

Development

开发

5

6

Analysis

需求分析

0.5

0.5

Design Spec

生成设计文档

0.5

0.5

Design Review

设计复审

0.5

0.5

Coding Standard

代码规范

0.5

0.5

Design

具体设计

0.5

1

Coding

具体编码

4

5

Code Review

代码复审

1

0.5

Test

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

1

1

Reporting

报告

1.5

1.5

 

测试报告

0.5

0.5

 

计算工作量

3

2

 

并提出过程修改计划

0.5

0.5

 

 

 

 

 

posted @ 2018-10-15 13:56  黄观国  阅读(207)  评论(4编辑  收藏  举报