一、题目要求:
在第一次实验的基础上,实现以下功能:
1.题目避免重复
2.可定制(数量/打印方式)
3.可以控制下列参数
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数。
实验思路:
1.根据要求(是否有乘除法;是否有括号(最多可以支持十个数参与计算);加减有无负数;除法有无余数。),可以将程序分成12种选择;
2.按照12种选择分别进行代码设计;
二、代码
#include<iostream>
#include<string>
#include<ctime>
#define N 100
using namespace std;
//构造四则运算的结构体
struct arithmetic
{
string left2;//第二层(外层)左括号
string left1;//第一层(内层)左括号
int member;//运算数
string right1;//第一层(内层)右括号
string right2;//第二层(外层)右括号
string fuhao;//运算符
};
//构造出题的结构体
struct subject
{
arithmetic arith[10];
};
int length;//运算数个数
int fuh;//表示运算符的数(0、1、2、3分别代表+、-、*、/)
subject sub[N];//所有算式
int i, j;
//条件控制选择
int Choose()
{
int chooseWay; //条件筛选结果
int choose1; //有无乘除法选择
cout << "请选择是否有乘除法(是:1/否:0):";
cin >> choose1;
//有乘除法
if (choose1 == 1)
{
int choose21; //有无括号选择
cout << "请选择是否有括号(是:1/否:0):";
cin >> choose21;
//有括号
if (choose21 == 1)
{
int choose31; //加减有无负数选择
cout << "请选择加减有无负数(有:1/无:0):";
cin >> choose31;
//有负数
if (choose31 == 1)
{
int choose41; //除法有无余数选择
cout << "除法有无余数(有:1/无:0)";
cin >> choose41;
//有余数
if (choose41 == 1)
{
chooseWay = 1;
}
//无余数
else if (choose41 == 0)
{
chooseWay = 2;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
//无负数
else if (choose31 == 0)
{
int choose42; //除法有无余数选择
cout << "除法有无余数(有:1/无:0)";
cin >> choose42;
//有余数
if (choose42 == 1)
{
chooseWay = 3;
}
//无余数
else if (choose42 == 0)
{
chooseWay = 4;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
//无括号
else if (choose21 == 0)
{
int choose32; //加减有无负数选择
cout << "请选择加减有无负数(有:1/无:0):";
cin >> choose32;
//有负数
if (choose32 == 1)
{
int choose43; //除法有无余数选择
cout << "除法有无余数(有:1/无:0)";
cin >> choose43;
//有余数
if (choose43 == 1)
{
chooseWay = 5;
}
//无余数
else if (choose43 == 0)
{
chooseWay = 6;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
//无负数
else if (choose32 == 0)
{
int choose44; //除法有无余数选择
cout << "除法有无余数(有:1/无:0)";
cin >> choose44;
//有余数
if (choose44 == 1)
{
chooseWay = 7;
}
//无余数
else if (choose44 == 0)
{
chooseWay = 8;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
else
{
cout << "选择错误!"<<endl;
Choose();
}
}
//无乘除法
else if (choose1 == 0)
{
int choose22; //有无括号选择
cout << "请选择是否有括号(是:1/否:0):";
cin >> choose22;
//有括号
if (choose22 == 1)
{
int choose33; //加减有无负数选择
cout << "请选择加减有无负数(有:1/无:0):";
cin >> choose33;
//有负数
if (choose33 == 1)
{
chooseWay = 9;
}
//无负数
else if (choose33 == 0)
{
chooseWay = 10;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
//无括号
else if (choose22 == 0)
{
int choose34; //加减有无负数选择
cout << "请选择加减有无负数(有:1/无:0):";
cin >> choose34;
//有负数
if (choose34 == 1)
{
chooseWay = 11;
}
//无负数
else if (choose34 == 0)
{
chooseWay = 12;
}
else
{
cout << "选择错误!" << endl;
Choose();
}
}
else
{
cout << "选择错误!"<<endl;
}
}
else
{
cout << "选择错误!" << endl;
Choose();
}
return chooseWay;
}
//随机数产生运算符
string Fuhao(int fuh)
{
string fuh0;//返回运算符号
if (fuh == 0)
fuh0 = "+";
else if (fuh == 1)
fuh0 = "-";
else if (fuh == 2)
fuh0 = "*";
else
fuh0 = "/";
return fuh0;
}
//有乘除法、有括号、加减有负数、除法有余数
void Output1(int number,int low,int high)
{
for (i = 0; i < number; i++)
{
int check = 0;//检验产生式是否合格
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 4;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
if (length > 2)
{
int floor = rand() % 2 + 1;//产生括号的层数
if (floor == 1)
{
int lpoint1 = rand() % (length - 1);//产生左括号的位置
int rpoint1 = lpoint1 + rand() % (length - 1 - lpoint1);//产生右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
}
else
{
if (length > 3)
{
int lpoint1 = rand() % (length - 1);//产生内层左括号的位置
int rpoint1 = lpoint1 + 1;//产生内层右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
int lpoint2 = lpoint1 - rand() % lpoint1;//产生外层左括号的位置
int rpoint2 = rpoint1 + rand() % (length - rpoint1);//产生外层右括号的位置
sub[i].arith[lpoint2].left1 = "(";
sub[i].arith[rpoint2].right1 = ")";
}
else
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//有乘除法、有括号、加减有负数、除法无余数
void Output2(int number, int low, int high)
{
}
//有乘除法、有括号、加减无负数、除法有余数
void Output3(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
int check = 0;//检验产生式是否合格
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 4;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
if (length > 2)
{
int floor = rand() % 2 + 1;//产生括号的层数
if (floor == 1)
{
int lpoint1 = rand() % (length - 1);//产生左括号的位置
int rpoint1 = lpoint1 + rand() % (length - 1 - lpoint1);//产生右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
}
else
{
if (length > 3)
{
int lpoint1 = rand() % (length - 1);//产生内层左括号的位置
int rpoint1 = lpoint1 + 1;//产生内层右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
int lpoint2 = lpoint1 - rand() % lpoint1;//产生外层左括号的位置
int rpoint2 = rpoint1 + rand() % (length - rpoint1);//产生外层右括号的位置
sub[i].arith[lpoint2].left1 = "(";
sub[i].arith[rpoint2].right1 = ")";
}
else
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//有乘除法、有括号、加减无负数、除法无余数
void Output4(int number, int low, int high)
{
}
//有乘除法、无括号、加减有负数、除法有余数
void Output5(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 4;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//有乘除法、无括号、加减有负数、除法无余数
void Output6(int number, int low, int high)
{
}
//有乘除法、无括号、加减无负数、除法有余数
void Output7(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 4;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
int sum = sub[i].arith[0].member;//求和
int check = 0;//检验减法是否为负数
for (j = 1; j < length; j++)
{
if (sub[i].arith[j - 1].fuhao == "+")
{
sum += sub[i].arith[j].member;
}
else
{
sum -= sub[i].arith[j].member;
if (sum < 0)
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//有乘除法、无括号、加减无负数、除法无余数
void Output8(int number, int low, int high)
{
}
//无乘除法、有括号、加减有负数
void Output9(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
int check = 0;//检验产生式是否合格
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 2;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
if (length > 2)
{
int floor = rand() % 2 + 1;//产生括号的层数
if (floor == 1)
{
int lpoint1 = rand() % (length - 1);//产生左括号的位置
int rpoint1 = lpoint1 + rand() % (length - 1 - lpoint1);//产生右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
}
else
{
if (length > 3)
{
int lpoint1 = rand() % (length - 1);//产生内层左括号的位置
int rpoint1 = lpoint1 + 1;//产生内层右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
int lpoint2 = lpoint1 - rand() % lpoint1;//产生外层左括号的位置
int rpoint2 = rpoint1 + rand() % (length - rpoint1);//产生外层右括号的位置
sub[i].arith[lpoint2].left1 = "(";
sub[i].arith[rpoint2].right1 = ")";
}
else
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//无乘除法、有括号、加减无负数
void Output10(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
int check = 0;//检验产生式是否合格
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 2;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
if (length > 2)
{
int floor = rand() % 2 + 1;//产生括号的层数
if (floor == 1)
{
int lpoint1 = rand() % (length-1);//产生左括号的位置
int rpoint1 = lpoint1 + rand() % (length-1 - lpoint1);//产生右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
}
else
{
if (length > 3)
{
int lpoint1 = rand() % (length - 1);//产生内层左括号的位置
int rpoint1 = lpoint1 + 1;//产生内层右括号的位置
sub[i].arith[lpoint1].left1 = "(";
sub[i].arith[rpoint1].right1 = ")";
int lpoint2 = lpoint1 - rand() % lpoint1;//产生外层左括号的位置
int rpoint2 = rpoint1 + rand() % (length - rpoint1);//产生外层右括号的位置
sub[i].arith[lpoint2].left1 = "(";
sub[i].arith[rpoint2].right1 = ")";
}
else
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//无乘除法、无括号、加减有负数
void Output11(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 2;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
//无乘除法、无括号、加减无负数
void Output12(int number, int low, int high)
{
for (i = 0; i < number; i++)
{
length = rand() % 9 + 2;
for (j = 0; j < length - 1; j++)
{
sub[i].arith[j].left2 = "";
sub[i].arith[j].left1 = "";
sub[i].arith[j].right1 = "";
sub[i].arith[j].right2 = "";
sub[i].arith[j].member = rand() % high;
fuh = rand() % 2;
sub[i].arith[j].fuhao = Fuhao(fuh);
}
sub[i].arith[length - 1].left2 = "";
sub[i].arith[length - 1].left1 = "";
sub[i].arith[length - 1].right1 = "";
sub[i].arith[length - 1].right2 = "";
sub[i].arith[length - 1].member = rand() % high;
sub[i].arith[length - 1].fuhao = "=";
int sum = sub[i].arith[0].member;//求和
int check=0;//检验减法是否为负数
for (j = 1; j < length; j++)
{
if (sub[i].arith[j - 1].fuhao == "+")
{
sum += sub[i].arith[j].member;
}
else
{
sum -= sub[i].arith[j].member;
if (sum < 0)
{
check = 1; break;
}
}
}
if (check == 1)
{
i = i - 1; continue;
}
for (j = 0; j < length; j++)
{
cout << sub[i].arith[j].left2 << sub[i].arith[j].left1 << sub[i].arith[j].member << sub[i].arith[j].right1 << sub[i].arith[j].right2 << sub[i].arith[j].fuhao;
}
cout << endl;
}
}
void main()
{
srand((unsigned)time(NULL));
int chooseWay; //条件筛选结果
int number; //题目数量
int low; //算式数值范围的最小值
int high; //算式数值范围的最大值
cout << "请输入出题数量:";
cin >> number;
cout << "请输入算式的数值范围:"<<endl;
cout << "最小值:";
cin >> low;
cout << "最大值:";
cin >> high;
chooseWay=Choose(); //条件筛选
switch (chooseWay)
{
case 1:Output1(number, low, high); break;
case 2:Output2(number, low, high); break;
case 3:Output3(number, low, high); break;
case 4:Output4(number, low, high); break;
case 5:Output5(number, low, high); break;
case 6:Output6(number, low, high); break;
case 7:Output7(number, low, high); break;
case 8:Output8(number, low, high); break;
case 9:Output9(number, low, high); break;
case 10:Output10(number, low, high); break;
case 11:Output11(number, low, high); break;
case 12:Output12(number, low, high); break;
}
}
三、运行截图





总结:本次实验思考了很久才找到思路,但还是有些功能并没有实现,再继续努力吧。
项目计划总结:
| 日期\任务 | 听课 | 编写程序 | 查阅资料 | 日总计 |
| 星期一 | 2 | 1 | 3 | |
| 星期二 | ||||
| 星期三 | 1 | 1 | ||
| 星期四 | 2 | 2 | 4 | |
| 星期五 | 1 | 1 | ||
| 星期六 | 5 | 5 | ||
| 星期日 | ||||
| 周总计 | 4 | 10 |
14 |
时间记录日志:
| 日期 | 开始时间 | 结束时间 | 中断时间 | 静时间 | 活动 | 备注 |
| 3/7 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程 |
| 19: 00 | 20: 00 | 10 | 50 | 编写程序 | 编写第二次程序 | |
| 3/9 | 19: 00 | 20: 00 | 10 | 50 | 编写程序 | 编写第二次程序 |
| 3/10 | 14:00 | 15:50 | 10 | 100 | 听课 | 软件工程 |
| 3/11 | 18:10 | 21:40 | 20 | 190 | 编写程序 | 编写第二次程序 |
| 3/12 | 9:00 | 11:00 | 20 | 100 | 编写程序 | 编写第二次程序 |
| 15:00 | 18:00 | 180 | 编写测试程序、写博客 | 编写测试程序、写博客 |
缺陷记录日志:
| 日期 | 编号 | 引入阶段 | 排除阶段 | 修复时间&问题描述 |
| 3/7 | 1 | 编码 | 编译 | 编写程序,并未调试 |
| 3/8 | ||||
| 3/9 | 2 | 编码 | 编译 | 编写程序,实现部分条件选择,并调试成功 |
| 3/10-3/11 | 3 | 编码 | 编译 | 编写程序,已实现条件筛选,并调试成功 |
| 3/11-3/12 | 4 | 编码 | 编译 | 编写程序,对各部分功能完善,但在括号处理部分存在缺陷,还有几个条件没有完成。 |