"<
return0;
}
提示:
使用引用
改正过后的结果是:
函数的重载和默认参数
从键盘上输入年龄(实数)和性别(用字符M和F表示),输出对应信息.要求如下
键盘输入如:
18.6F,则输出19yearsold,female
19.4M,则输出19yearsold,male
年龄采用四舍五入,如果不会,可以不实现,只取整即可
编写print函数来处理(输出),要求函数可以用任意顺序的参数调用,程序结构如下
intmain(){
floatyear;charsex;
输入
print(year,sex)
print(sex,year)
print();//这里输出0yearsold,male,即默认是0岁,male
return0;
}
程序不要改变main函数结构,编写printf函数(思考需要编写几个?
)
提示:
如何实现四舍五入?
可以采用变量+0.5取整
#include
#usingnamespacestd;
#include
#include
usingnamespacestd;
//这里输出years和sex顺序不同,但方法体是相同的。
voidprint(floatyear,charsex){
inty=0;
y=(int)year;
if(sex=='m'||sex=='M')cout<elsecout<}
//出参数顺序不同意外,其它都是相同的。
voidprint(charsex,floatyear){
inty=0;
y=(int)year;
if(sex=='m'||sex=='M')cout<elsecout<}
//这里输出0yearsold,male,即默认是0岁,male
voidprint(){
cout<<"0yearsold,male"<}
intmain(){
floatyear;//变量year存放年龄变量。
charsex;//变量sex存放性别变量。
charinput[20];//存放输入字符串。
charyears[20];//存放输入字符串中年龄字符数组。
chardot[20];//存放输入字符数组中小数点以后的小数部分数组。
char*p;//存放小数点后第一位数值,用于判断是否进行四舍五入。
若大于5则总体值+1。
p=dot;
cout<<"pleaseinputyournameandsex(.eg.22M)"<cin>>input;//输入字符数组。
//字符串数组最后一位一定是性别,首先提取出来存放在sex变量中。
sex=input[strlen(input)-1];
//将输入数组除最后一个字符以外的字符串传入年龄数组。
for(inti=0;iyears[i]=input[i];
}
//在年龄数组中获取小数点最近的数值,放入p中。
for(intj=0;jif(years[j]=='.'){
*p=years[j+1];
}
}
//判断,若atoi(p)大于5,则年龄整体+1,若小于5,则年龄整体不变。
if(atoi(p)>=5)year=(float)(atoi(years)+1);
elseyear=(float)atoi(years);
//调用print函数。
Pring函数要进行重载。
print(year,sex);
print(sex,year);
print();//这里输出0yearsold,male,即默认是0岁,male
return0;
}
2.3实验项目2运用类和对象进行程序设计
实验目的
掌握类的定义
掌握对象的成员变量,成员函数的使用
掌握对象成员访问控制的设定
2.3.1实验内容类基本语法练习
#include
usingnamespacestd;
classTime//定义Time类
{public:
//数据成员为公用的
inthour;
intminute;
intsec;
};
intmain()
{Timet1;//定义t1为Time类对象
cin>>t1.hour;//输入设定的时间
cin>>t1.minute;
cin>>t1.sec;
cout<”<”<return0:
}
改写程序,要求:
改写后的程序:
#include"stdafx.h"
#include"iostream"
usingnamespacestd;
classTime
{
public:
Time();
voidprinttime();//实现输出时间函数
voidsettime(int,int,int);//实现时间的的格式设置
private:
//将成员函数改为私有的
inthour;
intminute;
intsec;
};
Time:
:
Time()
{
hour=minute=sec=0;
}
voidTime:
:
settime(inth,intm,ints)
{
hour=(h>=0&&h<24)?
h:
0;
minute=(m>=0&&m<60)?
m:
0;
sec=(s>=0&&s<60)?
s:
0;
}
voidTime:
:
printtime()
{cout<"<"<intmain()
{inti;
Timet1;
t1.settime(2,8,8);
cout<<"时骸?
间?
是?
:
";
t1.printtime();
cout<cin>>i;
printf("pause");
return0;}
//①将数据成员改为私有的;
在上面已经实现了
//②将输入和输出的功能改为由成员函数实现;
在上面已经实现了
//③在类体内定义成员函数
在上面已经实现了
然后编译和运行程序。
请分析什么成员应指定为公用的?
什么成员应指定为私有的?
什么函数最好放在类中定义?
什么函数最好在类外定义?
外部成员就应该定义为公有的,属性成员应该定义为私有的。
函数声明应该放在类中,方便用户调用的函数应该放在类的外部
下面程序设计了一个日期类如下,通过成员函数init来初始化,print输出
classDate{
inty,m,d;
voidinit(){
y=year;m=month;d=day;
}
voidprint(){
cout<}
}
intmain(){
Dated;
d.init();
d.print();
return0;
}
程序问题1:
程序有3处错误,试改正
提示:
类定义格式,注意最后的分号
在类定义完之后需要加分号
init函数是否要参数
需要带参数
注意成员函数的访问属性,公有还是私有
是公有的PUBLI
改正后的程序:
#include"stdafx.h"
#include"iostream"
usingnamespacestd;
classDate{
public:
voidinit(int,int,int);
voidprint();
private:
intyear,month,date;
};
voidDate:
:
init(inty,intm,intd){
year=y;
month=m;
date=d;
}
voidDate:
:
print(){
cout<<"date:
"<}
intmain(){
Dated;
inti;
d.init(1990,8,9);
d.print();
cin>>i;
return0;
}
4把程序分成3个部分(文件),main函数所在的文件main.cpp,类的声明time.h,类的定义time.cpp。
三个文件在同一个工程中。
注意:
哪些要包含头文件。
5//选做:
(在头文件中使用头文件卫士(#ifndef……)来保护头文件可以被多次包含
程序:
问题2.根据上面修改的类,继续添加成员函数,要求能进行日期相减得到相差的天数,日期可以加上一个数,得到新的日期.为简化程序,设每个月都是30天.
#include
usingnamespacestd;
classDate{
inty,m,d;
public:
voidinit(intyear,intmonth,intday){
y=year;m=month;d=day;
}
voidprint(){
cout<}
intsubDate(Date&d){
intdy;
intdm;
intdd;
if(this->y>d.y)dy=(this->y-d.y)*360;//把年求出并计算出它的天数
elsedy=(d.y-this->y)*360;
if(this->m>d.m)dm=(this->m-d.m)*30;//取出它的月份并用天数表示
elsedm=(d.m-this->m)*30;
if(this->d>d.d)dd=(this->d-d.d);//取出它的天数
elsedd=(d.d-this->d)*1;
returndy+dm+dd;
}
DateaddNum(intnum){
intdy,dm,dd;
dy=num/360;//传递一个数并计算出它的年份
dm=(num-(360*dy))/30;//传递一个数并计算出它的月份
dd=(num-dy*360-dm*30)/1;//传递一个数并计算出它的天数
this->y=this->y+dy;//当前年与它进行相加
this->m=this->m+dm;//当前月与它进行相加
this->d=this->d+dd;//当前日对它进行相加
return*this;
}
};
intmain(){
Dated1,d2,d3;
d1.init(1900,2,1);
d2.init(1900,1,1);
cout<<"thedatetotal:
"<d3=d1.addNum(5);//计算出它加后的年月日
d3.print();
return0;
}提示:
增加成员函数intsubDate(Dated){……}//返回一个值
DateaddNum(intnum){……}//返回一
在main函数中验证如下
Dated1,d2,d3;
d1.init(1900,2,1);
d2.init(1900,1,1);
cout<d3=d1.add(5);
d3.print();//d1是1900,2,6
思考:
addNum(intnum)函数的返回值是否可以定义为void?
即这样使用:
d1.add(5);
d1.print();
d1自身的日期加5,如果要这么做,addNum函数要如何修改?
提示:
注意区分当前对象,如果需要返回当前对象自己,可以使用return*this;
this是指向当前对象的指针,*this表示当前对象
改正过后的程序:
#include
usingnamespacestd;
classDate{
inty,m,d;
public:
voidinit(intyear,intmonth,intday){
if(month>12||day>30){
cout<<"dataerror"<exit(0);}
else{y=year;m=month;d=day;}
}
voidprint(){
cout<}
DateaddNum(intnum){
intdy,dm,dd;
dy=num/360;//传递一个数并计算出它的年份
dm=(num-(360*dy))/30;//传递一个数并计算出它的月份
dd=(num-dy*360-dm*30)/1;//传递一个数并计算出它的天数
this->y=this->y+dy;//当前年与它进行相加
this->m=this->m+dm;//当前月与它进行相加
this->d=this->d+dd;//当前日对它进行相加
return*this;
}
intsubDate(Date&d){
intdata=(this->y*12*30+(this->m-1)*30+this->d)-(d.y*12*30+(d.m-1)*30+d.d);
returndata;
}
};
intmain(){
Dated1,d2,d3;
d1.init(1900,25,1);
d2.init(1900,1,1);
cout<<"thedatetotal:
"<d3=d1.addNum(5);//计算出它加后的年月日
d3.print();
d3.print();
return0;
}
程序:
问题3.修改前面的程序,初始化一个错误的日期,如Dated1;d1.init(1900,13,45);
程序可以运行么?
怎么修改程序保证程序不会输出一个错误的日期
voiderror(){
if(y>24||y<0||m>60||m<0||d>60||d<0){
cout<<"Timeerror"<exit(0);
}
提示:
如果初始化出错了后面的就没必要运行下去了,可以用函数exit(0)结束程序
通过这个例子程序思考对象的安全性,如何保证对象是正常的,能不能把日期的年月日开放给使用者等
程序:
问题4:
(选作)使用下面公式增加求星期几的成员函数
计算星期可以用蔡勒(Zeller)公式(只适合于1582年10月15日之后的情形)
*w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
*公式中的符号含义如下:
*c:
世纪(年的高两位数);
*y:
年(年的低两位数);
*m:
月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2005年1月1日要看作2004年的13月1日来计算);
*d:
日;
*[]代表取整,即只要整数部分
可以考虑增加如下一个weekDay()函数
weekDay(){//下面的y,m,d分别代表年月日
y=y%100;
if(m==1){m=13;y=y-1;}
else
if(m==2){m=14;y=y-1;}
intweek=(26*(m+1)/10+y+y/4-2*y/100+y/400+d-1)%7;
//week是一个整数,1表示是星期一,2是星期二,……0则是星期天
……
}
算算今天星期几,看看公式是否准确
程序:
问题5.参照日期类,自己设计一个时间类,能初始化,可以输出,进行时间相减等操作
说明:
时间的表示可以自行拟定,一般是”时分秒”形式,可以增加毫秒,采用12或24小时制都可以。
设计好了后大家可以互相交换“使用”一下,看看谁设计的类最好用
//
2.3.2实验内容运算符重载
问题1:
以下有类Point,请添加适当成员函数以便Point对象可以进行运算
classPoint{
intx,y;
public:
voidinit(inta,intb){
x=a;y=b;
}
voiddisp(){
cout<}
} ;
intmain(){
Pointa,b,c ;
a.init(1,2) ;b.init(3,4)
c=a+b ;
c.disp() ;
}
#in