随机30道小学计算题02(修改)

由于上周作业实在存在许多问题,所以这周重新写了代码。

这次代码和上次完全不一样,将生成的算式保存在数组里了。

1.避免重复(通过for循环一个一个比较字符串)
2.定制数量/打印方式(循环次数提出来作为变量/ 打印到文件通过引用函数实现)
3.控制参数
  是否有乘除(rand()%4改成%2,)
  是否有括号,最多十个数(完成,随机生成插入括号的位置,不过只能插入一个括号就是)
  数值范围(random(x)中x作为变量)
  加减有无负数(通过计算结果,调用函数,返回bool判断)
  除法有无余数(通过计算结果,调用函数,返回bool判断)

还是存在一些问题,比如:规范用户输入,括号只能插入一个。但是比上次好多了,慢慢改吧。

#include<iostream>
#include<time.h>
#include<string>
#include <sstream>
#include <stdlib.h>
#include<fstream>
#include<cmath>
#define random(x)(rand()%x)
using namespace std;

bool jsResult(string i1,int a,int b)
{
    int result = a;
    bool bol=true;

    if (i1 == "-")
    {
        result = result - b;
        if (result < 0)
        {
            bol = false;
        }
    }

    if (i1 == "/")
    {
        result = result % b;
        if (result != 0)
        {
            bol = false;
        }
    }
    return bol;
}
void printfile(int n,string s[])//打印到文件
{
    int i;
    ofstream outfile;
    outfile.open("e://2.txt");
    for (i = 0; i < n; i++)
    {
        outfile << s[i] << endl;
    }
    outfile.close();
}
string fuhao(int f2)//随机符号
{

    string p;
    int i;
    if (f2 == 1)
    {
        i = rand() % 4;
    }
    if (f2 == 0)
    {
        i = rand() % 2;
    }
    switch (i)
    {
        case 0:p = "+"; break;
        case 1:p = "-"; break;
        case 2:p = "*"; break;
        case 3:p = "/"; break;
    }
    return p;
}
int main()
{
    srand((unsigned)time(NULL));
    int a, b, c, d=10, e, i=0, k,ii=0,nn,pp,result=0;
    stringstream s1, s2, s3, s4, s5;
    string s, ss, p, i1, i2,re[100];
    bool bol=true;

    int n,f1,f2,f3 ,f;
    cout << "输入生成数量\n";//n
    cout << "是否有括号,最多十个数(输入1,有括号;输入0,无括号)\n";//f
    cout << "是否打印到文件(输入1,打印到文件;输入0,不打印到文件)\n";//f1
    cout << "是否有乘除(输入1,有乘除;输入0,没有乘除)\n";//f2
    cout << "请输入数值范围(0-?)\n";//f3
    cin >> n;
    cin >> f;
    cin >> f1;
    cin >> f2;
    cin >> f3;
    //n = 10; f = 1; f1 = 1; f2 = 1; f3 = 100;
beg:
    for (nn = 0; nn < n; nn++)
    {

        i = rand() % 9;
        i = i + 1;//防止随机出0

        a = random(f3);
        s1 << a;

        s = s1.str();
        if (f == 0 )//无括号
        {

            for (k = 0; k < i; k++)
            {
                beg1:
                i1 = fuhao(f2);
                b = random(f3);
                if ((i1 == "/")&&(b==0))//除数不为0
                {

                    pp = rand() % 3;
                    switch (pp)
                    {
                        case 0:i1 = "+"; break;
                        case 1:i1 = "-"; break;
                        case 2:i1 = "*"; break;
                    }

                }
                bol = jsResult(i1, a, b);
                if (bol==false)
                {
                    goto beg1;
                }

                s2 << b;
                s = s + i1 + s2.str();
                s2.str("");    

            }
            re[nn] = s; 

            s1.str("");
            //cout << re[nn] << endl;

            //cout << s<<endl;
        }

/////////////////////////////////////////////////////////////////////////////////
        if (f == 1)//有括号
        {
            int k1 = 100, k2 = 100;

            while (i < 2)//至少三个才有括号,所以小于三个就接着随机直到合法
            {
                i = rand() % 10;
            }
            while (k1>i - 2)
            {
                k1 = rand() % i + 1;
            }
            while (k2 <= k1 || k2>i - 1)
            {
                k2 = (rand() % i) + 1;
            }

            for (k = 0; k < i; k++)
            {

                string str[100];

                c = random(f3);

                i2 = fuhao(f2);

                if ((i2 == "/") && (c == 0))//除数不为0
                {
                    pp = rand() % 3;
                    switch (pp)
                    {
                        case 0:i1 = "+"; break;
                        case 1:i1 = "-"; break;
                        case 2:i1 = "*"; break;
                    }

                }
                s3 << c;
                str[k] = s3.str();
                if (k == k1)
                {
                    str[k] = "(" + str[k];

                }
                if (k == k2)
                {
                    str[k] = str[k] + ")";

                }

                s = s + i2 + str[k];
                s3.str("");

            }
            re[nn] = s;
            s1.str("");
            //cout << re[nn] << endl;

        }
    }
///////////////////////////////////////
    int n1=n;
    for (e = 0; e < n1; e++)
    {
        if (re[e] == re[n1])//重复
        {
            goto beg;//重头开始
        }
        else
        {
            n1 = n1 - 1;//不重复,比下一个
            e = e - 1;

            if (n1 == 1)//比完了
            {
                goto p;//输出
            }
        }
    }
    p:
    for (nn = 0; nn < n; nn++)
    {
        cout << re[nn] << endl;
    }
////////////////////////////////////////////////////
    if (f1 == 1)//打印到文件
    {
        printfile(n,re);
    }
}

