软件工程(第三次作业)
组员:周德莉、王铭霞
一、题目
在之前编写的四则运算程序基础之上做如下改进:
1 请参照教材Page57:4.2-4.3节中内容,修改原程序,使之符合 “代码风格和设计规范”的基本要求;
2 请采用模块化设计思想,修改之前的code,将 “计算功能” 封装起来
小提示:
假如在C语言环境下,可将函数声明与具体实现分别存放在头文件(.h)和源文件(.c)中;
3 通过测试程序和API 接口,测试其简单的加法功能。
小提示:
单元测试方法请参看教材Page21:2.1.1节内容
4 扩展程序功能(选做)
针对第一次作业添加功能点支持:
1). 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
2). 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
二、需求分析
1、基本功能
1)此软件可选择所需的四则运算符号,即加、减、乘、除。
2)对于用户选择的运算符号可自动生成两个随机数的整数想x,y。
3)该软件可通过用户手动输入运算结果,判断用户答案的对错。
4)对于用户答案的正确与否可进行统计对错数量。
2、本组选择的扩展功能为第二个
即可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
三、基本设计
——修改了原程序,使之基本符合 “代码风格和设计规范”的要求。
——在Visual Studio 2010环境下对代码进行分拆、封装和测试。
——请采用模块化设计思想,修改之前的code,将 “计算功能” 封装起来。
——将函数声明与具体实现分别存放在头文件(.h)和源文件(.cpp)中。
——对于算术中的加法进行测试。
四、代码
stdaxf.h
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> void jia( int *, int * ); void jian(int *, int * ); void cheng(int *, int *); void chu(int *, int *);
stdafx.cpp
#include"stdafx.h" void jia(int *p, int *q) { int x, y, z; srand((unsigned)time(NULL)); x = rand() % 201-100; y = rand() % 201-100; if(x<0&&y>0) { printf("请输入您的答案:(%d)+%d=", x, y); } else if(x>0&&y<0) printf("请输入您的答案:(%d)+%d=", x, y); else if(x<0&&y<0) { printf("请输入您的答案:(%d)+(%d)=", x, y); } scanf_s("%d", &z); if (x + y != z) { printf("回答错误! "); *q++; } else { printf("回答正确! "); *p++; } } void jian(int *p, int *q) { int x, y, z; srand((unsigned)time(NULL)); x = rand() % 201-100; y = rand() % 201-100; if(x<0&&y>0) { printf("请输入您的答案:(%d)-%d=", x, y); } else if(x>0&&y<0) { printf("请输入您的答案:%d-(%d)=", x, y); } else if(x<0&&y<0) { printf("请输入您的答案:(%d)-(%d)=", x, y); } scanf_s("%d", &z); if (x - y != z) { printf("回答错误! "); *q++; } else { printf("回答正确! "); *p++; } } void cheng(int *p, int *q) { int x, y, z; srand((unsigned)time(NULL)); x = rand() %201- 100; y = rand() %201- 100; if(x<0&&y>0) { printf("请输入您的答案:(%d)*%d=", x, y); } else if(x>0&&y<0){ printf("请输入您的答案:%d*(%d)=", x, y); } else if(x<0&&y<0){ printf("请输入您的答案:(%d)*(%d)=", x, y); } scanf_s("%d", &z); if (x*y != z) { printf("回答错误! "); *q++; } else { printf("回答正确! "); *p++; } } void chu (int *p, int *q) { int x, y, z; srand((unsigned)time(NULL)); x = rand() % 201-100; y = rand() % 201 -100; if (x<0&&y>0) { printf("请输入您的答案:(%d)/%d=", x, y); } else if(x>0&&y<0) { printf("请输入您的答案:(%d)/%d=", x, y); } else if(x<0&&y<0) { printf("请输入您的答案:(%d)/(%d)=", x, y); } scanf_s("%d", &z); if (x / y != z) { printf("回答错误! "); *q++; } else { printf("回答正确! "); *p++; } }
sizeyunsuan.cpp
#include"stdafx.h"
int right = 0; int wrong = 0; void main() { int *p = &right; int *q = &wrong; int choise, sum = 0; printf(" *********************欢迎来到我的C语言四则运算程序系统!************************ "); system("pause"); system("cls"); while (1) { printf(" 请选择计算符号: 加法(输入1) 减法(输入2) 乘法(输入3) 除法(输入4) "); if (sum == 0)scanf_s("%d", &choise); switch (choise) { case 1: jia(p,q); break; case 2:jian(p,q); break; case 3:cheng(p,q); break; case 4:chu(p,q); break; } printf("请您选择: 继续(输入1) 重新(输入2) 退出(输入3) "); scanf_s("%d", &sum); if (sum == 1)sum = 1; if (sum == 2)sum = 0; if (sum == 3)break; } printf("您一共做了%d道题,正确%d道,错误%d道! ", right + wrong, right, wrong); system("pause"); }
以下为测试代码:
stdafx.h
#include<stdio.h> #include<stdlib.h> #include<windows.h> #include<time.h> int jia( int x, int y );
test1.cpp
#include"stdafx.h" int jia(int x, int y) { return x+y; }
test.cpp
#include"stdafx.h" int right=0,e; int wrong=0; int a=2 ,b=3; int main() { printf(" *********************欢迎进入我的测试!************************ "); system("pause"); system("cls"); e=jia(a,b); if(e==5) { right++;
printf("正确%d道 ", right );
} else
{
wrong++; printf("错误%d道 ", wrong ); } system("pause"); }
五、代码运行截图
封装后的结果:
测试结果:
六、PSP计时
七、两人合作步骤
- 一开始 我们先对题目要求目标不清楚,对于在C语言环境下,可将函数声明与具体实现分别存放在头文件(.h)和源文件(.c)中,这个作业从来没做过。
- 由于两人之前所写代码不一样,在讨论使用谁的代码上花了一点时间,但最终决定要使用谁的代码后,我们还是不确定要用什么方法去做这个题目。
- 于是通过几天的时间,我们在网上查找资料,并向同学、老师询问,得到了一点点想法,但具体的操作还不是很确定。
- 在不断地思考和查阅资料中,我们渐渐地有了自己的想法,于是在电脑上开始对代码进行修改和分拆,开始尝试自己将代码分成老师所说的.h和.cpp文件,对代码进行了封装。
- 所谓一分耕耘一分收获,我们的探索终于取得了成功,代码分拆成功了,但摆在我们面前的又一个问题出现了,我们不知道如何对代码进行单元测试。
- 于是我们决定一人先把博客的相关内容给写了,而另一人先尝试着写一写测试和将代码进行规范化。
- 最后,我们一人把博客的内容给做好了,而你另一人将测试代码做好了并将代码规范进行了规范。综合过后,我们将本次作业粗略了完成了。
八、总结
本次作业是由王铭霞、周德莉共同探讨共同完成的。从开始不知道封装,再到慢慢摸索,最后了解封装。这一过程确实遇到了许多困难。
但是,从封装过的程序来看,它确实给读程序和改程序的人带来了极大的便利。这让我们受益匪浅,以前老师是提 过封装,但是却没有去强调我们写程序要封装,
自然就不能真正的从实践过程中体验它的好处。同时在两人的合作中,了解其重要性,不管是在分工上,还是在想法上。