前 言
这是我在嵌入式学习的第一阶段——C语言基础的学习过程中完成的一个项目,如果对您有帮助的话,可以点赞,收藏,关注哦,有其他问题可以私聊交流。
项目还有需要改进优化的地方,也可以添加其他有趣的功能,期待各位大佬的指点和交流。
目 录
一、项目简介
项目名:四则运算小游戏
功 能:1.可以选择加减乘除四则运算之一 练习
2.可以退出程序
3.回答正确积分,回答错误扣分,并在回答后显示当前积分
4.连续练习
介 绍:这个项目的主要作用是为用户提供一个用来练习100以内的四则运算的工具,同时也作为一个C语言学习阶段前期的实践项目。它支持用户通过选择四则运算法则来进行相对应的练习。
二、功能介绍
1.可以选择加减乘除四则运算之一练习
进入程序后,可以根据界面通过输入 ‘ + ’(加号)选择加法, ‘ - ’(减号)选择减法, ‘ * ’(星号)选择乘法,‘ / ’(反斜杠)选择除法
2.可以退出程序
进入程序后,可以根据界面通过‘ 0 ’(零)选择退出程序
3.回答正确积分,回答错误扣分,并在回答后显示当前积分
在回答后,程序会判断答案的正确与否,正确则加10分,错误则减10分,同时打印出当前积分值
4.连续练习
在回答完成后,提示用户输入按键,输入按键‘ y ’或者' Y '则继续练习,输入其他按键则退出程序
三、技术实现
1.界面设计
运行界面包含了题号,选择,题目,答案,回答正确与否,积分,按键提示
2.代码设计
2.1设计思路
①四则运算界面函数:页面设计需要显示题号,以及提示用户输入键值
②按键选择和识别函数:因为有按键输入,所以需要识别按键值
③获取随机数函数:用时间做种子,使每次产生的随机数不同
④运算规则函数:输入键值后需要进行相对应的运算
⑤判断:根据用户输入答案的正确与否,并显示在界面上
⑥积分:根据用户输入答案的正确与否进行积分加减,并显示在界面上
⑦询问是否继续
2.2预处理头文件
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
2.3搭建主函数框架
运算规则函数这里我通过在按键选择和识别函数去调用
int main(void)
{
while(1)
{
show(); //界面
key_scan(); //按键选择和识别
}
return 0;
}
2.4四则运算界面函数
void show(void)
{
static int cont = 0;
cont++;
system("cls"); //清屏
printf("**********************************************\n");
printf("* *\n");
printf("* 欢迎来到四则运算小游戏 *\n");
printf("* 第%d题 *\n",cont);
printf("**********************************************\n");
printf("**【+】 【-】 【*】 【/】 【0】 **\n");
printf("**********************************************\n");
printf("请选择:");
}
tips: ①system("cls"); 是库函数<stdlib.h>中的清屏函数,它的作用就是清除控制台窗口的内容。
②static 当 static 用于一个函数内部的局部变量时,这个变量的生命周期会被延长至整个程序的执行期间,而不是只在定义它的函数执行期间。同时,这个变量只会被初始化一次,即使包含它的函数被多次调用。
2.5按键选择和识别函数
void key_scan(void)
{
char key;
STAR:
key = getch();
switch(key)
{
case '+':printf("您选择的是加法运算!\n");Rules_Operation(key);break;
case '-':printf("您选择的是减法运算!\n");Rules_Operation(key);break;
case '*':printf("您选择的是乘法运算!\n");Rules_Operation(key);break;
case '/':printf("您选择的是除法运算!\n");Rules_Operation(key);break;
case '0':printf("正在退出程序!\n");exit(1);break;
default:printf("输入有误,请重新输入!\n");goto STAR;break;
}
}
tips: ①getch(); getch();的特点是它立即返回用户输入的字符,不需要用户按下回车键。
②exit(1); exit(1);用于退出程序
③goto STAR 跳转到标签STAR的地方继续执行代码
2.6运算规则函数
void Rules_Operation(char ru)
{
int data1,data2;
int user_data,sys_data;
char k;
static int score = 0;
static int n = 1;
//产生两个随机数
STAR:
data1 = get_randata();
data2 = get_randata();
if(ru=='/')
{
if(data2 == 0 || data1%data2!=0)
{
goto STAR;
}
}
//显示两个随机数,并提醒用户输入答案
printf("请计算:%d %c %d\n",data1,ru,data2);
printf("请输入您的答案:");
//scanf输入答案
scanf("%d",&user_data);
//根据用户输入 的运算符计算答案,并与用户输入的答案进行比较
if(ru=='+')
{
sys_data = data1 + data2;
}
else if(ru=='-')
{
sys_data = data1 - data2;
}
else if(ru=='*')
{
sys_data = data1 * data2;
}
else if(ru=='/')
{
sys_data = data1 / data2;
}
printf("正确答案是:%d\n",sys_data);
//显示用户输入的答案的正确与否
if(user_data==sys_data)
{
printf("恭喜你,回答正确\n");
score+=10;
printf("(第%d题)目前总得分:%d\n",n,score);
}
else
{
printf("很遗憾,回答错误\n");
score-=10;
printf("(第%d题)目前总得分:%d\n",n,score);
}
n++;
//询问是否继续
printf("是否继续,继续请按【y】或【Y】,退出请按【任意键】\n");
k = getch();
if(k!='y' && k!='Y')
{
//退出程序
exit(1);
}
}
tips:这里将2.1设计思路中④到⑦的内容都封装到了一个函数中
2.7获取随机数函数
int get_randata(void)
{
int number;
static int flag = 1;//保留之前的赋值,只用一个时间节点
if(flag==1)
{
srand((unsigned) time(NULL)); //用时间做种子,每次产生随机数不一样
flag = 0;
}
number = rand() % 100;
return number;
}
tips:①因为做的是100以内的四则运算,所以 %100
2.8函数声明
//函数声明
void show(void);
void key_scan(void);
void Rules_Operation(char ru);
int get_randata(void);
tips:放在预处理(2.1)下面
3.遇到的问题及解决方案
3.1
问 题:获取随机数每次出来都是同一个数
解决方案:通过锁标志位思想,用同一个时间起始节点
3.2
问 题:除法运算中,产生的随机数不一定可以整除,这就导致答案不一定正确
解决方案:增加判断语句,只有产生的两个随机数能够整除,程序才继续执行下去
四、整体代码
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
//函数声明
void show(void);
void key_scan(void);
void Rules_Operation(char ru);
int get_randata(void);
int main(void)
{
while(1)
{
show(); //界面
key_scan(); //按键选择和识别
}
return 0;
}
/*********************************************************
*函数名 :show
*函数功能 :四则运算界面函数
*函数参数 :无
*函数返回值:无
*函数描述 :【0】 退出功能
*程序版本 :v1.0
*********************************************************/
void show(void)
{
static int cont = 0;
cont++;
system("cls"); //清屏
printf("**********************************************\n");
printf("* *\n");
printf("* 欢迎来到四则运算小游戏 *\n");
printf("* 第%d题 *\n",cont);
printf("**********************************************\n");
printf("**【+】 【-】 【*】 【/】 【0】 **\n");
printf("**********************************************\n");
printf("请选择:");
}
/*********************************************************
*函数名 :key_scan
*函数功能 :按键选择和识别函数
*函数参数 :无
*函数返回值:无
*函数描述 :
*程序版本 :v1.0
*********************************************************/
void key_scan(void)
{
char key;
STAR:
key = getch();
switch(key)
{
case '+':printf("您选择的是加法运算!\n");Rules_Operation(key);break;
case '-':printf("您选择的是减法运算!\n");Rules_Operation(key);break;
case '*':printf("您选择的是乘法运算!\n");Rules_Operation(key);break;
case '/':printf("您选择的是除法运算!\n");Rules_Operation(key);break;
case '0':printf("正在退出程序!\n");exit(1);break;
default:printf("输入有误,请重新输入!\n");goto STAR;break;
}
}
/*********************************************************
*函数名 :Rules_Operation
*函数功能 :运算规则函数
*函数参数 :char ru
*函数返回值:无
*函数描述 :通过传入 + - * / 运算符 决定运算规则
*程序版本 :v1.0
*********************************************************/
void Rules_Operation(char ru)
{
int data1,data2;
int user_data,sys_data;
char k;
static int score = 0;
static int n = 1;
//产生两个随机数
STAR:
data1 = get_randata();
data2 = get_randata();
if(ru=='/')
{
if(data2 == 0 || data1%data2!=0)
{
goto STAR;
}
}
//显示两个随机数,并提醒用户输入答案
printf("请计算:%d %c %d\n",data1,ru,data2);
printf("请输入您的答案:");
//scanf输入答案
scanf("%d",&user_data);
//根据用户输入 的运算符计算答案,并与用户输入的答案进行比较
if(ru=='+')
{
sys_data = data1 + data2;
}
else if(ru=='-')
{
sys_data = data1 - data2;
}
else if(ru=='*')
{
sys_data = data1 * data2;
}
else if(ru=='/')
{
sys_data = data1 / data2;
}
printf("正确答案是:%d\n",sys_data);
//显示用户输入的答案的正确与否
if(user_data==sys_data)
{
printf("恭喜你,回答正确\n");
score+=10;
printf("(第%d题)目前总得分:%d\n",n,score);
}
else
{
printf("很遗憾,回答错误\n");
score-=10;
printf("(第%d题)目前总得分:%d\n",n,score);
}
n++;
//询问是否继续
printf("是否继续,继续请按【y】或【Y】,退出请按【任意键】\n");
k = getch();
if(k!='y' && k!='Y')
{
//退出程序
exit(1);
}
}
/*********************************************************
*函数名 :get_randata
*函数功能 :获取随机数函数
*函数参数 :无
*函数返回值:int
*函数描述 :产生100以内的随机数
*程序版本 :v1.0
*********************************************************/
int get_randata(void)
{
int number;
static int flag = 1;//保留之前的赋值,只用一个时间节点
if(flag==1)
{
srand((unsigned) time(NULL)); //用时间做种子,每次产生随机数不一样
flag = 0;
}
number = rand() % 100;
return number;
}
五、总结
这个四则运算小游戏项目是在他人带领下完成的,只是作为一个练手的实践项目,这里面用到了C语言基础中的基本数据类型,printf函数的使用,scanf函数的使用,运算符,结构化编程,函数。这并不是一个已经完全完善了的代码,需要补足的地方还有很多,如可以将四则法则打乱练习,也可以通过代码写入其他功能,你也可以根据自己需要写入合适的功能。
你们的支持和反馈对我来说非常重要。如果你有任何问题或建议,请通过私聊随时与我联系。别忘了点赞,收藏,关注哦!