程序目的

用户进入程序,可根据程序提示选择加减乘除中的一个选项,程序根据用户所选类型自动生成两个数进行测试,用户输入答案。若答案正确,则计次并给予提示正确次数;若答案错误,则提示正确答案。完成后清除刚才题目,用户进行下一轮选择。

大致流程图如下:

此文章只详细讲解较难部分。

程序目的

程序说明

菜单

判断选项

生成约束

产生数字

符合约束

答案计算

显示算式

核实答案及其之后操作

整体代码


程序说明

菜单

菜单就是简单的输出函数即可,为了美观可适当加入\t、\n及星号(*)

判断选项

按照要求,选项0代表退出,1、2、3、4分别代表加、减、乘、除法。若用户输入非0,1,2,3,4的数字,则提示让用户重新输入选项并让用户重新输入选项再次进行判断。这里只需要使用while就行了,用个if进行判断,符合条件退出循环即可。此功能代码片段如下:

 while(1){Pr();            //此为菜单输出函数,未定义不可直接使用,后有介绍Sc();            //此为选项输出函数,未定义不可直接使用,后有介绍scanf("%d",&choice);if(choice<0||choice>4)         //即非0,1,2,3,4{printf("请重新输入正确选项!");sleep(500);                    //延时0.5s,未定义不可直接使用,后有介绍system("CLS");                 //清屏}elsebreak;                        //若为0,1,2,3,4跳出循环}

生成约束

加法和乘法对生成的数字没有任何要求,只有减法和除法有。减法:被减数不能小于减数;除法:除数不能为0。此处需要根据选项来进行判断,故此处使用了一个自定义函数,先让返回参数赋值为0,如果有不符合条件的随机数产生,则令返回值为1。这里返回值为1是有原因的:后面判断产生数字是否合乎约束时,会使用到do-while语句,如果符合条件,那么返回值为0,do-while接收到的条件为0,则不会进行第二次赋值,直接进行计算步骤;反之则进行第二次赋值并进行第二次判断,如此进行下去,直到返回值为0为止。此处功能代码片段如下:

int pb(float a,float b,int choice)
{
int x=0;
if(choice==2){if(a<b)        //若是减法,被减数比减数小x=1;           //令返回值为1}else if(choice==4){if(b==0)        //若是除法,除数为0x=1;            //令返回值为1}
return x;               //返回x至主函数
}

产生数字

数字的产生用的一个简单的随机赋值函数rand,子函数代码如下:

int Fz()
{
int a,b;
static int c=0;            //定义静态变量c    静态变量仅第一次使用时会执行赋值srand((int)time(0));      //初始化
a=rand()%10;
b=rand()%10;
c++;
if(c%2==0)
return a;                //这里是如果c为偶数,则返还a,否则返还b
else                     //因为c为静态变量,所以只要不是重新使用Fz()函数,c都会一直加下去
return b;                //这样返还a后下一次必反还b
}

关于静态变量,可查阅相关文章,作者对此了解尚浅,不便做过多解释。

符合约束

上边已产生两个数字,接下来则应该根据方才产生的约束判断两个数字是否符合约束条件,如果不符合,令其重新生成两个新的随机数。此处可用do-while语句解决(此处我的程序不可使用while语句)在程序代码里有相应解释。子函数代码如下:

int pb(float a,float b,int choice)
{                        //经过分析,只有在选项为2或4的时候有相应约束
int x=0;                 //所以只需要在选项为2或4时进行相应判断即可
if(choice==2)            {if(a<b)          //选项为2,代表减法,要求被减数大于除数,程序里,a在运算符前,为被减数x=1;}else if(choice==4){if(b==0)        //选项为4,代表除法,要求除数不能为0,程序里b在运算符后,为除数x=1;}
return x;
}

产生数字和符合约束的整体代码如下:

    do{a=Fz();b=Fz();}while(pb(a,b,choice));
/*
因为Fz里面的c为静态变量,c不会因为重新使用Fz而被重新赋值,除非重启所有程序,否则其会按照
0,1,2,3,4……这个顺序一直加下去。do里面有两个Fz,所以它始终可以把产生的第一个数给a,第二
个数给b
*/
/*
这里为什么用do-while而不用while:首先,while里面的a,b隶属于主函数里面的a,b,而while的运
行是先进行判断再执行循环体,这样的话就会导致a,b还没有初始值就被引用来进行判断,程序在运行时
便会出现问题;而do-while是先执行一次循环体再进行判断,执行一次循环体后,a与b都有了相应的值,
此时再拿去进行判断就不会出现问题
*/

答案计算

这一步在流程图里没画出来,但这一步必不可少。我将其安放在符合约束之后,即只要符合约束便直接进行运算,将正确答案存储在主函数的c内。子函数代码如下:

float count(float x,float y,int z)
{
float c;
if(z==0)
exit(0);
if(z==1)
c=pltr(x,y);
if(z==2)
c=sutr(x,y);
if(z==3)
c=mutr(x,y);
if(z==4)
c=ditr(x,y);return c;
}float pltr(float x,float y)    //加
{
float z;
z=x+y;
return z;
}float sutr(float x,float y)    //减
{
float z;
z=x-y;
return z;
}float mutr(float x,float y)    //乘
{
float z;
z=x*y;
return z;
}float ditr(float x,float y)    //除
{
float z;
z=(int)(((x*1.0)/y+0.005)*100)/100.0;    //此步为四舍五入保留两位小数,题中直接给出
return z;                                //暂不明白其原理
}

显示算式

这个应该不需要多说,子函数代码如下:

void Gs(float x,float y,int z)
{if(z==1)printf("%.0f+%.0f=",x,y);if(z==2)printf("%.0f-%.0f=",x,y);if(z==3)printf("%.0f×%.0f=",x,y);if(z==4)printf("%.0f÷%.0f=",x,y);
}    //%.0f代表浮点型,保留0位小数,类似用法还有%.2f,表示浮点型保留两位小数

核实答案及其之后操作

这个直接用if语句则能完成。清屏操作涉及的头文件为:<stdlib.h>和延时程序涉及的头文件为:<time.h>。由于作者了解较少,具体使用方法可参考其他文章。

整体代码

#include<stdio.h>
#include<time.h>
#include<conio.h>
#include<stdlib.h>void Pr();
int sleep(unsigned long x);    //休眠(延时)语句
float pltr(float x,float y);    //加
float sutr(float x,float y);    //减
float mutr(float x,float y);    //乘
float ditr(float x,float y);    //除
float count(float x,float y,int z);    //计算正确答案
int Fz();                   //初始赋值
int pb(float a,float b,int choice); //赋值判别,返回1需重新赋值
void Sc();                          //输出
void Gs(float x,float y,int z);     //公式输出
void Jg(float c,int z);             //结果输出 int main()
{
int n=0,choice;
float a,b,c,d=0;               //c为正确答案,d为用户输入答案
while(1){while(1){Pr();Sc();scanf("%d",&choice);if(choice<0||choice>4){printf("请重新输入正确选项!");sleep(500);system("CLS");}elsebreak;}do{a=Fz();b=Fz();}while(pb(a,b,choice));c=count(a,b,choice);printf("\t\t\t");Gs(a,b,choice);scanf("%f",&d);if(c==d){n++;printf("\n\t\t\t恭喜你回答正确!");printf("\n\t\t\t你已经回答正确%d道。",n);}else{printf("\n\t\t\t很遗憾你回答错误!");printf("\n\t\t\t正确答案为:");Gs(a,b,choice);Jg(c,choice);}
sleep(1000);
system("CLS");
}
}void Pr()
{
printf("\t\t\t\t\t\t欢迎进入训练系统\n");
printf("\t\t\t\t*************************");
printf("******************************\n");
printf("\t\t\t\t\t0、退出\t1、加法\t2、减法\t3、乘法\t4、除法");
printf("\n\t\t\t\t");
for(int i=0;i<55;i++)
printf("*");
}int Fz()
{
int a,b;
static int c=0;srand((int)time(0));
a=rand()%10;
b=rand()%10;
c++;
if(c%2==0)
return a;
else
return b;
}int pb(float a,float b,int choice)
{
int x=0;
if(choice==2){if(a<b)x=1;}else if(choice==4){if(b==0)x=1;}
return x;
}void Sc()
{printf("\n\t\t\t\t\t请输入选项:");
}float count(float x,float y,int z)
{
float c;
if(z==0)
exit(0);
if(z==1)
c=pltr(x,y);
if(z==2)
c=sutr(x,y);
if(z==3)
c=mutr(x,y);
if(z==4)
c=ditr(x,y);return c;
}int sleep(unsigned long x)
{                           clock_t start=clock(); clock_t end;            do{if ((end=clock())==(clock_t)-1){return 0;}} while(1000*(end-start)/CLOCKS_PER_SEC<x); return 1;
}void Gs(float x,float y,int z)
{if(z==1)printf("%.0f+%.0f=",x,y);if(z==2)printf("%.0f-%.0f=",x,y);if(z==3)printf("%.0f×%.0f=",x,y);if(z==4)printf("%.0f÷%.0f=",x,y);
}void Jg(float c,int z)
{
if(z==4)
printf("%.2f",c);
else
printf("%.0f",c);
}float pltr(float x,float y)
{
float z;
z=x+y;
return z;
}float sutr(float x,float y)
{
float z;
z=x-y;
return z;
}float mutr(float x,float y)
{
float z;
z=x*y;
return z;
}float ditr(float x,float y)
{
float z;
z=(int)(((x*1.0)/y+0.005)*100)/100.0;
return z;
}

[C语言]加减乘除训练系统相关推荐

  1. C语言课程训练系统题-字符串cqupt

    C语言课程训练系统题-字符串cqupt 1.十进制转换十六进制 2.比较两个字符串的大小 3.输出最长的字符串 4.统计一个字符串在另外一个字符串出现的次数 5.有趣的"回文"检测 ...

  2. C语言课程训练系统题-二维数组cqupt

    C语言课程训练系统题-二维数组cqupt 1.杨辉三角 2.输出每列最小值 3.一个n位正整数如果等于它的n个数字的n次方和,该数称为n位自方幂数.设计求3~6位自方幂数 4.有如下3*4的矩阵,求出 ...

  3. C语言oj学生成绩输入和输出,『ACM入门』蓝桥杯ACM训练系统基本输入输出教程

    在介绍训练场的OJ系统之前,首先为大家介绍一下ACM: ACM原代表美国计算机协会,因其举办的ICPC即国际大学生程序设计竞赛而闻名全世界,此项赛事要求学生的在五小时内解决全英文问题,并在效率和速度以 ...

  4. r语言必学的十个包肖凯_家长专栏自闭症儿童语言康复训练

    自闭症是一种广泛意义上的发育障碍,在儿童当中较为常见.自闭症的一种重要表现就是语言能力障碍和表达能力障碍.语言又是建立人际关系.认识世界.表达情感的最主要方式和途径,自闭症儿童存在的语言障碍在某种程度 ...

  5. 语言 物品竞拍系统_【优加答疑】没有语言的孩子,该如何沟通?

    在前面的文章里,我们讲到了适合有少许语言发展孩子的语言行为教学方法--仿说,来帮助孩子逐渐发出更多的音.词甚至是句子. 然而,有些孩子无论家长想尽各种办法给孩子上口肌课上言语课上各种各样的课,但是效果 ...

  6. 垂直领域出海,多语言预训练好使吗?

    ©PaperWeekly 原创 · 作者|刘世兴.程任清 单位|腾讯游戏知几AI团队 研究方向|自然语言处理 简介 垂直领域业务出海,往往面临着新语种.低资源语言数据不足等多语言挑战,其中一条技术路线 ...

  7. 船员能力评估计算机软件系统,船舶动力电力训练系统操作水平综合评估算法研究...

    摘要: 近年来随着航运事业的不断发展,航海专业技术人员的需求量持续增大,培养大量高质量的船员对于保证船舶航行的安全性和经济性具有重要意义.传统的实船操作训练评估方法受到资源有限.安全性较低以及人力评估 ...

  8. 【阅读笔记】技术前沿(视觉-语言预训练、能量模型)

    1. 视觉-语言预训练 (Vision-Language Pre-training,VLP) 预训练模型,生成图像标注,视觉问答 - 模型角度,基于编码器-解码器的模型在「图文检索」task中尚未成功 ...

  9. 南加州大学钱学海:去中心化分布式训练系统的最新突破

    2020 北京智源大会 本文属于2020北京智源大会嘉宾演讲的整理报道系列.北京智源大会是北京智源人工智能研究院主办的年度国际性人工智能高端学术交流活动,以国际性.权威性.专业性和前瞻性的" ...

最新文章

  1. PHOTOSHOP 快捷键
  2. 戳破微服务的七大谎言
  3. rabbitmq可靠性投递_解决RabbitMQ消息丢失问题和保证消息可靠性(一)
  4. Linux赋予普通用户root权限
  5. Pytorch基础(三)—— DataSet的应用
  6. 纵横公路造价软件学习_通辽分公司组织开展2020年 养护工程造价预算培训
  7. 使用CAJViewer 提取PDF文件中的文字
  8. C++标准转换运算符:const_cast
  9. jquery------导入jquery.2.2.3.min.js
  10. JS中的函数,Array对象,for-in语句,with语句,自定义对象,Prototype
  11. Linux工具篇 | Linux下安装repo工具
  12. Mysql各个大版本之间的区别
  13. php集成square功能(使用square/connect)
  14. 无线wifi网络企业微信认证解决方案
  15. 微信小程序轨迹回放实现及遇到的坑
  16. 如何解决浏览器的兼容性
  17. 华为手机安装Goole play教程及安装包
  18. 【WMCA】《Biometric Face Presentation Attack Detection with Multi-Channel Convolutional Neural Network》
  19. 五款经典GPRS无线上网卡比拼
  20. 2023年EasyRecovery数据恢复还会收费吗?

热门文章

  1. 带领团队,必须牢记这些
  2. HTML发展史及登录页面的开发
  3. 虚拟机链接克隆和完整克隆区别
  4. 北京BigData好程序员京东云共建北京首期开班
  5. 学习笔记 Java_ch03_封装 2014.7.22
  6. flex:1; 到底代表什么
  7. 2018年四川理工学院软件工程考试大纲(软件工程概述)
  8. gff文件_GFF文件格式说明
  9. Ray实例-乒乓球训练学习
  10. IT十八掌Java基础 网络编程