第4周-任务2-一个项目,多个文件

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【题目】针对第3周任务3,利用多文件组织项目。其中,项目包括3个文件: 主文件: main.cpp,用于定义main()函数 头文件: mytime.h,头文件 类定义文件: mytime.cpp,用于定义类Time 要求: (1)如果原任务的设计存在问题,要改正过来; (2)在报告中逐个文件进行说明,在报告最后要就多文档组织提出个人的观点。 【题目说明】 在软件工程中,一

【题目】针对第3周任务3,利用多文件组织项目。其中,项目包括3个文件:
主文件: main.cpp,用于定义main()函数
头文件: mytime.h,头文件
类定义文件: mytime.cpp,用于定义类Time
要求:
(1)如果原任务的设计存在问题,要改正过来;
(2)在报告中逐个文件进行说明,在报告最后要就多文档组织提出个人的观点。

【题目说明】

在软件工程中,一般采用多个文件组成一个项目,其中的好处多多(参考有关资料,深入领会)。所以需要掌握“一个项目,多个文件”的组织形式。要点是:

(1)类声明放在一个.h文件中;

(2)类中的成员函数的实现放在一个.cpp文件中,需要#include“xxx.h”

(3)对类的调用放在另外的.cpp文件中

【参考解答】

主文件: main.cpp,用于定义main()函数

#include <iostream>
#include"mytime.h"    //该头文件中包含了Time类的定义
using namespace std;
int main( )
{
	Time t1;    //有了 #include"mytime.h" ,可以直接使用Time定义对象
	t1.set_time( );  
	cout<<"现在时间是:";
	t1.show_time( );

	t1.add_a_sec();  //增加1秒钟
	cout<<"增加1秒钟后:";
	t1.show_time( );

	t1.add_a_minute(); //增加1分钟
	cout<<"增加1分钟后:";
	t1.show_time( );

	t1.add_an_hour(); //增加1小时
	cout<<"增加1小时后:";
	t1.show_time( );

	t1.add_seconds(40); //增加40秒钟
	cout<<"增加40秒钟后:";
	t1.show_time( );

	t1.add_minutes(127); //增加127分钟
	cout<<"增加127分钟后:";
	t1.show_time( );

	t1.add_hours(8); //增加8小时
	cout<<"增加8小时后:";
	t1.show_time( );
	system("PAUSE");  //在VS2008中,可出现“按任一键继续...” 
	return 0;
}

头文件: mytime.h,头文件

//本文件中只做类的声明,关注公用接口,而不关心私有实现,做到了信息隐藏
class Time
{
public:
	void set_time( );   
	void show_time( );  
	inline void add_a_sec();  //增加1秒钟
	inline void add_a_minute(); //增加1分钟
	inline void add_an_hour(); //增加1小时
	void add_seconds(int); //增加n秒钟
	void add_minutes(int); //增加n分钟
	void add_hours(int); //增加n小时
private: 
	bool is_time(int, int, int);
	int hour;
	int minute;
	int sec;
};

//注意:下面的内置成员函数(inline)要与类声明放在一个文件中。因为在编译时,需要将对该函数的调用替换为该函数的定义,所以不能在其他文件中独立定义

inline void Time::add_a_sec()  //增加1秒钟
{
	++sec;				//直接修改sec的值即可,sec是Time类的数据成员
	if (sec>59)			//sec超出规定的范围,因为只是增加1秒,最多也就是向分钟进位1,所以增加1分钟。		
		add_a_minute();	//至于增加1分钟是否会引起小时变化,由add_a_minute()处理
}

inline void Time::add_a_minute() //增加1分钟
{
	++minute;
	if (minute>59)		//参见add_a_sec()中的注释
		add_an_hour();
}

inline void Time::add_an_hour() //增加1小时
{
	++hour;
	if (hour>23)
		hour=0;		//到第2天了
	
}

类定义文件: mytime.cpp,用于定义类Time中的成员函数

#include <iostream>
#include"mytime.h"  //该头文件中包含了Time类的定义
using namespace std;

//下面实现的是非内置成员函数,实现了公用接口与私有实现的分离,做到了信息隐藏

void Time::set_time( ) 
{
	char c1,c2;
	cout<<"请输入时间(格式hh:mm:ss)";
	while(1)
	{
		cin>>hour>>c1>>minute>>c2>>sec;
		if(c1!=':'||c2!=':')
			cout<<"格式不正确,请重新输入"<<endl;
		else if (!is_time(hour,minute,sec))
			cout<<"时间非法,请重新输入"<<endl;
		else 
			break;
	}
}

