首页 > 技术文章 > 30道四则运算题的第三次补充

zhaixing 2015-03-15 16:56 原文

30道四则运算题目

一、题目:

用C++编写程序,打印30道四则运算题目;

  要求:1、题目避免重复;
       2
、可定制(数量/打印方式);
       3
、可以控制下列参数: 是否有乘除法、是否有括号、 数值范围、加减有无负数、除    法有无余数、否支持分数 (真分数, 假分数, …)是否支持小数 (精确到多少位)、打印中每行的间隔可调整;

 二、设计思路:

要求1:题目避免重复

         C++中用函数srand()能够避免生成重复的随机数,一定的数值范围只能生成一定数量的随机运算题目:满足一个关系:num>(4*(num2-num1)^2)即:题目数应小于4倍的可用整数的平方。满足这个条件才能不重复。

要求2:可定制(数量/打印方式);

         For()循环中的30这个数字,变成一个从键盘输入的参数num;

         打印方式:在循环的过程中要根据用户输入的每行几个式子,间距进行打印。

要求3:

A、是否有乘除法

        把参数c进行控制:除法c=0;加法c=1;减法c=2;乘法c=3;

         用if控制用户输入的是否要乘法、除法

         Rand()随机生成c。

B、是否有括号

         程序要改进成混合运算;if 0 cout<<;else cout<<

C、数值范围

         提示语句;新参数

         参数a、b进行控制,新参数作为随机函数后面的控制条件;

D、加减有无负数

         控制case 2的内容;a>b或者 a<b;

E、除法余数

         如果用户输入的结果判断出需要除法式子,则进行判断是不是要能够整除。

         不要求整除的话,判断除数是否为0,若为0,a、b颠倒位置输出即可;

        若要求整除,重新生成a、b,直到生成合适a、b为止,此处用到while循环。

F是否支持分数(真分数,假分数)

         输入提示语句

         真分数:结果输出形式a/b原样输出

G是否支持小数

         输入提示语句;        

H打印中每行的间隔可调整?

        在每道题目输出的时候,判断i与k是否是整除关系。是对话输出回车,进行排版。

三、源代码:

  1 /**
  2 作者:程鹏远
  3 题目:30道2年纪四则运算题目
  4 */
  5 #include <iostream.h>
  6 #include <stdlib.h>
  7 #include <conio.h>
  8 int main()
  9 {
 10     //初始化
 11     int a,b,c;    
 12     int num1,num2;
 13     int num;
 14     int chufa;
 15     int k,jiange;
 16     int zhengchu;
 17     int j=0;
 18     int chengfa;
 19     int con;
 20     //请输入数的范围,中间用空格隔开:
 21     cout<<"请输入数的范围,中间用空格隔开:";
 22     cin>>num1>>num2;
 23 
 24     //控制题目的个数,num
 25     cout<<"其输入要出多少道题目:";
 26     cin>>num;
 27     
 28     if(num>(4*(num2-num1)^2))
 29     {
 30         cout<<"您输入的题目数量太多,会造成重复,请重新输入数目:";
 31         cin>>num;
 32     }
 33 
 34     //打印格式
 35     cout<<"一行几道题,行间距是几,中间空格:";
 36     cin>>k>>jiange;
 37     if(jiange>=5||jiange<0)
 38     {
 39         cout<<"您输入的间距太大或为负数,请重输:";
 40         cin>>jiange;
 41     }
 42     
 43     //是否要除法
 44     cout<<"是否要除法?是输入1,否输入0:";
 45     cin>>chufa;
 46     if(chufa==1)
 47     {
 48         cout<<"是否要有余数,是输入1,否输0:";
 49         cin>>zhengchu;
 50     }
 51     
 52     //是否要乘法
 53     cout<<"是否要乘法,是输入1,否输入0:";
 54     cin>>chengfa;
 55 
 56     cout<<endl;
 57     for(int i=0;i<num;i++)
 58     {    
 59         cout<<i+1<<"";        
 60         a=(rand()%(num2-num1+1))+num1;
 61         b=(rand()%(num2-num1+1))+num1;
 62         
 63         if(chufa==1)
 64         {
 65             if(chengfa==1)
 66             {
 67                 c=rand()%4;//0-3
 68             }
 69             else
 70             {
 71                 c=rand()%3;//0-2
 72             }
 73         }
 74         else
 75         {
 76             if(chengfa==1)
 77             {
 78                 c=rand()%3+1;//1-3
 79             }
 80             else
 81             {
 82                 c=rand()%2+1;//1-2
 83             }
 84         }
 85 
 86         switch (c)
 87         {
 88             case 1:
 89                 cout<<a<<"+"<<b<<"="<<"\t";
 90                 break;
 91             case 2:
 92                 if(a>b)
 93                 {
 94                     cout<<a<<"-"<<b<<"="<<"\t";
 95                 }
 96                 else
 97                 {
 98                     cout<<b<<"-"<<a<<"="<<"\t";
 99                 }
100                 break;
101             case 3:            
102                 cout<<a<<"*"<<b<<"="<<"\t";
103                 break;
104             case 0://除法
105                 if(zhengchu==1)//有余数
106                 {
107                     if(b==0)
108                     {
109                         cout<<b<<"/"<<a<<"="<<"\t";
110                     }
111                     else
112                     {
113                         cout<<a<<"/"<<b<<"="<<"\t";    
114                     }
115 
116                     
117                 }
118                 else
119                 {
120                     while((j<100000)&&(a!=0)&&(b!=0)&&(a%b==0))
121                     {
122                         cout<<a<<"/"<<b<<"="<<"\t";
123                         j++;
124                     }
125                     if((a!=0)&&(b!=0)&&(a%b==0))
126                     {
127                         cout<<a<<"/"<<b<<"="<<"\t";
128                         //i++;
129                     }
130                     else
131                     {
132                         int j=0;
133                         while(j<100000)
134                         {
135                             a=(rand()%(num2-num1+1))+num1;
136                             b=(rand()%(num2-num1+1))+num1;
137                             if((a!=0)&&(b!=0)&&(a%b==0))
138                             {
139                                 cout<<a<<"/"<<b<<"="<<"\t";
140                                 //i++;
141                                 j=100000;
142                                 j++;
143                             }
144                             else
145                             {
146                                 j++;
147                             }
148                         }
149                     }                                
150                 }
151                 break;    
152         } 
153         
154         
155         if((i+1)%k==0)
156         {
157             cout<<endl;
158             for(int m=0;m<jiange;m++)
159             {
160                 cout<<endl;
161             }
162         }
163                 
164     }
165     //继续吗?
166     cout<<"继续吗?是输入1,否输入0:"<<endl;
167     cin>>con;
168     if(con==1)
169     {
170         cout<<endl;
171         main();
172     }
173     else
174     {
175         return 0;
176     }
177     getch();
178     return 0;
179 }

 

