• 程序设计之四则运算二


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

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

        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                 }
     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 }


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

    以下便是结果截图



     

    PS:括号问题已解决,因存在一条冗余代码影响了结果,在本文中已修改!

  • 相关阅读:
    CruiseControl.NET与TFS结合的配置文件
    环信Restfull API dotnetSDK
    NAnt0.92版本首次在windows 8.1的机子上运行报错的问题解决
    asp.net接收ajax请求参数时为空的现象
    对接微信红包时:CA证书出错,请登录微信支付商户平台下载证书
    在打开vs解决方案时,怎样让所以打开的项目自动折叠
    使用Chrome或Fiddler抓取WebSocket包
    SVN使用教程
    禁用Resharper长代码自动换行的解决办法
    SQLServer日期格式化
  • 原文地址:https://www.cnblogs.com/zzcs/p/5269459.html
Copyright © 2020-2023  润新知