四则运算2.0版

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 main() 
  4 { 
  5     printf("\n\t欢迎使用四则运算练习软件\n");
  6     printf("\t说明:如果进行分数运算,用户需输入最简(约分后)的答案!!\n");
  7     printf("\t格式为  5/6\n");
  8     Chioce();
  9 }
 10 //----------------------------------------------------------------------------------------------------
 11 Chioce()
 12 {
 13     int ch1=0;
 14     printf("\t1.整数运算\n\t2.分数运算\n\t请选择:");
 15     scanf("%d",&ch1);
 16     if(ch1==1)
 17     {
 18         ZhengShuYunSuan();    
 19     }
 20     FenShuYunSuan();
 21     return 0;
 22 }
 23 //---------------------------------------------------------------------------------------------------
 24 ZhengShuYunSuan()                  //整数运算
 25 {  
 26     int ranswer=0;                 //正确答案  
 27     int uanswer=0;                 //用户输入的答案  
 28     int t=0,n=0,m=0;               //临时变量  
 29     char op;                       //运算类别  
 30     int num1=0;                    //操作数1  
 31     int num2=0;                    //操作数2
 32     int ch=1,count=0;
 33     
 34     while(1)
 35     {
 36         if(count==10)
 37         {
 38             printf("\t在10道练习里你做对了%d题! \n",n);
 39             printf("\t1.继续练习\n\t2.退出\n\t请选择:");
 40             scanf("%d",&ch);
 41             if(ch==2)
 42             {
 43                 printf("\t谢谢使用!");
 44                 exit (0);
 45             }
 46             
 47             count=0;
 48             n=0;
 49             Chioce();
 50         }
 51         srand(time(NULL));                                    //初始化随机数  
 52         num1=rand()%10;                                       //取0-9之间的随机数  
 53         num2=rand()%10;  
 54         m=rand()%4+1;  
 55         switch(m)  
 56         {  
 57         case 1:    
 58             op='+';  
 59             break;
 60         case 2:  
 61             op='-'; 
 62             break;
 63         case 3:  
 64             op='*';    
 65             break;
 66         case 4:  
 67             op='/';  
 68             break; 
 69         }                                               //加入一条防止"不够减"的语句,当选择减法且num1小于num2时不够减
 70                                                         //不够减的时候,用临时变量交换两个操作数 
 71         if((op=='-') && (num1<num2)) 
 72         {   
 73             t=num1; 
 74             num1=num2;
 75             num2=t;  
 76         }
 77                                                         //防止"除数为0"的程序漏洞 
 78                                                         //当num2被随机取值到0时,就将num2强制置为1
 79                                                         //做除法时,将num1的值强制赋值给num1*num2,防止不能整除  
 80         if(op=='/')  
 81         {   
 82             if(num2==0)
 83             {    
 84                 num2=1;  
 85             }   
 86             num1=num1*num2; 
 87         }                                               //防止num1不能被num2整除的语句
 88                                                         //输出测试题本身、提示用户输入  
 89         printf("\t%d%c%d=",num1,op,num2);  
 90         while(!(scanf("%d",&uanswer)))
 91         {
 92             printf("\n\t非法输入,请重新输入答案:");
 93             fflush(stdin);
 94         }
 95                                                         //程序计算正确结果  
 96         switch(op) 
 97         {  
 98         case '+':   ranswer=num1+num2;   break;
 99         case '-':   ranswer=num1-num2;   break;
100         case '*':   ranswer=num1*num2;   break;
101         case '/':   ranswer=num1/num2;   break;  
102         } 
103         if(uanswer==ranswer) 
104         {   
105             printf("\t\t做对了!\n");  
106             n++;                                        //正确题数加1
107         }  
108         else
109         {   
110             printf("\t\t做错了!\n");  
111         } 
112         count++;                                        //题数加1
113     }
114     return 0;
115 }
116 //--------------------------------------------------------------------------------------------------
117 FenShuYunSuan()                                       //真分数
118 {
119     int a=0,b=0,c=0,d=0;                              //分别为第一、二个分数的分子分母
120     int x=0,y=0,z=0,ux=0,uy=0,uz=0;                   //系统运算的结果和用户输入的结果
121     int n=0,t=0,i=0,m=0;
122     char op,uop;    
123     int ch=0,count=0;
124     
125     while(1)
126     {
127         if(count==10)
128         {
129             printf("\n\t在10道练习里你做对了%d题! \n",n);
130             printf("\t1.继续练习\n\t2.退出\n\t请选择:");
131             scanf("%d",&ch);
132             if(ch==2)
133             {
134                 exit (0);
135             }
136             
137             count=0;
138             n=0;
139             Chioce();
140         }
141         srand(time(NULL));                              //获取四个随机整数
142         a=rand()%10+1;            
143         b=rand()%10+1;
144         c=rand()%10+1;
145         d=rand()%10+1;
146         
147         
148         
149         if(a>b)                                       //两个if保证分数为真分数,即分母大于分子
150         {
151             t=a;
152             a=b;
153             b=t;
154         }
155         if(c>d)
156         {
157             t=c;
158             c=d;
159             d=t;
160         }
161         srand(time(NULL));
162         m=rand()%4+1;                                 //随机获取运算符
163         switch(m)                                     //确定运算符后系统直接计算答案
164         {
165         case 1:
166             op='+';
167             x=a*d+b*c;
168             y=b*d;
169             break;
170             
171         case 2:
172             op='-';
173             if((a*d<b*c) && (a!=c))                   //if是避免两分数相减是得到的结果是负数
174             {
175                 t=a;
176                 a=c;
177                 c=t;
178                 t=b;
179                 b=d;
180                 d=t;
181             }
182             x=a*d-b*c;
183             y=b*d;
184             break;
185             
186         case 3:
187             op='*';
188             x=a*c;
189             y=b*d;
190             break;
191             
192         case 4:
193             op='/';
194             x=a*d;
195             y=b*c;
196             break;
197         }
198         
199         if(x>y)                                        //将系统得到的结果进行约分到最简式
200         {
201             i=y;
202         }
203         else
204         {
205             i=x;
206         }
207         
208         while(i>1)
209         {
210             if((x%i==0)&&(y%i==0))
211             {
212                 x=x/i;
213                 y=y/i;
214                 continue;
215             }
216             i--;
217         }
218         printf("\n\t%d/%d %c %d/%d=",a,b,op,c,d);
219         if(y==1)                                       //提示用户输入答案是分三种情况,1.分母为1时用户要输入一个整数
220         {                                              //2.分子分母相同时用户要输入一个整数
221             z=x;                                       //3.分子分母不同时用户要输入一个分数的格式--(12/13)
222             while(!(scanf("%d",&uz)))                  //4.并且判断答案的对错
223             {
224                 printf("\n\t非法输入,请重新输入答案:");
225                 fflush(stdin);
226             }
227             if(z==uz)
228             {
229                 printf("\t\t答对了!!");
230                 n++;
231             }
232             else
233             {
234                 printf("\t\t答错了!!");
235             }
236         }
237         else if(x==y)
238         {
239             z=1;
240             
241             while(!(scanf("%d",&uz)))
242             {
243                 printf("\n\t非法输入,请重新输入答案:");
244                 fflush(stdin);
245             }
246             if(z==uz)
247             {
248                 printf("\t\t答对了!!");
249                 n++;
250             }
251             else
252             {
253                 printf("\t\t答错了!!");
254             }
255             
256         }
257         else
258         {
259             
260             while(!(scanf("%d%c%d",&ux,&uop,&uy)))
261             {
262                 printf("\n\t非法输入,请重新输入答案:");
263                 fflush(stdin);
264             }
265             if((x==ux)&&(y==uy))
266             {
267                 printf("\t\t答对了!!");
268                 n++;
269             }
270             else
271             {
272                 printf("\t\t答错了!!");
273             }
274         }
275         count++;
276     }
277 }

      本次按老师的要求,把真分数的功能添加进去了,老师要求的是和运算,但为了方便,我将加减乘除都添加进去了,即菜单2,菜单1和第一次的博客实现的功能一样。真分数的运算不能说是很难,就是分数在约分时会有点困难,还有最后答案是一个分数还是整数也要判断,再提示用户输入。

posted on 2015-03-29 23:52  Alenqifeng  阅读(247)  评论(4编辑  收藏  举报

导航