关于随机四则运算的小程序

2015-03-12

基本上是按上一篇博文中的思想,粗略的编写了一个beta版,不足也是有的,一些判断机智,程序的健壮性有待改进。

  1 #include<iostream>
  2 #include<time.h>
  3 using namespace std;
  4 typedef struct node{
  5     int num1;
  6     int num2;
  7     char ope;
  8     struct node *next;
  9 }node,*linknode;                                                        //定义三个操作数的数据结构,用于对产生数据的记录   
 10 
 11 void Math(int num,linknode &L,int chengchu,int fanwei,int yushu);       //产生数据
 12 void InitList(linknode &L);                                             //链表初始化
 13 void Insertlist(linknode &L,int one,int two,char thr);                  //插入数据
 14 int Serchlist(linknode L,int one,int two,char thr);                     //查询节点
 15 void Printrecord(linknode &L,int hang);                                 //输出数据
 16 void menu1();                                                           //大要求的菜单选项
 17 void choice(int *n);                                                    //对用户的提供的选择
 18 void menu2();                                                           //是否有乘除法,数值范围,打印中每行的间隔可调整,除法有无余数,
 19 void standerd(int *n,int *f,int *y,int *h);
 20 
 21 void main()
 22 {
 23     int num=5;        //出题数量
 24     int chengchucan=0;
 25     int fanweican=100;
 26     int yushucan=0;
 27     int hangcan=0;
 28     linknode l;
 29     InitList(l);
 30     choice(&num);    
 31     standerd(&chengchucan,&fanweican,&yushucan,&hangcan);
 32     Math(num,l,chengchucan,fanweican,yushucan);         //调用函数,产生数据
 33     Printrecord(l,hangcan);
 34 }
 35 
 36 void menu1()
 37 {
 38     cout<<"- - - - -  - - - - - - 菜单- - - - - - -- - - - - - "<<endl;
 39     cout<<"                   1.定制出题数量                   "<<endl;
 40     cout<<"                   2.定制打印                       "<<endl;                      //附加功能??
 41     cout<<"                   3.退出菜单                       "<<endl;
 42     cout<<"                   4.使用说明                       "<<endl;
 43     cout<<"- - - - -  - - ---------------二柱子- "<<endl;
 44 }
 45 
 46 void menu2()
 47 {
 48     cout<<"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~菜单~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~"<<endl;
 49     cout<<"                   1.是否有乘除法                  "<<endl;
 50     cout<<"                   2.数值范围                       "<<endl; 
 51     cout<<"                   3.除法有无余数                   "<<endl; 
 52     cout<<"                   4.打印中每行的间隔可调整         "<<endl; 
 53     cout<<"                   5.退出菜单                       "<<endl;
 54     cout<<"~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~~ ~ ~~ ~ ~ ~ ~ ~ ~ ~ 二柱子 ~"<<endl;
 55 
 56 }
 57 
 58 void choice(int *n)
 59 {
 60     int choi,number;
 61     menu1();
 62     cout<<"请输入选择"<<endl;
 63     cin>>choi;
 64     while(choi!=3)
 65     {
 66         switch(choi)
 67         {
 68         case 1:
 69             {
 70                 cout<<"请输入题目数量"<<endl;
 71                 cin>>number;
 72                 *n=number;
 73                 menu1();
 74                 cin>>choi;
 75                 break;
 76             }
 77         case 2:
 78             {
 79                 cout<<"定制打印"<<endl;
 80                 menu1();
 81                 cin>>choi;
 82                 break;
 83             }
 84         case 4:
 85             {
 86                 cout<<" 使用说明书"<<endl;
 87                 menu1();
 88                 cin>>choi;
 89                 break;
 90             }
 91             
 92         }
 93     }
 94 }
 95 
 96 void standerd(int *chengchu,int *fanwei,int *yushu,int *hangjian)
 97 {
 98     int select,can1,can2,can3,can4;
 99     menu2();
100     cout<<"请输入选择"<<endl;
101     cin>>select;
102     while(select!=5)
103     {
104         switch(select)
105         {
106         case 1:          //是否有乘除法
107             {
108                 cout<<"请输入选择 0代表设定乘除法1代表不设定乘除法(程序默认拥有乘除法)"<<endl;
109                 cin>>can1;
110                 if(can1==1)
111                     *chengchu=1;
112                 menu2();
113                 cin>>select;
114                 break;
115             }
116         case 2:        //数值范围
117             {
118                 cout<<"请输入 您想要的出题数值范围(程序默认数值范围为100以内)"<<endl;
119                 cin>>can2;
120                 *fanwei=can2;
121                 menu2();
122                 cin>>select;
123                 break;
124             }
125         case 3:       //除法有无余数 
126             {
127                 cout<<"请输入选择 0代表设定允许余数1代表不允许除法有余数(程序默认会有余数)"<<endl;
128                 cin>>can3;
129                 *yushu=can3;
130                 menu2();
131                 cin>>select;
132                 break;
133             }
134         case 4:       //打印中每行的间隔可调整
135             {
136                 cout<<"请输入 您想要的打印题目之间的间隔(程序默认打印题目之间的间隔为0)"<<endl;
137                 cin>>can4;
138                 *hangjian=can4;
139                 menu2();
140                 cin>>select;
141                 break;
142             }
143         }
144     }
145 
146 }
147 void Math(int num,linknode &L,int chengchu,int fanwei,int yushu)
148 {
149     srand(time(NULL));
150     int a,b,c,rule;
151     char d;
152     int sancan=4;
153     int onecan=100;
154     if(chengchu==1)               //对乘除参数进行判断,为1时设置参数的改变
155         sancan=2;
156 
157     onecan=fanwei;                //对数值范围的修改,默认为
158     for(int x=0;x<num;x++)
159     {        
160         a=rand()%onecan;
161          b=rand()%onecan;
162         c=rand()%sancan;
163         //cout<<"连续输入三个数"<<endl;       //测试产生数据相同时的结构是否成立
164         //cin>>a>>b>>c;
165         rule=0;
166         switch(c)
167         {
168         case 0:
169             d='+';
170             break;
171         case 1:
172             d='-';
173             break;
174         case 2:
175             d='*';
176             break;
177         case 3:
178             d='/';
179             break;
180         } 
181         rule=Serchlist(L,a,b,d);
182         if(rule==0)
183         {
184             x--;
185             //cout<<"ji zhi "<<endl;
186         }
187         else if(yushu==1&&c==3&&a%b!=0)
188         {
189             x--;
190             cout<<"余数设置规则"<<endl;
191         }
192         else
193             Insertlist(L,a,b,d);
194         
195     }
196 }
197 
198 void InitList(linknode &L)
199 {
200     L=new node;
201     L->next=NULL;
202 }
203 
204 void Insertlist(linknode &L,int one,int two,char thr)
205 {
206     linknode p=L;
207     while(p->next!=NULL)
208         p=p->next;
209     node * s=NULL;
210     s = (node *) malloc (sizeof(node));
211     s->num1=one;
212     s->num2=two;
213     s->ope=thr;
214     s->next=p->next;
215     p->next=s;
216 }
217 
218 int Serchlist(linknode L,int one,int two,char thr)
219 {
220     if(L->next==NULL)
221         return 1;
222     linknode p=L->next;
223     while(p!=NULL)
224     {
225         if(p->num1==one&&p->num2==two&&p->ope==thr)
226             return 0;
227         p=p->next;
228     }
229     return 1;
230 }
231 
232 void Printrecord(linknode &L,int hang)
233 {
234     int a=hang;
235     linknode p=L->next;
236     while(p    !=NULL)
237     {
238         cout<<p->num1<<p->ope<<p->num2<<"="<<endl;
239         while(hang>0)
240         {
241             cout<<endl;
242             hang--;
243         }
244         hang=a;
245         p=p->next;
246     }
247 }




  通过设计这些小应用,可以练习一些基本编程的数据结构,解决问题可以采用分部分的拆分题目,对题目进行模块化设计,但设计的模块一定要有顺序,新模块在已有的模块基础之上,所以应该保证设计新模块时,原有的基础是正确的,这样才能保证你是离成功越来越近的,而不是背道而驰。

一、项目计划总结:

 

第二周活动总结表

姓名:赵小早                                       日期:3/10/2015

日期       任务

听课

编写程序

阅读课本

准备考试

 

 

日总计

周日

 

 

 

 

 

 

 

周一

 

 

 

 

 

 

 

周二

 80

 100

 30

 

 

 

 

周三

 80

 60

 

 

 

 

 

周四

 

 60

 

 

 

 

 

周五

 

 

 

 

 

 

 

周六

 

 

 

 

 

 

 

周总结

 

 

 

 

 

 

 

二、时间记录表:

学生      小早                                                  日期         3/10/2015              

教师        王建民                                             课程           PSP       

日期

开始时间

结束时间

中断时间

净时间

活动

备注

 3/10

 2:00

 4:00

 

 100

 编程

 

 3/11

 2:00

 4:00

 

 

 上课

 

 

 4:00

 6:00

 

 

 编程

 

 3/15

 3:00

4 :00

 

 

 编程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、缺陷记录日志:

学生         小早  

日期         310   

教员       王建民   

程序号                

日期

编号

类型

引入阶段

排除阶段

修复时间

修复缺陷

 3/10

 20

 传入指针,操作指针

 设计

 编译

 5min

 

 对传入指针,传地址形式的操作参数,疏忽了加星号

 

 40

链表创建

 设计

 编译

 5min

 

 创建链表时申请节点大小的空间(采用指针方式创建节点)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/zZ-ily/p/4333814.html