第一次作业 -- 四则运算题目生成
今天老师布置了一个作业,要求写一个小学生题目的生成程序。对于我们来说题目可能很简单,但是,做出这样的程序却不像想的那样简单。
首先是整数的加减法,加法无需控制,只需要生成两个随机数连同加号输出即可;对于减法,按要求可以选择是否出现负的结果,当结果不为负数时,应控制减数被减数使结果为正。具体过程如下:
if(!negative){ //negative:减法结果控制变量 1:结果可负 0:结果为正 if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } printf("%d - %d = ?\n",op1 ,op2); }else{ printf("%d - %d = ?\n",op1 ,op2); }
接下来是乘除法,乘法无需控制,除法时,应可以根据输入控制除法的结果是否出现余数,选择整除时,根据乘法进行调整,将乘法的结果作为被除数输出,具体过程如下:
if(!remainder){ //remainder 除法结果控制变量 1:不整除 0:整除 while(op1 * op2 > 100){ if(op1 > op2){op1 /= 2;}else{op2 /= 3;} } printf("%d / %d = ?\n",op1*op2, op1); }else{ printf("%d / %d = ?\n",op1 ,op2); }
其次是真分数的四则运算,我的做法是生成四个随机数,两两组合作为一个分数,小的作为分子,运用如下函数求出两数的最大公约数进行约分
int factor(int op1, int op2){ int n = op2; while(n>=0){ if(op1%n==0 && op2%n==0) return n; n--; } }
这里只有减法需要控制,为避免麻烦直接将真分数减法的结果处理为正,代码如下:
a = float(op2)/float(op1); b = float(op4)/float(op3); if(a-b < 0){ printf("%d/%d - %d/%d = ?\n",op2,op1,op4,op3); }else{ printf("%d/%d - %d/%d = ?\n",op4,op3,op2,op1); }
最后需要注意的就是模式的控制,这里我用到了随机数,使产生的题目不至于过于单一和重复,代码如下,creat会根据type值的不同生成不同的题目
void build(int num , int flag){ //flag 1整数 2分数 3 整+分 int type; int op1, op2, op3, op4; srand((unsigned) time(NULL)); for(int i=0; i<num; i++){ op1 = rand() % 99 +1; op2 = rand() % 99 +1; op3 = rand() % 99 +1; op4 = rand() % 99 +1; type = rand() % 4; if(2 == flag) type += 4; if(3 == flag) type += (rand()%5); printf("%d. \t",i+1); creat(op1,op2,op3,op4,type); } void creat(int op1, int op2, int op3, int op4, int mode){//mode: 0:加法判断 1:减法判断 2:乘法判断 3:除法判断 4:分数加法 5:分数减法 6:分数乘法 7:分数除法 }
程序截图:
代码清单:
#include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数 /********************配置**********************/ int negative = 0; // 减法是否有负数 0/1 int remainder = 0;//除法是否可以有余数 0/1 int number; //题目数量 /********************配置**********************/ int factor(int op1, int op2){ int n = op2; while(n>=0){ if(op1%n==0 && op2%n==0) return n; n--; } } void creat(int op1, int op2, int op3, int op4, int mode){//mode: 0:加法判断 1:减法判断 2:乘法判断 3:除法判断 4:分数加法 5:分数减法 6:分数乘法 7:分数除法 int temp; switch(mode) { case 0:{ printf("%d + %d = ?\n", op1, op2); } break; case 1:{ if(!negative){ //negative:减法结果控制变量 1:结果可负 0:结果为正 if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } printf("%d - %d = ?\n",op1 ,op2); }else{ printf("%d - %d = ?\n",op1 ,op2); } } break; case 2:{ printf("%d * %d = ?\n",op1,op2); } break; case 3:{ if(!remainder){ //remainder 除法结果控制变量 1:不整除 0:整除 while(op1 * op2 > 100){ if(op1 > op2){op1 /= 2;}else{op2 /= 3;} } printf("%d / %d = ?\n",op1*op2, op1); }else{ printf("%d / %d = ?\n",op1 ,op2); } } break; case 4:{ if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } if(op3 < op4){ temp = op3; op3 = op4; op4 = temp; } op1 /= factor(op1,op2); op2 /= factor(op1,op2); op3 /= factor(op3,op4); op4 /= factor(op3,op4); printf("%d/%d + %d/%d = ?\n",op2,op1,op4,op3); } break; case 5:{ float a,b; if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } if(op3 < op4){ temp = op3; op3 = op4; op4 = temp; } op1 /= factor(op1,op2); op2 /= factor(op1,op2); op3 /= factor(op3,op4); op4 /= factor(op3,op4); a = float(op2)/float(op1); b = float(op4)/float(op3); if(a-b < 0){ printf("%d/%d - %d/%d = ?\n",op2,op1,op4,op3); }else{ printf("%d/%d - %d/%d = ?\n",op4,op3,op2,op1); } } break; case 6:{ if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } if(op3 < op4){ temp = op3; op3 = op4; op4 = temp; } op1 /= factor(op1,op2); op2 /= factor(op1,op2); op3 /= factor(op3,op4); op4 /= factor(op3,op4); printf("%d/%d * %d/%d = ?\n",op2,op1,op4,op3); } break; case 7:{ if(op1 < op2){ temp = op1; op1 = op2; op2 = temp; } if(op3 < op4){ temp = op3; op3 = op4; op4 = temp; } op1 /= factor(op1,op2); op2 /= factor(op1,op2); op3 /= factor(op3,op4); op4 /= factor(op3,op4); printf("%d/%d / %d/%d = ?\n",op2,op1,op4,op3); } break; } } void build(int num , int flag){ //flag 1整数 2分数 3 整+分 int type; int op1, op2, op3, op4; srand((unsigned) time(NULL)); for(int i=0; i<num; i++){ op1 = rand() % 99 +1; op2 = rand() % 99 +1; op3 = rand() % 99 +1; op4 = rand() % 99 +1; type = rand() % 4; if(2 == flag) type += 4; if(3 == flag) type += (rand()%5); printf("%d. \t",i+1); creat(op1,op2,op3,op4,type); } } int main() { char choice; int flag; printf("------------------100以内四则运算生成器------------------\n"); printf("请选择出题模式 1:整数; 2:分数; 3:整数+分数;\n"); scanf("%d", &flag); printf("减法运算结果是否可以为负数?(y/n)\n"); fflush(stdin); choice = getchar(); if('y' == choice) negative = 1; printf("整数除法运算结果是否可有余数?(y/n)\n"); fflush(stdin); choice = getchar(); if('y' == choice) remainder = 1; printf("请输入题目数量\n"); scanf("%d",&number); printf("dangdangdangdang!!! \n题目如下:\n\n"); build(number, flag); printf("\n\n\n输入任意字符结束\n"); fflush(stdin); scanf("%c",&choice); return 0; }