一、问题描述:

一、要求:
    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语句插入的位置不正确

 

                                                                

 

posted on 2015-03-15 12:42  掬雪煮茶  阅读(190)  评论(0编辑  收藏  举报