实现“小学生算术题出题器”(第一次作业)

本次作业要求:(1)出题器可以随机出四则运算。(2)真分数的运算。以下为程序运行截图:

根据使用说明来输入整数题目的数量,以及分数题目的数量,这里分别以5道题为例。

如果回答正确就会提示“回答正确”,回答错误则会提示“回答错误”。所有题目全部回答完毕将会给出得分情况。

为了便于打印,将所有的算术题存到了文本中。

以上为该程序的内容和使用详情,以下为程序源代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int add(int);
int sub(int);
int mult(int);
int divi(int);
int max(int,int);
int gys(int,int);

int main()
{
FILE *fp;fp=fopen("count.txt","a+");
srand((unsigned)(time(NULL)));
int i,m,n;int answer,t,right=0,score=0;
printf("\t\t\t\t\t欢迎使用小学四则运算出题器\n使用说明:请根据提示输入题目的数量,需要多少道分数题。\n\t 整数除法题目如果存在余数请输入余数。\n\t 真分数计算题的答案先输入分子再输入分母。");
printf("\n请输出整数题目数量:\n");
scanf("%d",&n);
printf("\n请输入分数题目数量:\n");
scanf("%d",&t);
for(m=0;m<n;m++)                                                                                                           //整数计算
{
i=rand()%4+1;
switch(i)
{
case 1:answer=add(1);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
case 2:answer=sub(1);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
case 3:answer=mult(1);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
case 4:answer=divi(1);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
}
}
for(m=0;m<t;m++)                                                                                                              //分数计算
{
i=rand()%4+1;
switch(i)
{
case 1:answer=add(2);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");
break;
case 2:answer=sub(2);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
case 3:answer=mult(2);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
case 4:answer=divi(2);
if(answer==1){right++;score=score+10;printf("回答正确\n");}else printf("回答错误\n");break;
}
}
printf("共有%d道题,答对%d道,总得分:%d\n",n+t,right,score);            //输出
fclose(fp);
return 0;
}
int max(int a,int b){if(a>=b)return a;else return b;}                          //求最大值
int gys(int a,int b){if(a%b)return gys(b,a%b);return b;}                    //求最大公约数
int add(int q){ FILE *fp;fp=fopen("count.txt","a+");                                //加法
if(q==1){
srand((unsigned)(time(NULL)));
int a=rand()%100+1,b=rand()%100+1;int answer;
printf("%d + %d =",a,b);
fprintf(fp,"%d + %d =\n",a,b);
scanf("%d",&answer);
if(a+b==answer){return 1;}else return 0;}
if(q==2){
int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%13+1,c=rand()%13+1,d=rand()%15+1;
srand((unsigned)(time(NULL)));
x1=a+b-max(a,b);x2=max(a,b);x3=c+d-max(c,d);x4=max(c,d);
x=gys(x1,x2);x1=x1/x;x2=x2/x;x=gys(x3,x4);x3=x3/x;x4=x4/x;
printf("%d/%d + %d/%d =",x1,x2,x3,x4);
fprintf(fp,"%d/%d + %d/%d =\n",x1,x2,x3,x4);
scanf("%d",&e);scanf("%d",&f);                                                                                         //e为分子,f为分母
y=(x2*x4)/gys(x2,x4);                                                                                                     //同分分母 y
x=(x1)*y/x2+(x3)*y/x4;                                                                                                  //同分分子 x
z=gys(x,y);
if(z==1){if(x==e&&y==f)return 1;else return 0;}else if(x/z==e&&y/z==f)return 1;else return 0;
}
}
int sub(int q){int p;FILE *fp;fp=fopen("count.txt","a+");
if(q==1){
srand((unsigned)(time(NULL)));
int a=rand()%100+1,b=rand()%100+1;int answer;
if(a>b){printf("%d - %d =",a,b);}
else {p=a;a=b;b=p;{printf("%d - %d =",a,b);}}
fprintf(fp,"%d - %d =\n",a,b);
scanf("%d",&answer);
if(a-b==answer){return 1;}else return 0;}
if(q==2)
{
int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
srand((unsigned)(time(NULL)));
x1=a+b-max(a,b);x2=max(a,b);x3=c+d-max(c,d);x4=max(c,d);                              //x1是被减数分子,x2被减数分母,x3减数分子,x4减数分母
x=gys(x1,x2);x1=x1/x;x2=x2/x;x=gys(x3,x4);x3=x3/x;x4=x4/x;
x=gys(x2,x4);y=x1*x4/x;z=x3*x2/x;
if(y-z<0){x=x1;x1=x3;x3=x;x=x2;x2=x4;x4=x;}
printf("%d/%d - %d/%d =",x1,x2,x3,x4);
fprintf(fp,"%d/%d - %d/%d =\n",x1,x2,x3,x4);
scanf("%d",&e);scanf("%d",&f);                                                                         //e为分子,f为分母
y=(x2*x4)/gys(x2,x4);                                                                                     //通分分母 y
x=(x1)*y/x2-(x3)*y/x4;                                                                                   //通分分子 x
z=gys(x,y);
if(z==1){if(x==e&&y==f)return 1;else return 0;}else if(x/z==e&&y/z==f)return 1;else return 0;
}
}
int mult(int q)
{FILE *fp;fp=fopen("count.txt","a+");
if(q==1){
srand((unsigned)(time(NULL)));
int a=rand()%60+1,b=rand()%60+1;int answer;
printf("%d * %d =",a,b);
fprintf(fp,"%d * %d =\n",a,b);
scanf("%d",&answer);
if(a*b==answer)return 1;else return 0;}
if(q==2){
int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
srand((unsigned)(time(NULL)));
x1=a+b-max(a,b);x2=max(a,b);x3=c+d-max(c,d);x4=max(c,d);                         //x1是被乘数分子,x2被乘数分母,x3乘数分子,x4乘数分母
x=gys(x1,x2);x1=x1/x;x2=x2/x;x=gys(x3,x4);x3=x3/x;x4=x4/x;
printf("%d/%d * %d/%d =",x1,x2,x3,x4);
fprintf(fp,"%d/%d * %d/%d =\n",x1,x2,x3,x4);
scanf("%d",&e);scanf("%d",&f);                                                                        //e为分子,f为分母
y=x2*x4;                                                                                                       //通分分母 y
x=x1*x3;                                                                                                       //通分分子 x
z=gys(x,y);
if(z==1){if(x==e&&y==f)return 1;else return 0;}else if(x/z==e&&y/z==f)return 1;else return 0;
}
}
int divi(int q){FILE *fp;fp=fopen("count.txt","a+");
if(q==1){
srand((unsigned)(time(NULL)));
int a=rand()%40+1,b=rand()%20+1;int answer,re;
printf("%d / %d =",a,b);
fprintf(fp,"%d / %d =\n",a,b);
if(a%b==0){
scanf("%d",&answer);
if(a/b==answer)return 1;else return 0;}
else {scanf("%d",&answer);printf("余数为:");scanf("%d",&re); if(a/b==answer&&a%b==re)return 1;else return 0;}
}
if(q==2){
int e,f,x,y,z,x1,x2,x3,x4,a=rand()%15+1,b=rand()%15+1,c=rand()%15+1,d=rand()%15+1;
srand((unsigned)(time(NULL)));
x1=a+b-max(a,b);x2=max(a,b);x3=c+d-max(c,d);x4=max(c,d);                    //x1是被乘数分子,x2被乘数分母,x3乘数分子,x4乘数分母
x=gys(x1,x2);x1=x1/x;x2=x2/x;x=gys(x3,x4);x3=x3/x;x4=x4/x;
printf("(%d/%d) / (%d/%d) =",x1,x2,x3,x4);
fprintf(fp,"(%d/%d) / (%d/%d) =\n",x1,x2,x3,x4);
scanf("%d",&e);scanf("%d",&f);                                                                  //e为分子,f为分母
y=x2*x3;                                                                                                 //通分分母 y
x=x1*x4;                                                                                                 //通分分子 x
z=gys(x,y);
if(z==1){if(x==e&&y==f)return 1;else return 0;}else if(x/z==e&&y/z==f)return 1;else return 0;
}
}

