zoukankan      html  css  js  c++  java
  • 四则运算测试

    测试元素:

      1、题目数目;

      2、数值范围;

      3、是否带括号;

      4、是否有乘除;

      5、每行容纳算式个数;

      6、算式行间距.

    第一次测试:30  100  Y  Y   2  12

    结果:

    格式混乱,检查发现setw()函数逻辑位置不对;修改后显示正常。

    第二次测试:20  1  N  N  2   12

    结果:

    无法避免重复时程序出错,未解决;

    第三次测试:2000  1000  Y  Y  4  6

    结果:

    出现大数据时,会出现除数为零的情况,上面显示的结果是解决后的截图

    其他情况下测试未发现明显异常

    修改后的源代码如下:

      1 #include<iostream>
      2 #include<conio.h>
      3 #include<cstdlib>
      4 #include<ctime>
      5 #include <iomanip>
      6 using namespace std;
      7 
      8 void Rand_Cal_one(int digits[],char characters[],int range)  //随机产生运算数(包含乘除)
      9 {
     10     for(int i=0;i<6;i++){
     11         if(i<3){
     12             digits[i]=rand()%range;//生成四则运算的计算随机数
     13             continue;
     14         }
     15         else if(i<5){
     16             digits[i]=rand()%4;//随机产生标志判断计算符号
     17             continue;
     18         }
     19         else{
     20             digits[i]=rand()%2;//随机产生标志数判断括号位置
     21         }
     22     }
     23 }
     24 
     25 void Rand_Cal_two(int digits[],char characters[],int range)  //随机产生运算数(不含乘除)
     26 {
     27     for(int i=0;i<6;i++){
     28         if(i<3){
     29             digits[i]=rand()%range;//生成四则运算的计算随机数
     30             continue;
     31         }
     32         else if(i<5){
     33             digits[i]=rand()%2;//随机产生标志判断计算符号
     34             continue;
     35         }
     36         else{
     37             digits[i]=rand()%2;//随机产生标志数判断括号位置
     38         }
     39     }
     40 }
     41 
     42 void Demo(int digits[],char characters[],char * Arithmetic_arr[],int m,int n) //产生符合要求的运算式
     43 {
     44     char character1,character2;
     45     int character3,character4,range;
     46     cout<<"请输入数字范围(最大值):"<<endl;
     47     cin>>range;
     48     cout<<"请选择是否带括号: Y表示带括号,N表示不带括号"<<endl;
     49     cin>>character1;
     50     cout<<"请选择是否有乘除: Y表示有乘除,N表示无乘除"<<endl;
     51     cin>>character2;
     52     cout<<"请选择每行容纳算是数量:"<<endl;
     53     cin>>character3;
     54     
     55     if(character3!=1){    
     56         cout<<"请选择行间距(1-n):"<<endl;    
     57         cin>>character4;
     58     }
     59     
     60     cout<<"-------------------"<<m<<"道算式题如下-------------------------"<<endl;
     61     
     62     for(int k=0; k<m; k++){
     63         int flag=k+1;
     64 P:
     65         if (character2=='Y'){
     66             Rand_Cal_one(digits,characters,range);
     67         }
     68         else{
     69             Rand_Cal_two(digits,characters,range);
     70         }
     71         Arithmetic_arr[k]=new char[n];    
     72         if(k!=0){    
     73             for(int i=0;i<k;i++){        
     74                 if( digits[0]==Arithmetic_arr[i][0]                    //避免重复
     75                     && characters[digits[3]]==Arithmetic_arr[i][1]
     76                     && digits[1]==Arithmetic_arr[i][2]
     77                     && characters[digits[4]]==Arithmetic_arr[i][3]
     78                     && digits[2]==Arithmetic_arr[i][4]
     79                     &&digits[5]==Arithmetic_arr[i][5]){
     80                     
     81                     goto P;    
     82                 }
     83             }
     84         }
     85         
     86         Arithmetic_arr[k][0]=digits[0];        //第一个操作数
     87         Arithmetic_arr[k][1]=characters[digits[3]];//第一个运算符
     88         Arithmetic_arr[k][2]=digits[1];        //第二个操作数
     89         Arithmetic_arr[k][3]=characters[digits[4]];//第二个运算符
     90         Arithmetic_arr[k][4]=digits[2];        //第三个操作数
     91         Arithmetic_arr[k][5]=digits[5];   //存放括号位置标志
     92         
     93         if (character1=='Y'){
     94             switch(digits[5]){    
     95             case 0:
     96                 if((characters[digits[3]]=='/'&&digits[1]==0)||(characters[digits[4]]=='/'&&digits[2]==0))//数学规则,商不能为0
     97                 {
     98                     goto P;
     99                 }
    100                 else
    101                 {
    102                     if((characters[digits[3]]=='+'||characters[digits[3]]=='-')        //括号在前
    103                         &&(characters[digits[4]]=='*'||characters[digits[4]]=='/'))    //排除无用括号
    104                     {
    105                         cout<<"(";
    106                         if((int)Arithmetic_arr[k][0]<0)
    107                         {
    108                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
    109                         }
    110                         else
    111                             cout<<(int)Arithmetic_arr[k][0];
    112                         cout<<Arithmetic_arr[k][1];
    113                         if((int)Arithmetic_arr[k][2]<0)
    114                         {
    115                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
    116                         }
    117                         else
    118                             cout<<(int)Arithmetic_arr[k][2];
    119                         cout<<")"<<Arithmetic_arr[k][3];
    120                         if((int)Arithmetic_arr[k][4]<0)
    121                         {
    122                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
    123                         }
    124                         else
    125                             cout<<(int)Arithmetic_arr[k][4];
    126                         cout<<"=";
    127                         
    128                         
    129                         
    130                         if(flag%character3==0) {cout<<endl;}
    131                         else {cout<<setw(character4);}
    132                         
    133                         break;
    134                     }
    135                     else 
    136                     {
    137                         goto P;
    138                     }
    139                 }
    140                 
    141             case 1:  //括号在后
    142                 int result=1;  //计算括号里面的值,并赋值在result中
    143                 switch(characters[digits[4]])
    144                 {
    145                 case '+':result=digits[1]+digits[2];break;
    146                 case '-':result=digits[1]-digits[2];break;
    147                 case '*':result=digits[1]*digits[2];break;
    148                 case '/':result=digits[1]/digits[2];break;
    149                 }
    150                 if((characters[digits[4]]=='/'&&digits[2]==0)||(characters[digits[3]]=='/'&&result==0))    //数学规则,商不能为0
    151                 {
    152                     goto P;
    153                 }
    154                 else
    155                 {
    156                     if((characters[digits[3]]=='*'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'))
    157                         ||(characters[digits[3]]=='/'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-'||characters[digits[4]]=='*'))
    158                         ||(characters[digits[3]]=='-'&&(characters[digits[4]]=='+'||characters[digits[4]]=='-')))    //排除无用括号    
    159                     {    
    160                         if((int)Arithmetic_arr[k][0]<0)
    161                         {
    162                             cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
    163                         }
    164                         else
    165                             cout<<(int)Arithmetic_arr[k][0];
    166                         cout<<Arithmetic_arr[k][1];
    167                         cout<<"(";
    168                         if((int)Arithmetic_arr[k][2]<0)
    169                         {
    170                             cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
    171                         }
    172                         else
    173                             cout<<(int)Arithmetic_arr[k][2];
    174                         cout<<Arithmetic_arr[k][3];
    175                         if((int)Arithmetic_arr[k][4]<0)
    176                         {
    177                             cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
    178                         }
    179                         else
    180                             cout<<(int)Arithmetic_arr[k][4];
    181                         cout<<")"<<"=";
    182                         
    183                         if(flag%character3==0) {cout<<endl;}
    184                         else {cout<<setw(character4);}
    185                         break;
    186                     }
    187                     
    188                     else 
    189                     {
    190                         goto P;
    191                     }
    192                 }
    193             }    
    194         }
    195         else{
    196             
    197             if((int)Arithmetic_arr[k][0]<0)
    198             {
    199                 cout<<"("<<(int)Arithmetic_arr[k][0]<<")";
    200             }
    201             else
    202                 cout<<(int)Arithmetic_arr[k][0];
    203             cout<<Arithmetic_arr[k][1];
    204             if((int)Arithmetic_arr[k][2]<0)
    205             {
    206                 cout<<"("<<(int)Arithmetic_arr[k][2]<<")";
    207             }
    208             else
    209                 cout<<(int)Arithmetic_arr[k][2];
    210             cout<<Arithmetic_arr[k][3];
    211             if((int)Arithmetic_arr[k][4]<0)
    212             {
    213                 cout<<"("<<(int)Arithmetic_arr[k][4]<<")";
    214             }
    215             else
    216                 cout<<(int)Arithmetic_arr[k][4];
    217             cout<<"=";
    218             if(flag%character3==0) {cout<<endl;}
    219             else {cout<<setw(character4);}
    220         }
    221     }        
    222 }
    223 
    224 int main()
    225 {
    226     while(1)
    227     {
    228         cout<<"------------------小学生四则运算产生器-------------------"<<endl;
    229         
    230         srand((unsigned)time(NULL));    //为rand()函数生成不同的随机种子
    231         
    232         int num1,num2=6;
    233         
    234         cout<<"请输入定制数目(输入零结束):"<<endl;      //题目数
    235         
    236         cin>>num1;
    237         
    238         if(num1==0){
    239 
    240             cout<<"---------------------谢谢使用!!!----------------------"<<endl;
    241             exit(0);
    242         }
    243         
    244         char ** Arithmetic_arr=new char*[num1];  //存放运算式动态数组
    245         
    246         int digits[6];                    //存放计算的随机数字的数组,前三个为随机运算数字,第四第
    247                                         //五为随机产生运算符号标志数,第六为判断括号位置标志数。
    248         char characters[6]={'+','-','*','/','(',')'};    //存放加减乘除及括号等字符数组
    249         
    250         Demo(digits,characters,Arithmetic_arr,num1,num2);  //调用计算函数
    251         
    252         delete [] Arithmetic_arr;  //释放动态数组空间
    253         
    254         cout<<endl<<"------------------请输入任意键继续!---------------------"<<endl;
    255         
    256         getch();
    257         
    258         system("CLS");
    259     }
    260     return 0;
    261 }
    View Code


    结论:通过这次编写程序,我觉得难的不是是否对语法有多么精通,而是编写的算法是否精炼简洁,最难的是逻辑问题的解决;

    当小的问题在一个函数下,无需通过大量的结构化以及参数的传递很容易就能解决;但当函数结构扩大时,良好的算法结构才是

    维护及修改程序的总要条件。

  • 相关阅读:
    Overloaded的方法是否可以改变返回值的类型
    parseXXX的用法
    java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?
    UVA 10405 Longest Common Subsequence(简单DP)
    POJ 1001 Exponentiation(大数处理)
    POJ 2318 TOYS(计算几何)(二分)
    POJ 1265 Area (计算几何)(Pick定理)
    POJ 3371 Flesch Reading Ease (模拟题)
    POJ 3687 Labeling Balls(拓扑序列)
    POJ 1094 Sorting It All Out(拓扑序列)
  • 原文地址:https://www.cnblogs.com/bill927/p/4342578.html
Copyright © 2011-2022 走看看