您的位置:首页 > 其它

个人项目之 “二柱子四则运算”升级版

2016-03-12 13:34 375 查看

个人项目之 “二柱子四则运算”升级版

果然……还有后续故事……

可怜的二柱子,老师对他的自动出题系统提出了新的要求:(当然,要求是在实现上次的题目基础上的~~)

1、题目可以避免重复;

2、可以定制(打印方式/题目数量)

3、可以控制下列参数:是否有乘除法、是否有括号(最多可以支持10个数参与运算)、数值范围、加减有无负数、除法有无余数等等。。。

一、项目思路

我们要养成在写代码之前仔细分析项目,锻炼严谨的思路可以减少我们出错。为写这个程序我的思路如下:

1、首先为了避免重复,最基本的思路是先把题目存储下来,然后再逐个比较。

我们可以利用数据结构中的链表和指针进行比较和存储,但是我数据结构学的实在是太差,真心一点都回忆不出来(╥╯^╰╥)

本来以为我完不成这个要求了,后来向我同样也是学计算机的高中同学请教了一下,她给了我一种思路。建立一个二维数组来存放操作数和操作符,数组有n行(生成的算式数量)、3列(分别存放第一个操作数、第二个操作数和操作符所代表的数字),然后每次利用随机数生成函数产生随机数和随机的算符的时候,逐行去数组里比较,如果有完全符合的就重新产生随机数,否则就讲数据存放起来供下次比较。

(P.S我的程序基本上是用这种方法查重的,但是后来经过和室友的讨论,我发现这种方法貌似进行二元运算比较方便,但是如果进行含有括号的多元运算就比较吃力。我在想可不可以尝试用string声明一维数组进行存储,每一行代表一个算式。因为时间真的很有限,我没能尝试这种方法,有时间我一定一定试试看。)

2、用户选择打印方式:可以事先让用户选择要不要保存到文件里。要实现这个需要C++的文件输入输出流,因为不常用有点忘,于是我又翻阅了一下大一下的C++程序,可以基本实现这个功能,但是还需要改动和修改。

3、数值范围:本来是打算使用:由rand()%(b-a+1)+a实现范围为a~b的随机数 这种方法,但是在测试时出现了不能产生负数的问题,所以不得不稍加修改,改动的内容参见下一篇博客,在单元测试中我会详细说明改动的代码和原因,这里不再赘余。:)

4、除法是否含有余数:对于这个要求我们特意查了百度对于“余数”的定义,所谓余数,是指整数之间计算时的数据,因此不用考虑真分数的除法是否有余数的问题,无形中给我们减轻了不少的负担。

5、加减法有无负数:对于这个问题,每个人的看法不同。我所理解的是:如果不含负数,则每一个操作数和操作结果中都不含负数。因此我们要考虑每一个操作数的正负问题(因为生成的随机数可以随机产生负数),还要考虑减法的被减数是否大于减数的问题。当然,对于真分数要考虑分子小于分母,分母不能为0等问题。

6、此外,考虑到这个程序的代码量实在是太大了,因此不得不考虑用函数来封装一些功能的模块。

7、最后,还要注意各种用户输入数据时的异常处理问题。(当然,明天的单元测试更是重点要考虑)

二、实验的源代码如下

炒鸡长……(@﹏@)~,主要是逻辑思维真的不行。要不是老师说的事先列好思路,估计我就被自己绕进去了╮(╯_╰)╭

如果有时间我应该再好好修改自己的程序,虽然基本能够实现功能,但是像老师说的代码的可利用性和编程效率太低了,唉……

老师们,勿喷……我在努力的生长……( ̄ ‘i  ̄;)

下面进行分函数的介绍和展示(把下面的模块连接起来就是整个项目的源代码~)

函数的声明:

//Zhao Ziyin,2016/3/11,Four arithmetics(2)

#include<iostream>
#include<time.h>
#include<string>
#include<fstream>
using namespace std;
//#define N
#define random(x) (rand()%x)
int MM[10000][3];//临时记录算式的二维数组


查重的函数体,如下:

/*查重的函数*/
int WheReap(int op1,int op2,int s_n,int c)
{
//int MM[10000][3];//临时记录算式的二维数组
int i;
bool flag=true;
for (i = 0; i < c; i++)
{
if (MM[i][0] == op1 && MM[i][1] == s_n && MM[i][2] == op2)
{
flag = false;//出现了重复算式
break;
}
}
if (flag)//如果没有出现重复,随机数可以赋值
{
MM[c][0] = op1;
MM[c][1] = s_n;
MM[c][2] = op2;
}
return flag;
}


若用户只选择加减法运算的函数体,如下:

其中包括“是否含有真分数” “运算是否含有负数”等等……

/*加减法运算*/
void AddSub(int n, int r1,int r2)
{
/*srand((int)time(0));*/
int r=r2-r1, one, two,three,four, sign_num,type, count = 0;//count记录产生的第几个算式
char sign;
int choose1,choose2;
bool flag_one = false, flag_two = false,flag_three=false,flag_four=false;
loop1:cout << "是否进行带真分数的练习?请选择:1、有 2、无" << endl;
cin >> choose1;
if (choose1 != 1 && choose1 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop1;
}
else if (choose1 == 1)//含有真分数的题目
{
loop2: cout << "加减法运算中有无负数?请选择:1、有 2、无" << endl;
cin >> choose2;
if (choose2 != 1 && choose2 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop2;
}
cout << "系统将为您出" << n << "道加减法的运算题目:" << endl;
if (choose2 == 1)//可以含有负数
{
srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
three = r1 + rand() % r;
four = r1 + rand() % r;
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (three < 0)//记录第三个操作数为负数(true)
flag_three = true;
if (four < 0)//记录第四个操作数为负数(true)
flag_four = true;
//随机生成运算符
sign_num = rand() % 2;
switch (sign_num)
{
case(0) : sign = '+'; break;
case(1) : sign = '-'; break;
}
//随机生成运算数的类型
type = rand() % 4;
switch (type)
{
case(0) ://两个整数
{
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
{
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
break;
}
case(1) ://op1为真分数
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
bool flag_OT = false;
if ((one<0 && two>0) || (one > 0 && two < 0))//记录第一个真分数为负数(true)
flag_OT = true;
if (two!=0)//分母不为0
{
if (flag_OT && !flag_three)//如果op1为负,op2为正
cout << count << "、 (" << one << "/" << two << ") " << sign << " " << three << endl;
if (!flag_OT && flag_three)//如果op1为正,op2为负
cout << count << "、 " << one << "/" << two << " " << sign << " (" << three << ")" << endl;
if (flag_OT && flag_three)//如果op1、op2都为负
cout << count << "、 (" << one << "/" << two << ") " << sign << " (" << three << ")" << endl;
}
break;

}
case(2) ://op2为真分数
{
if (three > four)//第二真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
bool flag_TF = false;
if ((three<0 && four>0) || (three > 0 && four < 0))//记录第二个真分数为负数(true)
flag_TF = true;
if (four!=0)//分母不为0
{
if (flag_one && !flag_TF)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << three << "/" << four << endl;
if (!flag_one && flag_TF)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << three << "/" << four << ")" << endl;
if (flag_one && flag_TF)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << three << "/" << four << ")" << endl;
}
break;
}
case(3) ://两个数都为真分数
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (three > four)//第二真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
bool flag_OT = false;
if ((one<0 && two>0) || (one > 0 && two < 0))//记录第一个真分数为负数(true)
flag_OT = true;

bool flag_TF = false;
if ((three<0 && four>0) || (three > 0 && four < 0))//记录第二个真分数为负数(true)
flag_TF = true;

if (two!=0 &&four!=0)//分母不为0
{
if (flag_OT && !flag_TF)//如果op1为负,op2为正
cout << count << "、 (" << one << "/" << two << ") " << sign << " " << three << "/" << four << endl;
if (!flag_OT && flag_TF)//如果op1为正,op2为负
cout << count << "、 " << one << "/" << two << " " << sign << " (" << three << "/" << four << ")" << endl;
if (flag_OT && flag_TF)//如果op1、op2都为负
cout << count << "、 (" << one << "/" << two << ") " << sign << " (" << three << "/" << four << ")" << endl;
}
break;
}

}
count++;
}
}
if (choose2 == 2)//不可以含有负数
{
srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
three = r1 + rand() % r;
four = r1 + rand() % r;
//负数变为相反数
if (one < 0)
one = -one;
if (two < 0)
two = -two;
if (three < 0)
three = -three;
if (four < 0)
four = -four;

//随机生成运算符
sign_num = rand() % 2;
switch (sign_num)
{
case(0) : sign = '+'; break;
case(1) : sign = '-'; break;
}

//随机生成运算数的类型
type = rand() % 4;
switch (type)
{
case(0) ://两个整数
{
if (sign == '-')
{
if (one < two)//被减数大于减数
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
}
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
cout << count << "、 " << one << " " << sign << " " << two << endl;
break;
}
case(1) ://op1为真分数
{
if (sign != '-')
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (two != 0)//分母不为0
cout << count << "、 " << one << "/" << two << " " << sign << " " << three << endl;
}
break;
}
case(2) ://op2为真分数
{
if (three > four)//第二真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
if (four != 0) //分母不为0
cout << count << "、 " << one << " " << sign << " " << three << "/" << four << endl;
break;
}
case(3) ://两个数都为真分数
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (three > four)//第二个真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
float OT, TF;
OT = one / two;
TF = three / four;
if (two != 0 && four != 0)//分母不为0
{
if (sign == '-')//减法被减数大于减数
{
if (OT<TF)
cout << count << "、 " << three << "/" << four << " " << sign << " " << one << "/" << two << endl;
else if (OT>TF)
cout << count << "、 " << one << "/" << two << " " << sign << " " << three << "/" << four << endl;
}
cout << count << "、 " << one << "/" << two << " " << sign << " " << three << "/" << four << endl;
}
break;
}

}
count++;
}
}
}
else if (choose1 == 2)//不含有真分数的题目
{
int choose3;
loop3: cout << "加减法运算中有无负数?请选择:1、有 2、无" << endl;
cin >> choose3;
if (choose3 != 1 && choose3 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop3;
}
cout << "系统将为您出" << n << "道加减法的运算题目:" << endl;
if (choose3 == 1)//包含负数
{
srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
//随机生成运算符
sign_num = rand() % 2;
switch (sign_num)
{
case(0) :
{
sign = '+';
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
{
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
break;
}
case(1) :
{
sign = '-';
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
{
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
break;
}
}
count++;
}
}
else if (choose3 == 2)//不包含负数
{
srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
//负数变为相反数
if (one < 0)
one = -one;
if (two < 0)
two = -two;
//随机生成运算符
sign_num = rand() % 2;
switch (sign_num)
{
case(0) :
{
sign = '+';
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
cout << count << "、 " << one << " " << sign << " " << two << endl;
break;
}
case(1) :
{
sign = '-';
if (one < two)//被减数大于减数
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
cout << count << "、 " << one << " " << sign << " " << two << endl;
break;
}
}
count++;
}
}

}

}


