一、问题描述:
一、要求:
    1、题目避免重复
    2、可定制(数量/打印方式)
    3、可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),
是否支持小数(精确到多少位),打印中每行的间隔。
二、问题分析:
问题一:题目避免重复
    srand(time(NULL))函数;
  问题二:可定制(数量/打印方式)
    数量:将题目数量以数组的形式让用户输入;
    打印方式:以用户的输入数字来选择打印方式,几行几列...;
  问题三:可以控制:是否有乘除法、是否有括号、数值范围、加减有无负数、除法有无余数、是否支持分数(真假分数,、、、)
      是否支持小数(精确带多少位)、打印中每行间隔可调整
在选则有无上述各种数,用数字0,1表示有无。
三、源代码:
#include<iostream.h>
#include<stdlib.h>
#include<time.h> 
 void main( )
 {
     srand(time(NULL));//避免题目重复
     int i,j, x,y,t,b;//x,y表示两个数随机数,i表示题目的数量,t,b是在两个数相减中保证结果为正定义的变量
     int a[7];
      cout<<"请输入要打印的题目数:"<<endl;   
      cin>>a[0];
      while(a[0]<=0)  //题目数必须为正数
      {
          cout<<"请重新输入有效的题目数:"<<endl;
          cin>>a[0];
      };
      cout<<"请选择否有乘除法(是1;否0):"<<endl;
      cin>>a[1];
      while((a[1]!=1)&&(a[1]!=0)) //只能选择1或0
      {
          cout<<"请重新输入有效的数值:"<<endl;
          cin>>a[1];
      };
      cout<<"请输入运算数的范围:"<<endl;
      cin>>a[2];
      while(a[2]<=0)  //运算数必须为正数
      {
          cout<<"请重新输入有效的范围:"<<endl;
          cin>>a[2];
      };
     cout<<"请选择结果有无负数(是1;否0):"<<endl;
     cin>>a[3];
     while((a[3]!=1)&&(a[3]!=0))  //只能选择1或0
     {
         cout<<"请重新输入有效的数值:"<<endl;
         cin>>a[3];
     };
     cout<<"请选择结果有无余数(是1;否0):"<<endl;
     cin>>a[4];
     while((a[4]!=1)&&(a[4]!=0))  //只能选择1或0
     {
         cout<<"请重新输入有效的数值:"<<endl;
         cin>>a[4];
     };
     cout<<"请输入要打印的列数: "<<endl;
     cin>>a[5];
     while(a[5]<=0)
     {
         cout<<"请重新输入有效列数:  "<<endl;
         cin>>a[5];
     };
     cout<<"请输入每行间隔数: "<<endl;
     cin>>a[6];
    
    for(i=0;i<a[0];i++)
    {
        if(a[1]==1)//有乘除法的运算
        {
            t=rand()%4;
        }
        else//无乘除法的运算
        {
            t=rand()%2;
        }
        x=rand()%a[2]+1;
        y=rand()%a[2]+1;
        if(t==0)//加法
        {
            
          
           if((i+1)%a[5]==0)//判断是否换行
           {
               cout<<endl;
           if(a[6]!=0)
           {
               for(j=0;j<a[6];j++)
               {
                   cout<<'\t';
               }
           }
           }
           cout<<i+1<<"·"<<x<<"+"<<y<<"="<<endl;
           
        }
        if(t==1)//减法,考虑是否存在负数
        {
            if(a[3]==0)//不存在结果负数
            {
                b=x;
                x=y;
                y=b;
            }
            if(a[3]==1)//存在结果是负数
            {
            }
            
            
             if((i+1)%a[5]==0)//判断是否换行
             {
                 cout<<endl;
             
               
               if(a[6]!=0)//如果间隔数不是零
               {
                   for(j=0;j<a[6];j++)
                   {
                       cout<<'\t';
                   }
               }
             }
             cout<<i+1<<"·"<<x<<"-"<<y<<"="<<endl;
        }
        if(t==2)//乘法
        {
            
            
             if((i+1)%a[5]==0)//判断是否换行
           {
              
               if(a[6]!=0)
               {
                   cout<<endl;
               
                   for(j=0;j<a[6];j++)
                   {
                       cout<<'\t';
                   }
               }
             }
             cout<<i+1<<"·"<<x<<"*"<<y<<"="<<endl;
        }
        if(t==3)//除法,考虑结果是否有余数
        {
            if(a[4]==1)//结果有余数
            {}
            else
            {
                while(x%y!=0)//不能整除,重新生成随机函数
                {
                    x=rand()%a[2]+1;
                    y=rand()%a[2]+1;
                };
            }
        
            
             if((i+1)%a[5]==0)//判断是否换行
           {
               cout<<endl;
             
               if(a[6]!=0)
               {
                   for(j=0;j<a[6];j++)
                   {
                       cout<<'\t';
                   }
               }
             }
        cout<<i+1<<"·"<<x<<"/"<<y<<"="<<endl;
        }
    }
    cout<<"结束,欢迎下次使用"<<endl;
}
          
          
         
 
    
运行结果截图:
五、总结
在本次编程中,有很多小的问题,但是确实我们平时不注意的问题,本来最初的想法是一层一层函数的调用,但是调用函数学的不是很明白,所以造成很多错误,后来又想用if或者switch语句各种嵌套,但是又出现很多代码重复,虽然思路不难,但是没什么技术含量,最后我又分情况讨论,把各种限制条件加到加减乘除每种情况下,这样只是打印输出需要重复写,其余的限制条件就不必了。所以我知道每次编写程序前,必须做到胸中有沟壑,并把详情仔细的过滤下,从中找到最好的解决方案。
还有一点要改进当然地方是,列数总是输出不对,我就不截图了,以后会改进。
六、周活动总结表
| 
 项目计划总结 周活动总结表 姓名:唐仙迪 日期:2015/3/15  | 
