zoukankan      html  css  js  c++  java
  • 第一次作业 -- 四则运算题目生成

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

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

    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;
    }
    完整代码
  • 相关阅读:
    需求分析的方法与实践
    系统架构分析与设计方法论
    装修-3
    装修-2
    装修-1
    daikuan
    JAVA容器全面总结
    超图8C iserver启动成功,访问不了网站localhost:8090/iserver/manager,显示404
    Arcgis中给字段添加属性域
    arcgis for server搭建集群环境
  • 原文地址:https://www.cnblogs.com/lishida/p/5266421.html
Copyright © 2011-2022 走看看