软件工程课程作业(二)--四则运算2改进版(c++)
题目要求:
1、避免题目重复
2、可定制(数量/打印方式)
3、可以控制下列参数
(1)是否有乘除法
(2)是否有括号
(3)数值范围
(4)加减有无负数
(5)除法有无余数
关键设计思想:
operationSymbol(int &isMulAndDiv)用于确定运算式是否有乘除法
DivisorNotZore(int &Divisor,int RangeNum)用于保证除数不为0
Remainder(int number1,int &number2,int RangeNum)用于保证没有余数
Neg(int number1,int &number2,int RangeNum)用于避免减法出现负数
若用户选择有括号的运算式,程序通过循环一下步骤依次得到运算式:
1、通过随机数取得运算式中数的个数,执行2。
2、通过循环在0,1之间取随机数判断是否出现左括号,存放在problems[1000][100]相应位置,Rbr记录出现的次数,leftParenthese[100]记录左括号在表达式中的位置,执行3。
3、通过随机数取得数,存入number数组相应位置,在problems[1000][100]相应位置用字符‘n'代替存储,执行4。
4、通过循环在0,1之间取随机数判断是否出现左括号,若出现,则与右括号匹配,同时排除无意义的括号,执行5。
5、在输入最后一个数之前通过随机数0-4选择运算符,将运算符存放在problems[1000][100]相应位置,执行6。
6、执行2,直到输入数的个数符合条件执行7。
7、判断这个运算式是否与前面的运算式重复,若重复,则舍弃这个运算式,重新执行1。
若用户选择没有括号的运算式,程序选择通过循环下列步骤依次得到运算式:
1、通过随机数取得运算式中数的个数,执行2。
2、通过通过随机数取得数,存入number数组相应位置,在problems[1000][100]相应位置用字符‘n'代替存储,执行3。
3、在输入最后一个数之前通过随机数0-4选择运算符,将运算符存放在problems[1000][100]相应位置,执行4
4、执行2,直到输入数的个数符合条件执行5。
5、判断这个运算式是否与前面的运算式重复,若重复,则舍弃这个运算式,重新执行1。
若用户选择在屏幕上显示运算式,则依次将存放在problems的字符显示出来,遇到字符’n',则输出对应数字
若用户选择在problems.txt文件中保存运算式,则依次将存放在problems的字符输入到文件中,遇到字符’n',则输入对应数字
源程序代码:
//2016 3.6 Cheng Qiqin
//四则运算改进
#include <iostream>
#include<ctime>
#include<cstdlib>
#include<iomanip>
#include<fstream>
using namespace std; void proNum(int &ProNum)//确定题目数量
{
cout<<"请输入运算式的数量: ";
cin>>ProNum;
if(ProNum<)
{
cout<<"输入错误,";
proNum(ProNum);
}
} void typeway(int &type)//确定打印方式
{
cout<<"请输入打印方式(1、输出到屏幕 2、输出到文件): ";
cin>>type;
if(type>||type<)
{
cout<<"输入错误,";
typeway(type);
}
} void ismulAndDiv(int &isMulAndDiv)//确定是否有乘除法
{
cout<<"是否有乘除法(1、是 2、否):";
cin>>isMulAndDiv;
if(isMulAndDiv<||isMulAndDiv>)
{
cout<<"输入错误,";
ismulAndDiv(isMulAndDiv);
}
} int operationSymbol(int &isMulAndDiv)//确定是否有乘除法
{
if(isMulAndDiv==)
{
return ;
}
else
{
return ;
}
} void isparenthese(int &isParenthese)//确定是否有括号
{
cout<<"是否有括号(1、是 2、否): ";
cin>>isParenthese;
if(isParenthese<||isParenthese>)
{
cout<<"输入错误,";
isparenthese(isParenthese);
}
} void isneg(int &isNeg)//确定加减有无负数
{
cout<<"加减有无负数(1、有 2、无): ";
cin>>isNeg;
if(isNeg<||isNeg>)
{
cout<<"输入错误,";
isneg(isNeg);
}
} void isremainder(int &isRemainder)//确定除法有无余数
{
cout<<"除法有无余数(1、有 2、无): ";
cin>>isRemainder;
if(isRemainder<||isRemainder>)
{
cout<<"输入错误,";
isremainder(isRemainder);
}
} void DivisorNotZore(int &Divisor,int RangeNum)//排除除数为0
{
while(Divisor==)
{
Divisor=rand()%RangeNum;
}
} void Neg(int number1,int &number2,int RangeNum)//排除形如a-b结果为负的情况
{
while(number1<number2)
{
number2=rand()%RangeNum;
}
} void Remainder(int number1,int &number2,int RangeNum)//排除有余数的情况
{
while((number1%number2)!=)
{
number2=rand()%RangeNum;
DivisorNotZore(number2,RangeNum);
}
} void main()
{
srand((int)time()); //设定时间种子
int ProNum,type,isMulAndDiv,isParenthese,RangeNum,isNeg,isRemainder;
int number[][],Prolength[],Rbr=,num,i,j,n; //number[100][10]用于存放每个表达式中数字,Prolength[100]用于记录表达式的长度
char Problems[][];// Problems[100][100]用于存放表达式
char fuhao[]={'+','-','*','/'};
proNum(ProNum);
typeway(type);
ismulAndDiv(isMulAndDiv);
isparenthese(isParenthese);
isneg(isNeg);
if(isMulAndDiv==)
{
isremainder(isRemainder);
}
cout<<"请输入数值范围:"<<endl;
cout<<"请输入上限:";
cin>>RangeNum;
if(RangeNum<){
cout<<"输入错误,请重新输入上限:";
cin>>RangeNum;
} if(isParenthese==)//有括号
{
for(i=;i<ProNum;i++)
{
num=rand()%+;//随机得出每个表达式中数的个数
j=;
int leftParenthese[],loc=;
if(num==)//运算式中只有两个数时,不需要括号
{
for(n=;n<num;n++)
{
Problems[i][j]='n';
number[i][n]=rand()%RangeNum;
if(Problems[i][j-]=='/')//排除除号后面的数为0的情况
{
DivisorNotZore(number[i][n],RangeNum);
}
j++;
if(n<num-)//添加运算符
{
Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
j++;
}
}
Prolength[i]=j;//记录运算式的长度
}
else//运算式中数超过两个,出现括号
{
for(n=;n<num;n++)
{
while(rand()%)//添加左括号
{
Rbr++;
Problems[i][j]='(';
leftParenthese[loc]=j;
loc++;
j++;
}
Problems[i][j]='n';
number[i][n]=rand()%RangeNum;//排除除号后面的数为0的情况
if(Problems[i][j-]=='/')
{
DivisorNotZore(number[i][n],RangeNum);
}
j++;
while(rand()%==)//添加右括号
{
if(Rbr>)
{
Rbr--;
loc--;
if(Problems[i][j-]=='(')//排除形如(20)的情况
{
Problems[i][j-]=Problems[i][j-];
j--;
}
else
{
if(Problems[i][leftParenthese[loc]]=='('&&Problems[i][leftParenthese[loc]+]=='('&&Problems[i][j-]==')')
{
for(int loction=leftParenthese[loc];loction<j-;loction++)
{
Problems[i][loction]=Problems[i][loction+];
}
j--;
}
else
{
Problems[i][j]=')';
j++;
}
}
}
else{
break;
}
}
if(n<num-)//添加运算符
{
Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
j++;
}
}
while(Rbr>)//保证左括号数量与右括号数量相等
{
Rbr--;
loc--;
if(Problems[i][j-]=='(')//排除形如(20)的情况
{
Problems[i][j-]=Problems[i][j-];
j--;
}
else
{
if(Problems[i][leftParenthese[loc]]=='('&&Problems[i][leftParenthese[loc]+]=='('&&Problems[i][j-]==')')
{
for(int loction=leftParenthese[loc];loction<j-;loction++)
{
Problems[i][loction]=Problems[i][loction+];
}
j--;
}
else
{
Problems[i][j]=')';
j++;
}
}
}
Prolength[i]=j;
}
for(int k=;k<i;k++)//排除运算式重复
{
if(Problems[k]==Problems[i])
{
i--;
break;
}
}
}
}
else
{
for(i=;i<ProNum;i++){
num=rand()%+;
j=;
for(n=;n<num;n++){
Problems[i][j]='n';
number[i][n]=rand()%RangeNum;
if(Problems[i][j-]=='/')//排除除号后面的数为0的情况
{
DivisorNotZore(number[i][n],RangeNum);
}
j++;
if(n<num-)//添加运算符
{
Problems[i][j]=fuhao[rand()%operationSymbol(isMulAndDiv)];
j++;
}
}
Prolength[i]=j;//记录运算式的长度
for(int k=;k<i;k++)//排除重复
{
if(Problems[k]==Problems[i])
{
i--;
break;
}
}
}
}
int s,t,q;
ofstream of("problems.txt");
if(!of)
exit();
for(i=;i<ProNum;i++)//表达式数量
{
s=;
t=;
q=Prolength[i];
while(Problems[i][s]=='('&&Problems[i][q-]==')')//排除表达式首尾都有括号且无意义时的情况
{
int m,n=;
bool kuohao=true;
for(m=s;m<q-;m++)
{
if(Problems[i][m]=='(')
{
n++;
}
if(Problems[i][m]==')')
{
n--;
}
if(n==)
{
kuohao=false;
break;
}
}
if(kuohao)
{
s++;
Prolength[i]=Prolength[i]-;
q=q-;
}
else
{
break;
}
}
while(Prolength[i]>)
{
if(Problems[i][s]=='n')
{
if(t>)
{
if(isNeg==)
{
if(Problems[i][s-]=='-'&&Problems[i][s-]=='n')
{
Neg(number[i][t-],number[i][t],RangeNum);
}
}
if(isRemainder==)
{
if(Problems[i][s-]=='/'&&Problems[i][s-]=='n')
{
Remainder(number[i][t-],number[i][t],RangeNum);
}
}
}
if(type==)
{
cout<<number[i][t];
}
else
{
of<<number[i][t];
}
s++;
t++;
}
else
{
if(type==)
{
cout<<Problems[i][s];
}
else
{
of<<Problems[i][s];
}
s++;
}
Prolength[i]--;
}
if(type==)
{
cout<<"="<<endl;
}
else
{
of<<"="<<endl;
}
}
of.close();
if(type==)
{
cout<<"出题完毕!"<<endl;
}
else
{
cout<<"出题完毕,题目已成功存入problems.txt!"<<endl;
}
}
运行结果截图:










