解决二柱子问题

一.设计思路:

1 题目避免重复:建立两个数组,rand()函数确定随机数,将这两个数加入两个数组,重复确定随机数,判断这两个数是否与两个数组的数值相同以避免重复,无重复则输出题目。

2 可定制(数量/打印方式):数量和打印方式用宏定义确定输出几行与几列。

3 是否有乘除法:定义一个四则运算符的数组,前两个表示加减,后两个表示乘除,用随机数范围来确定有无乘除。

4 数值范围:rand()函数可确定数值范围。

5 if else语句来判断加减有无负数与除法有无余数。

二.代码实现:

#include<iostream>
#include<cmath>
using namespace std;

void main()
{
int m,n,min,max,g,s,l; //m为题目数量,n为打印方式,min数值范围下界,max为数值范围上界
int a1,a2,a3,i,j,t,a[10000],b[10000];
cout<<"请输入题目数量和打印方式:"<<endl; //打印方式即多少题一组
cin>>m>>n;
cout<<"请输入数值范围:"<<endl;
cin>>min>>max;
if(min>max)
{
g=min;
min=max;
max=g;
}
s=max-min+1;
cout<<"有无乘除法?(1/0)"<<endl;
cin>>a1;
cout<<"加减有无负数?(1/0)"<<endl;
cin>>a2;
if(a1==1)
{
cout<<"乘除有无余数?(1/0)"<<endl;
cin>>a3;
}
cout<<endl;

for(i=1;i<=m;i++)
{
a[i]=min+rand()%s;
b[i]=min+rand()%s;
for(j=0;j<i;j++) //判断重复
{
while(a[j]==a[i]&&b[j]==b[i])
{
a[i]=min+rand()%s;
b[i]=min+rand()%s;
}
}
}
for(i=1;i<=m;i++)
{
if(a1==0)
{
t=rand()%2;
if(a2==0)
{
if(t==0) cout<<a[i]<<"+"<<b[i];
if(t==1)
{
if(a[i]>b[i]) cout<<a[i]<<"-"<<b[i];
else cout<<b[i]<<"-"<<a[i];
}
}
if(a2==1)
{
l=rand()%3;
if(l==0) a[i]=a[i]*-1;
if(l==1) b[i]=b[i]*-1;
if(l==2) a[i]=a[i]*-1,b[i]=b[i]*-1;
if(t==0) cout<<a[i]<<"+"<<b[i];
if(t==1) cout<<a[i]<<"-"<<b[i];
}
}
if(a1=1)
{
t=rand()%4;
if(a2==0)
{
if(t==0) cout<<a[i]<<"+"<<b[i];
if(t==1)
{
if(a[i]>b[i]) cout<<a[i]<<"-"<<b[i];
else cout<<b[i]<<"-"<<a[i];
}
if(t==2) cout<<a[i]<<"*"<<b[i];
if(t==3)
{
while(b[i]==0) {b[i]=min+rand()%s;}
if(a3==1)
{
while(a[i]%b[i]==0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
cout<<a[i]<<"/"<<b[i];
}
if(a3==0)
{
while(a[i]%b[i]!=0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
cout<<a[i]<<"/"<<b[i];
}
}
}
if(a2==1)
{
l=rand()%4;
if(l==0) a[i]=a[i]*-1;
if(l==1) b[i]=b[i]*-1;
if(l==2) a[i]=a[i]*-1,b[i]=b[i]*-1;
if(t==0) cout<<a[i]<<"+"<<b[i];
if(t==1) cout<<a[i]<<"-"<<b[i];
if(t==2) cout<<a[i]<<"*"<<b[i];
if(t==3)
{
while(b[i]==0) {b[i]=min+rand()%s;}
if(a3==1)
{
while(a[i]%b[i]==0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
cout<<a[i]<<"/"<<b[i];
}
if(a3==0)
{
while(a[i]%b[i]!=0) {b[i]=min+rand()%s,a[i]=min+rand()%s;}
cout<<a[i]<<"/"<<b[i];
}
}
}
}
cout<<"="<<endl;
if(i%n==0) cout<<endl;
}
}

三.截图:

四.总结:

这个问题有两个难点,即避免题目重复和条件判断是否有乘法,加减有无负数,除法有无余数等。避免数的重复,可随即取两个随机数放入两个数组中,每当取随机数时可与数组中的数比较,如果重复则取随机数,直到不满足重复条件,跳出循环。设置变量分别表示有无乘除法,有无负数和有无乘除法,分别用if语句嵌套判断是否符合条件。总体来说,先取两个不重复的随机数,然后分别根据各个变量的值来决定输出题目。

五.时间记录日志

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3/14 8:00 9:40 10 100 设计 思考设计思路
  15:20 16:10   50 编程 实现题目不重复
3/15 9:10 9:35   25 思考讨论 如何嵌套条件判断
  9:30 10:25 5 55 编程 实现条件判断
3/16 17:10 18:23   73 编程 实现输出打印方式
3/18 10:20 11:20 10 60 写实验报告 总结和反思
             
原文地址:https://www.cnblogs.com/houtaoliang/p/4346683.html