zoukankan      html  css  js  c++  java
  • 实现自动生成30道四则运算题目(3)

     
    这周老师在前两周的基础上又增加了一些要求
    1.可以判断答案的正确与否
    2.程序必须能处理四则运算的混合算式
    这次的作业我们封装了几个子函数,
    1.随机数函数:把取值范围按最大最小值传递给函数就会返回一个符合要求的随机数(前两周的作业就已经存在随机数生成函数)
    2.计算函数:把运算符和操作数传递给函数就会返回运算的的结果(根据运算需要新添加到的子函数)
    3.题目生成函数:把要生成题目的要求传递给该函数就会返回一个符合要求的运算式
                          这个函数主要包括:运算式的输出,括号的运算,乘除的运算,加减的运算
    主函数主要进行数据的输入和结果正确的判定
    程序的主要思路还是用数组,3个数为一个单位,这次因为需要运算出得数,所以用了两个数组a,b。其中a为整型数组,b为double型数组,经过运算的得数因为有可能是小数所以用b来储存得数。
    改程序的缺点
       1.目前还不支持分数的运算(思路是用结构体)
       2.两个连续的除法需要括号(思路是初始化数组完成后加判断语句增加括号时间原因暂时无法实现)
      1 #include<iostream>
      2 #include<string>
      3 #include<stdlib.h>
      4 #include<time.h>
      5 using namespace std;
      6 int randnum2(int min,int max)   //获得随机数
      7 {
      8    int ranum=0;
      9    ranum=rand(); 
     10    while(ranum>max)
     11    { 
     12       ranum%=max;//保证min<b<max
     13       if(ranum<min)
     14       {
     15         ranum=rand();
     16       }
     17    }
     18    return ranum;
     19 }
     20 double answer(int ope,double num1,double num2)
     21 {
     22     double ans=0;
     23     if(ope==0)
     24     {
     25         ans=num1+num2;
     26     }
     27     if(ope==1)
     28     {
     29         ans=num1-num2;
     30     }
     31     if(ope==2)
     32     {
     33         ans=num1*num2;
     34     }
     35     if(ope==3)
     36     {
     37         ans=num1/num2;
     38     }
     39     return ans;
     40 }
     41 double  question(int max,int min,int numam)
     42 {
     43     int a[100],i=2,j=0,num=0;
     44     double b[100];
     45     string str="+-*/";
     46     num=randnum2(i,numam);
     47     i=0;
     48     while(i<=num*3)                  // 初始化数组
     49     {
     50         a[i]=randnum2(min,max);
     51         b[i]=a[i];
     52         i++;
     53     }
     54     while(j<=num*3)
     55     {
     56         a[j]%=4;//运算符
     57         a[j+1]%=2;//括号
     58         if(a[j+1]==1)
     59         {
     60            a[j+4]=-1;
     61         }
     62         j+=3;
     63     } 
     64 
     65     //测试
     66     int t=0;
     67     //测试1111111111111111
     68     i=0;
     69     j=1; 
     70     while(j<=num*3)                            //输出式子
     71     { 
     72         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)cout<<"(";
     73         cout<<a[j+1];
     74         if(a[j-3]==1&&j>3&&a[j-1]!=2&&a[j-1]!=3)cout<<")";
     75         if(j<(num*3-3))cout<<str[a[j+2]];
     76         j+=3;
     77     }
     78     
     79     j=1;
     80     while(j<=num*3-3)                          //计算括号
     81     { 
     82         if(a[j]==1&&j<num*3-3&&a[j+2]!=2&&a[j+2]!=3)
     83         { 
     84            b[j+1]=answer(a[j+2],b[j+1],b[j+4]);
     85            a[j+1]=b[j+1];
     86            for(int i=j+2;i<num*3-3;i++)
     87            {
     88               a[i]=a[i+3];
     89               b[i]=b[i+3];  
     90            }
     91            num-=1;
     92         }
     93         j+=3;
     94     }
     95     j=1; 
     96     while(j<=num*3-3)                                //计算乘除
     97     { 
     98         if(a[j+2]==2||a[j+2]==3)
     99         {
    100           
    101            b[j+1]= answer(a[j+2],b[j+1],b[j+4]);
    102            for(int i=j+2;i<num*3-3;i++)
    103            {
    104               a[i]=a[i+3];
    105               b[i]=b[i+3];
    106            }
    107            num-=1;
    108            j-=3;
    109         }
    110         j+=3;
    111     }
    112     j=1; 
    113     double ans=0,m=0;
    114     while(j<=num*3)
    115     { 
    116         m=b[j+1];
    117         if(a[j+2]==1)
    118         {
    119              ans=ans-m;
    120         }
    121         else
    122         {
    123             ans=ans+m;
    124         }
    125         j+=3;
    126     }
    127     return ans;
    128 }
    129 int main()
    130 {
    131   int quam=5,max=9, min=3,numam=5;
    132                 //输入生成题目的条件
    133      cout<<"一共出几道题:";
    134      cin>>quam;
    135      cout<<"最多几个数(10个数之间):";
    136      cin>>numam;
    137      cout<<"数值范围:
    最大值:";
    138      cin>>max;
    139      cout<<"最小值:";
    140      cin>>min;
    141                //结束输入生成题目的条件
    142     int i=1;
    143     double ansin;
    144     while(quam--)                            //循环一次生成一道题
    145     {
    146      cout<<"No."<<i++<<":";   //题目计数器
    147      double ans=question( max, min,numam);
    148      cout<<"=";
    149      cin>>ansin;
    150      cout<<"你输入的数为:"<<ansin<<endl;
    151      ansin=ansin-ans;
    152      if(ansin<0)
    153      {
    154         ansin=-ansin;
    155      }
    156      if(ansin<0.1)
    157      {
    158          cout<<"good!!"<<endl;
    159      }
    160      else
    161      {
    162         cout<<"回答错误!!!正确答案为:"<<ans<<endl;
    163      }
    164   }
    165   return 0;
    166 }

    实验结果:

    1.生成3道最多5个数取值范围在2~9之间的四则运算式

    2.生成3道最多6个数取值范围在4~9之间的四则运算式

    六、PSP0级相关日志:

    1、项目计划日志

    周活动总结表

    姓名:李晨                                                                    日期:3/19

    日期任务

    听课    

    编写程序

    阅读书本

    考研复习

     安装软件

    日总计  

    周日

    周一

    周二

    周三

    周四

     300

     50

     30

     90

     80

     550

    周五

     200

     60

     30

     290

    周六

    周总结

     500

     110

     60

     90

     80

     840

    阶段时间和效率                                                                      周数:1

    不包括上一周在内的累计时间                                                                

    总计

        

        

        

        

        

    平均

    最大

    最小

     以前各周的累计时间                                                                         

    总计

    500

    110

    60

    90

    80

    840

    平均

    500

    110

    60

    90 

    80

    840 

    最大

    500

    110

    60

    90

    80

    840

    最小

    500 

    110

    60 

    90 

    80

    840 

    2、时间记录日志

    学生:李晨                                                                     日期:3/19

    教师:王建民                                                                      课程:PSP

    日期

    开始时间

    结束时间

    中断时间

    净时间

    活动

    备注

    3/19

    08:00

    12:00

    40

    200

    听课

    课间休息

    14:00

    15:50

    10 

    100

    听课

    课间休息

    16:00

    17:30

    90

    考研复习

    18:30

    20:00

    10

    80

    安装软件

    休息

    20:10

    21:00

    50

    编写程序

    21:00

    21:30

    30

    阅读

     3/20

    08:00

    12:00

    40 

    200

    听课

    课间休息 

    14:30

    15:40

    10 

    60

    编写程序

    休息、问题 

    21:00

    21:30

    30 

    阅读 

    3、缺陷记录日志

    学生:李晨                                                               日期:3/19

    教员:王建民                                                                程序号:02

    日期

    编号

    类型   

    引入阶段

    排除阶段

    修复阶段

    修复缺陷

    3/19 

    1

     001

     设计

    编译 

    20min

    描述:判断语句位置错误

    002 

    编码

     编译

    1min 

    描述:使用数组之前没有定义

     3/20

     3

    003 

    设计

    编译 

    5min 

    描述:计算数值的算式位置放错

    注:结队开发组员:刘伟

         博客园地址:http://www.cnblogs.com/Lw-1573/ 

    附:工作照

  • 相关阅读:
    MagicZoom bug-Strict Standards: Only variables should be assigned by reference Error
    Web大文件(夹)上传(断点续传)控件-Xproer.HttpUploader6
    在PHP中,通过filesize函数可以取得文件的大小,文件大小是以字节数表示的。如果要转换文件大小的单位,可以自己定义函数来实现。
    PHP正则匹配6到16位字符组合(且只能为数字、字母、下划线)
    Windows下PHP版本选取
    简单配置nginx使之支持pathinfo
    PHP如何关闭notice级别的错误提示
    php开启pathinfo 模式
    php 5.3新增的闭包语法介绍function() use() {}
    Object.prototype.toString.call() 区分对象类型
  • 原文地址:https://www.cnblogs.com/jiajun1/p/5295364.html
Copyright © 2011-2022 走看看