void Time::show_time( )      
{
	cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

bool Time::is_time(int h,int m, int s)
{
	if (h<0 ||h>24 || m<0 ||m>60 || s<0 ||s>60)
		return false;
	return true;
}

void Time::add_seconds(int n) //增加n秒钟
{
	sec+=n;			//直接加上去。此操作可能使sec超出取值范围,将在下面处理,我们只要保证此函数执行完sec的取值正确即可
	if (sec>59)		//思考:if中的两条语句能否交换顺序?为什么不能?后果将是……?
	{
		add_minutes(sec/60);	//增加sec/60分钟
		sec%=60;				//秒数应该是sec%=60
	}
}

void Time::add_minutes(int n) //增加n分钟
{
	minute+=n;
	if (minute>59)		//参见add_seconds()中的注释
	{
		add_hours(minute/60);
		minute%=60;
	}
}

void Time::add_hours(int n) //增加n小时
{
	hour+=n;
	if (hour>23)
		hour%=24;		//此程序不涉及日期,如果设计类DateTime,修改将继续下去
}
【特别强调】掌握这样的结构,并且体会内置成员函数要与class的定义放在同一个头文件中。如果三个内置成员函数与其他成员函数都定义在了mytime.cpp中,将会在编译时出现错误:

1>------ 已启动生成: 项目: time, 配置: Debug Win32 ------
1>正在链接...
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Time::add_an_hour(void)" (?add_an_hour@Time@@QAEXXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Time::add_a_minute(void)" (?add_a_minute@Time@@QAEXXZ),该符号在函数 _main 中被引用
1>main.obj : error LNK2019: 无法解析的外部符号 "public: void __thiscall Time::add_a_sec(void)" (?add_a_sec@Time@@QAEXXZ),该符号在函数 _main 中被引用
1>D:\C++\VS2008 project\time\Debug\time.exe : fatal error LNK1120: 3 个无法解析的外部命令
1>生成日志保存在“file://d:\C++\VS2008 project\time\time\Debug\BuildLog.htm”
1>time - 4 个错误,0 个警告
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

【更好的写法】直接在class中实现的成员函数被 认为是内置函数,本题中add_a_xxxxx()中代码短,(可能)会被频繁调用,设置为内置函数是合理的。所以,mytime.h采用如下写法更简洁。
class Time
{
public:
	void set_time( );   
	void show_time( );  
	inline void add_a_sec()  //增加1秒钟
	{
		++sec;				
		if (sec>59)	add_a_minute();	
	}
	inline void add_a_minute() //增加1分钟
	{
		++minute;
		if (minute>59) add_an_hour();
	}
	inline void add_an_hour() //增加1小时
	{
		++hour;
		if (hour>23) hour=0;		
	}
	void add_seconds(int); //增加n秒钟
	void add_minutes(int); //增加n分钟
	void add_hours(int); //增加n小时
private: 
	bool is_time(int, int, int);
	int hour;
	int minute;
	int sec;
};


目录
相关文章
|
C++
2014秋C++第10周项目6参考-贪财的富翁
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 【项目6:贪财的富翁(选做题目)】一个百万富翁遇到一个陌生人,陌生人找他谈一个换钱的计划,该计划如下:我每天给你十万元,而你第一天只需给我一分钱,第二天我仍给你十万元,你给我两分钱,第三天我仍给你十
1146 0
|
数据安全/隐私保护 C++
2014秋C++第10周项目2参考-M$pszi$y是嘛意思
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 【项目2-M$pszi$y是嘛意思?】小明让同学传纸条给小丽,纸条上写着M$pszi$y。小丽接到会心一笑,大家却不知所云。他们俩的花招瞒不过老师,给你一个程序,输入M$pszi$y,输出的,就是小明
1058 0
|
C++
2014秋C++第9周项目4参考-小九九
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703。课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目4:乘法口诀表】编程序,输出一个乘法口诀表,形如   提示:一共要输出9行,每一行…… 参考解答: #include &lt;iostream&gt; using namespace std
1040 0
|
C++
2014秋C++第8周项目2参考-加班费
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,实践要求见http://blog.csdn.net/sxhelijian/article/details/39493833。 课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。  【项目2:加班费,要不要?】 小贺刚上班,按工作时间小时制领取周工
1086 0
|
C++
2014秋C++ 第5周项目 初识C++
课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂“贺老师课堂”同步展示,使用的帐号请到课程主页中查看。 【项目1-见识初学者常见错误】下面是最经典和最简单的C++程序。在ideone.com中运行程序,并在能正确运行的程序基础上,“捣乱”制造些错误,对此进行观察。经验是从错误中得来的,这个项目就是要
1197 0
|
C++
C++第12周项目3——太乐了多文件版
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 【项目3-多文件程序组织】  阅读http://blog.csdn.net/sxhelijian/article/details/15187309中《CodeBlocks中程序的多文件组织》,建立一个包含多个文件的项目,把本周项目2“太乐了”也用多文件组织起来。其中,m
1235 0
|
C++
C++第12周项目2——太乐了
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 【项目2-太乐了】先听故事,再编程序。  故事是这样的:话说sin和cos是一对夫妇。一天,sin去听相声了,cos在家。过了一会,有人敲门,cos开门一看,是一个不认识的多项式函数。cos问:你是谁啊?他说:我是你的老公sin啊。cos说:你不是去听相声了吗?怎么成这
1171 0
|
C++
C++第8周项目4要不要加油
课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759 【项目4:要不要加油?】设计一个程序,用于赛车上的计算机监视系统。该程序在赛车油量偏低时(少于1/4),警示车手应该注意;在油箱接近满载(不低于3/4)时要告诉车手绕过维修站。在其他情况下,不提示任何信息,以免车手分心。  理一下思路,要给车手提示的信息来自于: 如果
1034 0
|
C++
C++第11周项目4 - 点类、圆类、圆柱类
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8894095 【项目4】按以下的提示,由基类的设计和测试开始,逐渐地完成各个类的设计,并且完成要求的计算任务:     (1)先建立一个Point(点)类,
1228 0
|
C++
C++第6周项目3 - 平面坐标点类
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8748730 【项目3】设计平面坐标点类,计算两点之间距离、到原点距离、关于坐标轴和原点的对称点等 class CPoint { private: do
1097 0