关于用C语言写了程序给小学生出数学计算题的这件事
编程环境:Cygwin64
所用IDE: JetBrains CLion 2022.2.4
卷首语
写程序给小学生出几道数学题,这个想法对我来说,的确有点离谱。小学生的计算题基本上都是四则运算(加、减、乘、除)。要不就写个这样的程序给小学生出题。(小学生:楼主,我真的会谢!)
此处已经定义了几个全局变量
int a, b; //a,b分别是两个操作数
int answer; //用户输入的答案
int right = 0; //正确的题目数量
int c = 10; //出多少以内的计算题
int number; //自定义出题个数
int op; //菜单选项
目录
输出菜单
首先是打印菜单,我已经给这个菜单给了五个选项,前三个选项是固定出10道、20道和100道,第四项是自定义出题数目的,最后一项就是退出程序。不过,菜单可以设计成这样。
void nemuPrint() {// 打印菜单printf("==========菜单==========\n");printf("=1. 出10道题 =\n");printf("=2. 出20道题 =\n");printf("=3. 出100道题 =\n");printf("=4. 自定义出题数目 =\n");printf("=0. 退出程序 =\n");printf("=======================\n");
}
别问,问就是这样设计的。
出题和答题
出题
循环出题:
for (int i = 1; i <= number; i++) {switch (rand() % 4) {case 0: //加ADD();break;case 1: //减Sub();break;case 2: //乘Time();break;case 3: //除Div();break;}}
注:number是要出题的题目数量。
既然是给小学生出题,那就是随机出题目。不过,既然是电脑自己给小学生出题,两个要运算的数必须是随机的,不过我把范围地都设定成了0~30的随机整数,即rand()%31(注:x被31除的余数的范围是0~30)。不过,要是真的随机出题话,需要用srand()函数来获取随机种子。(注:这两个函数都在在stdlib.h头文件中)。
对于加法题目和乘法题目来说,基本上是没有限定的。
srand(time(NULL));
a = rand() % (c + 1);
b = rand() % (c + 1);
printf("%d+%d=", a, b);
对于乘法题目,仅需把
+改成*即可。
对于减法的算式题目来说,这里要求被减数要大于或等于减数,比如15-4,而不是4-15,右边算出来的是一个负数。然而,随机数的确很随机,不知道被减数比减数谁大谁小,所以就出了个循环:当被减数大于或等于减数时,终止这个循环:
srand(time(NULL));
do {a = rand() % (c + 1);b = rand() % (c + 1);
} while (a < b);
printf("%d-%d=", a, b);
除法的题目要求就一样了:
- 被除数必须大于除数,且被除数必须要被除数整除,不能出现:类似7/8或14/4这样的式子;
- 除数不难为零,不能出现类似0/0的式子
对此,也出了个循环:当被除数和除数满足上面的要求时,终止这个循环:
srand(time(NULL));
do {a = rand() % (c + 1);b = rand() % (c + 1);
} while (a < b || a % b != 0 || b == 0);
printf("%d/%d=", a, b);
答题
scanf("%d", &answer);
if (a + b == answer) {printf("正确\n");right++;
} else {printf("错误\n");
}
此外以加法为例:当用户输入答案时,如果答案正确,则输出正确,并right上+1;否则就输出错误。(减、乘、除同理,仅需把加号改成-、*、/即可。
判分
当测试结束时,输出测试结果。如果需要退出测试的时候,可以按零跳出循环以退出测试,输入非零数的时候就重新测试。
printf("本次测试结束\n");
printf("本次测试一共有%d题,你答对了%d题\n",number,right);
printf("是否重新测试?按0退出");
scanf("%d", &op);
if(op==0){printf("感谢使用");break;
} else right = 0;
总代码
以下代码仅供参考。
//
// Created by admin on 2022/10/31.
//
#include
#include //随机数
#include //更改种子//全局变量
int a, b; //a,b分别是两个操作数
int answer; //用户输入的答案
int right = 0; //正确的题目数量
int c = 10; //出多少以内的计算题
int number; //自定义出题个数
int op; //菜单选项void nemuPrint() {// 打印菜单printf("==========菜单==========\n");printf("=1. 出10道题 =\n");printf("=2. 出20道题 =\n");printf("=3. 出100道题 =\n");printf("=4. 自定义出题数目 =\n");printf("=0. 退出程序 =\n");printf("=======================\n");
}// 加法题目
void ADD() {srand(time(NULL));a = rand() % (c + 1);b = rand() % (c + 1);printf("%d+%d=", a, b);scanf("%d", &answer);if (a + b == answer) {printf("正确\n");right++;} else {printf("错误\n");}
}// 减法题目
void Sub() {srand(time(NULL));do {a = rand() % (c + 1);b = rand() % (c + 1);} while (a < b);printf("%d-%d=", a, b);scanf("%d", &answer);if (a - b == answer) {printf("正确\n");right++;} else {printf("错误\n");}
}//乘法题目
void Time() {srand(time(NULL));a = rand() % (c + 1);b = rand() % (c + 1);printf("%d*%d=", a, b);scanf("%d", &answer);if (a * b == answer) {printf("正确\n");right++;} else {printf("错误\n");}
}//除法题目
void Div() {srand(time(NULL));do {a = rand() % (c + 1);b = rand() % (c + 1);} while (a < b || a % b != 0 || b == 0);printf("%d/%d=", a, b);scanf("%d", &answer);if (a / b == answer) {printf("正确\n");right++;} else {printf("错误\n");}
}//出题的,number是出题的个数
void Give(int number) {printf("本次出题数量是%d题,请按回车键开始\n", number);getchar();for (int i = 1; i <= number; i++) {switch (rand() % 4) {case 0:ADD();break;case 1:Sub();break;case 2:Time();break;case 3:Div();break;}}
}// 输出结果void fuck(){while (1) {nemuPrint();printf("请输入功能所在的序号");scanf("%d", &op);if(op == 0) {printf("感谢使用");break;}else {switch (op) {case 1:number = 10;Give(number);break;case 2:number = 20;Give(number);break;case 3:number = 100;Give(number);break;case 4:printf("请输入你要出题的个数:");scanf("%d", &number);Give(number);break;}printf("本次测试结束\n");printf("本次测试一共有%d题,你答对了%d题\n",number,right);printf("是否重新测试?按0退出");scanf("%d", &op);if(op==0){printf("感谢使用");break;} else right = 0;}}
}int main() {fuck();return 0;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
