一、程序要求:

  1、学生写的程序必须能够判定用户的输入答案是否正确;

  2、程序必须能处理四种运算的混合算式;

  3、在上次程序的基础上,添加新的功能。

二、程序设计思想:

  1、在上次程序的基础之上添加要求;

  2、根据助教提出的问题,添加了用户不按照要求输入的情况处理;

  3、判断答案正误时,整数比分数容易判断(判断过程不予叙述),所以单独引入分数类,设计函数分别计算分数四则运算的结果并与输入的结果比较判断;

三、源程序代码:

    1 //李俏,张莹荧,2016.3.15

  2 //随机生成四则运算3
  3 
  4 #include<iostream>
  5 #include<stdio.h>
  6 #include<stdlib.h>
  7 #include<time.h>
  8 using namespace std;
  9 
 10 class Fenshu
 11 {
 12 private:
 13     int fenzi;  // 分子  
 14     int fenmu;  // 分母 
 15 public:
 16     Fenshu(int fz = 0, int fm = 1) :fenzi(fz), fenmu(fm){}
 17     void set(int, int);
 18     void simplify();
 19     friend bool judge1(const Fenshu &c1, const Fenshu &c2);     //判断两个分数是否相等
 20     friend bool judge2(const Fenshu &c1, int z);     //判断两个分数是否相等
 21     friend Fenshu add(const Fenshu &c1, const Fenshu &c2);  //两个分数相加,结果要化简  
 22     friend Fenshu sub(const Fenshu &c1, const Fenshu &c2);  //两个分数相减,结果要化简  
 23     friend Fenshu mul(const Fenshu &c1, const Fenshu &c2);  //两个分数相乘,结果要化简  
 24     friend Fenshu div(const Fenshu &c1, const Fenshu &c2);  //两个分数相除,结果要化简 
 25 };
 26 
 27 void Fenshu::set(int m, int n)// 分数赋值
 28 {
 29     fenzi = m;
 30     fenmu = n;
 31 }
 32 
 33 void Fenshu::simplify()// 分数化简
 34 {
 35     int m, n, r;
 36     m = abs(fenmu);
 37     n = abs(fenzi);
 38     while (r = m%n)  // 求m,n的最大公约数  
 39     {
 40         m = n;
 41         n = r;
 42     }
 43     fenmu /= n;     // 化简  
 44     fenzi /= n;
 45     if (fenmu<0)  // 将分母转化为正数  
 46     {
 47         fenmu = -fenmu;
 48         fenzi = -fenzi;
 49     }
 50 }
 51 
 52 Fenshu add(const Fenshu &c1, const Fenshu &c2)// 分数相加  
 53 {
 54     Fenshu t;
 55     t.fenzi = c1.fenzi*c2.fenmu + c2.fenzi*c1.fenmu;
 56     t.fenmu = c1.fenmu*c2.fenmu;
 57     t.simplify();
 58     return t;
 59 }
 60 
 61 Fenshu sub(const Fenshu &c1, const Fenshu &c2)// 分数相减 
 62 {
 63     Fenshu t;
 64     t.fenzi = c1.fenzi*c2.fenmu - c2.fenzi*c1.fenmu;
 65     t.fenmu = c1.fenmu*c2.fenmu;
 66     t.simplify();
 67     return t;
 68 }
 69 
 70 Fenshu mul(const Fenshu &c1, const Fenshu &c2)// 分数相乘
 71 {
 72     Fenshu t;
 73     t.fenzi = c1.fenzi*c2.fenzi;
 74     t.fenmu = c1.fenmu*c2.fenmu;
 75     t.simplify();
 76     return t;
 77 }
 78 
 79 Fenshu div(const Fenshu &c1, const Fenshu &c2)// 分数相除 
 80 {
 81     Fenshu t;
 82     if (!c2.fenzi) return c1;
 83     t.fenzi = c1.fenzi*c2.fenmu;
 84     t.fenmu = c1.fenmu*c2.fenzi;
 85     t.simplify();
 86     return t;
 87 }
 88 
 89 bool judge1(const Fenshu &c1, const Fenshu &c2)//判断正误
 90 {
 91     bool flag;
 92     if ((c1.fenzi == c2.fenzi) && (c1.fenmu == c2.fenmu))
 93     {
 94         flag = true;
 95         return flag;
 96     }
 97     else
 98     {
 99         flag = false;
100         return flag;
101     }
102 }
103 
104 bool judge2(const Fenshu &c1, int z)//判断正误
105 {
106     bool flag;
107     if (0 == c1.fenzi - z)
108     {
109         flag = true;
110         return flag;
111     }
112     else
113     {
114         flag = false;
115         return flag;
116     }
117 }
118 
119 int main()
120 {
121     int first, second, firstm, secondm;
122     int sign, i, j;
123     int num, chengchu, fushu, yushu, fanwei;
124     int ans, ansm, ansy;
125     int right = 0, wrong = 0;
126     Fenshu x1, x2, x, y;
127 
128     cout << "请输入题目数量:";
129     cin >> num;
130     if (num < 0)    //题目数必须为正数
131     {
132         cout << "请重新输入有效的题目数:";
133         cin >> num;
134     };
135     if (num == 0)
136     {
137         exit(1);
138     }
139 
140     cout << "是否有乘除法?1.是,2.否:";
141     cin >> chengchu;
142     if ((chengchu != 1)||(chengchu != 2)) //只能选择1或2
143     {
144         cout << "请重新输入有效的数值:";
145         cin >> chengchu;
146     };
147     if (chengchu == 1)
148     {
149         cout << "除法是否有余数?1.是,2.否:";
150         cin >> yushu;
151         if ((yushu != 1)||(yushu != 2)) //只能选择1或2
152         {
153             cout << "请重新输入有效的数值:";
154             cin >> yushu;
155         };
156     }
157 
158     cout << "减法是否有负数?1.是,2.否:";
159     cin >> fushu;
160     if ((fushu != 1)||(fushu != 2)) //只能选择1或2
161     {
162         cout << "请重新输入有效的数值:";
163         cin >> fushu;
164     };
165     cout << "请输入数值范围:";
166     cin >> fanwei;
167     if (fanwei <= 0)    //运算数必须为正数
168     {
169         cout << "请重新输入有效的范围:";
170         cin >> fanwei;
171     };
172 
173     srand((int)time(NULL)); //用时间做种子,每次产生随机数都不一样
174 
175     for (i = 0; i<num; i++)
176     {
177         j = rand() % 2;        //选择生成整数运算还是分数运算
178 
179         if (j == 0)           //选择整数
180         {
181             first = rand() % (fanwei + 1);
182             second = rand() % (fanwei + 1);
183             if (chengchu == 1)
184             {
185                 sign = rand() % 4;
186             }
187             else
188             {
189                 sign = rand() % 2;
190             }
191             switch (sign)
192             {
193             case 0:                      //整数加法
194                 cout << first << "+" << second << "=" << endl;
195                 cout << "请输入结果:";
196                 cin >> ans;
197                 if (ans == first + second)
198                 {
199                     cout << "答对了!" << endl;
200                     right = right + 1;
201                 }
202                 else
203                 {
204                     cout << "答错了!" << endl;
205                     wrong = wrong + 1;
206                 }
207                 break;
208             case 1:                      //整数减法
209                 if (fushu == 1)
210                 {
211                     cout << first << "-" << second << "=" << endl;
212                     cout << "请输入结果:";
213                     cin >> ans;
214                     if (ans == first - second)
215                     {
216                         cout << "答对了!" << endl;
217                         right = right + 1;
218                     }
219                     else
220                     {
221                         cout << "答错了!" << endl;
222                         wrong = wrong + 1;
223                     }
224                 }
225                 else
226                 {
227                     if (first>second)
228                     {
229                         cout << first << "-" << second << "=" << endl;
230                         cout << "请输入结果:";
231                         cin >> ans;
232                         if (ans == first - second)
233                         {
234                             cout << "答对了!" << endl;
235                             right = right + 1;
236                         }
237                         else
238                         {
239                             cout << "答错了!" << endl;
240                             wrong = wrong + 1;
241                         }
242                     }
243                     else
244                     {
245                         cout << second << "-" << first << "=" << endl;
246                         cout << "请输入结果:";
247                         cin >> ans;
248                         if (ans == second - first)
249                         {
250                             cout << "答对了!" << endl;
251                             right = right + 1;
252                         }
253                         else
254                         {
255                             cout << "答错了!" << endl;
256                             wrong = wrong + 1;
257                         }
258                     }
259                 }
260                 break;
261             case 2:                   //整数乘法
262                 cout << first << "*" << second << "=" << endl;
263                 cout << "请输入结果:";
264                 cin >> ans;
265                 if (ans == first * second)
266                 {
267                     cout << "答对了!" << endl;
268                     right = right + 1;
269                 }
270                 else
271                 {
272                     cout << "答错了!" << endl;
273                     wrong = wrong + 1;
274                 }
275                 break;
276             case 3:                   //整数除法
277                 if (yushu == 1)
278                 {
279                     if (second != 0)
280                     {
281                         cout << first << "/" << second << "=" << endl;
282                         cout << "请输入结果(商和余数):";
283                         cin >> ans >> ansy;
284                         if ((ans == (first / second)) && (ansy == (first%second)))
285                         {
286                             cout << "答对了!" << endl;
287                             right = right + 1;
288                         }
289                         else
290                         {
291                             cout << "答错了!" << endl;
292                             wrong = wrong + 1;
293                         }
294                     }
295                     else
296                     {
297                         i = i - 1;
298                     }
299                 }
300                 else
301                 {
302                     if (second != 0 && (first%second == 0))
303                     {
304                         cout << first << "/" << second << "=" << endl;
305                         cout << "请输入结果:";
306                         cin >> ans;
307                         if (ans == first / second)
308                         {
309                             cout << "答对了!" << endl;
310                             right = right + 1;
311                         }
312                         else
313                         {
314                             cout << "答错了!" << endl;
315                             wrong = wrong + 1;
316                         }
317                     }
318                     else
319                     {
320                         i = i - 1;
321                     }
322                 }
323                 break;
324             }
325         }
326 
327         else              //选择分数
328         {
329             first = rand() % (fanwei + 1);
330             second = rand() % (fanwei + 1);//分子
331             firstm = rand() % (fanwei + 1);
332             secondm = rand() % (fanwei + 1);//分母
333             if (chengchu == 1)
334             {
335                 sign = rand() % 4;
336             }
337             else
338             {
339                 sign = rand() % 2;
340             }
341 
342             switch (sign)
343             {
344             case 0:                //分数加法
345                 if ((firstm != 0) && (secondm != 0) && (first<firstm) && (second<secondm))
346                 {
347                     cout << first << "/" << firstm << "  +  " << second << "/" << secondm << "=" << endl;
348                     cout << "请输入结果(分子和分母):";
349                     cin >> ans >> ansm;
350                     x.set(ans, ansm);
351                     x1.set(first, firstm);
352                     x2.set(second, secondm);
353                     y = add(x1, x2);
354                     if (true == judge1(x, y))
355                     {
356                         cout << "答对了!" << endl;
357                         right = right + 1;
358                     }
359                     else
360                     {
361                         cout << "答错了!" << endl;
362                         wrong = wrong + 1;
363                     }
364                 }
365                 else
366                 {
367                     i = i - 1;
368                 }
369                 break;
370             case 1:                //分数减法
371                 if (fushu == 1)
372                 {
373                     if ((firstm != 0) && (secondm != 0) && (first<firstm) && (second<secondm))
374                     {
375                         cout << first << "/" << firstm << "  -  " << second << "/" << secondm << "=" << endl;
376                         cout << "请输入结果(分子和分母):";
377                         cin >> ans;
378                         if (ans != 0)
379                         {
380                             cin >> ansm;
381                             x.set(ans, ansm);
382                             x1.set(first, firstm);
383                             x2.set(second, secondm);
384                             y = sub(x1, x2);
385                             if (true == judge1(x, y))
386                             {
387                                 cout << "答对了!" << endl;
388                                 right = right + 1;
389                             }
390                             else
391                             {
392                                 cout << "答错了!" << endl;
393                                 wrong = wrong + 1;
394                             }
395                         }
396                         else
397                         {
398                             x1.set(first, firstm);
399                             x2.set(second, secondm);
400                             y = sub(x1, x2);
401                             if (true == judge2(y, ans))
402                             {
403                                 cout << "答对了!" << endl;
404                                 right = right + 1;
405                             }
406                             else
407                             {
408                                 cout << "答错了!" << endl;
409                                 wrong = wrong + 1;
410                             }
411                         }
412                     }
413                     else
414                     {
415                         i = i - 1;
416                     }
417                 }
418                 else
419                 {
420                     if ((firstm != 0) && (secondm != 0) && (first<firstm) && (second<secondm) && ((first / firstm)>(second / secondm)))
421                     {
422                         cout << first << "/" << firstm << "  -  " << second << "/" << secondm << "=" << endl;
423                         cout << "请输入结果(分子和分母):";
424                         cin >> ans;
425                         if (ans != 0)
426                         {
427                             cin >> ansm;
428                             x.set(ans, ansm);
429                             x1.set(first, firstm);
430                             x2.set(second, secondm);
431                             y = sub(x1, x2);
432                             if (true == judge1(x, y))
433                             {
434                                 cout << "答对了!" << endl;
435                                 right = right + 1;
436                             }
437                             else
438                             {
439                                 cout << "答错了!" << endl;
440                                 wrong = wrong + 1;
441                             }
442                         }
443                         else
444                         {
445                             x1.set(first, firstm);
446                             x2.set(second, secondm);
447                             y = sub(x1, x2);
448                             if (true == judge2(y, ans))
449                             {
450                                 cout << "答对了!" << endl;
451                                 right = right + 1;
452                             }
453                             else
454                             {
455                                 cout << "答错了!" << endl;
456                                 wrong = wrong + 1;
457                             }
458                         }
459                     }
460                     else
461                     {
462                         i = i - 1;
463                     }
464                 }
465                 break;
466             case 2:                //分数乘法
467                 if ((firstm != 0) && (secondm != 0) && (first<firstm) && (second<secondm))
468                 {
469                     cout << first << "/" << firstm << "  *  " << second << "/" << secondm << "=" << endl;
470                     cout << "请输入结果(分子和分母):";
471                     cin >> ans;
472                     if (ans != 0)
473                     {
474                         cin >> ansm;
475                         x.set(ans, ansm);
476                         x1.set(first, firstm);
477                         x2.set(second, secondm);
478                         y = sub(x1, x2);
479                         if (true == judge1(x, y))
480                         {
481                             cout << "答对了!" << endl;
482                             right = right + 1;
483                         }
484                         else
485                         {
486                             cout << "答错了!" << endl;
487                             wrong = wrong + 1;
488                         }
489                     }
490                     else
491                     {
492                         x1.set(first, firstm);
493                         x2.set(second, secondm);
494                         y = sub(x1, x2);
495                         if (true == judge2(y, ans))
496                         {
497                             cout << "答对了!" << endl;
498                             right = right + 1;
499                         }
500                         else
501                         {
502                             cout << "答错了!" << endl;
503                             wrong = wrong + 1;
504                         }
505                     }
506                 }
507                 else
508                 {
509                     i = i - 1;
510                 }
511                 break;
512             case 3:                //分数除法
513                 if ((firstm != 0) && (secondm != 0) && (first != 0) && (second != 0) && (first<firstm) && (second<secondm))
514                 {
515                     cout << first << "/" << firstm << "  /  " << second << "/" << secondm << "=" << endl;
516                     cout << "请输入结果(分子和分母):";
517                     cin >> ans;
518                     if (ans != 0)
519                     {
520                         cin >> ansm;
521                         x.set(ans, ansm);
522                         x1.set(first, firstm);
523                         x2.set(second, secondm);
524                         y = sub(x1, x2);
525                         if (true == judge1(x, y))
526                         {
527                             cout << "答对了!" << endl;
528                             right = right + 1;
529                         }
530                         else
531                         {
532                             cout << "答错了!" << endl;
533                             wrong = wrong + 1;
534                         }
535                     }
536                     else
537                     {
538                         x1.set(first, firstm);
539                         x2.set(second, secondm);
540                         y = sub(x1, x2);
541                         if (true == judge2(y, ans))
542                         {
543                             cout << "答对了!" << endl;
544                             right = right + 1;
545                         }
546                         else
547                         {
548                             cout << "答错了!" << endl;
549                             wrong = wrong + 1;
550                         }
551                     }
552                 }
553                 else
554                 {
555                     i = i - 1;
556                 }
557                 break;
558             }
559         }
560     }
561     cout << "总共完成" << num << "道题,做对" << right << "道,做错" << wrong << "道题!" << endl;
562   return 0;
563 }

