作业四:个人项目-小学四则运算之JAVA版
作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186
代码所在的github远程仓库的地址:https://github.com/lyh-2333/lyhthree
github仓库文件:项目文件(Operations.zip);代码文件(operstions.txt);可执行文件(public.zip)。
一、需求分析
任何编程语言都可以,命令行程序接受一个数字输入,然后输出相应数目的四则运算题目和答案。例如输入数字是 30, 那就输出 30 道题目和答案。 运算式子必须至少有两个运算符,运算数字是在 100 之内的正整数,答案不能是负数。 如:23 - 3 * 4 = 11。
统计用户共答对多少道题。
二、功能设计
1.根据用户要求的题目数n,循环n次输出随机的四则运算。
2.判断用户输入值是否正确,并给出正确题目数。
3.运算答案不能小于0,小于0就重新在后台出题目。
三、详细设计
随机产生三个100以内的正整数和四个分别用“1”-“4”代表+,-,*,/运算符号,通过对四则运算中乘除和加减的优先级别判断:先乘除后加减,在计算函数中遍历运算符数组中乘除符号后进行优先计算,之后再对乘除计算之后的运算数进行相加减运算。
遇到当随机产生的正整数运算题计算结果为负数时,递归重新生成运算题,直至结果是大于零时所产生的题目打印在控制台上,用户输入答案,答案与结果匹配正确即累加正确题数,错误的输出打印正确结果,当全部运算题做完后输出统计结果。
代码实现:
1)主要运算
public void operation(int n){
int op1,op2;
for (int i = 0; i < n; i++) {
num1 = new Random().nextInt(100)+1;
num2 = new Random().nextInt(100)+1;
num3 = new Random().nextInt(100)+1;
op1=new Random().nextInt(4)+1;//用1~4随机生成的整数来代表加、减、乘、除四个运算符
op2=new Random().nextInt(4)+1;
//整数1代表加法
if(op1 == 1){
String str = num1 + "+" + num2;//str为输出提示语句(公式)
if(op2 == 1){
result = add(num1,num2);
result = add(result,num3);
str = str + "+" + num3;/*++*/
}
else if(op2 == 2){
result = add(num1,num2);
//while循环确保此result值大于等于num3,从而保证最终答案不为负数
while(result < num3){
num3 = new Random().nextInt(100)+1;
}
result = sub(result,num3);
str = str + "-" + num3;/*+-*/
}
/*乘法除法做优先级处理*/
else{
str = pri(op1,op2);
}
print(str);
}
//整数2代表减法
else if(op1 == 2){
// String str = num1 + "-" + num2;
String str = "";
if(op2 == 1){
result = sub(num1,num2);
//while循环确保此result的绝对值小于等于num3的绝对值,从而保证最终答案不为负数
while(Math.abs(result) > Math.abs(num3)){
num3 = new Random().nextInt(100)+1;
}
result = add(result,num3);
str = num1 + "-" + num2 + "+" + num3;
}
else if(op2 == 2){
//while循环确保result的值为正数(因为如果这一步result为负数,下一步的result值一定为负数(由于num3一定为正数))
while(num1 < num2){//算法不优先,把num1的取值范围缩小了
num1 = new Random().nextInt(100)+1;
}
result = sub(num1,num2);
// str = num1 + "-" + num2;
//while循环确保result大于等于num3
while(result < num3){
num3 = new Random().nextInt(100)+1;
}
result = sub(result,num3);
}
/*乘法除法做优先级处理*/
else{
str = pri(op1,op2);
}
print(str);
}
//整数3代表从乘法
else if(op1 == 3){
String str = num1 + "*" + num2+"*" + num3;
result = mul(num1,num2);
result = mul(result,num3);
// str = operation2(op1,op2,str);
print(str);
}
//整数4代表除法
else if(op1 == 4){
String str = num1 + "÷" + num2;
result = div(num1,num2);
str = operation2(op1,op2,str);
print(str);
}
else {
System.out.println("出错了。。。。");
}
}
System.out.println(n+"题中"+"您一共答对了"+mark+"题。");
}
2)对先进行加(减)法再进行乘(除)法的算式进行优先级判断和处理
public String pri(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(100)+1;
num3 = new Random().nextInt(100)+1;
result = mul(num2,num3);
}
result = sub(num1,result);
str = num1 + "-" + num2;
}
return str;
}
3)对除法中的运算进行分析
public String operation2(int op1,int op2,String str){
if(op2 == 1){
result = add(result,num3);
return str + "+" + num3;
}
/*先除后减*/
else if(op2 == 2){
//while循环确保最终答案不为负数
while(result < num3){
num1 = new Random().nextInt(100)+1;
num2 = new Random().nextInt(100)+1;/*重新生成num1,num2*/
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{
/*还未做被除数和除数不为零的操作*/
result = div(result,num3);
return str + "÷" + num3;
}
}
4)输出代码
public void print(String str){ Scanner s = new Scanner(System.in);
System.out.print(str + "=");
int input = s.nextInt();
if(input == result){
mark=mark+1;
System.out.println("回答正确!");
// System.out.println("已答对"+mark+"题。");
}
else {
System.out.println("回答错误!正确答案为:" + str + "=" +result);
}
}
四、运行结果
五、问题及解决办法
对于如何做到答案不为负数的问题。会出现负数的情况只有:在减法中减数大于被减数。所以我在有减法的运算式中对其减数和被减数进行了对比处理;
从上面的运行结果不难看出,对于除法的运算还是未能做到完全正确。其中的问题来源于:我把结果result定义为了int类型,因此我的整个程序都只是做整数部分的运算。
我的程序中还未做到的处理是:被除数不为零的操作。
六、过程耗时估计与统计表
PSP2.1 | Personal Software Process Stages | 预计时间(分钟) | 实际时间(分钟) |
Planning | 计划 | 20 | 20 |
· Estimate | 估计这个任务需要多少时间 | 180 | 160 |
Development | 开发 | 120 | 150 |
· Analysis | 需求分析 (包括学习新技术) | 20 | 20 |
· Design Spec | 生成设计文档 | 10 | 20 |
· Design Review | 设计复审 | 10 | 10 |
· Coding Standard | 代码规范 | 10 | 10 |
· Design | 具体设计 | 30 | 30 |
· Coding | 具体编码 | 120 | 150 |
· Code Review | 代码复审 | 30 | 20 |
· Test | 测试(自我测试,修改代码,提交修改) | 60 | 120 |
Reporting | 报告 | 30 | 30 |
· | 测试报告 | 10 | 10 |
· | 计算工作量 | 10 | 10 |
· | 并提出过程改进计划 | 10 | 10 |
作业四:个人项目-小学四则运算之JAVA版的更多相关文章
- 【软件工程Ⅱ】作业四 |个人项目-小学四则运算 “软件”之初版(C语言)
本次作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2186 本次作业代码的github地址:https://gith ...
- 【软件工程第三次作业】结对编程:四则运算( Java 实现)
1. GitHub 地址 本项目由 莫少政(3117004667).余泽端(3117004679)结对完成. 项目 GitHub 地址:https://github.com/Yuzeduan/Arit ...
- java版gRPC实战之三:服务端流
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- 小学四则运算结对项目报告(GUI)
小学四则运算结对项目报告(GUI) 一.Coding.Net项目地址: https://git.coding.net/wsshr/Calculation.git 二.PSP表格(完成前): PSP 任 ...
- 结对作业:四则运算(Java+JavaFX)
一.简介 此程序是一个可自动生成,计算小学四则运算题目的项目. Github地址:https://github.com/czmDeRepository/SoftwareWork/tree/master ...
- 小学四则运算练习(JAVA编写)
源码在Github的仓库主页链接地址:https://github.com/rucr9/rucr 看到这个题目,大概很多人会发出“切,这也太简单了吧!有必要小题大做?”的感叹!是的,仅仅作为一道数学运 ...
- 软工作业-四则运算(java实现)BY叶湖倩,叶钰羽
四则运算生成器 BY-信安1班 叶湖倩(3216005170) 信安1班 叶钰羽(3216005171) 1. 项目介绍 源代码GitHub地址:https://github.com/yeyuyu/s ...
- java实现自动生成小学四则运算——朱庭震,詹祺豪
组员:朱庭震,詹祺豪 Github地址:https://github.com/ztz1998/second/tree/master 1题目:实现一个自动生成小学四则运算题目的命令行程序. 2说明: 自 ...
随机推荐
- Google瓦片地图URL
http://mt2.google.cn/vt/lyrs=y&scale=2&hl=zh-CN&gl=cn&x=6891&y=3040&z=13 //含 ...
- Hadoop 2.8集群安装及配置记录
第一部分:环境配置(含操作系统.防火墙.SSH.JAVA安装等) Hadoop 2.8集群安装模拟环境为: 主机:Hostname:Hadoop-host,IP:10.10.11.225 节点1:Ho ...
- MIUI6系统详细卡刷开发版获得root权限的经验
小米的手机不同手机型号通常情况miui论坛都提供两个不同的版本,分别为稳定版和开发版,稳定版没有提供ROOT权限管理,开发版中就开启了ROOT权限,很多情况下我们需要使用的一些功能强大的App,都需要 ...
- oracle入坑日记<二>认识oracle(含sqlplus基础使用)
1.SID(数据库实例) 1.1. oracle安装的时候有一项叫[全局数据库名]的填写项,这个就是oracle的SID也是数据库的唯一标识符: 1.2.一个oracle数据库有且只有一个SID(一般 ...
- when to use reinterpret_cast
写的太好了.. When you convert for example int(12) to unsigned float (12.0f) your processor needs to invok ...
- kvm 虚机环境碰到的两个小坑
1)当部署一个商用VA的时候,出现virsh version|grep "Using library" 返回错误,经过查看,发现里面有汉字,猜应该是这个原因导致无法检索到libvi ...
- 关于各种O,DO/BO/DTO/VO/AO/PO
阿里巴巴Java开发手册 链接:https://pan.baidu.com/s/11I9ViOrat-Bw_HA8yItXwA 密码:x5yi 2. DO/BO/DTO/VO/AO/PO PO(per ...
- zabbix使用SNMPV3协议监控交换机
SNMPV3是简单网络管理协议的第三版,因为其安全性更高,现在的中低端交换机已普遍支持该协议,所以在生产环境中我们应该采用SNMPV3对交换机.路由器进行管理. 首先在交换机上要配置SNMPV3协议, ...
- java8 for ,forEach ,lambda forEach , strean forEach , parller stream forEach, Iterator性能对比
java8 for ,forEach ,Iterator,lambda forEach ,lambda strean forEach , lambda parller stream forEach性 ...
- nodejs 实现文件拷贝
通过4中不通的方式实现对一个文件的拷贝 方式一:readFile 异步一次性读取文件再写入 //异步形式读取文件 function copyFile(url){ const extName = pat ...