一、小程序功能描述
编写加减乘除4个自定义函数add,sub,mul,div,在主函数中调用这4个函数去完成以下功能:
- 随机生成5道四则运算题,题目的类型自加,减,乘,除中任意混合出题(即5道题目中有各种类型的题目),每道题目的两个整数是20以内的随机数,题目显示在屏幕上,由用户输入答案(如下图所示)
- 程序判断用户输入的答案是否正确,统计答题的正确率。运行结束时,询问是否继续练习,如果回答"Y"则继续进行练习,如果回答“N”则退出练习。
二、题目分析
根据题意能得到以下相关信息:
1.c语言中随机函数的应用
//导入随机函数所需的头文件
#include<stdlib.h>
#include<time.h>
//设置随机种子
srand((int)time(NULL));
//使用随机函数
//生成0-20之间的整数,用于随机生成两个20以内的整数
rand()%21
//生成1-4之间的整数,用于随机取四则运算
rand()%4+1
2.结构化编程
对题目中所需要的四则运算分别定义为add,sub,mul,div四个函数,供主函数调用。
3.四舍五入保留两位小数
在样例图黑窗口第二行文字中可以看到四舍五入保留2小数的字样,提示我们需要对计算机内部的除法运算进行四舍五入处理。另外,还有就是c语言中的浮点数直接进行比较会遇到精度问题,直接比较会出错,因此可以对计算机除法运算的浮点数结果进行四舍五入保留两位小数处理,提示用户输入除法运算四舍五入保留两位小数的数值,用处理后的结果进行比较就会避免精度问题。
float f(float a)
{
a=a*1000;
int t=(a+5)/10;
return (float)t/100;
}
三、功能实现
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<time.h>
float f(float a)
{
a=a*1000;
int t=(a+5)/10;
return (float)t/100;
}
float add(float a,float b){
return a+b;
}
float sub(float a,float b){
return a-b;
}
float mul(float a,float b){
return a*b;
}
float divv(float a,float b){
if(b==0) b=1;
float result=f(a/b);
return result;
}
int main(){
srand((int)time(NULL));
char flag='Y';
printf("计算练习,电脑随机生成5道题目\n");
printf("十以内加、减、乘、除(四舍五入保留2小数),请答题:\n");
float s=0,result=0;
while (flag=='Y'){
float num=0;
for(int i=0;i<5;i++)
{
float a=rand()%21;
float b=rand()%21;
int c=rand()%4+1;
char ch;
switch(c)
{
case 1:ch='+';s=add(a,b);break;
case 2:ch='-';s=sub(a,b);break;
case 3:ch='*';s=mul(a,b);break;
case 4:ch='/';s=divv(a,b);break;
}
printf("%.0f%c%.0f=",a,ch,b);
scanf("%f",&result);
if(s==result)
{
num++;
}
}
printf("正确率为%.0f%%",num/5*100);
printf("是否继续,如果是输入Y,否则输入N\n");
getchar();
scanf("%c",&flag);
}
return 0;
}
四、运行结果
五、扩展
除了四舍五入这种方法外还可以使用相减判断精度方法来判断两数是否相等。
程序设计中最为常用的精度为1e-6也就是0.000001,所以对于两个浮点数a,b:
如果a==b,那么就会满足fabs(a-b)<=1e-6
如果a>b,那么就会满足a>b&&fabs(a-b)>1e-6