可怜的二柱子同学,老师又对他的自动出题系统提出了新的要求:
1、题目避免重复;
2、可定制(数量/打印方式);
3、可以控制下列参数:
是否有乘除法;
是否有括号(最多可以支持十个数参与计算);
数值范围;
加减有无负数;
除法有无余数!
阅读PSP相关资料,掌握psp项目计划、时间记录、缺陷记录相关日志文件。
设计思路:
对于题目避免重复可以用建立字符串数组,进行字符串之间相互比较来解决,另外题目
可以定制通过随机数生成题目数并带入循环解决,同时打印方式可以用文件输入输出流
把数据存到文件里。对于是否有乘除法,可以把+ - * /存到数组里,随机调用
数值范围可以用随机数进行范围控制,本题的难点在是否能生成括号,
括号是用来提升优先级,对于这个问题我们可以用循环调用来实现,具体含义是
四则运算表达式可以看成 表达式1+符号+表达式2的模式,在进入循环开表达式
可以随机选择放在表达式1或表达式2上,也可以决定有无括号,这样用随机生成
的运算数的个数决定循环的次数,加减有无负数和除法有无余数,这里只对两个
运算数的表达式进行了操作。
实验源代码:
#include<iostream>
#include<string>
#include<time.h>
#include <stdio.h>
#include<fstream>
using namespace std;
string str1[4]={"+","-","*","/"};
int num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,n,m,a,b;
char str2[25];
char str3[25];
string str4[100];
void Input(int n,int p)
{
m=n;
string str;
ofstream outfile;
outfile.open("a.txt",ios::app);
if(!outfile)
{
cerr<<"OPEN ERROR!"<<endl;
exit(0);
}
num1=rand()%100+1;
num2=rand()%100+1;
num3=rand()%4;
num8=num1;
num9=num2;
num10=num3;
itoa(num1,str2,10);
itoa(num2,str3,10);
str=str2+str1[num3]+str3;
n=n-2;
while(n!=0) //当n不等于0时,循环生成str,即表达式+符号+表达式的形式
{
num4=rand()%2;
if(num4==0) //上一个str放在符号的左边
{
num5=rand()%2;
if(num5==0) //上一个str不加括号
{
num3=rand()%4;
num1=rand()%100+1;
itoa(num1,str2,10);
str=str+str1[num3]+str2;
}
else //上一个str加括号
{
num3=rand()%4;
num1=rand()%100+1;
itoa(num1,str2,10);
str="("+str+")"+str1[num3]+str2;
}
}
else //上一个str放在符号的右边
{
num5=rand()%2;
if(num5==0) // 上一个str不加括号
{
num3=rand()%4;
num1=rand()%100+1;
itoa(num1,str2,10);
str=str2+str1[num3]+str;
}
else //上一个str加括号
{
num3=rand()%4;
num1=rand()%100+1;
itoa(num1,str2,10);
str=str2+str1[num3]+"("+str+")";
}
}
n--;
}
str4[p]=str; //把str存入字符串数组str4中
for(int i=0;i<p;i++) //查询四则运算式是否有重复
if(str4[i]==str4[p])
Input(m,p);
cout<<str4[p]<<" ";
outfile<<str4[p]<<endl;
if(m==2)
{
if(num10==0) //加法有无负数
{
a=num8+num9;
if(a>0)
cout<<"结果"<<a<<"为正";
else if(a==0)
cout<<"结果"<<a<<"为零";
else if(a<0)
cout<<"结果"<<a<<"为负";
}
else if(num10==1) //减法有无负数
{
a=num8-num9;
if(a>0)
cout<<"结果"<<a<<"为正";
else if(a==0)
cout<<"结果"<<a<<"为零";
else if(a<0)
cout<<"结果"<<a<<"为负";
}
else if(num10==2)
{
a=num8*num9;
if(a>0)
cout<<"结果"<<a<<"为正";
else if(a==0)
cout<<"结果"<<a<<"为零";
else if(a<0)
cout<<"结果"<<a<<"为负";
}
else if(num10==3) //除法有无余数
{
b=num8%num9;
if(b==0)
cout<<"余数为0";
else
cout<<"余数不为0";
}
}
cout<<endl;
}
void changeNum(int n)
{
for(int i=0;i<n;i++) //随机生成的题目
{
num6=rand()%9+2;
switch(num6)
{
case 2:Input(2,i);break;
case 3:Input(3,i);break;
case 4:Input(4,i);break;
case 5:Input(5,i);break;
case 6:Input(6,i);break;
case 7:Input(7,i);break;
case 8:Input(8,i);break;
case 9:Input(9,i);break;
case 10:Input(10,i);break;
}
}
}
void main()
{
ofstream outfile1;
outfile1.open("a.txt");
if(!outfile1)
{
cerr<<"OPEN ERROR!"<<endl;
exit(0);
}
srand((unsigned)time(NULL)); //随机种子
cout<<"输入你想做的题目数:";
cin>>n;
changeNum(n);
cout<<"四则表达式没有重复"<<endl;
}
如下是不同题目数量的结果截图:
题目数量为5

相应的文件输出

题目数量为30

相应的文件输出

浙公网安备 33010602011771号