四、结果截图

五、总结:

  1.遇到问题:

    Rand()获取随机数,他的范围问题,是不是包括边界值;

    一定数目的题目才能够在满足数字的范围内不重复,运用高中排列组合知识进行讨论解决;

    这么多要求,这些要求是有顺序的,例如,必须先有判断是不是有除法,才能继续判断是不是要余数,如果没有除法,就不用判断是不是要余数,避免用户的困惑;

    要求无余数,一次循环过来的a、b是不满足条件的,需要对while循环熟练使用才能快速生成有用的a、b;

    For循环内部是包括自加1机制的,不用在循环的最后加1;

  2.收获

    一个软件的编写一定是从简单的小模块到大的模块,是从小到要求实现,到全部的要求实现。开始看见题目不要太着急,先对题目进行分解,慢慢就能做出完整的题目。

  3.体会

    先对题目要有一个自己的设计思路,思路成熟后才进行编写代码环节。编写的时候遇到小问题,可以百度相应的知识点,也可以问经验丰富的同学。

一、项目计划总结:

周活动总结表

姓名:程鹏远                                                 日期:3月15日

日期       任务

听课

编写程序

阅读课本

准备考试

日总计

周日

 

205

 

 

 205

周一

 

 

 

 

 

周二

 

 

 

 

 

周三

 

 

 

 

 

周四

 

 

 

 

 

周五

 

105

 

 

 105

周六

 

 

 

 

 

周总结

 

 

 

 

 

阶段时间和效率                                           第2 周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间                                                                         

总计

 

 

 

 

 

 

 

平均

 

 

 

 

 

 

 

最大

 

 

 

 

 

 

 

最小

 

 

 

 

 

 

 

以前各周的累计时间                                                                                    

总计

 310

 

 

 

 

 

 

平均

 155

 

 

 

 

 

 

最大

 205

 

 

 

 

 

 

最小

 105

 

 

 

 

 

 

二、时间记录表:

学生        程鹏远                                              日期     315      

教师        王建民                                              课程      软件工程       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

3/15

1:00

4:37

12min

3小时25分钟

编写30道四则运算题目

 

 

三、缺陷记录日志:

学生    程鹏远                                

日期   3月15日                                                                                      

教员       王建民                                             

程序号       1                                  

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

 3/15

 01

20

 编码

 编码

 1分钟

 

  描述:不会用rand()函数;

 

 02

制表符”\t”

 编码

 编译

 2分钟

 

描述:不会用制表符“\t”

 

 03

 For()

 编码

编译

7分钟

 

 描述:for循环内部多层嵌套,内部放入了i++;

 

 

 

 

 

 

 

 

推荐阅读