第二周,老师接着上次的程序有对四则运算的程序,做出来一些要求,这次要求可以控制乘除法,有无括号,控制输出方式,控制结果有无负数,有无余数。

我在对原先的程序分析了一下,发现我原先的程序可扩展性特别差,完全不能再原先的基础上叠加功能,所以我又重新写了一个程序。

思路分析:

1、控制乘除法

2、括号添加。思路:题中只要求添加括号,所以我的括号添加方法是:把所有数放入一个数组中,‘+-*/’都用数字化表示,使用随机函数实现随机选择在哪个运算符左边加上左括号,右括号统一加在右边,其中括号最多只有2层嵌套。

3、判断重复:先生成所有运算式子,然后使用循环判断有无重复。

4、结果有无负数和余数:没任何技巧使用循环里面在加循环,先找到最里面的括号,先乘除再加减,然后消括号重复加减最后得出结果,根据最后结果得出结果。

5、输出方式:使用fstream类把结果输出到1.txt中

 #include<iostream>
#include"time.h"
#include<fstream>
#define SUM 1000
#define SUMS 300
using namespace std;
int Results[SUM][SUMS] = { }; void Input(int &base, int &top){
cout << "\n请输入下限(正数) ";
cin >> base;
cout << "\n请输入上限(正数) ";
cin >> top;
}
//生成四则运算公式
void Combination1(int time, int base,int top,int add,int dec,int mul,int div,int equ){
int choose;
int amount;
amount = + rand() % ;
Results[time][] = + rand() % top;
while (Results[time][] <= base){
Results[time][] = + rand() % top;
}
amount--;
int count = ;
while (true){
choose = + rand() % ;
if (choose == ){
Results[time][count] = add;
}
if (choose == ){
Results[time][count] = dec;
}
if (choose == ){
Results[time][count] = mul;
}
if (choose == ){
Results[time][count] = div;
}
count++;
Results[time][count] = + rand() % top;
while (Results[time][count] <= base){
Results[time][count] = + rand() % top;
}
count++;
amount--;
if (amount == ){
break;
}
}
Results[time][count] = equ; }
//生成二则运算公式
void Combination2(int time, int base, int top, int add, int dec, int mul, int div, int equ){
int choose;
int amount;
amount = + rand() % ;
Results[time][] = + rand() % top;
while (Results[time][] <= base){
Results[time][] = + rand() % top;
}
amount--;
int count = ;
while (true){
choose = + rand() % ;
if (choose == ){
Results[time][count] = add;
}
if (choose == ){
Results[time][count] = dec;
}
count++;
Results[time][count] = + rand() % top;
while (Results[time][count] <= base){
Results[time][count] = + rand() % top;
}
count++;
amount--;
if (amount == ){
break;
}
}
Results[time][count] = equ;
}
//cmd
void Output(int time, int top,int add, int dec, int mul, int div, int equ,int LBra,int RBra){
int count = ;
while (true){
if (Results[time][count] <= top){
cout << Results[time][count];
}
if (Results[time][count] == add){
cout << "+";
}
if (Results[time][count] == dec){
cout << "-";
}
if (Results[time][count] == mul){
cout << "*";
}
if (Results[time][count] == div){
cout << "/";
}
if (Results[time][count] == LBra){
cout << "(";
}
if (Results[time][count] == RBra){
cout << ")";
}
if (Results[time][count] == equ){
cout << "=";
break;
}
count++;
}
}
//文件流
void OutputFile(int time, int top, int add, int dec, int mul, int div, int equ, int LBra, int RBra){
ofstream out("1.txt", ios::out);
int count;
for (int i = ; i < time; i++){
count = ;
while (true){ if (Results[i][count] <= top){
out << Results[i][count];
}
if (Results[i][count] == add){
out << "+";
}
if (Results[i][count] == dec){
out << "-";
}
if (Results[i][count] == mul){
out << "*";
}
if (Results[i][count] == div){
out << "/";
}
if (Results[i][count] == LBra){
out << "(";
}
if (Results[i][count] == RBra){
out << ")";
}
if (Results[i][count] == equ){
out << "=";
break; }
count++;
}
out << endl;
}
out.close(); }
//添加括号
void AddBrackets(int time, int add, int dec, int mul, int div, int equ, int LBra,int RBra){
int place;
int level=;
int sumNum,sumNum1;
int count;
int BracketNum;
BracketNum = + rand() % ;
for (int i = ; i < SUMS; i++){
if (Results[time][i] >= add&&Results[time][i] <= div){
level++;
}
if (Results[time][i] == equ){
sumNum = i;
break;
}
}
int BracketNum1;
BracketNum1 = BracketNum;
//随机在运算公式中生成左括号
for (int j = ; j < BracketNum; j++){
sumNum1 = sumNum;
if (level == ){
break;
}
place = + rand() % (level - );
count = ;
while (true){
if (Results[time][count] >= add&&Results[time][count] <= div){
place = place - ;
if (place == ){
break;
}
}
count++;
}
if (Results[time][count + ] == LBra){
BracketNum1--;
break;
}
while (true){
Results[time][sumNum + ] = Results[time][sumNum];
if (sumNum - == count){
Results[time][sumNum] = LBra;
break;
}
sumNum--;
}
sumNum = sumNum1 + ;
}
//直接在等式右边生成相同数量的有括号
for (int k = ; k < BracketNum1; k++){
if (level == ){
break;
}
Results[time][sumNum + ] = Results[time][sumNum];
Results[time][sumNum] = RBra;
sumNum++;
}
if (Results[time][sumNum] != equ){
AddBrackets(time, add, dec, mul, div, equ, LBra, RBra);
}
sumNum1 = sumNum-;
count = ;
while (true){
if (Results[time][sumNum1] == RBra){
count++;
}
sumNum1--;
if (sumNum1 == sumNum - ){
break;
}
}
sumNum1 = ;
while (true){
if (Results[time][sumNum1] == LBra){
count--;
}
if (sumNum1 == sumNum){
break;
}
sumNum1++;
}
if (count < ){
AddBrackets(time, add, dec, mul, div, equ, LBra, RBra);
}
}
//判断有误重复
int Replay(){
int i, j,k;
int charge;
for (i = ; i < SUM; i++){
charge = ;
for (j = i+; j < SUM; j++){
for (k = ; k < SUMS; k++){
if (Results[i][k] != Results[j][k]){
charge = ;
break;
}
}
if (charge == ){
return ;
}
}
}
return ;
} //判断有无余数和是否正数
//把公式化成float型,有利于进行判断有无余数,而且计算更准确
void Judge(int time, int equ, int add, int dec, int mul, int div, int LBra, int RBra, int &pos, int &integer){
float calculate[SUMS];
int Bracket[] = { }; //用于记录括号位置
int count = ;
int sumNum, sumNum1, sumNum2;
for (int i = ; i < SUMS; i++){
if (Results[time][i] == LBra){
Bracket[count] = i;
count++;
}
if (count == ){
break;
}
if (Results[time][i] == RBra){
break;
}
}
for (int i = ; i < SUMS; i++){
if (Results[time][i] == RBra){
sumNum = i;
break;
}
}
for (int i = ; i < sumNum; i++){
calculate[i] = float(Results[time][i]);
}
int Has = ;
int place;
//双括号
if (count == ){
sumNum1 = Bracket[]; //sumNum2 = sumNum1;
while (true){
Has = ;
for (int i = sumNum1 + ; i < sumNum; i++){
if (calculate[i] == mul)
{
calculate[i - ] = calculate[i - ] * calculate[i + ];
Has = ;
place = i;
break;
}
if (calculate[i] == div)
{
calculate[i - ] = calculate[i - ] / calculate[i + ];
Has = ;
place = i;
break;
}
}
if (Has == ){
while (true){
if ((place + ) == sumNum){
break;
}
calculate[place] = calculate[place + ];
place++; }
sumNum -= ;
}
if (Has == ){
break;
}
}
sumNum1 += ;
sumNum2 = sumNum1;
while (true){
if (sumNum1 + >= sumNum){
break;
}
if (calculate[sumNum1 + ] == add){
calculate[sumNum2] = calculate[sumNum2] + calculate[sumNum1 + ];
sumNum1 += ;
}
if (calculate[sumNum1 + ] == dec){
calculate[sumNum2] = calculate[sumNum2] - calculate[sumNum1 + ];
sumNum1 += ;
}
}
calculate[sumNum2 - ] = calculate[sumNum2];
sumNum = sumNum2;
count = count - ;
}
if (count == ){ //单括号
sumNum1 = Bracket[];
while (true){
Has = ;
for (int i = sumNum1 + ; i < sumNum; i++){
if (calculate[i] == mul)
{
calculate[i - ] = calculate[i - ] * calculate[i + ];
Has = ;
place = i;
break;
}
if (calculate[i] == div)
{
calculate[i - ] = calculate[i - ] / calculate[i + ];
Has = ;
place = i;
break;
}
}
if (Has == ){
while (true){
if ((place + ) == sumNum){
break;
}
calculate[place] = calculate[place + ];
place++; }
sumNum -= ;
}
if (Has == ){
break;
}
}
sumNum1 += ;
sumNum2 = sumNum1;
while (true){
if (sumNum1 + >= sumNum){
break;
}
if (calculate[sumNum1 + ] == add){
calculate[sumNum2] = calculate[sumNum2] + calculate[sumNum1 + ];
sumNum1 += ;
}
if (calculate[sumNum1 + ] == dec){
calculate[sumNum2] = calculate[sumNum2] - calculate[sumNum1 + ];
sumNum1 += ;
}
}
calculate[sumNum2 - ] = calculate[sumNum2];
sumNum = sumNum2;
}
for (int i = ; i < sumNum; i++){
if (calculate[i] == mul){
calculate[i - ] *= calculate[i + ];
place = i;
while (true){
if (place + >= sumNum){
sumNum -= ;
break;
}
calculate[place] = calculate[place + ];
place += ;
}
}
if (calculate[i] == div){
calculate[i - ] /= calculate[i + ];
place = i;
while (true){ if (place + >= sumNum){
sumNum -= ;
break;
}
calculate[place] = calculate[place + ];
place += ;
}
}
}
for (int i = ; i < sumNum; i++){
if (calculate[i] == add){
calculate[] = calculate[] + calculate[i + ];
}
if (calculate[i] == dec){
calculate[] = calculate[] + calculate[i + ];
}
}
//结果判断
if (calculate[] >= ){
pos = ;
}
else{
pos = ;
}
if ((calculate[]-int(calculate[]))!=)
{
integer = ;
}
else{
integer = ;
} }
int main(){
srand((unsigned)time(NULL));
int add;
int dec;
int mul;
int div;
int equ;
int base;
int top;
int LBra;
int RBra;
int MulAndDiv;
int HaveBracket;
int AboveZero;
int Isint;
int Isrepeat;
int Isfile;
int sum;
int integer;
int pos;
cout << "是否使用乘除?1表示是,0表示不是: ";
cin >> MulAndDiv;
cout << "\n是否有括号?1表示是,0表示不是: ";
cin >> HaveBracket;
cout << "\n结果能否有负数?1表示能,0表示不能: ";
cin >> AboveZero;
cout << "\n结果能否有余数? 1表示能,0表示不能: ";
cin >> Isint;
cout << "请输入题目数量:";
cin >> sum;
cout << "是否输出到文件? 1表示是,0表示否: ";
cin >> Isfile;
Input(base, top);
add = top + ;
dec = top + ;
mul = top + ;
div = top + ;
equ = top + ;
LBra = top + ;
RBra = top + ;
//判断乘除和有无括号
for (int j = ; j < sum; j++){
if (MulAndDiv == ){
Combination2(j, base, top, add, dec, mul, div, equ);
}
else
Combination1(j, base, top, add, dec, mul, div, equ);
if (HaveBracket == ){
AddBrackets(j, add, dec, mul, div, equ, LBra, RBra);
} }
//判断有无负数和余数
for (int j = ; j < sum; j++){
pos = ;
integer = ;
Judge(j, equ, add, dec, mul, div, LBra, RBra, pos, integer);
if (Isint == ){
while (integer == ){
if (MulAndDiv == ){
Combination2(j, base, top, add, dec, mul, div, equ);
}
else
Combination1(j, base, top, add, dec, mul, div, equ);
if (HaveBracket == ){
AddBrackets(j, add, dec, mul, div, equ, LBra, RBra);
}
Judge(j, equ, add, dec, mul, div, LBra, RBra, pos, integer);
}
}
if (AboveZero == ){
while (pos == ){
if (MulAndDiv == ){
Combination2(j, base, top, add, dec, mul, div, equ);
}
else
Combination1(j, base, top, add, dec, mul, div, equ);
if (HaveBracket == ){
AddBrackets(j, add, dec, mul, div, equ, LBra, RBra);
}
Judge(j, equ, add, dec, mul, div, LBra, RBra, pos, integer);
}
}
}
//查重
while(true){
if (Replay() == ){
if (Isfile == ){
OutputFile(sum, top, add, dec, mul, div, equ, LBra, RBra);
}
else{
for (int j = ; j < sum; j++){
Output(j, top, add, dec, mul, div, equ, LBra, RBra);
cout << endl;
}
}
break;
}
else
{
for (int j = ; j < sum; j++){
if (MulAndDiv == ){
Combination2(j, base, top, add, dec, mul, div, equ);
}
else
Combination1(j, base, top, add, dec, mul, div, equ);
if (HaveBracket == ){
AddBrackets(j, add, dec, mul, div, equ, LBra, RBra);
} }
}
}
return ;
}

