第二次作业
- 题目
请编写一个能自动生成小学四则运算题目的 “软件”。
让程序能接受用户输入答案,并判定对错。
最后给出总共 对/错 的数量。
- 需求分析
- 基本功能
- 显示每次测试题目数量
- 用户可以选择测试类型(混合、加、减、乘、除)
- 用户可以逐个题目解答
- 显示答案的对错,错误的给出正确答案
- 统计每次测试答对的题的个数
- 设计
- 主函数运用了一个for循环来限制测试的次数。
- 用了9个子函数(测试的5种模式选择、加法、减法、乘法、除法)来实现对测试模式的选择以及选择后的运算。
- 代码实现
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<time.h> //函数声明 void test1(); void test2(); void test3(); void test4(); void test5(); void jia(int a,int b); void jian(int a,int b); void cheng(int a,int b); void chu(int a,int b); //全局变量 int count1=0; //每次测试做正确的题的数量 int count=0; //测试题目的数量 /******************************** *功能描述:主函数 *输入参数:shuru-选择执行的操作 *输出参数:无 *返回值:无 *其它说明:无 *修改日期:20150410 ********************************/ int main() { int i; int shuru; printf("\n您好,欢迎登录小学生四则运算测试系统!\n\n"); //测试循环 for(i=0;i<=100;i++) { printf("*******************************************\n"); printf("提示:每次测试共5题,请输入相应序号:\n\n"); printf(" 1、混合测试 4、乘法测试\n\n"); printf(" 2、加法测试 5、除法测试\n\n"); printf(" 3、减法测试 6、退出测试系统\n"); printf("*******************************************\n\n"); scanf("%d",&shuru); //模式选择 switch(shuru) { case 1: { test1(); break; } case 2: { test2(); break; } case 3: { test3(); break; } case 4: { test4(); break; } case 5: { test5(); break; } case 6: { printf("您已退出测试系统!再见!\n\n"); return 0; } default: { printf("\n您的输入有误,请重新输入!\n\n"); break; } } } return 0; } /*************************************************** *功能描述:加减乘除的混合测试 *输入参数:a-第一个数,b-第二个数,n-除以4的余数 *输出参数:count1-正确的题的数量 *返回值:无 *修改日期:20150410 ***************************************************/ void test1() { int n; int a; int b; int i;//控制循环 //题目数量的限定 for(i=1;i<=5;i++) { n=a%4; srand(time(NULL)); //获取随机数 a = rand()%100; b = rand()%100; //随机选择加减乘除的运算 switch(n) { case 0: { jia(a,b); count++; break; } case 1: { jian(a,b); count++; break; } case 2: { cheng(a,b); count++; break; } case 3: { chu(a,b); count++; break; } default: { count++; break; } } } printf("本次测试共对了%d道题\n",count1); printf("\n"); count1=0; } /*************************************************** *功能描述:加法测试 *输入参数:a-第一个数,b-第二个数 *输出参数:count1-正确的题的数量 *返回值:无 *修改日期:20150410 ***************************************************/ void test2() { int a; int b; int i; for(i=1;i<=5;i++) { srand(time(NULL)); a = rand()%100; b = rand()%100; jia(a,b); count++; } printf("本次测试共对了%d道题\n",count1); printf("\n"); count1=0; } /*************************************************** *功能描述:减法测试 *输入参数:a-第一个数,b-第二个数 *输出参数:count1-正确的题的数量 *返回值:无 *修改日期:20150410 ***************************************************/ void test3() { int a; int b; int i; for(i=1;i<=5;i++) { srand(time(NULL)); a = rand()%100; b = rand()%100; jian(a,b); count++; } printf("本次测试共对了%d道题\n",count1); printf("\n"); count1=0; } /*************************************************** *功能描述:乘法测试 *输入参数:a-第一个数,b-第二个数 *输出参数:count1-正确的题的数量 *返回值:无 *修改日期:20150410 ***************************************************/ void test4() { int a; int b; int i; for(i=1;i<=5;i++) { srand(time(NULL)); a = rand()%100; b = rand()%100; cheng(a,b); count++; } printf("本次测试共对了%d道题\n",count1); printf("\n"); count1=0; } /*************************************************** *功能描述:除法测试 *输入参数:a-第一个数,b-第二个数 *输出参数:count1-正确的题的数量 *返回值:无 *修改日期:20150410 ***************************************************/ void test5() { int a; int b; int i; for(i=1;i<=5;i++) { srand(time(NULL)); a = rand()%100; b = rand()%100; chu(a,b); count++; } printf("本次测试共对了%d道题\n",count1); printf("\n"); count1=0; } /*************************************************** *功能描述:加法计算 *输入参数:result-结果 *输出参数:a+b-两数之和 *返回值:无 *修改日期:20150410 ***************************************************/ void jia(int a,int b) { int result; printf("%d + %d =",a,b); scanf("%d",&result); if(result == a+b) { printf("正确!\n"); count1++; } else { printf("错误!\n正确答案是:%d\n",a+b); } } /*************************************************** *功能描述:减法计算 *输入参数:result-结果 *输出参数:a-b-两数之差 *返回值:无 *修改日期:20150410 ***************************************************/ void jian(int a,int b) { int result; printf("%d - %d =",a,b); scanf("%d",&result); if(result == a-b) { printf("正确!\n"); count1++; } else { printf("错误!\n正确答案是:%d\n",a-b); } } /*************************************************** *功能描述:乘法计算 *输入参数:result-结果 *输出参数:a*b-两数之积 *返回值:无 *修改日期:20150410 ***************************************************/ void cheng(int a,int b) { int result; printf("%d * %d =",a,b); scanf("%d",&result); if(result == a*b) { printf("正确!\n"); count1++; } else { printf("错误!\n正确答案是:%d\n",a*b); } } /*************************************************** *功能描述:除法计算 *输入参数:result-结果 *输出参数:a/b-两数之商 *返回值:无 *修改日期:20150410 ***************************************************/ void chu(int a,int b) { float result; float temp; printf("%d / %d =",a,b); //除数为0的情况 if(b==0) { printf("出错了!\n"); return; } scanf("%f",&result); //判断答案的正确性,答案至少保留小数点后两位 temp=result*100 - ((float)a/(float)b)*100; if(abs(temp)<0.01) { printf("正确!\n"); count1++; } else { printf("错误!\n正确答案是:%f\n",(float)a/(float)b); } }
- 程序运行截图
- 分析和总结
1. 对加、减、乘、除的单独测试可进行选择,也可选择混合模式,不过在写的过程中,对计算总共对的题目个数的统计 不太会,之前学的有些忘了,问了下我们软件工程的老师,后来解决了问题。以及刚开始只写了混合模式的,后来改了后可以选择单独运算的模式,可以进行单向训练。不过我写的比较简单,以后还会慢慢改进的。
--(第一次修改)
2. 我一直想用do-while来代替goto,结果改来改去都改不出来,最后选择了用for循环代替,解决了问题,说明我对do- while的使用不够熟练,以后要多加练习。
--(第二次修改)
3. 把之前写的test函数里最外层switch-case里的每个case请进一步单独**封装**一个函数之后,代码更加直观,容易被其他人看懂。
4. 对于为什么不能用goto,我也上网查了一下,在结构化程序设计中一般不主张使用goto语句, 以免造成程序流程的混乱,使理解和调试程序都产生困难。
5. 我为每个函数单独写了一个测试函数,测试函数能测试对输入可能出错的参数判断其输出答案的正确性,能测试出自己的代码的正确性,而手工测试,调试出现的数是随机的,不能测试出一些特殊情况的计算的正确性。例如:测试函数,对除法我设置了除数为0,被除数为0或者为其它数的情况,调试结果为我上面代码中写的“出错了”,而手工测试不能测试这一点。
6. 上面程序添加了对用户需要退出测试的代码以及对输入其它数据的判断;为代码添加了注释;改了switch-case的分支,进行了单独封装。
- psp耗时统计
步骤 |
耗时 |
百分比 |
需求分析 |
3 |
6.25 |
设计 |
5 |
10.42 |
代码实现 |
15 |
31.25 |
测试 |
10 |
20.83 |
分析和总结 |
2 |
4.17 |
第一次修改 |
5 |
10.42 |
第二次修改 |
8 |
16.66 |