四则运算题目生成程序(一)
一、作业信息
博客班级 | |
---|---|
作业要求 | 作业要求 |
作业目标 | 写一个能自动生成小学四则运算题目的程序 |
学号 | 3180701218 |
二、作业要求
写一个能自动生成小学四则运算题目的程序,然后在此基础上扩展:
1)除了整数以外,还要支持真分数的四则运算,例如:1/6+1/8=7/24
2)程序要求能处理用户的输入,判断对错,累积分数
3)程序支持可以由用户自行选择加、减、乘、除运算
4)使用-n参数控制生成题目的个数,例如Myapp.exe -n 10,将生成10个题目
三、代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string.h>
#include<math.h>
#define EPSILON 0.000001 //根据精度需要
int N=0;
int n=0;//用户输入搜题数目n
int m=0;//选择搜题种类
void huajian(int *p,int *q)//化简为真分数
{
int i;
for(i=*p;i>=1;i--)
{
if(((*p)%i==0)&&((*q)%i==0))
{
(*p)=(*p)/i;
(*q)=(*q)/i;
}
}
}
void input()//用户输入搜题数目n,选择搜题种类
{
printf("*———————————*\n");
printf("| 四则运算生成器 |\n");
printf("*———————————*\n");
printf("| 1.加法 |\n");
printf("| 2.减法 |\n");
printf("| 3.乘法 |\n");
printf("| 4.除法 |\n");
printf("| 5.结束 |\n");
printf("| 无限小数保留6位小数 |\n");
printf("*———————————*\n");
printf("请输入搜题种类:\n");
scanf("%d",&m);
}
void addtion()//加法
{
int i,j;
printf("1.整数运算or2.真分数运算\n");
scanf("%d",&j);
srand(time(NULL));
if(j==1)
{
for(i=0;i<n;i++)
{
int a,b,c,d;
a=rand()%N;
b=rand()%N;
c=a+b;
printf("%d+%d=",a,b);
scanf("%d",&d);
if(d==c)printf("运算正确!\n");
else printf("运算错误!正确答案是%d\n",c);
}
}
else
for(i=0;i<n;i++)
{
int a,b;
int a1,b1;
float c,d;
while(1)
{
a=rand()%N;
b=rand()%N;
a1=rand()%N;
b1=rand()%N;
if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
break;
}
huajian(&a,&b);
huajian(&a1,&b1);
c=a/(b*1.0)+a1/(b1*1.0);
printf("%d/%d+%d/%d=",a,b,a1,b1);
scanf("%f",&d);
if(fabs(d-c)<EPSILON)
printf("运算正确!\n");
else
printf("运算错误!正确答案是%f\n",c);
}
};
void subtract()//减法
{
int i,j;
printf("1.整数运算or2.真分数运算\n");
scanf("%d",&j);
srand(time(NULL));
if(j==1)
{
for(i=0;i<n;i++)
{
int a,b,c,d;
a=rand()%N;
b=rand()%N;
c=a-b;
printf("%d-%d=",a,b);
scanf("%d",&d);
if(d==c)printf("运算正确!\n");
else printf("运算错误!正确答案是%d\n",c);
}
}
else
for(i=0;i<n;i++)
{
int a,b;
int a1,b1;
float c,d;
while(1)
{
a=rand()%N;
b=rand()%N;
a1=rand()%N;
b1=rand()%N;
if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
break;
}
huajian(&a,&b);
huajian(&a1,&b1);
c=a/(b*1.0)-a1/(b1*1.0);
printf("%d/%d-%d/%d=",a,b,a1,b1);
scanf("%f",&d);
if(fabs(d-c)<EPSILON)
printf("运算正确!\n");
else
printf("运算错误!正确答案是%f\n",c);
}
};
void multiply()//乘法
{
int i,j;
printf("1.整数运算or2.真分数运算\n");
scanf("%d",&j);
srand(time(NULL));
if(j==1)
{
for(i=0;i<n;i++)
{
int a,b,c,d;
a=rand()%N;
b=rand()%N;
c=a*b;
printf("%d*%d=",a,b);
scanf("%f",&d);
if(d==c)printf("运算正确!\n");
else printf("运算错误!正确答案是%d\n",c);
}
}
else
for(i=0;i<n;i++)
{
int a,b;
int a1,b1;
float c,d;
while(1)
{
a=rand()%N;
b=rand()%N;
a1=rand()%N;
b1=rand()%N;
if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
break;
}
huajian(&a,&b);
huajian(&a1,&b1);
c=a/(b*1.0)*a1/(b1*1.0);
printf("%d/%d*%d/%d=",a,b,a1,b1);
scanf("%f",&d);
if(fabs(d-c)<EPSILON)
printf("运算正确!\n");
else
printf("运算错误!正确答案是%f\n",c);
}
};
void divide()//除法【小数大小判断不准确】
{
int i,j;
printf("1.整数运算or2.真分数运算\n");
scanf("%d",&j);
srand(time(NULL));
if(j==1)
{
for(i=0;i<n;i++)
{
int a,b,c,d;
a=rand()%N;
b=rand()%N;
c=a/b;
printf("%d/%d=",a,b);
scanf("%f",&d);
if(d==c)printf("运算正确!\n");
else printf("运算错误!正确答案是%d\n",c);
}
}
else
for(i=0;i<n;i++)
{
int a,b;
int a1,b1;
float c,d;
while(1)
{
a=rand()%N;
b=rand()%N;
a1=rand()%N;
b1=rand()%N;
if(b1!=0&&b!=0&&a!=0&&a1!=0&&a!=b&&a1!=b1)
break;
}
huajian(&a,&b);
huajian(&a1,&b1);
c=a/(b*1.0)/(a1/(b1*1.0));
printf("(%d/%d)/(%d/%d)=",a,b,a1,b1);
scanf("%f",&d);
if(fabs(d-c)<EPSILON)
printf("运算正确!\n");
else
printf("运算错误!正确答案是%f\n",c);
}
};
int main()
{
printf("想练习多大数以内的运算题目:\n");
scanf("%d",&N);
while(1)
{
input();
switch(m)
{
case 1:
printf("请输入搜题数目:\n");
scanf("%d",&n);
addtion();
break;
case 2:
printf("请输入搜题数目:\n");
scanf("%d",&n);
subtract();
break;
case 3:
printf("请输入搜题数目:\n");
scanf("%d",&n);
multiply();
break;
case 4:
printf("请输入搜题数目:\n");
scanf("%d",&n);
divide();
break;
case 5:
printf("谢谢使用!:\n");
return 0;
default:
printf("输入指令有误,请重新输入!\n");
break;
}
}
return 0;
};
四、运行截图
五、总结
1.psp表格
psp2.1 | 任务内容 | 计划完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
Planning | 计划 | 10 | 8 |
Estimate | 估计这个任务需要多少时间, 并规划大致工作步骤 |
10 | 12 |
Development | 开发 | 100 | 150 |
Analysis | 需求分析(包括学习新技术) | 12 | 5 |
Design Spec | 生成设计文档 | 5 | 5 |
Design Review | 设计复审 | 5 | 5 |
Coding Standard | 代码规范 | 3 | 2 |
Design | 具体设计 | 10 | 12 |
Coding | 具体编码 | 36 | 21 |
Code Review | 代码复审 | 5 | 7 |
Test | 测试(自我测试,修改代码,提交修改) | 10 | 15 |
Reporting | 报告 | 9 | 6 |
Test Report | 测试报告 | 3 | 2 |
Size Measurement | 计算工作量 | 2 | 1 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 3 | 3 |
2.总结
刚看到这个题目时,我觉得很简单,只需要利用随机数就可以了,但是实现过程却遇到了很多困难,尤其是实现真分数运算。该系统将分数转化为小数,通过两个分数差的绝对值与一个很小量比较判断大小,因此会产生误判,并且用户只能输入小数才能被系统识别。例如1/3+3/7=?正确答案是16/21。但是用户只能输入小数,且保留小数点后6位。这样,用户输入不方便,而且系统可能会误判。