运行结果如下:
cmd输出:

1.txt文件输出:

总结:这一次的实验我感觉蛮难的,我差不多花了4个晚上外加一个星期六才写完,而且这也是勉强实现功能,在编写功能模块时,总是单独测试都运行十分OK,但是几个功能一迭加就老是BUG,然后花1-2小时去调试解决,好麻烦,当然在实现真分数插入括号时老是出现错误,我都不知道该怎么办了-_-!! 总之,这次的程序不能说完美吧,但还是勉强能实现功能。

项目计划总结:

日期\任务 听课 编写程序 查阅资料 日总计
星期一 2 1 1 4
星期二   2   2
星期三   2 1 3
星期四 2 2   4
星期五   3 1 4
星期六   5   5
星期日        
周总计 4 15 3

22

时间记录日志:

日期 开始时间 结束时间 中断时间 静时间 活动 备注
3/7 14:00 15:50 10 100 听课 软件工程
  19:30 21:50 10 130 编写程序 编写第二次程序&查资料
3/8 19:20 21:45 10 135 编写程序  
3/9 16:30 17:40 10 60 查阅资料 查资料和同学间交流
  19:20 21:50 20 130 编写程序  
3/10 14:00 15:50 10 100 听课 软件工程
  19:20 21:20   120 编写程序 调试程序寻找错误地方
