四则运算2及psp0设计

       随机生成运算式,要求:

                 1.题目避免重复。

                 2.可定制(数量/打印方式)。

                 3.可以控制一下参数。

                 要求:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数。

       刚开始看到这样一个题目感觉还挺简单,于是从头开始,一步一步的编写代码。但是这次遇到了大麻烦。

       我的基本思路是全部用数组来实现,基本是这样的:

                1.随机产生num[i]个运算符数组,对应的ch[num[i]]里边放着相应的运算符,类型为string类型。

                2.rand1[i][j]数组盛放随机生成参与运算的数,根据算式的形式,运算数要比运算符多一个,所以运算数个数为num[1]+1。

                3.rand1[i][j]之所以是二维数组,是因为,每行表示一个式子,列数为参与运算的数的个数。

                4.定义两个函数L(int w),R(int w),判断括号的输出,left和right,分别指左括号和右括号,随机输出左括号,参数w加1,当右括号随机输出时,判断是否有左括号,在有左括号的情况下才能输出右括号,而且一个括号不能只包含一个数。

                5,.根据输入有无负数,将随机数范围改为了-39~+99之间,方法为rand()%139-99。

我的程序代码如下:

  1 /*随即产生带有括号的30个式子
  2 20133078_yulei*/
  3 #include <iostream>
  4 #include <string>
  5 #include <time.h>//用到了time函数 
  6 #define random(x)(rand()%x)
  7 #define N 30    //预定产生30个
  8 using namespace std;
  9 void sort(int a[], int n)
 10 {
 11     int i,j,temp;
 12     for (j=0;j<n-1;j++)
 13         for (i=0;i<n-1-j;i++)
 14             if(a[i]>a[i+1])
 15             {
 16                 temp=a[i];
 17                 a[i]=a[i+1];
 18                 a[i+1]=temp;
 19             }
 20 }
 21 
 22 void L(int &w)
 23 {
 24     int q=rand()%100;
 25     if(q%2==0)
 26     {
 27         cout<<"";
 28         w++;
 29     }
 30 
 31 }
 32 void R(int &w)
 33 {
 34     int q=rand()%100;
 35     if(q%7==0)
 36     {
 37         cout<<"";
 38         w--;
 39     }
 40 }
 41 
 42 void main()
 43 {
 44     srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
 45     int rand1[N][10];    //30个式子,每列最多10个数 
 46     int i=0,j=0,k=0,w=0;
 47     string ch[N][10]={};          //运算符数组,最多允许10个
 48     int num[N];   //每行式子的运算符的个数
 49     int cc,ff,kk;
 50     cout<<"***输入有无乘除法:(0无/1有):";
 51     cin>>cc;
 52     cout<<"***输入有无负数:(0无/1有):";
 53     cin>>ff;
 54     cout<<"***输入有无括号:(0无/1有):";
 55     cin>>kk;
 56     for(i=0;i<N;i++)                //每行参与运算的个数,不能为零
 57     {
 58         num[i]=rand()%9+1;
 59         if(num[i]==0)
 60             i--;
 61     }
 62     for(i=0;i<N;i++)
 63     {
 64         switch(cc)
 65         {
 66         case 0:{
 67             for (j=0;j<num[i];j++)              //参与运算的运算符
 68             {
 69                 int k=rand()%2;
 70                 switch(k%2)
 71                 {
 72                 case 0:ch[i][j]="+";break;
 73                 case 1:ch[i][j]="-";break;
 74                 }
 75             }
 76                }break;
 77         case 1:
 78             {
 79                 for (j=0;j<num[i];j++)              //参与运算的运算符
 80                 {
 81                     int k=rand()%4;
 82                     switch(k%4)
 83                     {
 84                     case 0:ch[i][j]="+";break;
 85                     case 1:ch[i][j]="-";break;
 86                     case 2:ch[i][j]="*";break;
 87                     case 3:ch[i][j]="÷";
 88                     }
 89                 }
 90             }
 91         }
 92 
 93     }
 94 
 95     switch(ff)
 96     {
 97     case 0:
 98         {
 99             for(i=0;i<N;i++)                    //产生参与运算的数
100             {
101                 for (j=0;j<num[i]+1;j++)
102                 {
103                     rand1[i][j]=rand()%100;     //参与运算的数据比运算符多1个 
104                     if(j!=0&&ch[i][j-1]=="/"&&rand1[i][j]==0)   //除第一个数据外的其他数据前边是除法,则这个数不能为零
105                         j=j-1;   //回溯重新产生
106                 }
107             }break;
108         }
109     case 1:
110         {
111             for(i=0;i<N;i++)                    //产生参与运算的数
112             {
113                 for (j=0;j<num[i]+1;j++)
114                 {
115                     rand1[i][j]=rand()%139-39;     //参与运算的数据比运算符多1个 
116                     if(j!=0&&ch[i][j-1]=="/"&&rand1[i][j]==0)   //除第一个数据外的其他数据前边是除法,则这个数不能为零
117                         j=j-1;   //回溯重新产生
118                 }
119             }break;
120         }
121     }
122 
123     //数据有了,运算有了,剩下的就是将他们进行组合。
124     switch(kk)
125     {
126     case 1:
127         {
128             for(i=0;i<N;i++)
129             {
130                 cout<<i+1<<".";
131                 int k=0;
132                 for (j=0;j<num[i]+1;j++)
133                 {
134                     int p;
135                     L(k);
136                     if (k>0)
137                         p=j;
138                     if(rand1[i][j]<0)
139                         cout<<"("<<rand1[i][j]<<")";
140                     else
141                         cout<<rand1[i][j];
142                     if(k>0&&p!=j)
143                         R(k);
144                     cout<<ch[i][j];
145                 }
146                 for(k;k!=0;)
147                 {
148                     R(k);
149                 }
150                 cout<<"= "<<endl;
151 
152             }break;
153         }
154     case 0:
155         {
156             for(i=0;i<N;i++)
157             {
158                 cout<<i+1<<".";
159                 int k=0;
160                 for (j=0;j<num[i]+1;j++)
161                 {
162                     if(rand1[i][j]<0)
163                         cout<<"("<<rand1[i][j]<<")";
164                     else
165                         cout<<rand1[i][j];
166                     cout<<ch[i][j];
167                 }
168                 cout<<"= "<<endl;
169 
170             }
171         }
172     }
173 
174 
175 }

