题目:
- 请编写一个能自动生成小学四则运算题目的 “软件”。
- 让程序能接受用户输入答案,并判定对错。
- 最后给出总共 对/错 的数量。
一:基本要求
1:题型选择界面设计,选择加、减、乘、除运算。
2:系统随机产生一百以内的两个数进行运算。
3:练习时,用户从键盘输入结果,正确和错误均有提示,按6,显示总题数和正确数。
二:需求分析
编写小学四则运算测试系统,要求完成两位数的加,减,乘,除四则运算。能根据用户的输入来选择运算种类,用户输入答案后可以判断正误,做完一次测试后,用户可以决定是否继续进行下一次运算。
三:设计
1:定义变量i,j,a,b,m其中i表示答对的题数,j表示答错的题数,a,b表示随机产生的数,m接收从键盘输入的运算结果。
2:分别定义加,减,乘,除子函数,出错和正确都有提示。
3:主函数用switch来实现用户的输入来选择运算种类,并输出答题的数目和正确的题数。
四:扩展功能
1:可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。
2:程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
3:用户答题结束以后,程序可以显示用户答题所用的时间。
五:代码风格
1:代码风格的原则--简明,易读,无二义性。
2:括号使用--在复杂的条件表达式中,用了括号清楚的表示逻辑优先级。
3:使用断行与空白的{}行--在有多层控制嵌套时,每个“{”和“}”都独占一行,这样的格式就容易看清楚结构和对应关系。
4:函数命名--对函数命名时,用具有实际生活意义的英文来命名,使人能一眼看出函数的作用(例如:在我们这次实验中,add函数所对应就是要实现的加法运算)
5:注释--在我们的代码中,为了使读者能够清楚地读懂代码实现过程,为一些的语句作了相应的注释,增加了代码的可读性。
六:代码设计规范
1:函数--代码编写中,每一个子函数只对应一种相应的算法(例如:子函数add对应“+”运算、subtract对应“-”运算、multiply对应“*”运算、divide对应“/”运算)。
2:函数声明与具体实现分别存放在头文件(.h)和源文件(.c)中。
七:代码实现
definition.h文件
#include<stdio.h> #include<stdlib.h> #include<time.h> void add(int a,int b) ; void subtract(int a,int b) ; void multiply(int a,int b); void divide(int a,int b) ;
text.cpp文件
/**************************************** *程序名:test.cpp *作者:张燕、毛茸 *功能:进行简单的四则运算测试 *日期:2015-4-22 *****************************************/ #include "definition.h" int i=0,j=0; void add(int a,int b) //实现加法运算 { int m; srand(time(NULL)); a=1+rand()%100; //随机产生一个100以内的数 b=1+rand()%100; printf("请输入运算结果:%d+%d= ",a,b); scanf("%d",&m); if(m==a+b) { printf("恭喜你答对了 "); i++; //统计正确的个数 } else { printf("你答案有错误 "); j++; //统计出错的题的个数 } } void subtract(int a,int b) //实现减法运算 { int m; srand(time(NULL)); a=1+rand()%100; b=1+rand()%100; if(a<b) //随机产生的两个数,当a小于b时,交换两数的值 { int t=0; t=a;a=b;b=t; } printf("请输入运算结果:%d-%d= ",a,b); scanf("%d",&m); if(m==a-b) { printf("答对了,你真聪明 "); i++; } else { printf("有错误,下次细心 "); j++; } } void multiply(int a,int b) //实现乘法运算 { int m; srand(time(NULL)); a=1+rand()%20; b=1+rand()%20; if(b%5==0) { b=b; printf("%d * %d = ",a,b); } else { b=-b; printf("%d * (%d) = ",a,b); } scanf("%d",&m); if(m==a*b) { printf("太好了,你答对啦! "); i++; } else { printf("错了,再接再励 "); j++; } } void divide(int a,int b) //实现除法运算 { int m; srand(time(NULL)); a=1+rand()%100; b=1+rand()%100; if(b==0) { b=1+rand()%100; } if(a<b) { int t=0; t=a;a=b;b=t; } while(a%b!=0) { a=1+rand()%100; b=1+rand()%100; } printf("请输入运算结果%d / %d = ",a,b); scanf("%d",&m); if(m==a/(float)b) { printf("恭喜你答对了 "); i++; } else { printf("你答案有错误 "); j++; } }
text_main.cpp文件
/****************************************
*程序名:test_main.cpp
*作者:张燕、毛茸
*功能:进行简单的四则运算测试
*日期:2015-4-22
*****************************************/
/*进行时间的统计,输出用户做题所用的时间,以及用户答题的总数和正确题数*/ #include "definition.h"
#include "test.cpp" int main() { double start, finish; int time1; //定义运行时间 int select,select1;
int a,b; start = clock(); //获取开始时间 while(1) { printf(" 欢迎进入四则运算系统: "); printf("你将进行100以内的四则运算: "); printf(" 1.加法运算 "); printf(" 2.减法运算 "); printf(" 3.乘法运算 "); printf(" 4.除法运算 "); printf(" 请选择"); scanf("%d", &select); //进行加、减、乘、除法的选择 switch(select) { case 1:add(a,b);break; case 2: subtract(a,b);break; case 3:multiply(a,b);break; case 4:divide(a,b);break; } printf("------------------------------------------------------- "); printf(" 5.请重新选择 "); printf(" 6.结束 "); scanf("%d", &select1); printf("------------------------------------------------------- "); if(select1==6) break; finish = clock(); //获取完成时间 time1 = (int)(finish - start) /CLOCKS_PER_SEC; if(time1>120) { printf( "时间已到,用户不能再答题 "); break; } } printf("你回答题的总数%d和正确的个数%d ",i+j,i); printf( "运行时间为:%d 秒 ",time1); //以秒为单位显示之 return 0; }
calc.cpp文件(加、减、乘、除)
#include "definition.h"
int add(int a,int b) //加法运算
{
int result = a + b;
return result;
}
int subtract(int a,int b) //减法运算
{
int result = a - b;
return result;
}
int multiply(int a,int b) //乘法运算
{
int result = a * b;
return result;
}
float divide(int a,int b) //除法运算
{
int result = a /b;
return result;
}
assert.c文件(进行加法测试)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<assert.h>
#include "definition.h"
int testadd() //测试加法运算
{
assert(6==add(2,3));
assert(30==add(14,16));
assert(55==add(20,35));
return 1;
}
八:系统测试
(1) 加法运算界面,包括做的总题数和正确数
(2)减法运算界面
(3)乘法运算界面
(4)除法运算界面
九:PSP耗时统计
序号 | psp | 耗时(min) | 百分比(%) |
1 | 需求分析 | 35 | 17.1 |
2 | 设计 | 60 | 29.3 |
3 | 代码实现 | 80 | 39 |
4 | 测试 | 20 | 9.8 |
5 | 分析和总结 | 10 | 4.9 |
十:合作步骤
1:我们两人一起对实验要求进行分析、讨论,各自提出自己的观点。
2:在写实验报告时,每一步都是合作完成的,我们先各自说怎么写,最后综合两人的观点。
3:代码规范设计方面,我们认真阅读教材Page57:4.2-4.3节中内容,进行了风格、设计讨论,了解之后,一人说一人写。
4:一起讨论如何采用模块化的思想,将函数封装起来。如:函数声明存放在头文件(.h),具体实现存放在源文件(.cpp)中。
5:对该软件的功能进行了扩展, 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。每一次测试结束会 给出本次测试的时间,或者在120秒时间内未完成给出的题目,则会显示时间已到,不能答题!
十一:事后分析和总结
1:首先看到题目,对函数的封装和测试不了解,在老师的讲解下,大概知道了函数封装和测试的基本思想。
2:码调试过程中,出现了一些细节性的小错误,通过仔细排查,找出错误并解决。
3:在这次实验中我们了解了代码的风格和代码的设计规范。
4:代编写过程中,不仅要有基本的编写能力,遇到不懂的地方要学会利用资源、查阅资料。