编程:四则运算题目生成器

题目:编写一个能自动生成小学四则运算题目的程序,要求在支持1至100的整数的加减乘除的基础上也支持真分数的加减乘除

个人编写的代码:

  1 #include<iostream>
  2 #include<ctime>
  3 #include<strstream>
  4 #include<stdlib.h>
  5 #include<string>
  6 using namespace std;
  7 int flag = 1;//全局变量,
  8 int function(int n)//随机生成1至n的整数
  9 {
 10     int random;
 11     int low = 1, high = n;
 12     if (flag)
 13     {
 14         flag = 0;
 15         srand((unsigned)time(NULL));//种子
 16     }
 17     random = rand()% (high - low+1) + low;//生成随机数
 18     return random;
 19     
 20 }
 21 int max(int a, int b)//返回两个整数中较大的整数
 22 {
 23     int h=a >=b ? a : b;
 24     return h;
 25 }
 26 int min(int a, int b)//返回两个整数中较小的整数
 27 {
 28     int l = a <=b ? a : b;
 29     return l;
 30 }
 31 string fraction()//生成真分数
 32 {
 33     int temp1 = function(100);//调用function函数随机生成两个随机整数
 34     int temp2 = function(100);
 35     int high = min(temp1, temp2);//比较两个整数的大小,其中较大的整数做分母,较小的整数做分子
 36     int low = max(temp1, temp2);
 37     strstream tra,ss;//将分子分母从int型转换为string型
 38     string up, down;
 39     tra << high;
 40     tra >> up;
 41     ss << low;
 42     ss >> down;
 43     string fra;
 44     high != low ? fra = up + "\\" + down : fra = 1;//将分子分母连接成真分数
 45     return fra;
 46 }
 47 int main()
 48 {
 49     int integer1, integer2;
 50     string first, second;//四则运算的第一个运算数和第二个运算数
 51     int ch1, ch2, ch3;//switch语句的选项
 52     char sign;//运算符号
 53     int times = 30;//题目数
 54     for (int i = 1;i <= times;i++)
 55     {
 56         ch1 = function(4);//随机生成运算符号
 57         switch (ch1)
 58         {
 59         case 1:sign = '+';break;
 60         case 2:sign = '-';break;
 61         case 3:sign = '*';break;
 62         case 4:sign = '/';break;
 63         default:cout << "有错误!" << endl;break;
 64         }
 65         ch2 = function(3);//四则运算题目的三种情况
 66         switch (ch2)
 67         {
 68         case 1://整数和整数
 69         {
 70             strstream ss, cc;
 71             integer1 = function(100);
 72             ss << integer1;
 73             ss >> first;
 74             integer2 = function(100);
 75             cc << integer2;
 76             cc >> second;
 77         }break;
 78         case 2://整数和真分数
 79         {
 80             strstream kk;
 81             integer1 = function(100);
 82             kk << integer1;
 83             kk >> first;
 84             second = fraction();
 85         }break;
 86         case 3://真分数和真分数
 87         {
 88             first = fraction();
 89             second = fraction();
 90         }break;
 91         default:cout << "有错误!" << endl;break;
 92         }
 93         ch3 = function(2);//输出的两种情况
 94         switch (ch3)
 95         {
 96         case 1:cout <<"("<< first <<")"<< sign << "("<<second<<")" << "=" << endl;break;
 97         case 2:cout << "(" << second << ")" << sign << "(" << first<< ")" << "=" << endl;break;
 98         default:cout << "有错误!" << endl;break;
 99         }
100     }
101     
102 
103     system("pause");
104     return 0;
105 }

 

结果截图:

编程:四则运算题目生成器_第1张图片

设计思路:

step 1:构造可以生成随机数范围为:[1,n]的随机数生成函数 int function(int n)

step 2 : 先构造比较两个整数大小的函数max()和min(),在通过调用这两个函数来生成真分数的函数string fraction()

step 3:利用function函数生成范围为[1,4]的随机数,然后利用switch语句对应生成’+’、'-'、'*'、'/'

step 4: 利用function函数生成范围为[1,3]的随机数,然后利用switch语句对应生成四则运算的对应表达式,分别是:

        a、整数和整数

        b、整数和真分数

        c、整数和真分数

step 5:利用function函数生成范围为[1,2]的随机数,然后利用switch语句对应两种输出(主要目的是使真分数既可以出现在第一个位置,也可以出现在第二个位置)

收获:

1、随机数的生成:

     要使用的头文件:#include<ctime>

                         #include<stdlib.h>

     要调用的函数:   srand((unsigned)time(NULL));//种子

                                     (rand()%(b-a+1))+a-1//(a,b)
              (rand()%(b-a))+a //[a,b)
              (rand()%(b-a))+a+1//(a,b]
              (rand()%(b-a+1))+a//[a,b]

2、如果利用for语句循环调用function函数生成随机数,则容易出现这种情况:

这是因为只有几十次的for循环运行时间非常短,time(NULL)每次都返回相同的值,解决方法如下:

编程:四则运算题目生成器_第2张图片

其中flag为全局变量(其实flag最好应该在头文件中定义接口,在源文件中实现)

3、对于将数值类型(如int、double、float等)转换为string类型,可以利用如下方法:

注意strstream要设置为局部变量,且每一个石头人strstream变量只对应一个转换

你可能感兴趣的:(编程:四则运算题目生成器)