四、运行结果截图:

  

  

  

五、项目计划日志:

          周活动总结表

姓名:张莹荧                                      日期:2016-03-19

日期/任务    听课     编写程序    阅读课本   准备考试                        日总计  
周日3.13   60 120 120     300
周一 300 30 30 120     480
周二 300 30 30  120     453
周三 200 180   180     560
周四 300     120     420
周五 100 180 30       310
周六    60          60
周总结 1200 540 210 660     2610

 

 

 

 

 

 

 

 

 

 

阶段时间和效率                      周数:2

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

总计                     
平均              
最大              
最小              

 

 

 

 

 

以前各周的累计时间

总计 1200 540 210 660       2610
平均 1200 540 210 660     2610
最大 1200 540 210 660     2610
最小 1200 540 210 660     2610

 

 

 

 

 

六、时间记录日志:

  学生:张莹荧                                              日期:2016-03-19

  教师:王建民                                              课程: PSP  

日期 开始时间 结束时间 中断时间 净时间 活动 备注
3.16

14:30

16:10

16:00

17:40

0

0

90

90

编程

阅读课本

 中间上网、休息
3.17

8:00

14:00

12:00

15:50

40

10

200

100

上课 课间休息
3.18

14:30

19:00

17:40

19:30

10

0

180

30

编程

阅读课本

中间休息
3.19

12:30

19:00

13:30

19:30

0

0

60

30

编程

阅读课本

 

 

 

 

 

 

 

 

 

 

 

 

七、缺陷记录日志:

  学生:  张莹荧,李俏                                                          

  日期: 2016-03-19 

  教员:  王建民                                                                           

  程序号:  2  

 日期  编号 类型 引入阶段 排除阶段 修复时间 修复缺陷
 3.18  1 计算 设计 编译 30min  
  描述:分数部分判断正误时,分数该怎样计算结果。通过分数化简,通分等过程解决。
 3.18  2 类与对象 编码 编译 5min  
描述:在引用类中的变量时,出现错误。
 3.18  3 余数 编码 编译 5min  
描述:在整数除法中,需加上余数的正误判断。
 3.19  4 答案 编码 编译 10min  
  描述:分数的减、乘、除运算,若结果为0,则出错。通过先判断分子是否为0来解决,若为0,则不需输入分母,若不为0,则需要继续输入分母并判断。

 

 
 
 
 
 
 
 
 
 
 
 
 
 
八、结对开发队友:
  李俏 信1301-2班 20132912
  博客地址:http://www.cnblogs.com/Aliqiao/
  工作照: