首页 > 技术文章 > C语言编程—自动生成四则运算升级版

yuhancheng 2015-03-26 13:08 原文

  1 #include<stdio.h>
  2 #include<time.h>
  3 struct fenshu
  4 {
  5     int fenzi;
  6     int fenmu;
  7 }Fenshu[100];
  8 int suiji(int x)
  9 {
 10     x=rand()%100;
 11     return x;
 12 }
 13 double Suiji(int x)
 14 {
 15     x=rand()%100;
 16     return x;
 17 }
 18 main()
 19 {
 20     int a,b,i,j,k,x,y,daan,grade=0;
 21     double c,d,e,f; //小数
 22     float g,h;
 23     int l,m,n,o,p,r,s,t;
 24     printf("\t\t\t欢迎使用本系统\n");
 25     while (1)
 26     {
 27         srand((int)time(0));
 28         //使用srand(time(0))来使用当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒)
 29         printf("------1:整数 2:小数 3:真分数 4:用户出题模式 5:分数统计 0:退出------");
 30         printf("\n");
 31         scanf("%d",&j);
 32         switch(j)
 33         {
 34         case 1:
 35              printf("请选择: 1:加法运算 2:减法运算 3:乘法运算 4:除法运算\n");
 36              scanf("%d",&k);
 37              switch(k)
 38              {
 39              case 1:
 40                  while (1)
 41                  {
 42                     a=suiji(x)+1;
 43                     b=suiji(y)+1;
 44                     printf("%d+%d=",a,b);    
 45                     scanf("%d",&daan);
 46                     if (a+b==daan) {
 47                         printf("\n 恭喜你,答对了!\n");
 48                         grade=grade+10; }
 49                     else if (daan==-1)   //输入-1退出
 50                        break;
 51                     else{
 52                         printf("\n 很抱歉,答错了!\n");
 53                         continue;
 54                     }
 55                  }
 56                    printf("\n");
 57                  break;
 58              case 2:
 59                  while (1)
 60                  {
 61                     a=suiji(x)+1;
 62                     b=suiji(y)+1;
 63                     if (a>b)    //这里强制被减数比减数大
 64                     {
 65                         printf("%d-%d=",a,b);}
 66                        scanf("%d",&daan); 
 67                     if (a-b==daan) {
 68                         printf("\n 恭喜你,答对了!\n");
 69                         grade=grade+10; }
 70                     else if (daan==-1)
 71                        break;
 72                     else{
 73                             printf("\n 很抱歉,答错了!\n");
 74                             continue;
 75                     }
 76                  }
 77                  printf("\n");
 78                  break;
 79              case 3:
 80                  while (1)
 81                  {
 82                     a=suiji(x)+1;
 83                     b=suiji(y)+1;
 84                     printf("%d*%d=",a,b);
 85                     scanf("%d",&daan);
 86                     if (a*b==daan) {
 87                         printf("\n 恭喜你,答对了!\n");
 88                         grade=grade+10; }
 89                     else if (daan==-1)
 90                        break;
 91                     else{
 92                             printf("\n 很抱歉,打错了!\n");
 93                             continue;
 94                     }
 95                  }
 96                  printf("\n");
 97                  break;
 98              case 4:
 99                  while (1)
100                  {
101                       a=suiji(x)+1;
102                     b=suiji(y)+1;
103                     if (a<b) {
104                         printf("%d÷%d=",a,b);   } 
105                     scanf("%f",&h);
106                     g=(float)a/b;
107                     if (h==g) {
108                         printf("恭喜你,答对了!\n");
109                         grade=grade+10;  }
110                     else if (daan=-1)
111                         break;
112                     else {
113                         printf("\n 很抱歉,答错了!\n");
114                         continue;
115                     }
116                  } 
117                  printf("\n");
118                  break;
119              }
120              break;
121       case 2:
122           printf("请选择: 1:加法运算 2:减法运算 3:乘法运算 4:除法运算\n");
123           scanf("%d",&k);
124           switch(k)
125           {
126           case 1:
127                   for (i=0;i<30;i++)
128                   {
129                      c=Suiji(x)+1;
130                      d=Suiji(y)+1;
131                      e=Suiji(x)*0.01;
132                      f=Suiji(y)*0.01;
133                      printf("%2.2f+%2.2f=\t",c+e,d+f);
134                   }
135                     printf("\n");
136                   break;
137           case 2:
138                   for (i=0;i<30;i++)
139                   {
140                      c=Suiji(x)+1;
141                      d=Suiji(y)+1;
142                      e=Suiji(x)*0.01;
143                      f=Suiji(y)*0.01;
144                      printf("%2.2f-%2.2f=\t",c+e,d+f);
145                   }
146                     printf("\n");
147                   break;
148           case 3:
149                   for (i=0;i<30;i++)
150                   {
151                      c=Suiji(x)+1;
152                      d=Suiji(y)+1;
153                      e=Suiji(x)*0.01;
154                      f=Suiji(y)*0.01;
155                      printf("%2.2f*%2.2f=\t",c+e,d+f);
156                   }
157                     printf("\n");
158                   break;
159           case 4:
160                   for (i=0;i<30;i++)
161                   {
162                      c=Suiji(x)+1;
163                      d=Suiji(y)+1;
164                      e=Suiji(x)*0.01;
165                      f=Suiji(y)*0.01;
166                      printf("%2.2f/%2.2f=\t",c+e,d+f);
167                   }
168                     printf("\n");
169                   break;
170           }
171           break;
172       case 3:
173            printf("请选择: 1:加法运算 2:减法运算 3:乘法运算 4:除法运算\n");
174            scanf("%d",&k);
175            switch(k)
176            {
177             case 1:
178                for (i=0;i<30;i++)
179                {
180                    Fenshu[i].fenzi=suiji(x)+1;
181                    Fenshu[i].fenmu=suiji(y)+1;
182                    Fenshu[i+1].fenzi=suiji(x)+1;
183                    Fenshu[i+1].fenmu=suiji(y)+1;
184                    if (Fenshu[i].fenzi<Fenshu[i].fenmu && Fenshu[i+1].fenzi<Fenshu[i+1].fenmu)   //把真分数筛选出来
185                        printf("%d/%d+%d/%d=\t ",Fenshu[i].fenzi,Fenshu[i].fenmu,Fenshu[i+1].fenzi,Fenshu[i+1].fenmu);
186                }
187                printf("\n");
188                break;
189             case 2:
190                for (i=0;i<30;i++)
191                {
192                    Fenshu[i].fenzi=suiji(x)+1;
193                    Fenshu[i].fenmu=suiji(y)+1;
194                    Fenshu[i+1].fenzi=suiji(x)+1;
195                    Fenshu[i+1].fenmu=suiji(y)+1;
196                    if (Fenshu[i].fenzi<Fenshu[i].fenmu && Fenshu[i+1].fenzi<Fenshu[i+1].fenmu)   
197                        printf("%d/%d-%d/%d=\t ",Fenshu[i].fenzi,Fenshu[i].fenmu,Fenshu[i+1].fenzi,Fenshu[i+1].fenmu);
198                }
199                printf("\n");
200                break;
201             case 3:
202                for (i=0;i<30;i++)
203                {
204                    Fenshu[i].fenzi=suiji(x)+1;
205                    Fenshu[i].fenmu=suiji(y)+1;
206                    Fenshu[i+1].fenzi=suiji(x)+1;
207                    Fenshu[i+1].fenmu=suiji(y)+1;
208                    if (Fenshu[i].fenzi<Fenshu[i].fenmu && Fenshu[i+1].fenzi<Fenshu[i+1].fenmu)   
209                        printf("%d/%d*%d/%d=\t ",Fenshu[i].fenzi,Fenshu[i].fenmu,Fenshu[i+1].fenzi,Fenshu[i+1].fenmu);
210                }
211                printf("\n");
212                break;
213             case 4:
214                for (i=0;i<30;i++)
215                {
216                    Fenshu[i].fenzi=suiji(x)+1;
217                    Fenshu[i].fenmu=suiji(y)+1;
218                    Fenshu[i+1].fenzi=suiji(x)+1;
219                    Fenshu[i+1].fenmu=suiji(y)+1;
220                    if (Fenshu[i].fenzi<Fenshu[i].fenmu && Fenshu[i+1].fenzi<Fenshu[i+1].fenmu)   
221                        printf("%d/%d÷%d/%d=\t ",Fenshu[i].fenzi,Fenshu[i].fenmu,Fenshu[i+1].fenzi,Fenshu[i+1].fenmu);
222                }
223                printf("\n");
224                break;
225            }
226            break;
227         case 4:
228             while (1)  //     a/c+b/d = (ad+bc)/cd
229             {
230                 printf("请输入两个真分数(用逗号分开 两个分数用空格隔开):");
231                 scanf("%d,%d %d,%d",&m,&n,&o,&p);
232                 
233                 printf("下列是加法运算:\n");   //r是最大公约数
234                 if ((m*p+o*n)>(n*p)) {r=m*p+o*n; s=n*p;}
235                   else {r=n*p; s=m*p+o*n;}
236                 t=s;
237                 while (t!=0)
238                 {
239                     t=r%s;
240                     r=s;
241                     s=t;
242                 }
243                 printf("%d/%d+%d/%d=%d/%d\n",m,n,o,p,(m*p+o*n)/r,(n*p)/r);
244                 
245                 printf("下列是减法运算:\n");
246                 if ((m*p-o*n)>(n*p)) {r=m*p+o*n; s=n*p;}
247                   else {r=n*p; s=m*p-o*n;}
248                 t=s;
249                 while (t!=0)
250                 {
251                     t=r%s;
252                     r=s;
253                     s=t;
254                 }
255                 printf("%d/%d-%d/%d=%d/%d\n",m,n,o,p,(m*p-o*n)/r,(n*p)/r);
256                 
257                 printf("下列是乘法运算:\n");
258                 if ((m*o)>(n*p)) {r=m*o; s=n*p;}
259                   else {r=n*p; s=m*o;}
260                 t=s;
261                 while (t!=0)
262                 {
263                     t=r%s;
264                     r=s;
265                     s=t;
266                 }
267                 printf("%d/%d*%d/%d=%d/%d\n",m,n,o,p,(m*o)/r,(n*p)/r);
268 
269                 printf("下列是除法运算:\n");
270                 if ((m*p)>(n*o)) {r=m*p; s=n*o;}
271                   else {r=n*o; s=m*p;}
272                 t=s;
273                 while (t!=0)
274                 {
275                     t=r%s;
276                     r=s;
277                     s=t;
278                 }
279                 printf("%d/%d÷%d/%d=%d/%d\n",m,n,o,p,(m*p)/r,(n*o)/r);
280                 break;
281             }
282             break;
283         case 5:
284               printf("\n 你获得的分数为%d\n",grade);
285               break;
286         case 0:
287               exit(0);
288               break;
289         }
290    }
291 }

感想:这个程序写出来感觉不难,但是如果要更好的话,还要继续努力。通过写这个程序,我学习到了语句:srand((int)time(0));。这条语句可以把当前时间使随机数发生器随机化,这样就可以保证每两次运行时可以得到不同的随机数序列(只要两次运行的间隔超过1秒),要是没有的话,会发现每一次运行的结果都一样,即“不是随机的随机”,显然不是我们想要的。四则运算题目,需要产生随机数,那么问题来了,产生的是整数还是小数?想产生哪个区间的整数,就用rand()对几求余加1,例如想在1到100之间取整,那么可以rand()%100+1。还有,小数部分,首先要想到的是小数点后几位,我总结出了通式:(rand()%10x)*10-x。得之老师给我们布置了升级版的题目,马上就动脑并开始做了。判断正确与否设置在了整数那,小数和分数不做设置,本程序的精华在于两个真分数的四则运算,虽然还有些小瑕疵,但是对于我来说已经是一种进步了,继续加油吧!

推荐阅读