含有加减乘除四则运算的函数体部分,如下:

/*加减乘除运算*/
void FourOper(int n, int r1, int r2)
{
int r = r2 - r1, one, two, three, four, sign_num, type, count = 0;//count记录产生的第几个算式
char sign;
int choose1, choose2;
bool flag_one = false, flag_two = false, flag_three = false, flag_four = false;
loop1:cout << "是否进行带真分数的练习?请选择:1、有 2、无" << endl;
cin >> choose1;
if (choose1 != 1 && choose1 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop1;
}
else if (choose1 == 1)//含有真分数的题目
{
loop2: cout << "除法运算中有无余数?请选择:1、有 2、无" << endl;
cin >> choose2;
if (choose2 != 1 && choose2 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop2;
}
cout << "系统将为您出" << n << "道按您定制的四则运算题目:" << endl;

srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
three = r1 + rand() % r;
four = r1 + rand() % r;

//随机生成运算符
sign_num = rand() % 4;
switch (sign_num)//利用随机数随机产生运算符
{
case(0) ://加法运算
{
sign = '+';
loop4:    type = rand() % 4;
switch(type)
{
case(0) ://两个整数
{
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
{
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;

if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
break;
}
case(1) ://op1为真分数
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (three < 0)//记录第三个操作数为负数(true)
flag_three = true;
if (four < 0)//记录第四个操作数为负数(true)
flag_four = true;
bool flag_OT = false;
if ((one<0 && two>0) || (one > 0 && two < 0))//记录第一个真分数为负数(true)
flag_OT = true;
if (two != 0)//分母不为0
{
if (!flag_OT && !flag_three)//如果op1、op2都为正
cout << count << "、 " << one<<"/"<<two << " " << sign << " " << three << endl;
if (flag_OT && !flag_three)//如果op1为负,op2为正
cout << count << "、 (" << one << "/" << two << ") " << sign << " " << three << endl;
if (!flag_OT && flag_three)//如果op1为正,op2为负
cout << count << "、 " << one << "/" << two << " " << sign << " (" << three << ")" << endl;
if (flag_OT && flag_three)//如果op1、op2都为负
cout << count << "、 (" << one << "/" << two << ") " << sign << " (" << three << ")" << endl;
}
break;
}
case(2) ://op2为真分数
{
if (three > four)//第二真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (three < 0)//记录第三个操作数为负数(true)
flag_three = true;
if (four < 0)//记录第四个操作数为负数(true)
flag_four = true;
bool flag_TF = false;
if ((three<0 && four>0) || (three > 0 && four < 0))//记录第二个真分数为负数(true)
flag_TF = true;
if (four != 0)//分母不为0
{
if (!flag_one && !flag_TF)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << three<<"/"<<four << endl;
if (flag_one && !flag_TF)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << three << "/" << four << endl;
if (!flag_one && flag_TF)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << three << "/" << four << ")" << endl;
if (flag_one && flag_TF)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << three << "/" << four << ")" << endl;
}
break;
}
case(3) ://两个数都为真分数
{
if (one > two)//第一个真分数的分子要小于分母
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (three > four)//第二真分数的分子要小于分母
{
int tmp;
tmp = three;
three = four;
four = tmp;
}
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (three < 0)//记录第三个操作数为负数(true)
flag_three = true;
if (four < 0)//记录第四个操作数为负数(true)
flag_four = true;
bool flag_OT = false;
if ((one<0 && two>0) || (one > 0 && two < 0))//记录第一个真分数为负数(true)
flag_OT = true;

bool flag_TF = false;
if ((three<0 && four>0) || (three > 0 && four < 0))//记录第二个真分数为负数(true)
flag_TF = true;
if (two != 0 && four != 0)//分母不为0
{
if (!flag_OT && !flag_TF)//如果op1、op2都为正
cout << count << "、 " << one <<"/"<<two<< " " << sign << " " << three << "/" << four << endl;
if (flag_OT && !flag_TF)//如果op1为负,op2为正
cout << count << "、 (" << one << "/" << two << ") " << sign << " " << three << "/" << four << endl;
if (!flag_OT && flag_TF)//如果op1为正,op2为负
cout << count << "、 " << one << "/" << two << " " << sign << " (" << three << "/" << four << ")" << endl;
if (flag_OT && flag_TF)//如果op1、op2都为负
cout << count << "、 (" << one << "/" << two << ") " << sign << " (" << three << "/" << four << ")" << endl;
}
break;
}
}
break;
}
case(1) :
{
sign = '-';
goto loop4;

}
case(2) :
{
sign = '*';
goto loop4;
}
case(3) :
{
sign = '/';
if (one < two)
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;

if (two != 0)
{
int yu = one%two;
if (choose2 == 1)//除法运算含有余数
{
if (yu != 0)
{
if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
}
else if (choose2 == 2)//除法运算不含余数
{
if (yu == 0)
{
if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
}
}
break;
}
}
count++;
}
}

else if (choose1 == 2)//不含有真分数的题目
{
int choose3;
loop3: cout << "除法运算中有无余数?请选择:1、有 2、无" << endl;
cin >> choose3;
if (choose3 != 1 && choose3 != 2)
{
cout << "没有您选择的功能,请重新选择:" << endl;
goto loop3;
}
cout << "系统将为您出" << n << "道按您定制的四则运算题目:" << endl;

srand((int)time(0));
while (count < n)
{
one = r1 + rand() % r;
two = r1 + rand() % r;
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
//随机生成运算符
sign_num = rand() % 4;
switch (sign_num)
{
case(0) :
{
sign = '+';
loop5:    if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (!WheReap(one, two, sign_num, count))//如果有重复
count--;
else//如果没有重复
{
if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
break;
}
case(1) :
{
sign = '-';
goto loop5;
}
case(2) :
{
sign = '*';
goto loop5;
}
case(3) :
{
sign = '/';
if (one < two)
{
int tmp;
tmp = one;
one = two;
two = tmp;
}
if (one < 0)//记录第一个操作数为负数(true)
flag_one = true;
if (two < 0)//记录第二个操作数为负数(true)
flag_two = true;
if (two != 0)
{
int yu = one%two;
if (choose2 == 1)//除法运算含有余数
{
if (yu != 0)
{
if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
}
else if (choose2 == 2)//除法运算不含余数
{
if (yu == 0)
{
if (!flag_one && !flag_two)//如果op1、op2都为正
cout << count << "、 " << one << " " << sign << " " << two << endl;
if (flag_one && !flag_two)//如果op1为负,op2为正
cout << count << "、 (" << one << ") " << sign << " " << two << endl;
if (!flag_one && flag_two)//如果op1为正,op2为负
cout << count << "、 " << one << " " << sign << " (" << two << ")" << endl;
if (flag_one && flag_two)//如果op1、op2都为负
cout << count << "、 (" << one << ") " << sign << " (" << two << ")" << endl;
}
}
}
break;
}
}
count++;
}
}

}


用户选择打印方式的函数体,如下:

/*输出打印方式*/
int Output(int o)
{
/*int o;
cout << "系统已经记录了您的定制参数!请选择打印的方式:(1、直接输出 2、保存到文件)"<<endl;
cin >> o;*/
if (o == 1)
cout << "四则运算出题系统欢迎您!!" << endl;
else if (o == 2)
{
cout << "四则运算出题系统欢迎您!!" << endl;
ofstream outfile("formula.txt", ios::out);
if (!outfile)
{
cout << "Open error!!" << endl;
exit(1);
}
outfile.close();
}
else
cout << "输入错误,重新选择!" << endl;

return 0;
}


最后,是主函数部分:

void main()
{
/*srand((int)time(0));*/
int O, F;
int N,R,R1,R2,count;
cout << "请选择您是否需要保存文档?(1、不需要 2、需要)" << endl;
cin >> O;
Output(O);
cout << "您想为孩子定制什么范围的题目呢?先输入下限,再输入上限(以回车间隔,可含有负数且上限≥下限):"<<endl;
cin >> R1;
cin >> R2;
while (1)//判断是否输入合法
{
if (R2 < R1)
{
cout << "您输入的范围不合理,应输入 上限≥下限,请重新输入:" << endl;
cin >> R1;
cin >> R2;
}
else
break;
}
cout << "出多少道题呢?请输入个数:"<<endl;
cout << "(友情提示:您不要为孩子出太多的题目~1000道以内最好,上限是100000道!谢谢合作!)" << endl;
cin >> N;
cout << "请按照孩子的学习程度选择题目的难度:是否包含乘除运算?(1、是 2、否)" << endl;
cin >> F;
while (1)//判断是否输入合法
{
if (F!=1 && F!=2)
{
cout << "没有您想定制的功能,请重新输入(只输入1或2即可):" << endl;
cin >> F;
}
else
break;
}
if (F == 1)//包含乘除法
FourOper(N, R1, R2);
if (F == 2)//不包含乘除法
AddSub(N, R1, R2);
cout << "感谢您的使用,欢迎下次再来!祝您的孩子学习进步!!<( ̄︶ ̄)>" << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: