时间:
2015/4/17-2015/4/23
基本要求:
在之前编写的四则运算程序基础之上做如下改进:
- 请参照教材Page57:4.2-4.3节中内容,修改原程序,使之符合 “代码风格和设计规范”的基本要求;
- 请采用模块化设计思想,修改之前的code,将 “计算功能” 封装起来
小提示:假如在C语言环境下,可将函数声明与具体实现分别存放在头文件(.h)和源文件(.c)中;
- 通过测试程序和API 接口,测试其简单的加法功能。
小提示:单元测试方法请参看教材Page21:2.1.1节内容
扩展程序功能(每组至少选做其中2个方向)
针对第一次作业添加功能点支持:
- 程序可以出带括号的正整数四则运算,支持分数,除法保留两位小数,如:(1/3+1)*2 = 2.67,特别注意:这里是2.67而非2.66,或保持分数形式:8/3
- 可以出表达式里含有负整数(负整数最小不小于-100)的题目,且负数需要带括号,用户输入的结果不用带括号。如: 2*(-4) = -8
- 用户在第一次答题时,需要用户输入用户名,用户下次启动后,程序需要记住用户前一次输入的用户名
- 程序可以设置答题时间,时间设置为整数,单位为秒,最大不能超过120秒,若超过了答题时间未答题,则提示:时间已到,不能答题。
- 用户答题结束以后,程序可以显示用户答题所用的时间
封装,API和单元测试解释:
封装
:
- 大家把所有的代码都写在一个main函数里,那么把加减乘除都提取出来成单独的函数就是一种封装。
- 大家把scanf等等待用户输入的行为放在add函数里了,那么把sanf提取到函数外部,函数原型变成
int add(int a,int b);
这是一种封装 - 错误处理的代码雷同,是否能写一个函数,然后供其他地方调用?这是封装
- 进一步,大家把加减乘除函数的声明放到.h文件里,实现放到.c文件里,是一种封装步骤
- 进一步,如果把计算函数、对错判断、以及错误处理等写到一个class里,是一种封装
- 进一步,如果把函数抽象成一个统一的函数
double calc(const char* operator,double a,double b)
;该函数内部可以转调用前面封装的加减乘除函数,那么这是进一步的封装,调用者可以只用calc("+",1,2)
这样的方式,用一个函数实现四种调用行为。 - 进一步,如果写简单的字符串解析,可以将
calc
做进一步封装,改为double calc(const char* expression)
,调用者这样使用calc("1+2")
,calc("100/2")
等,这是进一步的封装 - 进一步,如果你会写dll(无论是基于c、c++还是c#),把计算功能封装成一个独立的dll+暴露接口的.h文件(c和c++需要头文件,java和c#则没有),那么这是更大粒度的封装,此时调用者不需要看到代码的实现,而只需要有dll以及头文件,就可以调用头文件里的函数。
API
API的全程是:Applicaton Programming Interface,翻译过来是应用程序接口。
- 简单说,API就是函数,调用者只需要知道API函数就可以完成所需要的功能。
- 但是,API是调用者完成功能必须的函数,比如说上面的封装过程中你写了
Add,Subtraction,Multiplication,Division
等内部函数
,但是最后封装了calc
函数,那么,只需要在头文件里暴露calc
函数给调用者就可以,其他几个函数都可以只放在cpp里。calc
就是API。 - 另外对于C++和Java来说,如果你封装了一个class,那么public的函数就是你需要暴露给调用者的,不需要暴露的函数应该是private的。
单元测试
单元测试,看个英文介绍怎样?:http://en.wikipedia.org/wiki/Unit_testing
啊,全英文,太难了,还是必应、Google、百度中文吧?对了,推荐必应词典,无论是pc还是手机app都有。超级好用。
举个栗子,前面封装了calc
这个API,那么,可以这样做单元测试:
测试加法
void testAdd()
{
double result = calc("1+2");
assert(result==3);
result = calc("0+100");
assert(result==100);
...
}
哈哈,然后你就可以针对除法的被除数为0
等情况做单元测试了,单元测试就是大家来找茬的程序方式- -。
作业报告
须包括以下几个方面:
- 对题目要求的分析、设计 和 代码实现。
- 代码规范设计、风格讨论。
- 两人合作步骤
- 结对编程作业只要一个人发布博客就可以
- 结对编程现场的照片一张(可选)