标签:自动 优先级 out 自己 coding enc 上网 racket 基本
我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求:
(1)能够自动生成四则运算练习题
(2)可以定制题目数量
(3)用户可以选择运算符
(4)用户设置最大数(如十以内、百以内等)
(5)用户选择是否有括号、是否有小数
(6)用户选择输出方式(如输出到文件、打印机等)
(7)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主)
小学四则运算包含四钟运算符——加减乘除,从优先级考虑,加减的优先级相同,乘除的优先级相同,乘除的优先级高于加减,所以在运行时尽量避免全是乘除或加减时有括号的存在,加减可以适当的存在。所以进行了以下的优化。在写入运算符时判断此时括号的存在,若出现左括号,下一个运算符赋予加或减;若出现右括号,下一个运算符赋予乘或除。保证出题的规范性。代码如下显示:
void CC::Operator(FILE* fp)
{
if (bl == 1)
{
for (int i = 0; i < 4; i++)
{
if (op[i] == '+' || op[i] == '-')
{
if(print==1) fprintf(fp, "%c", op[i]);
cout << op[i];
bl = 0;
break;
}
}
}
else if (br == 1)
{
for (int i = 0; i < 4; i++)
{
if (op[i] == '*' || op[i] == '/')
{
if(print==1) fprintf(fp, "%c", op[i]);
cout << op[1];
br = 0;
break;
}
}
}
else
{
while(1)
{
opp = rand() % (strlen(op)-1);
if(op[opp]!=' ') break;
}
if(print==1) fprintf(fp, "%c", op[opp]);
cout << op[opp];
}
}
为了保证计算的个数存在随机性,增加了用户随机输入计算个数的功能。个数的多少对括号产生影响.编写代码时括号要注意以下几个问题:
(1)允许出现嵌套括号
(2)左右括号需互相匹配,并数目相同
(3)第一个数之前出现左括号与最后一个数后出现的右括号不相互匹配。
(4)在倒数第一位数与倒数第二位数前不出现左括号
(5)避免乘除运算出现括号
问题(2)解决方法:在最后一个数输入完,输出未输出的右括号
问题(3)解决方法:若第一个数之前出现左括号,规定与它相匹配的右括号出现的位置
代码如下显示:
void CC::rbcalculate(FILE* fp) //分有括号和无括号
{
int i;
if (sign == 1)
{
br = 1;
sign = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
}
else
{
brnum = rand() % 2;//随机生成1或0,1代表有括号,0代表无括号
if (brnum == 1)
{
for (i = 0; i < 10; i++)
{
if (blnum[i] == 1)
{
br = 1;
blnum[i] = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
break;
}
}
}
//保证在计算个数输出之前输出右括号
if (Cnum == Cnumber)
{
for (i = 0; i < 10; i++)
{
if (blnum[i] == 1)
{
blnum[i] = 0;
if(print==1) fprintf(fp, ")");
cout << ")";
}
}
}
}
}
整体的输出算数题的过程如下代码所示:
void CC::calculate(FILE* fp)
{
for (Cnum = 1; Cnum <= Cnumber; Cnum++)//计算个数
{
if (Cnum != 1)//运算符
{
Operator(fp);//输出运算符
}
if (bracket == 1 && Cnum != Cnumber)//左括号
{
if (sign == 0)
{
lbcalculate(fp);//输出左括号
}
}
//数字的输出
int num = rand() % 2; //0代表整数四则运算,1代表小数四则运算,2代表有括号四则运算。
if (num == 1 && point == 1)//小数四则运算
{
pcalculate(fp);
}
else //整数四则运算
{
icalculate(fp);
}
bright = Cnum;
if (bracket == 1 && bright > bleft)//右括号//直接判断是否有左括号的产生
{
rbcalculate(fp);
}
}
if(print==1) fprintf(fp,"=");
if(print==1) fprintf(fp, "\n");
cout << "=" << endl;
}
加减乘除混合运算运行结果如下图所示:
标签:自动 优先级 out 自己 coding enc 上网 racket 基本
原文地址:https://www.cnblogs.com/yemaoaiyue/p/10821493.html