存档在 2013年4月

第4章习题举例

2013年4月7日

 

前言

由于很多同学问相同的问题,每个同学都一一解答,时间上不允许,所以我挂在网上,大家可以互相学习与解答。

我在博客中挂出部分课后习题代码,我会以我能达到的最规范方式编码。

在另外一个网页中,大家可以粘贴自己的代码互相学习解答,我也会针对每个问题进行解答,链接为:http://unix8.net/forum-108-1.html,密码为2013

可以打开该该链接后保存在收藏夹,以后有任何通知或者更新大家查看也很方便。

当然不仅局限于课本习题,任何关于程序设计方面的问题都可以探讨!

作业

通过作业看出主要有以下几个问题:
1.代码排版错乱
2.命名不规范
3.想更改private成员,最好通过public函数在主函数中修改,也即是很多人的输入操作应该放在主函数中。
4.抄袭严重

代码

代码下载链接4-10.cpp

运行效果如下:

身份证号为[20130001]的员工,信息如下:
编号为:1
性别为:男
生日为:1989年7月1日

身份证号为[20130002]的员工,信息如下:
编号为:2
性别为:女
生日为:1988年7月2日

 

#include <iostream>
#include <string>
using namespace std;

//出生日期类
class CDateOfBirth
{
public:
	~CDateOfBirth();
	//拷贝构造函数类
explicit	CDateOfBirth(const CDateOfBirth& tDate);
	//重载的构造函数,已经具有默认构造函数功能
explicit CDateOfBirth(int tYear, int tMonth, int tDay);

	//提供给外部的接口
	int getYear(void) const;
	int getMonth(void) const;
	int getDay(void) const;
	void setYear(int);
	void setMonth(int);
	void setDay(int);

private:
	int year;
	int month;
	int day;
};
//析构函数
CDateOfBirth::~CDateOfBirth(){}
//拷贝构造函数
CDateOfBirth::CDateOfBirth(const CDateOfBirth& tDate) :
						year(tDate.year), month(tDate.month), day(tDate.day){}
//带默认形参的构造函数
CDateOfBirth::CDateOfBirth(int tYear = 0, int tMonth = 0, int tDay = 0) :
						year(tYear), month(tMonth), day(tDay){}
//内联成员函数
inline int CDateOfBirth::getYear(void)const { return year;}
inline int CDateOfBirth::getMonth(void)const { return month;}
inline int CDateOfBirth::getDay(void)const { return day;}
inline void CDateOfBirth::setYear(int tYear){year = tYear;}
inline void CDateOfBirth::setMonth(int tMonth){month = tMonth;}
inline void CDateOfBirth::setDay(int tDay){day = tDay;}

//人事管理的“人员”类
//这个类部分成员函数演示直接在类中定义,默认就为内联
class CEmployee
{
public:
	//默认构造函数
	explicit CEmployee(){}
	//析构函数
	~CEmployee(){}
	//拷贝构造函数
	explicit	CEmployee(const CEmployee& tEmployee) :
						id(tEmployee.id), sex(tEmployee.sex), card(tEmployee.card), birth(tEmployee.birth){}
	//赋值操作符
	CEmployee& operator=(const CEmployee& tEmployee)
	{
		id = tEmployee.id;
		sex = tEmployee.sex;
		card = tEmployee.card;
		birth = tEmployee.birth;
	}
	//重载的构造函数
	explicit	CEmployee(CDateOfBirth &tBirth, int tId, char tSex, string tCard);
	explicit	CEmployee(int tId, char tSex, string tCard, int tYear, int tMonth, int tDay);
	//提供给外部的接口
	void setId(int tId) {id = tId;}
	void setSex(char tSex) {sex = tSex;}
	void setCard(string tCard) {card = tCard;}
	//设置人员的生日
	void setBirth(int tYear, int tMonth, int tDay)
	{
		birth.setYear(tYear);
		birth.setMonth(tMonth);
		birth.setDay(tDay);
	}
	//设置人员的生日重载
	void setBirth(const CDateOfBirth& tBirth)
	{
		birth.setYear(tBirth.getYear());
		birth.setMonth(tBirth.getMonth());
		birth.setDay(tBirth.getDay());
	}
	int getId(void) const {return id;}
	string getCard(void) const {return card;}
	char getSex(void) const {return sex;}
	const CDateOfBirth& getBirth(void) const {return birth;}

private:
	int id;
	char sex;
	string card;
	CDateOfBirth birth;
};
CEmployee::CEmployee(int tId, char tSex, string tCard, int tYear, int tMonth, int tDay):
	 id(tId), sex(tSex), card(tCard)
{
	birth.setYear(tYear);
	birth.setMonth(tMonth);
	birth.setDay(tDay);
}
CEmployee::CEmployee(CDateOfBirth &tBirth, int tId = 0, char tSex = 'f', string tCard = ""):
	birth(tBirth), id(tId), sex(tSex), card(tCard){}