程序运行结果1:

   运行结果2:

 总结:

        这次程序编写好不容易的,到最后程序仍然不完整,需要后续完善。这次的思路有点麻烦了,对于数组的操作很麻烦。导致后来一直进行修改bug,条件复杂,循环便捷很不好整,尤其是数组的下标。

        项目计划总结:

日期\任务 听课 编写程序 查阅资料 日总计
星期一 2   1 3
星期二   1   1
星期三   2 1 3
星期四 2     2
星期五   2 1 3
星期六   8   8
星期日        
周总计 4 13 3

20

       

      时间记录日志:

日期 开始 结束 中断 总时间 具体活动 备注
3/7 14:00 15:50 30 110 听课 软件工程
  16:30 17:30 20 130 查阅资料 查资料
3/8 16:20 15:20 20 135 编写程序  编程
3/9 16:10 17:20 10 60 查阅资料 查资料
  19:00 21:30 20 130 编写程序  
3/10 14:00 15:50 10 100 听课 软件工程
3/11 8:00 9:30 20 70 编程序  
  15:00 16:30 20 70 找bug  
  7:30 9:00 10 80 查资料,编程 看数据结构书寻找解决办法
3/12 7:30 11:00 50 210 调试 最终调试
  12:30 16:00   210 调试+博客 写博客

       缺陷记录日志:

日期 编号 引入阶段 排除阶段 修复时间&问题描述
3/7        
3/8  1 编码 编译  随机数产生一样,然后将时间函数加上后,bug修复
3/9        
3/10 2 编码 编译 数组下标出界,内存溢出,通过计算修改了bug
3/11 3 编码 编译 一个小时产生负数随机数和加括号
3/12  4 调试 修复 一天的时间,调试程序,实现有无负数,有无括号功能
posted @ 2016-03-12 17:44  _小学生  阅读(254)  评论(1编辑  收藏  举报