一、实验目的与要求:
- 学习和掌握 C 语言函数的定义与调用
- 进一步掌握随机数、选择结构、循环控制、交互式输入输出等程序设计方法
- 进一步掌握 C 语言中数组定义和引用方法
- 学习和掌握根据流程图进行模块化程序设计的思想
- 编译并运行你的程序。调试正确后,①将源程序*.c 文件上载;②将可执行程序*.exe 压缩后上载
- 提交正式的实验报告。实验报告的文件名为“学号姓名 综 3”,如“202x280168 王 敬华 综 3.doc
- 在实验报告中,要求画出实现函数 subLmt100(int num1, int num2) 和 divLmt100( )功能的流程图。
二、实验步骤与过程:
(给出编程思路并表示出算法,如画出流程图或伪代码表示。提供带注释的核心程序代码。要求:设计思路合理,程序运行正确、输出界面符合实验要求。)
函数subLmt100(int num1, int num2)的流程图如下:
函数divLmt100( )的流程图如下
程序的主代码如下
/**
* @author: 2021090225 Sheng-yang Chen
* @description: Four arithmetic games for children
* version: v0.01
* @date 2022-11-26 14:56
**/
#include<stdio.h>
#include<string.h>
#include<time.h>
int randN1N2(int N1,int N2)
{
int randnum;
randnum=rand()%(N2-N1+1)+N1;
return(randnum);
}
//返回一个 N1 至 N2 之间的随机整数
char randOperator()
{
int randN1N2(int N1,int N2);
int a;
a=randN1N2(0,99);
if (a<25) return '+';
else if (a<50 && a>24) return '-';
else if (a<75 && a>49) return '*';
else return '/';
}
int randLmt100()
{
int a;
a=randN1N2(0,99);
return a;
}
//返回一个 0-99 之间的随机整数
int addLmt100(int num1, int num2)
{
printf("%d + %d = ",num1,num2);
int ans;
scanf("%d",&ans);
int real=num1+num2;
if (ans==real)
{
printf("恭喜你答对了");
return 1;
}
else
{
printf("很遗憾,你答错了,正确答案是%d,请继续加油!",real);
return 0;
}
}
//加法运算
int subLmt100(int num1, int num2)
{
int ans;
int numMax,numMin;
if (num1 > num2)
{
numMax=num1;
numMin=num2;
}
else
{
numMax=num2;
numMin=num1;
}
int real=numMax-numMin;
printf("%d - %d = ",numMax,numMin);
scanf("%d",&ans);
if (ans==real)
{
printf("恭喜你答对了");
return 1;
}
else
{
printf("很遗憾,你答错了,正确答案是%d,请继续加油!",real);
return 0;
}
}
//最大数选取和减法运算
int mulLmt100(int num1, int num2)
{
printf("%d * %d = ",num1,num2);
int ans;
scanf("%d",&ans);
int real=num1*num2;
if (ans==real)
{
printf("恭喜你答对了");
return 1;
}
else
{
printf("很遗憾,你答错了,正确答案是%d,请继续加油!",real);
return 0;
}
}
//乘法运算
int divLmt100()
{
int randLmt100();
int num1,num2,ans;
do{
num1=randLmt100();
num2=randLmt100();
}while ((num1%num2!=0));
//仅当num1可以被num2整除时才显示题目
if (num1%num2==0)
{
printf("%d / %d = ",num1,num2);
scanf("%d",&ans);
int real=num1/num2;
if (ans==real)
{
printf("恭喜你答对了");
return 1;
}
else
{
printf("很遗憾,你答错了,正确答案是%d,请继续加油!",real);
return 0;
}
}
}
//除法运算
int main()
{
int proNum[4]={0},ansNum[4]={0},sFlag=1,i;
loop: //循环起点
srand((unsigned)time(NULL));
int n1=randLmt100();
int n2=randLmt100();
char oper=randOperator();
if (oper=='+')
{
proNum[0]++;
ansNum[0]+=addLmt100(n1,n2);
}
else if (oper=='-')
{
proNum[1]++;
ansNum[1]+=subLmt100(n1,n2);
}
else if (oper=='*')
{
proNum[2]++;
ansNum[2]+=mulLmt100(n1,n2);
}
else if (oper=='/')
{
proNum[3]++;
ansNum[3]+=divLmt100();
}
printf("\n若继续玩,直接打回车;\n若不想继续,键盘输入字母'N'或'n'后打回车;");
getchar(); //清键盘缓冲区
char c = getchar();
printf("\n\n");
if ( c =='N'||c =='n') sFlag=0;
else {}
if (sFlag==1)
{
goto loop;
}
else
{
printf("统计结果:\n");
printf("运算类型 加 减 乘 除 \n");
printf("题目数量");
for(i=0;i<4;i++)
{
printf("%4d ",proNum[i]);
}
printf("\n答对次数");
for(i=0;i<4;i++)
{
printf("%4d ",ansNum[i]);
}
}
return 0;
}
三、实验结果与分析:
(其中:提交程序运行情况及运行结果的截图,对实验结果与实验数据进行分析、评价,说明实验结果是否达到实验要求?同时回答“思考与上机验证问题”。)
上图为结果的一部分,经检验实验结果正确,实验结果达到实验要求,本次实验成功完成。
思考题:
1) 谈一下,为了更加吸引小朋友使用,应该如何设计该游戏的用户交互界面?
2) 对这个游戏,你还有什么改进的想法?请说明一下。
答:
1)可以在界面上增加图形的描绘,例如正确时跳出笑脸,失败时出现沮丧的表情,可以使程序更加生动。
2)上面是交互界面上的改进,程序上还可以增加一个图形判断的游戏,更加直观且更有趣。比如随机生成一个图形,判断图形中星号的个数。程序结果上还可以输出总的运算次数和答对次数,这会让游戏更具成就感。