码迷,mamicode.com
首页 > 其他好文 > 详细

程序设计之四则运算二

时间:2016-03-12 18:43:26      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:

  随着又一次软件工程课的来临,老师再一次给我们布置了新的作业,这次作业是上一次的改良版,有了更多的要求

  一.题目避免重复
  二.定制(数量/打印方式)
  三.控制参数

    1.是否有乘除法
    2.是否有括号
    3.数值范围
    4.加减有无负数
    5.除法有无余数

 

  题目避免重复,可以通过存入算式到数组,生成之后的算式时比较,如果重复则重新生成。

  控制是否有乘除法可以通过改变随机生成时的参数来实现。

  难度最大的就是生成括号了,这个需要考虑生成括号的位置,个数,括号的叠加等等。

  位置可以通过设置数组代替,对应数字只有左右两边两个位置才能生成括号,可以通过左括号数组和右括号数组来控制。每生成一个左括号,就在合适的位置生成一个右括号。

  数字范围可以通过控制rand生成随机数的参数来实现。

  因为涉及到数字之间的比较,加减有无负数,除法有无余数暂时还未想到办法实现

  以下便是我这次作业的源代码:

  1 //练习二,练习一问题扩充  可以控制:是否有乘除,是否有括号,数值范围
  2 //赵承圣 2016.3.11
  3 #include<iostream>
  4 #include<ctime>
  5 #include<string>
  6 using namespace std;
  7 
  8 void main()
  9 {
 10     //数据定义部分
 11     srand((int)time(NULL));
 12     int control[2],num_max,num_min,num_num,bracket_num;
 13     string item[30];
 14     char symbol[4];                    //随机计算符号数组
 15     symbol[0] = +;
 16     symbol[1] = -;
 17     symbol[2] = *;
 18     symbol[3] = /;
 19 
 20     // 输入部分
 21     cout<<"是否有乘除(2 否/4 是):  ";
 22     cin>>control[0];
 23     cout<<"是否有括号(1 否/0 是):  ";
 24     cin>>control[1];
 25     cout<<"数字最大取值:  ";
 26     cin>>num_max;
 27     cout<<"数字最小取值:  ";
 28     cin>>num_min;
 29 
 30 
 31     //算式生成部分
 32     for(int count=0;count<30;count++)
 33     {
 34         num_num=rand()%10;
 35         if(num_num==0||num_num==1)
 36         {
 37             count--;
 38             continue;
 39         }
 40 
 41         //定义并初始化动态数组 num:数字数组  symnum:符号选择数组  sym:符号数组
 42         int *num=new int[num_num];
 43         int *symnum=new int[num_num-1];
 44         char *sym=new char[num_num-1];
 45 
 46         int bracket_leftposition,bracket_rightposition;    //定义左、右括号生成的位置
 47         int *bracket_left_time=new int[num_num];           //定义左、右括号生成次数数组,下标为数字位置
 48         int *bracket_right_time=new int[num_num];
 49         string *bracket_left=new string[num_num]();        //定义左右括号字符串型数组
 50         string *bracket_right=new string[num_num]();
 51         for(int rcount=0;rcount<num_num;rcount++)          //左、右括号生成次数初始化
 52         {
 53             bracket_left_time[rcount]=0;
 54             bracket_right_time[rcount]=0;
 55         }
 56 
 57         if(control[1]==0)
 58         {
 59             bracket_num=rand()%5+1;                                    //生成括号次数
 60             for(int bcount=0;bcount<bracket_num;bcount++)
 61             {
 62                 bracket_leftposition=rand()%num_num;                //随机生成左右括号的位置
 63                 bracket_rightposition=rand()%num_num;
 64                 if(bracket_leftposition==bracket_rightposition)     //先剔除部分一次性在一个数左右同时生成左右括号的情况
 65                 {
 66                     break;
 67                 }
 68                 bracket_left_time[bracket_leftposition]++;            //该位置数左括号生成次数+1
 69                 if(bracket_left_time[bracket_leftposition]==1)
 70                 {
 71                     bracket_left[bracket_leftposition]="(";
 72                 }
 73                 if(bracket_left_time[bracket_leftposition]==2)
 74                 {
 75                     bracket_left[bracket_leftposition]="((";
 76                 }
 77                 if(bracket_left_time[bracket_leftposition]==3)
 78                 {
 79                     bracket_left[bracket_leftposition]="(((";
 80                 }
 81                 bracket_rightposition=rand()%num_num;
 82                 bracket_right_time[bracket_rightposition]++;
 83                 if(bracket_right_time[bracket_rightposition]==1)
 84                 {
 85                     bracket_right[bracket_rightposition]=")";
 86                 }
 87                 if(bracket_right_time[bracket_rightposition]==2)
 88                 {
 89                     bracket_right[bracket_rightposition]="))";
 90                 }
 91                 if(bracket_right_time[bracket_rightposition]==3)
 92                 {
 93                     bracket_right[bracket_rightposition]=")))";
 94                 }
 95                 for(int bpcount=0;bpcount<num_num;bpcount++)            //再次扫描数字左右括号生成次数相等的情况并排除
 96                 {
 97                     if(bracket_left_time[bpcount]==bracket_right_time[bpcount])
 98                     {
 99                         bracket_right[bpcount]="";
100                         bracket_left[bpcount]="";
101                     }
102                 }
103             }
104         }
105         //给参与计算的数赋值(指定数值范围)
106         for(int cnum=0;cnum<num_num;cnum++)
107         {
108             num[cnum]=rand()%(num_max-num_min+1)+num_min;
109         }
110 
111         //随机生成式子的各个位置的符号
112         for(int snum=0;snum<num_num-1;snum++)
113         {
114             symnum[snum]=rand()%control[0];
115             sym[snum]=symbol[symnum[snum]];
116         }
117 
118         //输出算式
119         for(int ph=0;ph<num_num-1;ph++)
120         {
121             cout<<bracket_left[ph]<<num[ph]<<bracket_right[ph]<<sym[ph];
122         }
123         cout<<bracket_left[num_num-1]<<num[num_num-1]<<bracket_right[num_num-1]<<endl;
124 
125         if(count==29)
126         {
127             delete []num;
128             delete []symnum;
129             delete []sym;
130             delete []bracket_left_time;
131             delete []bracket_right_time;
132             delete []bracket_left;
133             delete []bracket_right;
134         }
135 
136     }
137     system("pause");
138 }


此程序在生成括号处出现问题,因时间关系暂时未解决。

以下便是结果截图


技术分享
 

技术分享

程序设计之四则运算二

标签:

原文地址:http://www.cnblogs.com/zzcs/p/5269459.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!