软件工程(一)

一、随机生成300道四则运算题目的程序(C语言)


(一)小学低年级题目为例:

分析:

      1.编写测试题,且为100道,就要用到循环函数,因此想到用for()函数

      2.随机产生两个数,就想到用rand()函数。

         注:1.rand()函数在使用时应有头文件#include<stdlib.h>,我上课时由于没有用此头文件,程序一直无法运行

              2.我在调试程序的过程中,随机数一直不变,通过查资料我了解到,要想让随机数改变,需要提供一个种子,相同的种子会产生相同的随机数,因此必须在rand()函数前加上 srand(time(NULL));语句,且头文件中加上#include<time.h>,这样就能保证两个随机数能够该变了。

        3.随机缠上四则运算要想每道题+ ,-,*,/都是随机的,我就想到了用分支函数,通过用if 语句,我感觉有点麻烦,然后我就想到了switch()函数,且通过随机产生0,1,2,3四个数来进行分支,比较方便一点

       4.考虑到小学生没有学过负数,所以在做减法时,我想到了,要让大数减小数来计算。还有就是除法,除数不能是0,因此我想到了如果除数是0,则重新出一道题,为了保证题目为30道题,要让i+1才行。

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
int main()
{
 int x,y,z,t;
 srand(time(NULL));
 cout<<"小学二年级四则运算测试题"<<endl;
 for(int i=0;i<100;i++)
 {
  x=rand()%100;
  y=rand()%100;
  z=rand()%4;
  switch(z)
  {
  case 0:
   cout<<x<<"+"<<y<<"="<<endl;
   break;
  case 1:
   if(x<y)
   {
    t=x;
    x=y;
    y=t;
   }
   cout<<x<<"-"<<y<<"="<<endl;
   break;
  case 2:
   cout<<x<<"*"<<y<<"="<<endl;
   break;
  case 3:
   if(y!=0)
   {
   cout<<x<<"/"<<y<<"="<<endl;
   }
   else
   {
    i=i-1;
   }
   break;
  default:
   cout<<"超出测试范围"<<endl;
   break;
  }
 }
 cout<<"恭喜你已经完成了100道数学测试题"<<endl;
 return 0;
}

(二)、在低年级的基础上再次修改,对该软件提出以下四个要求:

    (a)除了整数之外,还支持真分数的运算。(例如:1/6+1/8=7/24)

    (b)让程序能够接受用户输入的答案,并判定对错,最后给出总共对错的数量。

    (c)逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目(最多10个运算母,括号的数量不限制)。

    (d)一次可以批量产生100道以上的题目,保存在文本文件中,并且保证题目不重复,(1+2)和(2+1)是重复的题目。

    分析:整数的四则运算比较简单,在这里就不多加分析。对于真分数的四则运算,要考虑随机产生的分子分母消去公约数的问题,还要考虑真分数与整数的混合运算以及计算结果的化简和判断问题。具体的程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define MAX 100
void simple(int &m,int &n) //约去分子分母公约数
{
int p;
p=(m+n-abs(m-n))/2;
for(int i=2;i<=p;i++)
if(m%i==0&&n%i==0)
{
m/=i;
n/=i;
i=2;
}
}

void show(int &x,int &y) //输出整数或分数
{
if(x%y==0)
printf("%d",x/y);
else
printf("%d/%d",x,y);
}

static int number=0;
void judge(int p,int q,int f,int g) //判断输入结果的对错
{
if(p==f&&q==g)
{
printf("right!\n");
number+=1;
}
else
printf("wrong!\n");
}

int main()
{
FILE *fp;
//文件的打开
if((fp=fopen("mytiku.txt","w"))==NULL)
{
printf("Cannot open this file!\n");
exit(0);
}
for(int i=0;i<MAX;i++)
{
int a,b,c,d,e,f,g,p,q,x,y;
int *A=(int *)malloc(MAX*sizeof(int)),*B=(int *)malloc(MAX*sizeof(int));
int *C=(int *)malloc(MAX*sizeof(int)),*D=(int *)malloc(MAX*sizeof(int));
a=rand()%MAX+1;
b=rand()%MAX+1;
c=rand()%MAX+1;
d=rand()%MAX+1;
e=rand()%4+1;
simple(a,c);
simple(b,d);
A[i]=a;
B[i]=b;
C[i]=c;
D[i]=d;

//保证没有重复的题目
for(int j=0;j<i;j++)
if((A[i]==A[j]&&B[i]==B[j]&&C[i]==C[j]&&D[i]==D[j])||(A[i]==B[j]&&B[i]==A[j])&&C[i]==D[j]&&D[i]==C[j])
{
a=rand()%MAX+1;
b=rand()%MAX+1;
c=rand()%MAX+1;
d=rand()%MAX+1;
simple(a,c);
simple(b,d);
j=0;
}

//显示产生的算式
show(a,c);
switch(e)
{
case 1: printf("+");break;
case 2: printf("-");break;
case 3: printf("*");break;
case 4: printf("/");break;
}
show(b,d);
printf("=");

//对结果进行判断
switch(e)
{
case 1: f=a*d+b*c;
g=c*d;
simple(f,g);
if(g!=1)
{
scanf("%d/%d",&p,&q);
simple(p,q);
judge(p,q,f,g);
}
else
{
scanf("%d",&p);
judge(p,1,f,1);
}
fprintf(fp,"%d/%d+%d/%d=%d/%d\n",a,c,b,d,f,g);break;
//减法可能产生负数,要对其进行判断
case 2: f=abs(a*d-b*c);
g=c*d;
x=a*d;
y=b*c;
simple(f,g);
if(x>=y)
{
if(g!=1)
{
scanf("%d/%d",&p,&q);
simple(p,q);
judge(p,q,f,g);
}
else
{
scanf("-%d",&p);
judge(p,1,f,1);
}
fprintf(fp,"%d/%d-%d/%d=%d/%d\n",a,c,b,d,f,g);
}
else
{
if(g!=1)
{
scanf("-%d/%d",&p,&q);
simple(p,q);
judge(p,q,f,g);
}
else
{
scanf("%d",&p);
judge(p,1,f,1);
}
fprintf(fp,"%d/%d-%d/%d=-%d/%d\n",a,c,b,d,f,g);
}break;
case 3: f=a*b;
g=c*d;
simple(f,g);
if(g!=1)
{
scanf("%d/%d",&p,&q);
simple(p,q);
judge(p,q,f,g);
}
else
{
scanf("%d",&p);
judge(p,1,f,1);
}
fprintf(fp,"%d/%d*%d/%d=%d/%d\n",a,c,b,d,f,g);break;
case 4: f=a*d;
g=b*c;
simple(f,g);
if(g!=1)
{
scanf("%d/%d",&p,&q);
simple(p,q);
judge(p,q,f,g);
}
else
{
scanf("%d",&p);
judge(p,1,f,1);
}
fprintf(fp,"%d/%d/%d/%d=%d/%d\n",a,c,b,d,f,g);break;
}
}
fprintf(fp,"做对题目的数目为%d\n",number);
fclose(fp);
return 0;
}













  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值