四则运算2及psp0设计

时间比较紧,我简单写写我的设计思路:

题目在四则运算1的基础上控制产生题目的数量,这个可以用变量控制;打印方式也可选用变量控制,程序的关键是括号的生成。我们可以将整个四则运算式看成()+()的模型,然后再利用递归函数对这个模型进行分解(这个函数我一直在调试但感觉还没有完善,时间比较紧,到后面我会补上)。

下面是我的源程序代码:关于括号生成目前是有问题的,请大家看后可以帮我指一下问题。

  1 //author:ly 2016.3.12
  2 /*function:arithmetic operation that avoid duplication
  3  can order question number
  4  can select division and multiplication
  5  can choose brackets
  6  Specified range of operation
  7 */
  8 #include<iostream>
  9 #include<time.h>
 10 #include<sstream>
 11 #include<string>
 12 #include<fstream>
 13 using namespace std;
 14
 15 string Judge[30][30];   //判断是否重复的数组
 16 string para[30];       //备用数组
 17 char op_arrays[4]={‘+‘,‘-‘,‘*‘,‘/‘};   //运算符数组
 18 int row=0;   //定义行
 19 int ran=0;   //定义列
 20 int k=0;
 21 int parameters[30];           //定义参数数组
 22 void Random_build1(int,int,int);    //产生算术式的函数
 23 void Random_build2(int,int,int);
 24 void Random_build3(int,int,int);
 25 void Random_build4(int,int,int);
 26 void Decu(int,int,int);      //递归函数
 27
 28 int main()
 29 {
 30     //对于产生括号的运算生成还有问题 希望老师看了能给我在博客中指点一下问题所在
 31
 32     int count_t=0;     //产生题目数量
 33     char print_way;    //判断打印方式
 34     char Jude_has_mul_dev;    //判断是否有乘除法
 35     char  Jude_has_brackets;   //判断是否有括号
 36
 37     int parameters_num=0;     //参数个数
 38     int rangeof_count=0;    //指定计数的范围
 39     int brackets_l=0;     //判断左括号的序数
 40     int brackets_r=0;     //判断右括号的序数
 41
 42     cout<<"请输入需要产生四则元算的题数:"<<endl;
 43     cin>>count_t;
 44
 45     while(1)
 46     {
 47     //判断有无乘除法
 48     cout<<"是否需要做乘除  是(输入y) 否(输入n)"<<endl;
 49     cin>>Jude_has_mul_dev;
 50     cout<<"判断是否需要括号 是(输入y) 否(输入n)"<<endl;
 51     cin>> Jude_has_brackets;
 52     cout<<"判断你需要做的计算的范围(小于1000):"<<endl;
 53     cin>>rangeof_count;
 54
 55      srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样
 56      memset(Judge,0,sizeof(Judge));
 57      memset(parameters,0,sizeof(parameters));
 58     while(row<count_t)
 59     {
 60        parameters_num=2+rand()%9;   //产生2-10个随机数
 61        ran=0;
 62        memset(para,0,sizeof(para));
 63
 64     if(Jude_has_mul_dev==‘n‘)
 65     {
 66         //不含乘除法
 67         if(Jude_has_brackets==‘n‘)
 68         {
 69             //不含括号
 70             //调用产生算术式的函数
 71             int i=1;
 72
 73             while(i<=parameters_num)
 74             {
 75                 Random_build2(parameters_num, rangeof_count, i);
 76                 i++;
 77             }
 78             parameters[row]=ran;    //记录每次产生参数的个数
 79
 80        }
 81         else
 82         {
 83             //产生括号(采用递归方式产生括号)
 84             //先产生算术式 并用数组记录
 85             int i=1,s,l;
 86             int flag=1; //判断递归函数中是否生成括号
 87             while(i<=parameters_num)
 88             {
 89                 Random_build3(parameters_num, rangeof_count, i);
 90                 i++;
 91             }
 92
 93             s=k,l=0;
 94
 95             Decu(l,k,flag);
 96
 97             parameters[row]=ran;    //记录每次产生参数的个数
 98
 99       }
100     }
101     else
102     {
103         //含乘除法
104         if(Jude_has_brackets==‘n‘)
105         {
106             //不含括号
107             int i=1;
108             while(i<=parameters_num)
109             {
110                 Random_build1(parameters_num, rangeof_count, i);
111                 i++;
112             }
113                 parameters[row]=ran;    //记录每次产生参数的个数
114         }
115         else
116         {
117             //含括号
118             //产生括号(采用递归方式产生括号)
119             //先产生算术式 并用数组记录
120             int i=1,s,l;
121             int flag=1; //判断递归函数中是否生成括号
122             while(i<=parameters_num)
123             {
124                 Random_build4(parameters_num, rangeof_count, i);
125                 i++;
126             }
127             s=k,l=0;
128
129             Decu(l,k,flag);
130             parameters[row]=ran;    //记录每次产生参数的个数
131         }
132     }
133           row++;    //运算式的行数
134     }
135
136     cout<<"请输入你需要的打印方式:(输入a 在控制台打印输出 输入b 在文件中输出)"<<endl;
137     cin>>print_way;
138
139     if(print_way==‘a‘)
140     {
141     //打印产生的运算表达式
142     cout<<"产生的运算表达式为:"<<endl;
143     for(int i=0;i<count_t;i++)
144     {
145         cout<<i+1<<". ";
146         for(int j=0;j<=parameters[i];j++)
147             cout<<Judge[i][j];
148         cout<<endl;
149     }
150     }
151     else
152     {
153         //将产生的四则运算表达式输出到D:\1.txt中
154         ofstream out("D:\1.txt");
155         for(int i=0;i<count_t;i++)
156     {
157         out<<i+1<<". ";
158         for(int j=0;j<=parameters[i];j++)
159             out<<Judge[i][j];
160         out<<endl;
161     }
162     }
163  }
164     return 0;
165 }
166
167 void Random_build1(int parameters_num,int rangeof_count,int i)
168 {
169     int parameters;
170     int fuhao=0;
171     stringstream ss;
172     //随机产生 运算表达数
173     parameters=0+rand()%rangeof_count;
174     //判断上一次产生的是否除法
175     if(fuhao==3)
176     {
177        while(parameters==0)     //除数为0就重新生成
178         {
179             parameters=0+rand()%rangeof_count;
180         }
181     }
182     //随机产生 运算符(最后一次不产生运算符)
183     if(i<parameters_num)
184     {
185         fuhao=((0+rand()%4)+4)%4;
186     }
187     if(i<parameters_num)
188     {
189         //将产生的数放入判断重复的数组中
190         ss<<parameters;
191         ss>>Judge[row][ran];
192         ran++;    //列增加
193         Judge[row][ran]=op_arrays[fuhao];
194         ran++;    //列增加
195     }
196     else
197     {
198         ss<<parameters;
199         ss>>Judge[row][ran];
200     }
201 }
202
203 void Random_build2(int parameters_num,int rangeof_count,int i)
204 {
205     int parameters;
206     int fuhao;
207     stringstream ss;
208     //随机产生 运算表达数
209     parameters=0+rand()%rangeof_count;
210
211     //随机产生 运算符(最后一次不产生运算符)
212     if(i<parameters_num)
213     {
214          fuhao=((0+rand()%2)+2)%2;
215     }
216     if(i<parameters_num)
217     {
218         //将产生的数放入判断重复的数组中
219         ss<<parameters;
220         ss>>Judge[row][ran];
221         ran++;    //列增加
222         Judge[row][ran]=op_arrays[fuhao];
223         ran++;    //列增加
224     }
225     else
226     {
227         ss<<parameters;
228         ss>>Judge[row][ran];
229     }
230 }
231
232 void Random_build3(int parameters_num,int rangeof_count,int i)
233 {
234     int parameters;
235     int fuhao;
236     stringstream ss;
237     //随机产生 运算表达数
238     parameters=0+rand()%rangeof_count;
239
240     //随机产生 运算符(最后一次不产生运算符)
241     if(i<parameters_num)
242     {
243          fuhao=((0+rand()%2)+2)%2;
244     }
245     if(i<parameters_num)
246     {
247         //将产生的数以字符放入判断重复的数组中
248         ss<<parameters;
249         ss>>para[k];
250         k++;    //列增加
251
252         para[k]=op_arrays[fuhao];
253         k++;    //列增加
254     }
255     else
256     {
257         ss<<parameters;
258         ss>>para[k];
259     }
260 }
261
262 void Random_build4(int parameters_num,int rangeof_count,int i)
263 {
264     int parameters;
265     int fuhao=0;
266     stringstream ss;
267     //随机产生 运算表达数
268     parameters=0+rand()%rangeof_count;
269     if(fuhao==3)
270     {
271        while(parameters==0)     //除数为0就重新生成
272         {
273             parameters=0+rand()%rangeof_count;
274         }
275     }
276     //随机产生 运算符(最后一次不产生运算符)
277     if(i<parameters_num)
278     {
279          fuhao=((0+rand()%4)+4)%4;
280     }
281     if(i<parameters_num)
282     {
283         //将产生的数以字符放入判断重复的数组中
284         ss<<parameters;
285         ss>>para[k];
286         k++;    //列增加
287
288         para[k]=op_arrays[fuhao];
289         k++;    //列增加
290     }
291     else
292     {
293         ss<<parameters;
294         ss>>para[k];
295     }
296 }
297
298 void Decu(int l,int s,int flag)
299 {
300     srand(time(NULL));//用系统当前时间设置rand()随机序列种子,保证每次运行随机序列不一样
301
302     if((s-l)<2) return ;
303
304     if((s-l)==2)
305     {
306         if(flag==1)
307         {
308             //产生括号
309           Judge[row][ran]="(";
310           ran++;
311           Judge[row][ran]=para[l];
312           ran++;
313           Judge[row][ran]=para[l+1];
314           ran++;
315           Judge[row][ran]=para[s];
316           ran++;
317           Judge[row][ran]=")";
318           ran++;
319         }
320         if(flag==0)
321         {
322           Judge[row][ran]=para[l];
323           ran++;
324           Judge[row][ran]=para[l+1];
325           ran++;
326           Judge[row][ran]=para[s];
327           ran++;
328         }
329         return ;
330     }
331     if((s-l)==4)
332     {
333         //存在随机数个数为奇数的情况
334         flag=0+rand()%2;
335         if(flag==1)
336         {
337          Judge[row][ran]="(";
338          ran++;
339          Judge[row][ran]=para[l];
340          ran++;
341          Judge[row][ran]=para[l+1];
342          ran++;
343          flag=0+rand()%2;
344          Decu(l+2,s,flag);
345          Judge[row][ran]=")";
346           ran++;
347         }
348         if(flag==0)
349         {
350              Judge[row][ran]=para[l];
351          ran++;
352          Judge[row][ran]=para[l+1];
353          ran++;
354          flag=0+rand()%2;
355          Decu(l+2,s,flag);
356         }
357           return ;
358     }
359
360     if((s-l)>4)
361     {
362             flag=0+rand()%2;
363         if(flag==1)
364         {
365          Judge[row][ran]="(";
366          ran++;
367              flag=0+rand()%2;
368          Decu(l,s-4,flag);
369          Judge[row][ran]=para[s-3];
370          ran++;
371          l=s-2;
372          flag=0+rand()%2;
373          Decu(l,s,flag);
374          Judge[row][ran]=")";
375           ran++;
376         }
377         if(flag==0)
378         {
379             flag=0+rand()%2;
380          Decu(l,s-4,flag);
381          Judge[row][ran]=para[s-3];
382          ran++;
383          l=s-2;
384          flag=0+rand()%2;
385          Decu(l,s,flag);
386         }
387           return ;
388     }
389 }

运行截图:

PSP0设计:

周活动日志:

  听课 编写程序 阅读课本 日总计
周一  100  180  0  
周二  0  200  0  
周三  0  180  0  
周四  100  200  80  
周五  0  200  60  
周六  0  300  60  
周日        
周总计  200      

时间记录日志:

 日期  开始时间  结束时间  中断时间  净时间  活动 备注 
 7/3  14:00  15:50        
             
 8/3            
             
9/3            
             
10/3             
             
 11/3            
             
 12/3            
时间: 2024-10-11 17:42:24

四则运算2及psp0设计的相关文章

小学生四则运算C/C++编程设计思想

题目: 1.题目避免重复:        2.可定制(数量(打印方式)):        3.可控制下列参数:是否有乘除法.是否有括号.数值范围.加减有无负数.        除法有无余数.是否支持分数(真分数.假分数....).是否支持小数       (精确到多少位).打印中每行间隔可调整. 设计思想:   1.题目避免重复:将每道题目存储后,新生成的题目进行对比,排除重复相同的题目:   2.可定制(数量/打印方式):主函数负责数量和打印方式:   3.控制变量参数:将各种参数变量组成参数

个人作业三:四则运算一

四则运算1 一.设计思路: 1.程序的主体部分是循环输出,次数即题目数目由用户输入: 2.三个整型变量+rand函数来实现随机数四则运算,一个变量代表加减乘除,另外两个用作运算数: 3.用户体验:题目分三列,排列整洁间距适中,并且不会显示除数为0的情况. 二.源代码 // 四则运算.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "iostre

随机生成30道100以内的四则运算题目

1.题目要求:除了整数以外,还要支持真分数的四则运算. 2.设计思路: (1)操作数的产生: a.利用宏定义定义随机函数. b.引用随机随机函数产生随机数,并定义随机数的取值范围. (2)运算符问题的解决: a.引用随机函数产生0~3四个随机数 b.引用swatch.case结构,随机选择运算符号:0:加 1:减 2:乘 3:除 (3)运行结果的输出: 利用for循环结构,顺序输出30道四则运算题目,并显示在屏幕上. (4)未解决问题: 随机产生真分数计算的问题还没有解决,希望通过以后的努力可以

个人作业五:四则运算二

四则运算2 一.设计思路: 1.题目避免重复: (1)利用系统时间来产生随机数,重复率会降低. (2)建立链表,逐个判断.可读取写入文件. 2.可定制(数量/打印方式): (1)格式有默认值; (2)可以选择重新设置分几列和每行的间隔.打印方式用%取余来实现分列输出. 3.可以控制参数: (1)这些参数都有默认值: (2)出题之前可以选择重新设置某一个或多个参数: (3)是否有乘除法/括号/负数/余数/支持分数/支持小数:用户输入1/0表示是/否: 数值范围.真分数.假分数.精确到几位小数.每行

01:JAVA_四则运算题目生成程序(基于控制台)

一.题目要求 1. 使用 -n 参数控制生成题目的个数,例如 Myapp.exe -n 10 -o Exercise.txt 将生成10个题目. 2. 使用 -r 参数控制题目中数值(自然数.真分数和真分数分母)的范围,例如 Myapp.exe -r 10 将生成10以内(不包括10)的四则运算题目.该参数可以设置为1或其他自然数.该参数必须给定,否则程序报错并给出帮助信息. 3. 生成的题目中如果存在形如e1 ÷ e2的子表达式,那么其结果应是真分数. 4. 每道题目中出现的运算符个数不超过3

关于“代码规范”,“Review”和“Check list”(续)

在前两天的    关于“代码规范”,“Review”和“Check list”    一文中,我给自己列出了Check list,如下: 1.代码能够工作么?它有没有实现预期的功能,逻辑是否正确等. 2.所有的代码是否简单易懂? 3.代码符合你所遵循的编程规范么?这通常包括大括号的位置,变量名和函数名,行的长度,缩进,格式和注释. 4.是否存在多余的或是重复的代码? 5.代码是否尽可能的模块化了? 6.是否有可以被替换的全局变量? 7.是否有被注释掉的代码? 8.循环是否设置了长度和正确的终止条

软件工程概论课个人总结

在这一学期经历了16周的软件工程概论课程的学习,我学习到了很多知识,收获了很多,大二我们进入软件工程专业,对软件工程专业和所要学习的知识和方向还不了解,软件工程概论课向我们讲解了软件工程的基本概念和软件开发这项工程的开发流程以及开发中的一些问题,使我们了解了软件的开发的方式,开发的流程,使我们建立了开发软件这项工程的基本框架,我从中收获了很多知识,构建了软件开发的基本思维. 通过软件工程概论课我基本了解了程序的概念,程序=算法+数据结构,软件=程序+软件工程,软件工程需要通过需求分析.设计.编码

JAVA作业)01

一,四则运算 (一)  设计思想 使用Scanner类读取运行时用户输入数据,然后进行数据类型转换,完成四则运算之后利用输出类输出. (二)  流程图 (三)程序代码 //Zhangxiaochen 2015/10 04  四则运算 import javax.swing.JOptionPane;  // import class JOptionPane public class Operation { public static void main( String args[] ) { Stri

软件工程第五次作业(结对作业)

软件工程第五次作业 题目 本次作业我与合作伙伴选择的是题目1:四则运算生成 能够自动生成四则运算练习题 可以定制题目数量 用户可以选择运算符 用户设置最大数(如十以内.百以内等) 用户选择是否有括号.是否有小数 用户选择输出方式(如输出到文件.打印机等) 最好能提供图形用户界面(根据自己能力选做,以完成上述功能为主) 角色选择 驾驶员 - 能够完成全部代码工作,程序基本实现全部要求功能,并将代码上传至coding.net或者GitHub代码托管系统中 - 能够对导航员在本次编程工作中起到的作用给