程序实现自动生成30道四则运算题目(2)

继上一次的任务后,本周老师又给自动出题系统提出了新的要求,我感觉我跟二柱子
一样可怜,本次老师的要求是
1.题目避免重复
2.题目可以定制(数量/打印方式)
3.可以控制一下参数
(1)是否有乘除法
(2)是否有括号(最多可以支持十个数参与运算)
(3)数值范围
(4)加减有无负数
(5)除法有无余数

针对本次任务,我们逐个要求,逐个分析
对于题目避免重复可以用建立字符串数组,进行字符串之间相互比较来解决,另外题目
可以定制通过随机数生成题目数并带入循环解决,同时打印方式可以用文件输入输出流
把数据存到文件里。对于是否有乘除法,可以把+ - * /存到数组里,随机调用
数值范围可以用随机数进行范围控制,本题的难点在是否能生成括号,
括号是用来提升优先级,对于这个问题我们可以用循环调用来实现,具体含义是
四则运算表达式可以看成 表达式1+符号+表达式2的模式,在进入循环开表达式
可以随机选择放在表达式1或表达式2上,也可以决定有无括号,这样用随机生成
的运算数的个数决定循环的次数,加减有无负数和除法有无余数,这里只对两个
运算数的表达式进行了操作。
下面是本次实验源代码:

//随机生成四则运算表达式 杨超群 2016.3.12
#include<iostream>
#include<string>
#include<time.h>
#include <stdio.h>
#include<fstream>
using namespace std;
string str1[4]={"+","-","*","/"};
int num1,num2,num3,num4,num5,num6,num7,num8,num9,num10,n,m,a,b;
char str2[25];
char str3[25];
string str4[100];
void Input(int n,int p)
{
    m=n;
    string str;
    ofstream outfile;
    outfile.open("a.txt",ios::app);
    if(!outfile)
    {
        cerr<<"OPEN ERROR!"<<endl;
        exit(0);
    }
    num1=rand()%100+1;
    num2=rand()%100+1;
    num3=rand()%4;
    num8=num1;
    num9=num2;
    num10=num3;
    itoa(num1,str2,10);
    itoa(num2,str3,10);
    str=str2+str1[num3]+str3;
    n=n-2;
    while(n!=0)                 //当n不等于0时,循环生成str,即表达式+符号+表达式的形式
    {
        num4=rand()%2;
        if(num4==0)             //上一个str放在符号的左边
        {
            num5=rand()%2;
            if(num5==0)            //上一个str不加括号
            {
                num3=rand()%4;
                num1=rand()%100+1;
                itoa(num1,str2,10);
                str=str+str1[num3]+str2;
            }
            else                           //上一个str加括号
            {
                num3=rand()%4;
                num1=rand()%100+1;
                itoa(num1,str2,10);
                str="("+str+")"+str1[num3]+str2;
            }
        }
        else                              //上一个str放在符号的右边
        {
            num5=rand()%2;
            if(num5==0)                    // 上一个str不加括号
            {
                num3=rand()%4;
                num1=rand()%100+1;
                itoa(num1,str2,10);
                str=str2+str1[num3]+str;
            }
            else                         //上一个str加括号
            {
                num3=rand()%4;
                num1=rand()%100+1;
                itoa(num1,str2,10);
                str=str2+str1[num3]+"("+str+")";
            }
        }
        n--;
    }
    str4[p]=str;                         //把str存入字符串数组str4中
    for(int i=0;i<p;i++)                 //查询四则运算式是否有重复
        if(str4[i]==str4[p])
             Input(m,p);
    cout<<str4[p]<<"                       ";
    outfile<<str4[p]<<endl;
    if(m==2)
    {
        if(num10==0)                     //加法有无负数
        {
            a=num8+num9;
            if(a>0)
                cout<<"结果"<<a<<"为正";
            else if(a==0)
                cout<<"结果"<<a<<"为零";
            else if(a<0)
                cout<<"结果"<<a<<"为负";
        }
        else if(num10==1)                    //减法有无负数
        {
            a=num8-num9;
            if(a>0)
                cout<<"结果"<<a<<"为正";
            else if(a==0)
                cout<<"结果"<<a<<"为零";
            else if(a<0)
                cout<<"结果"<<a<<"为负";
        }
        else if(num10==2)
        {
            a=num8*num9;
            if(a>0)
                cout<<"结果"<<a<<"为正";
            else if(a==0)
                cout<<"结果"<<a<<"为零";
            else if(a<0)
                cout<<"结果"<<a<<"为负";
        }
        else if(num10==3)                          //除法有无余数
        {
            b=num8%num9;
            if(b==0)
                cout<<"余数为0";
            else
                cout<<"余数不为0";
        }
    }
    cout<<endl;
}
void changeNum(int n)
{
    for(int i=0;i<n;i++)                   //随机生成的题目
    {
        num6=rand()%9+2;
        switch(num6)
        {
        case 2:Input(2,i);break;
        case 3:Input(3,i);break;
        case 4:Input(4,i);break;
        case 5:Input(5,i);break;
        case 6:Input(6,i);break;
        case 7:Input(7,i);break;
        case 8:Input(8,i);break;
        case 9:Input(9,i);break;
        case 10:Input(10,i);break;
        }
    }
}
void main()
{
    ofstream outfile1;
    outfile1.open("a.txt");
    if(!outfile1)
    {
        cerr<<"OPEN ERROR!"<<endl;
        exit(0);
    }
    srand((unsigned)time(NULL));             //随机种子
    cout<<"输入你想做的题目数:";
    cin>>n;
    changeNum(n);
    cout<<"四则表达式没有重复"<<endl;
}