时间: 2024-12-14 07:17:45

实现“小学生算术题出题器”(第一次作业)的相关文章

第一次作业:Linux 2.6.28进程模型与CFS调度器分析

第一次作业 1.摘要 本文主要针对Linux Kernel 2.6.28内核版本,描述了进程的概念以及调用过程. Linux Kernel源码查阅地址:https://elixir.bootlin.com/linux/v4.6/source/include/linux/types.h 2. 何谓进程 2.1 进程的概念 进程的一种官方定义: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,也是操作系统进行资源分配和调度的一个独立单位. 简而言之,进程是操作系统为正在运行的程序所建

第一次作业:关于Linux进程模型及CFS调度器分析

第一次作业内容 挑选一个开源的操作系统,深入源码分析其进程模型,具体包含如下内容: 操作系统是怎么组织进程的 进程状态如何转换(给出进程状态转换图) 进程是如何调度的 谈谈自己对该操作系统进程模型的看法 1. 前言 本文基于Linux Kernel 2.6.28 的源代码,分析本版本linux的进程模型和CFS调度器的基本算法. 源码浏览地址:https://elixir.bootlin.com/linux/v2.6.28/source 2. 进程 2.1 进程的定义 <计算机操作系统>这门课

软件工程管理——第一次作业

这是软件工程管理课第一次作业,也是我的第一篇随笔. 这篇随笔分为四个部分:1.自我介绍. 2.对这门课的期待. 3.第一周工作统计. 4.第一个小项目(词频统计与四则运算选其一). 一.自我介绍        我叫夏一鸣,是东北师范大学计算机科学与信息技术学院,计算机应用技术专业的研一学生.本科也是东北师大的,专业是计算机科学与技术.我来自湖北咸宁,是一个南方小伙,为人还算随和乐观,希望老师和同学们多多关照. 二.对这门课的期待        我想,大家之所以选了这门课,当然初衷都应该是想学到一