项目计划日志:(单位:min)

时间记录日志:

缺陷记录日志:

程序已实现功能:
避免题目重复
可定制(数量/打印方式)
可以控制下列参数
(1)是否有乘除法
(2)是否有括号
(3)数值范围
程序部分实现功能:
(4)加减有无负数
(5)除法有无余数
未实现部分:
未能实现运算式的计算
未实现原因:
不能预测括号中计算后出现的结果
实现部分:
仅能保证两个数之间没有括号的减法不出现负数,除法不出现余数
软件工程课程作业(二)--四则运算2改进版(c++)的更多相关文章
- 软件工程课程作业(三)--四则运算3(C++)
伙伴链接:http://www.cnblogs.com/haoying1994/ 一.设计思路 在此前程序拥有的功能:加减有无负数,除法有无余数以及算式可定制的功能的基础上,此次程序又添加了算式结果的 ...
- 软件工程课程作业(一)—20道随机四则运算题(C++)
一.编程思想: 1.定义所需要变量2.设置数组,存储运算符,3.通过随机函数random(0,100)找出运算数,random(0,4)找出运算符4.通过输出显示运算式. 二.源代码: //2016 ...
- 【软件工程Ⅱ】作业二 |分布式版本控制系统Git的安装与使用
本次作业的要去来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远程库地址:https://github.com/Mol ...
- 软件工程大作业(学生会管理系统)Web端个人总结报告
软件工程大作业(学生会管理系统)Web端个人总结报告 一.小组信息 1.所在小组:第二组 2.小组选题:学生会管理系统 3.项目源代码链接: Web端源代码:code 小程序端源代码:code APP ...
- BUAA 2020 软件工程 热身作业
BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...
- coursea机器学习课程作业
coursea机器学习课程作业 一 关于此课程 课程地址 图片来自网络 1.官网课程地址传送 2.如果访问官网速度较慢可以上 B站课程地址 机器学习是一门研究在非特定编程条件下让计算机采取行动的学科. ...
- [2019BUAA软件工程]结对作业
Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1 预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...
- THE LAST ONE!! 2017《面向对象程序设计》课程作业八
THE LAST ONE!! 2017<面向对象程序设计>课程作业八 031602230 卢恺翔 GitHub传送门 题目描述 1.时间匆匆,本学期的博客作业就要结束了,是否有点不舍,是否 ...
- 自我介绍for软件工程课程
石家庄铁道大学学生,正在学习软件工程课程. 对于软件工程课程,没什么太大的希望.度了一下,发现软件工程课程近年来比较脱节,这次用新课本不知道效果怎么样.嗯,等课本到手看看再说吧. 自己的目标:我希望能 ...
随机推荐
- HDU 3085 Nightmare II 双向bfs 难度:2
http://acm.hdu.edu.cn/showproblem.php?pid=3085 出的很好的双向bfs,卡时间,普通的bfs会超时 题意方面: 1. 可停留 2. ghost无视墙壁 3. ...
- 百胜集团李磊:BPM实现业务流程全过程无缝链接
作为全球最大的餐饮企业之一,百胜集团在形成规模化连锁经营效应的同时,战略地利用信息化手段,强化管理和运营水平,打造企业的核心竞争力.通过流程梳理,百胜集团实现了以规模化.规范化.信息化和现代化为主题的 ...
- jQuery 通用表单方法
表单验证一直是一个麻烦的事情,让很多人望而退步,之前想过一个验证的好方法,但是有bug,昨晚请教了juyling.com的王员外,顺利解决. 以下是js代码 function mySubmit ...
- Python开发入门与实战1-开发环境
1.搭建Python Django开发环境 1.1.Python运行环境安装 Python官网:http://www.python.org/ Python最新源码,二进制文档,新闻资讯等可以在Pyth ...
- 【python】dict。字典
特点:以空间换取时间,使用HASH算法通过key算出了value的内存地址,建立索引,拿到key后查找速度快,但内存浪费多 因为是用key值算的内存地址,所以key为不可变变量 (set,和dict类 ...
- ZOJ 3329 - One Person Game
题意:每次筛三个骰子面分别为k1,k2,k3,如果三个骰子的值分别为a,b,c则得分置0,否则得到分数加上三个骰子的值的和,如果得分大于等于n则结束游戏. 设E[i]表示当前得到i分时结束游戏的期望. ...
- C++数据结构之List--线性实现
List(表)类似于队列,不同于队列的是,list可以随机读取/修改/插入某一position,通过position这一位置信息就可以直接修改相应位置的元素.实现方式和队列的类似,多了个positio ...
- Mousejack测试指南
0x00 前言 近日,Bastille的研究团队发现了一种针对蓝牙键盘鼠标的攻击,攻击者可以利用漏洞控制电脑操作,他们将此攻击命名为MouseJack. 攻击者仅需要在亚马逊上以60美元购买设备,改造 ...
- vim的Tab设置为4个空格
vim /etc/vimrc 1 set ts=42 set expandtab3 set autoindent 按tab键时产生的是4个空格,这种方式具有最好的兼容性.
- Git的环境搭建
Git时当下流行的分布式版本控制系统. 集中式版本控制系统的版本库是集中存放在中央处理器的,所以开发者要先从中央服务器获取最新的版本,编码后再将自己的代码发送给中央处理器.集中式版本控制系统最大的缺点 ...