如下是不同题目数量的结果截图:

题目数量为5

相应的文件输出

题目数量为30

相应的文件输出

总结:本次实验有点仓促,勉勉强强符合,有很多瑕疵的地方,真分数没有弄

0值判断没有写,大于两个数的运算结果没有计算,以后逐个完善,希望做的更好。

时间: 2024-10-12 18:30:37

程序实现自动生成30道四则运算题目(2)的相关文章

程序实现自动生成30道四则运算题目

课堂上老师要求我们做这样一个题目,题目要求是自动生成30道四则运算题目,要求除整数加减乘除外,还有真分数加减乘除.刚开始听到这个题目一头雾水,有点复杂,但仔细拆分这个题目不难发现,这个题目可以简化成三个小问题,分别是随机数自动生成两个数,自动生成符号,还有输出结果.对于随机数自动生成两个数可以简化为随机数生成整数,随机数生成真分数,生成真分数可以简化到随机数生成分子和分母.对于自动生成符号,也可以简化为随机数生成1,2,3,4,分别代表+,—,*,/,输出结果可以用一个for循化,实现输出30道

实现自动生成30道四则运算题目

这个问题我按照老师的方法,把他分成3部分进行完成, 输入:本程序没有输入略过, 代码实现功能: 1.先生成1道题,30道就是重复30次生成 2.运算符问题可以先定义一个字符串string d="+-*/"然后生成随机数对4取余确定用第几个 3.真分数运算跟运算符生成一个道理也是用随机数对2取余 输出:根据对2取余的情况确定输出整数运算题目或者分数运算题目 #include<iostream> #include<string> #include<stdlib

随机生成30道四则运算题目

1.题目要求:随机生成30到四则运算题,其中不能超过2位运算,包含真分数. 2.设计思路 (1)先随机产生四个数,前两个数用作整数的四则运算,然后前两个数再作为第一个分数,后两个数作为第二个分数. (2)利用switch\case函数分别对每种情况进行表示,利用除以7的余数表示8中不同的情况,前四种表示整数的加减乘除运算,后四种表示分数的加减乘除运算. (3)利用for循环产生30个运算式. 3.程序代码: //2016/3/3 王宗泽 #include<iostream> #include&

小学数学老师要求程序能自动生成300道四则运算题!!!!

public class Main {    public static void main(String[] ages) {        String[] operate = new String[]{"+", "-", "×", "÷"};        int[] numbers = new int[100];        for (int i = 1; i <= 100; i++) {           

随机生成30道四则运算-NEW

补充:紧跟上一个随机生成30道四则运算的题目,做了一点补充,可以有真分数之间的运算,于是需要在原来的基础上做一些改进. 首先指出上一个程序中的几个不足:1.每次执行的结果都一样,所以不能每天给孩子出30道一样的题吧!2.没有考虑,如果随机出的是除法,且除数为0的情况.3.没有实现生成真分数的四则运算的功能. 经过分析,决定依次进行改进: 针对问题1:在程序中设置时间种子,即可使得每次程序运行的结果不同. 针对问题2:当判断要生成除法运算时,做一个判断,若除数为0,则重新生成. 针对问题3:定义一

软件工程课堂练习-随机生成30道四则运算练习题

习题要求:随机生成30道四则运算题 以下是程序代码: 1 #include "stdafx.h" 2 #include "stdio.h" 3 #include "time.h" 4 #include "stdlib.h" //随机器函数头文件 5 6 void print() 7 { 8 srand((int)time(0)); 9 for(int i=0;i<=29;i++) 10 { 11 int x; 12 in

课堂练习之每天出30道四则运算题目

1 /* 2 需求:每天出30道四则运算题目给小学生做 3 */ 4 5 class Rand 6 { 7 public static void sop(Object obj) 8 { 9 System.out.println(obj); 10 } 11 public static void main(String[] args) 12 { 13 sop("小学生二年级课后作业,每天30道四则运算练习:"); 14 15 int count = 0; 16 17 for (int i=

随机生成30道四则运算题

思路:首先随机生成两个操作数.将运算符存到数组c中,随机生成0-3的整数作为数组下标.即相当于随机产生运算符. 利用for循环输出30道四则运算题 #include<iostream.h>#include<stdlib.h>int main(){     int a,b,d,i;     char c[4]={'+','-','*','/'};     for(i=0;i<30;i++)     {           a=int(rand()%11);           

30道四则运算题目---课堂作业--软件工程c++

问题:设计一程序,给二年级小学生随机产生四则运算题目. 一.设计思考问题: 1.四则运算需要俩个运算数和一个运算符. 2.如何产生随机数? 3.如何实现随机产生四则运算? 4.题目是否符合小学生学习范围?(减法和除法) 二.程序源代码: #include<iostream.h>#include<stdlib.h>#include "time.h"int main (){ cout<<"--------四则运算题--------"&