|||||||
| 
 任务 日期  | 
 听课  | 
 编程  | 
 阅读课外数目  | 
 锻炼身体  | 
 写老师留得作业  | 
 业余活动  | 
 日总计 (分钟)  | 
| 
 周日  | 
 
  | 
 100  | 
 30  | 
 
  | 
 
  | 
 
  | 
 130  | 
| 
 周一  | 
 400  | 
 
  | 
 30  | 
 
  | 
 
  | 
 
  | 
 430  | 
| 
 周二  | 
 200  | 
 
  | 
 30  | 
 
  | 
 60  | 
 
  | 
 290  | 
| 
 周三  | 
 100  | 
 60  | 
 30  | 
 
  | 
 60  | 
 120  | 
 370  | 
| 
 周四  | 
 200  | 
 30  | 
 30  | 
 
  | 
 40  | 
 
  | 
 300  | 
| 
 周五  | 
 200  | 
 100  | 
 30  | 
 
  | 
 40  | 
 
  | 
 370  | 
| 
 周六  | 
 
  | 
 40  | 
 30  | 
 
  | 
 40  | 
 120  | 
 230  | 
| 
 阶段时间和效率 周数:1  | 
|||||||
| 
 总计  | 
 60  | 
 415  | 
 410  | 
 370  | 
 420  | 
 490  | 
 230  | 
| 
 平均  | 
 30  | 
 69  | 
 68  | 
 61  | 
 70  | 
 67  | 
 46  | 
| 
 最大  | 
 30  | 
 400  | 
 200  | 
 100  | 
 200  | 
 200  | 
 60  | 
| 
 最小  | 
 30  | 
 15  | 
 30  | 
 30  | 
 30  | 
 30  | 
 
  | 
2,时间记录日志:
学生:唐仙迪 日期:2015/3/15
老师:王建民 课程:PSP
| 
 日期  | 
 开始时间  | 
 结束时间  | 
 中断时间  | 
 净时间  | 
 活动  | 
 备注  | 
| 
 3/10  | 
 08:00  | 
 12:00  | 
 40  | 
 200  | 
 上课  | 
 
  | 
| 
 14:30  | 
 15:30  | 
 
  | 
 60  | 
 构思程序  | 
 
  | 
|
| 
 16:00  | 
 17:00  | 
 
  | 
 60  | 
 写作业  | 
 
  | 
|
| 
 21:00  | 
 21:30  | 
 
  | 
 30  | 
 读梦断代码  | 
 
  | 
|
| 
 3/11  | 
 08:00  | 
 10:00  | 
 20  | 
 100  | 
 听课  | 
 
  | 
| 
 11:00  | 
 12:00  | 
 
  | 
 60  | 
 编程  | 
 
  | 
|
| 
 14:00  | 
 15:00  | 
 
  | 
 60  | 
 写作业  | 
 
  | 
|
| 
 21:00  | 
 21:30  | 
 
  | 
 30  | 
 读梦断代码  | 
 
  | 
|
| 
 3/12  | 
 10:00  | 
 12:00  | 
 20  | 
 100  | 
 听课  | 
 
  | 
| 
 14:00  | 
 14:30  | 
 
  | 
 30  | 
 编程  | 
 
  | 
|
| 
 15:00  | 
 16:00  | 
 
  | 
 60  | 
 写作业  | 
 
  | 
|
| 
 21:00  | 
 21:30  | 
 
  | 
 30  | 
 读梦断代码  | 
 
  | 
|
| 
 3/13  | 
 08:00  | 
 12:00  | 
 40  | 
 200  | 
 听课  | 
 
  | 
| 
 14:00  | 
 15:40  | 
 
  | 
 100  | 
 编程  | 
 
  | 
|
| 
 21:00  | 
 21:30  | 
 
  | 
 30  | 
 读梦断代码  | 
 
  | 
3,缺陷记录日志:
学生:唐仙迪 日期:2015/3/15
老师:王建民
| 
 日期  | 
 编号  | 
 类型  | 
 引入阶段  | 
 排除阶段  | 
 修复阶段  | 
 修复缺陷  | 
| 
 3/10  | 
 1  | 
 001  | 
 编程  | 
 编译  | 
 15min  | 
 
  | 
| 
 描述:函数定义错误  | 
||||||
| 
 2  | 
 002  | 
 编程  | 
 编译  | 
 10min  | 
 
  | 
|
| 
 描述:函数调用出现错误  | 
||||||
| 
 3/11  | 
 3  | 
 003  | 
 编程  | 
 编译  | 
 2  | 
 
  | 
| 
 描述:switch语句掌握不好  | 
||||||
| 
 4  | 
 004  | 
 编程  | 
 编译  | 
 10min  | 
 
  | 
|
| 
 描述:输入时换行,导致错误  | 
||||||
| 
 3/12  | 
 5  | 
 005  | 
 编程  | 
 编译  | 
 5min  | 
 
  | 
| 
 描述:输出混乱  | 
||||||
| 
 3/13  | 
 6  | 
 006  | 
 编程  | 
 编译  | 
 5min  | 
 
  | 
| 
 描述: 在运行时,输出的格式不是按要求的输出的,原因是if语句插入的位置不正确 
  | 
||||||
                    
                
                
            
        
浙公网安备 33010602011771号