ostream& operator<<(ostream& out, const CEmployee& employee)
{
	cout<<"身份证号为["<<employee.getCard()<<"]的员工,信息如下:"<<endl;
	cout<<"编号为:"<<employee.getId()<<endl;
	cout<<"性别为:"<<(employee.getSex() == 'f' ? "男":"女")<<endl;;
	cout<<"生日为:"<<employee.getBirth().getYear()<<"年"
			<<employee.getBirth().getMonth()<<"月"<<employee.getBirth().getDay()<<"日"<<endl;
}

int main()
{
	//第一种用法,员工为小王
	//编号+性别+身份证号+年+月+日
	CEmployee XiaoWang(1, 'f', "20130001", 1989, 7, 1);
	//测试小王
	cout<<XiaoWang<<endl;

	//第二种测试,测试为小张
	//生日+编号+性别+身份证号
	CDateOfBirth birth(1988, 7, 2);
	CEmployee XiaoZhang(birth, 2, 'm', "20130002");
	cout<<XiaoZhang<<endl;
	return 0;
}

最好将输入信息放在主函数中完成,比如下面的主函数,要修改某个对象的private数据成员,可以调用public成员函数进行修改。

int main()
{
	//第一种用法,员工为小王
	//编号+性别+身份证号+年+月+日
	CEmployee XiaoWang(1, 'f', "20130001", 1989, 7, 1);
	//测试小王
	cout<<XiaoWang<<endl;

	//第二种测试,测试为小张
	//生日+编号+性别+身份证号
	CDateOfBirth birth(1988, 7, 2);
	CEmployee XiaoZhang(birth, 2, 'm', "20130002");
	cout<<XiaoZhang<<endl;
        //第三种测试,测试为小黄
	int year, month, day;
	int no;
	char sex;
	string card;
	cin>>year>>month>>day>>no>>sex>>card;
	CEmployee XiaoHuang(no, sex, card, year, month, day);
	cout<<XiaoHuang<<endl;

	return 0;
}

有问题或者疑问,请跳转到:http://unix8.net/forum-108-1.html,密码为2013

数学建模美赛成绩出来了,呵呵。二等奖

2013年4月3日

1

美赛奖项设置:
Successful Participant成功参赛奖(占大约60%队伍)
Honorable Mention中文一般译为“二等奖”(大约20%的队伍)
Meritorious Winner中文译为“一等奖”(大约15%)
Finalist中文译为“特等奖提名”(2010年新增,在最后一轮选拔被淘汰的队伍获此奖项)
Outstanding Winner中文译为“特等奖”(大约10支队伍)

C++中不能重载的5个运算符

2013年4月3日

. :
?: :
siezof :
:: :
.* :

1. 运算符重载后,优先级和结合性怎么办?
  用户重载新定义运算符,不改变原运算符的优先级和结合性。这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载后,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载双目运算符。

2. 编译程序如何选用哪一个运算符函数?
  运算符重载实际是一个函数,所以运算符的重载实际上是函数的重载。编译程序对运算符重载的选择,遵循着函数重载的选择原则。当遇到不很明显的运算时,编译程序将去寻找参数相匹配的运算符函数。

3. 重载运算符有哪些限制?
  (1) 不可臆造新的运算符。必须把重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中。
  (2) 重载运算符坚持4个“不能改变”。
  ·不能改变运算符操作数的个数;
  ·不能改变运算符原有的优先级;
  ·不能改变运算符原有的结合性;
  ·不能改变运算符原有的语法结构。

4. 运算符重载时必须遵循哪些原则?
  运算符重载可以使程序更加简洁,使表达式更加直观,增加可读性。但是,运算符重载使用不宜过多,否则会带来一定的麻烦。
  使用重载运算符时应遵循如下原则:
  (1) 重载运算符含义必须清楚。
  (2) 重载运算符不能有二义性

教你在linux下如何测试串口

2013年4月2日

因为我使用的是USB转串口,所以硬件设备为/dev/ttyUSB0.

我想测试写数据,则可以使用:
echo “creater” > /dev/ttyUSB0
如果我想测试读数据,则可以使用:
cat /dev/ttyUSB0

另外一端可以连接一个串口助手来收发数据,推荐http://unix8.net/thread-372-1-1.html下载。

关于TCP的可靠性

2013年4月1日

TCP是一个可靠的协议。有时人们会说:”TCP能够保证它所发送数据的可靠传输。”这种说法尽管很常见,但却非常不恰当。

首先,只要稍微想一下就会知道这不可能是对的。比如,假设在数据传输的过程中将一台主机从网络上断开,TCP这侧不管做出何种努力,都无法获取其余 的数据。网络确实会中断,主机确实会崩溃,用户确实会在TCP连接仍然活跃的时候关机。这些事件或其他类似的事件都使得TCP无法将它从应用程序收到的数 据传送出去。

但更重要的是,TCP”确保可靠传输”这种说法会对不够谨慎的网络程序员产生微妙的影响。当然,没人真的会相信TCP有某种魔法总是可以将数据安全 地传送到其目的地。但是,相信TCP能够保证可靠传输会让人觉得没必要进行防御性编程,也没必要考虑对故障模式的处理,还是那句话,毕竟TCP可以确保可 靠传输。 » 阅读更多: 关于TCP的可靠性