软件工程第一次作业补充

软件工程第一次作业的补充 对于作业"在一周之内快速看完<构建之法>,列出你不懂的5-10个问题". 作业要求有: (1)在每个问题后面,请说明哪一章节的什么内容引起了你的提问,提供一些上下文 (2)列出一些事例或资料,支持你的提问 (3)说说你提问题的原因,你说因为自己的假设和书中的不同而提问,还是不懂书中的术语,还是对推理过程有疑问,还是书中的描述和你的经验(直接经验或间接经验)矛盾? 例如:我看了这一段文字 (引用文字),有这个问题 (提出问题):我查了资料,有这些说法

第一次作业——四则运算小程序

这是第一次作业,而且是个人项目,说实话一开始得到作业还是很紧张的.虽然题目比较简单,但是由于自身动手能力很差,所以还是慌得要死. 经过思考和审题,我渐渐有了思路.四则运算主要的难点在于选取数是否是随机数而且是否能保证整数相除能否除尽. 一开始关于选取数是否随机我很苦恼,因为从前写程序变量基本都是自己赋值,没想到怎么随机取数.后来经过同学的点拨,我想到了随机选取函数.比如十以内的四则运算就将0-9赋给a1 再加1就变成1-10了.而保证除尽的问题也很快想到了解决方案,只需要添加一个判断两数相除记过

2015-2016-1 学期《软件工程》第一次作业【点评】--- 欢迎其他老师和同学补充

第一次作业全部批改结束,总体情况如下: (1) 部分同学是从网络上搜索资料,一个链接直接copy.--- 直接 0 分: (人数在2位数) (2) 部分同学是从网络上搜索资料,多个链接(信息来源)整合在一起.--- 视其整合的深度,给予10~50 分:(人数在2位数) (3) 极少数同学也借鉴了网络资料,但是结合自己的体会给出了相应的分析. --- 给予60~90 分:(人数在个位数) ==== 对同学们的建议: (1)引用资料时(特别是网络上一些网页)要注意其资料的真实性.权威性和时效性.典型

实时软件系统设计第一次作业

实时控制软件设计第一次作业 ABS系统: 简称:制动防抱死系统(antilock brake system). 作用:在汽车制动时,自动控制制动器制动力的大小,使车轮不被抱死,处于边滚边滑(滑移率在20%左右)的状态,以保证车轮与地面的附着力在最大值. 原理:在制动时,ABS根据每个车轮速度传感器传来的速度信号,可迅速判断出车轮的抱死状态,关闭开始抱死车轮上面的常开输入电磁阀,让制动力不变,如果车轮继续抱死,则打开常闭输出电磁阀,这个车轮上的制动压力由于出现直通制动液贮油箱的管路而迅速下移,防止

重新提交的作业相较于第一次作业的改进

由于对第一次作业的估计严重失误,导致周二上交的作业是极其不完整的程序,无法正确运行.经过两天的调试,修改了众多BUG以及算法上的不足.以下是修改的主要问题: 1. 栈溢出导致的崩溃:修改了结构体数组变量的相关初始化,大致计算并限定了各函数中变量数组的界限,解决了栈溢出的问题. 2.生成计算式:本程序采用的方法是根据参数计算一个种子,作为间隔,然后按序生成,从而可以较容易的避免产生相同的计算式 (1)该种子的选取一开始存在问题,计算种子的失误导致往往生成的式子无法达到数量要求. (2)操作数的生成

【助教】第一次作业成绩

当我第一次知道公布大家第一次作业的分数的时候,其实我是拒绝的!因为我觉得……呀……你不能叫我公开我马上就公开,第一,我要想一下,我又不想说,你公布分数之后以后加了很多水分,那效果DUANG……很炫!很亮!很与众不同!结果我的分数一出来童鞋们以后一定骂我,根本不公正!……我说先要给我试一下.后来我经过也知道他们是很好的,而且不会很偏激的到我博客来骂我对不对? 那我发了分数以后,起码我觉得还蛮公平的,我还把分数发给老师看了一下,童鞋们应该不会打我吧:) 下面公布第一次作业成绩: 说明: 1.按照老师