简单截取测试:

时间: 2024-10-14 00:59:22

随机30道小学计算题02(修改)的相关文章

随机30道小学计算题修改01

经过两位老师的点评,我此次修正以下两个问题: 1.整数除数为0(如果出现这种情况,就把符号改成除除法之外的随机一种) 2.分数可约分(新增函数zuidagongyueshu,如果存在最大公约数,就除以这个最大公约数,其结果替换之前的数字) #include<stdio.h> #include<stdlib.h> #include<time.h> #define random(x) (rand()%x) #include <iostream> using na

随机30道小学计算题

一开始我是想直接把整数和分数写成两个函数再随机调用的,后来发现存在问题:1.分数随机出来很可能成是假分数,假分数时调用了也不会输出.2.如果这样那还得再来个时间,而且在试过之后发现再来一个随机出的数字也一样,就太冗余了. 综上:我选择了一个比较讨巧的方式,即:一个时间,当能生成真分数时就输出分数,不能的时候就用整数. 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 #define random(

小学计算题一次大满足

海量小学计算题 一.预估与实际 PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 120 300 ? Estimate ? 估计这个任务需要多少时间 600 1460 Development 开发 ? Analysis ? 需求分析 (包括学习新技术) 120 300 ? Design Spec ? 生成设计文档 30 60 ? Design Review ? 设计复审 20 30 ? Coding Sta

30道小学生四则运算题C/C++编程

软件工程科课上,老师通过实例讲解什么是程序,程序和软件的区别,要求我们通过短时间写一道编程题, 题目就是编写30道小学生四则运算题.以下就是源代码: #include<iostream.h>#include<stdlib.h>#include<time.h>void demo(void)  //随机产生四则运算{ int m,n,k;   //随机数m,n,计数  m=rand()%100;//生成随机数 n=rand()%100; k=rand()%5; switch

生成300道小学四则运算题

通过Java编写一个能够自动生成三百道小学四则运算的小demo 通过Ramdom获取随机数 algorithm的值确定运算法则 parameter值确定循环次数 package D; import java.text.DecimalFormat; import java.util.Random; public class Demo { public static void main(String[] args) { operation(); } public static void operat

30道小学二年级四则运算题

思路与体会:用rand函数产生随机数32767/327约等于100.2.排除了除数是0的错误, 但是仍有缺陷:减法会出现不够减结果是负数的情况! 运行结果总出现闪退情况,查阅资料后加了system("pause") 运行环境:vs2013 源代码: #include<iostream> using namespace std; #include<stdio.h> #include<stdlib.h>int rak(){ return rand() /

个人项目1:随机生成30道整数四则运算题

使用的语言:C# 基本思路:运用最近学习的C#窗体应用程序设计两个按钮一个显示的窗口,运用Random生成随机数,编写程序,调试运行. 窗体设计 代码 namespace 随机四则运算 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button2_Click(object sender, EventArgs e) { Application.Exit();

小学计算题——四则运算

一.题目要求 我们在刚开始上课的时候介绍过一个小学四则运算自动生成程序的例子,请实现它,要求: (1)能够自动生成四则运算练习题 (2)可以定制题目数量 (3)用户可以选择运算符 (4)用户设置最大数(如十以内.百以内等) (5)用户选择是否有括号.是否有小数 (6)用户选择输出方式(如输出到文件.打印机等) (7)最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 二.角色分配 驾驶员--王越--博客地址 (1)能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至codi

50道编程计算题,留着自己练习用

[程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... [程序2] 题目:判断101-200之间有多少个素数,并输出所有素数. 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数. [程序3]题目:打印出所有的"水仙花数",所谓"水