第一次作业 -- 四则运算题目生成

  今天老师布置了一个作业,要求写一个小学生题目的生成程序。对于我们来说题目可能很简单,但是,做出这样的程序却不像想的那样简单。

  首先是整数的加减法,加法无需控制,只需要生成两个随机数连同加号输出即可;对于减法,按要求可以选择是否出现负的结果,当结果不为负数时,应控制减数被减数使结果为正。具体过程如下:

if(!negative){ //negative:减法结果控制变量 1:结果可负 0:结果为正
  if(op1 < op2){
  temp = op1;
  op1 = op2;
  op2 = temp;
  }
  printf("%d - %d = ?
",op1 ,op2);
  }else{
  printf("%d - %d = ?
",op1 ,op2);
}
减法

接下来是乘除法,乘法无需控制,除法时,应可以根据输入控制除法的结果是否出现余数,选择整除时,根据乘法进行调整,将乘法的结果作为被除数输出,具体过程如下:

if(!remainder){ //remainder 除法结果控制变量 1:不整除 0:整除
  while(op1 * op2 > 100){
  if(op1 > op2){op1 /= 2;}else{op2 /= 3;}
  }
  printf("%d / %d = ?
",op1*op2, op1);
  }else{
  printf("%d / %d = ?
",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 = ?
",op2,op1,op4,op3);
}else{
  printf("%d/%d - %d/%d = ?
",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. 	",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 = ?
", op1, op2);

      }
      break;
    case 1:{
      if(!negative){ //negative:减法结果控制变量 1:结果可负 0:结果为正
        if(op1 < op2){
          temp = op1;
          op1 = op2;
          op2 = temp;
        }
          printf("%d - %d = ?
",op1 ,op2);
        }else{
          printf("%d - %d = ?
",op1 ,op2);
        }
      }
      break;
    case 2:{
      printf("%d * %d = ?
",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 = ?
",op1*op2, op1);
      }else{
        printf("%d / %d = ?
",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 = ?
",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 = ?
",op2,op1,op4,op3);
      }else{
        printf("%d/%d - %d/%d = ?
",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 = ?
",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 = ?
",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. 	",i+1);
    creat(op1,op2,op3,op4,type);
  }
}

int main()
{
  char choice;
  int flag;
  printf("------------------100以内四则运算生成器------------------
");
  printf("请选择出题模式 1:整数; 2:分数; 3:整数+分数;
");
  scanf("%d", &flag);
  printf("减法运算结果是否可以为负数?(y/n)
");
  fflush(stdin);
  choice = getchar();
  if('y' == choice)
    negative = 1;
  printf("整数除法运算结果是否可有余数?(y/n)
");
  fflush(stdin);
  choice = getchar();
  if('y' == choice)
    remainder = 1;
  printf("请输入题目数量
");
  scanf("%d",&number);
  printf("dangdangdangdang!!! 
题目如下:

");
  build(number, flag);
  printf("


输入任意字符结束
");
  fflush(stdin);
  scanf("%c",&choice);
  return 0;
}
完整代码
原文地址:https://www.cnblogs.com/lishida/p/5266421.html