3/11 18:10 21:40 20 190 编写程序 调试程序为主
  7:30 9:00 10 80 看书 看数据结构书寻找解决办法
3/12 8:00 15:00 50 370 调试 最终调试
  16:00 17:00   60 博客 撰写博客

缺陷记录日志:

日期 编号 引入阶段 排除阶段 修复时间&问题描述
3/7 1 编码 编译 1小时,真分数叠加,后来发现是输出时除号和正分数符号弄反了
3/8        
3/9        
3/10-3/11 2 编码 编译 4小时,循环叠加混乱,不是忘记赋值就是忘记跳出循环
3/11-3/12 3 编码 编译 4小时,括号添加数量不对,后来发现是数组越界
         

第二次程序+PSP0级的更多相关文章

  1. 四则运算2+psp0级表格

    四则运算2 一.题目和要求 题目:写一个能自动生成小学四则运算题目的程序,要求一次输出不少于30道,只能是整数100以内的四则运算(四则运算1升级版) 要求: 1.题目避免重复 2.可定制(数量/打印 ...

  2. 四则运算三+psp0级表格

    一.题目 在四则运算二的基础上,选择一个方向进行拓展,我选择的是增加了答题模块 二.设计思路 1.在上次的基础上,增加了答题模块,每出现一道四则运算题目,便提醒输入结果,如果结果错误,就会提示错误 2 ...

  3. 撰写一篇博客要求讲述四则运算2的设计思想,源程序代码、运行结果截图、编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志。

    一.撰写一篇博客要求讲述四则运算2的设计思想,源程序代码.运行结果截图.编程总结分析,并按照PSP0级的要求记录开发过程中的时间记录日志. 1.设计思想: ①创建test.jsp建立第一个前端界面,提 ...

  4. RIGHT-BICEP测试第二次程序

    根据Right-BICEP单元测试的方法我对我写的第二次程序进行了测试: 测试一:测试能否控制使用乘除 测试二:测试是否能加括号 测试三:是否可以控制题目输出数量 测试四:能否控制输出方式,选择文件输 ...

  5. 复旦大学2014--2015学年第二学期(14级)高等代数II期末考试第八大题解答

    八.(本题10分)  设 $A,B$ 为 $n$ 阶半正定实对称阵, 求证: $AB$ 可对角化. 分析  证明分成两个步骤: 第一步, 将 $A,B$ 中的某一个简化为合同标准形来考虑问题, 这是矩 ...

  6. 复旦大学2015--2016学年第二学期(15级)高等代数II期末考试第六大题解答

    六.(本题10分)  设 $n$ 阶复方阵 $A$ 的特征多项式为 $f(\lambda)$, 复系数多项式 $g(\lambda)$ 满足 $(f(g(\lambda)),g'(\lambda))= ...

  7. PSP0级 周活动总结表+时间记录日志+缺陷记录日志 表格模板

    一.项目计划总结: 周活动总结表 姓名:               日期: 日期\任务 听课 编写程序 阅读课本 准备考试     日总计 周日               周一           ...

  8. iphone开发第二个程序

    此程序包括UIProgressView,UIButton, UIDatePicker,UIAlert,UILabel,NSTimer // //  HViewController.h //  Btn_ ...

  9. 汇编语言第二版 程序在dos中执行情况.P86-87

    假设程序要被dos系统加载到sa:0000的内存中,在这个地址的内存开始会有256个字节的PSP程序,用于加载程序和dos系统的通信.ds中的地址为sa. 真正的程序会在这256个字节之后.所以真正程 ...

随机推荐

  1. querySelectorAll 和 getElementBy 方法的区别

    作者:简生 链接:https://www.zhihu.com/question/24702250/answer/28695133 来源:知乎 1. W3C 标准 querySelectorAll 属于 ...

  2. BufferedImage缓存图片(data:image/jpg;base64,)转换base64输出与解析

    1.比如说二维码图片数据data,不想落地生成jpg文件,通过java缓存文件转换base64输出到页面展示,那么java后端处理写法参考如下: InputStream is = new ByteAr ...

  3. jQuery 实现下载进度条

    //ajax异步上传 $.ajax({ url: "${pageContext.request.contextPath }/upload", type: "POST&qu ...

  4. Vue使用moment.js处理前端时间格式问题

    使用moment.js处理格式显示问题: 1.首先引入moment.js插件 npm install moment --save 2.入口文件main.js中导入并使用 3.在项目中使用即可:data ...

  5. HTTP1.0,HTTP1.1,HTTP2.0的主要特征对比

    HTTP1.0 是一种无状态.无连接的应用层协议. HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务 ...

  6. 有关javaEE及WebGIS的一些地址

    jdk:https://www.oracle.com/index.html eclipse:https://www.eclipse.org spring:http://repo.springsourc ...

  7. Python之路(六)---> 函数、变量

    Python中的函数和数学上的函数定义是不一样的,从数学的角度上来说函数的定义:给定一个数集A,假设其中的元素为x.现对A中的元素x施加对应法则f,记作f(x),得到另一数集B.假设B中的元素为y.则 ...

  8. 20155313 2016-2017-2 《Java程序设计》第三周学习总结

    20155313 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 4.1 类与对象 4.1.1 定义类 书本中使用了设计衣服来定义类,一件衣服的设计Cloth ...

  9. 20155315 2016-2017-2 《Java程序设计》第二周学习总结

    教材学习内容总结 在教材中,有一句话叫做 伪代码是最好的注释. 一开始我不理解什么是伪代码,但在参考了百度和C语言的学习过程后,我发现伪代码的作用就相当于是解决问题前期的流程图设计,伪代码设计好了之后 ...

  10. 20155319 2017-2018-1《信息安全系统设计》第四周课堂测试、Makefile、myod

    20155319 2017-2018-1<信息安全系统设计>第四周课堂测试.Makefile.myod 测试2-gcc测试 1.用gcc 进行预处理,编译,汇编,链接vi输入的代码 2.生 ...