实验目的
一、 学习和掌握C 语言函数的定义与调用;
二、 进一步掌握随机数、选择结构、循环控制、交互式输入输出等程序设计方法;
三、 进一步掌握C 语言中的数组定义和引用方法;
四、 学习和掌握根据流程图进行模块化程序设计的思想。
实验内容
给学龄前儿童编写一个100 以内的四则运算游戏,程序的具体要求如下:
1) 定义一个函数randN1N2(int rN1, int rN2 )。该函数有两个整型的输入参数rN1 和 rN2,其中,rN1 <= rN2。该函数的功能是生成rN1 到 rN2 之间均匀分布的随机整数,该函数的返回值类型是整型。每调用一次该函数,函数返回一个rN1 至 rN2 之间的随机整数(随机数产生方法参考实验七);
提示:生成rN1 到 rN2之间的随机数方法为:rand()%(rN2-rN1+1)+rN1
2) 定义函数char randOperator( ),该函数没有输入参数,功能是随机返回 ’+’、 ’-’、 ’’、 ’/’ 这四个字符的其中一个。要求在该函数内部调用上述randN1N2( )函数来实现。
提示:先用n=randN1N2(1,4)产生一个1到4之间的随机数n, 根据n的值返回四个字符中的一个。若n为1,返回’+’; n为2,返回’-’; n为3,返回’’; n为4,返回’/’。
3) 定义一个函数randLmt100( )。该函数没有输入参数,函数的返回类型是整型。该函数内部调用上述函数randN1N2。每调用一次函数randLmt100( ),返回一个0-99 之间的随机整数。
4) 定义一个函数addLmt100(int num1, int num2)。该函数有两个整型的输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式num1 + num2 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。
5) 定义一个函数subLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式 numM1 - numM2 =,其中:numM1 是num1 和 num2 中较大的一个数,numM2 是num1 和 num2 中较小的一个数;然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。
6) 定义一个函数mulLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:在屏幕上列出一个算式num1 × num2 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。
7) 定义一个函数divLmt100(int num1, int num2)。该函数有两个整型输入参数num1 和 num2;函数返回值类型为整型。该函数的功能是:首先判定num1是否为0, 以及num2 是否可以被num1整除,若num1为0或者num2 不能被num1整除,则调用randLmt100( )函数重新生成两个新的num1 和 num2,然后再重新判断,直到num1不为0且num2能被num1整除为止;在num2 能被num1整除的情况下,在屏幕上列出一个算式num2 ÷ num1 =,然后接受一个键盘输入的计算答案answer。若结果正确,则屏幕输出一句赞扬的语句,然后返回函数值1;若结果错误,则屏幕输出一句鼓励的语句,并输出正确答案,然后返回函数值0。
8) 主函数的功能如下:在主函数中调用上面定义的五个函数,在屏幕上随机循环出一道100 以内的四则运算题。其中,定义一个整型数组proNum[4] 和整型数组ansNum[4],这两个数组中分别存储在上述游戏循环过程中加、减、乘、除四种类型的题出现的次数,以及这四种类型的题被答对的次数。在用户不想继续游戏退出时,在屏幕上显示本次游戏中的加、减、乘、除四种类型题出现的数量,以及每一种题被答对的次数。主程序可参照附录A给出的参考流程图编写。
注:流程图中proNum[0]、proNum[1]、proNum[2]、proNum[3]分别用于统计加、减、乘、除运算的次数,而ansNum[0]、ansNum[1]、ansNum[2]、ansNum[3]分别用于统计加、减、乘、除运算中答对的次数。
附图:主程序的参考流程图(见下一页):
实验代码
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int randN1N2(int rN1, int rN2)
{
return rand() % (rN2 - rN1 + 1) + rN1;
}
char randOperator()
{
int a = randN1N2(1, 4);
if (a == 1)
return '+';
if (a == 2)
return '-';
if (a == 3)
return '*';
if (a == 4)
return '/';
}
int randLmt100()
{
return randN1N2(0, 99);
}
int addLmt100(int num1, int num2)
{
int answer;
printf("%d+%d=", num1, num2);
scanf("%d", &answer);
if (num1 + num2 == answer)
{
printf("你厉害,我给你大拇哥!\n");
return 1;
}
else
{
printf("真的是太逊啦,继续加油吧!\n");
printf("正确答案是:%d\n", num1 + num2);
return 0;
}
}
int subLmt100(int num1, int num2)
{
int answer;
int max = (num1 > num2 ? num1 : num2);
printf("%d-%d=", max, num2 + num1 - max);
scanf("%d", &answer);
if (2 * max - num1 - num2 == answer)
{
printf("你厉害,我给你大拇哥!\n");
return 1;
}
else
{
printf("真的是太逊啦,继续加油吧!\n");
printf("正确答案是:%d\n", 2 * max - num1 - num2);
return 0;
}
}
int mulLmt100(int num1, int num2)
{
int answer;
printf("%d*%d=", num1, num2);
scanf("%d", &answer);
if (num1 * num2 == answer)
{
printf("你厉害,我给你大拇哥!\n");
return 1;
}
else
{
printf("真的是太逊啦,继续加油吧!\n");
printf("正确答案是:%d\n", num1 * num2);
return 0;
}
}
int divLmt100(int num1, int num2)
{
while (num1 == 0 || num2 % num1 != 0 || num1 > num2)
{
num1 = randLmt100();
num2 = randLmt100();
}
int answer;
printf("%d/%d=", num2, num1);
scanf("%d", &answer);
if (num2 / num1 == answer)
{
printf("你厉害,我给你大拇哥!\n");
return 1;
}
else
{
printf("真的是太逊啦,继续加油吧!\n");
printf("正确答案是:%d\n", num2 / num1);
return 0;
}
}
int main()
{
int probNum[4] = {0};
int ansNum[4] = {0};
int sFlag = 1;
srand((unsigned int)time(NULL));
while (1)
{
char oper, c;
int num1, num2;
oper = randOperator();
num1 = randLmt100();
num2 = randLmt100();
if (oper == '+')
{
probNum[0]++;
ansNum[0] += addLmt100(num1, num2);
}
if (oper == '-')
{
probNum[1]++;
ansNum[1] += subLmt100(num1, num2);
}
if (oper == '*')
{
probNum[2]++;
ansNum[2] += mulLmt100(num1, num2);
}
if (oper == '/')
{
probNum[3]++;
ansNum[3] += divLmt100(num1, num2);
}
printf("若继续玩,直接打回车:\n");
printf("若不想继续,键盘输入字母'N'或'n'后打回车\n\n\n");
rewind(stdin);
c = getchar();
if (c == 'N' || c == 'n')
{
sFlag = 0;
break;
}
}
printf("出现加法类型的题目有%d次\n", probNum[0]);
printf("加法类型的题目答对次数为:%d\n", ansNum[0]);
printf("出现减法类型的题目有%d次\n", probNum[1]);
printf("减法类型的题目答对次数为:%d\n", ansNum[1]);
printf("出现乘法类型的题目有%d次\n", probNum[2]);
printf("乘法类型的题目答对次数为:%d\n", ansNum[2]);
printf("出现除法类型的题目有%d次\n", probNum[3]);
printf("除法类型的题目答对次数为:%d", ansNum[3]);
return 0;
}
实验结果