面向对象A面向对象习题.docx
《面向对象A面向对象习题.docx》由会员分享,可在线阅读,更多相关《面向对象A面向对象习题.docx(22页珍藏版)》请在冰豆网上搜索。
面向对象A面向对象习题
第8章习题:
8-1、设计Date类,输出合法日期。
#includeusingnamespacestd;
//类定义//
classDate
{intyear;//存储日期的年份
intmonth;//存储日期的月份
intday;//存储日期的天数
public:
boolsetDate(constint,constint,constint);
voiddisplay(void);
char*getMonth(constint);
};
//类的实现//
//设置成员变量//
//mm:
月份,dd:
天数,yy:
年份//
〃返回值:
如果成功赋值则返回true,否则返回false。
//char*Date:
:
getMonth(constintm)
{if(m==1)
return"January";
elseif(m==2)return"February";
elseif(m==3)
return"March";
elseif(m==4)return"April";
elseif(m==5)return"May";
elseif(m==6)return"June";
elseif(m==7)return"July";
elseif(m==8)return"August";
elseif(m==9)
return"September";
elseif(m==10)return"October";
elseif(m==11)return"November";
else
return"December";
}
//设置成员变量//
〃参数:
mm:
月份,dd:
天数,yy:
年份//
〃返回值:
如果成功赋值则返回true,否则返回false//boolDate:
:
setDate(constintmm,constintdd,constintyy){if(mm<1||mm>12)returnfalse;
if(dd<1||dd>31)returnfalse;
year=yy;
month=mm;
day=dd;
returntrue;
}//在屏幕上显示日期//voidDate:
:
display(void)
{//按照"12-25-2004"的形式输出日期
cout<//按照"December25,2004"的形式输出日期cout<//按照"25December2004"的形式输出日期cout<}
voidmain(void)
{DatemyDate;//存储日期
while(true){intyear;//临时存储年份intmonth;//临时存储月份intday;//临时存储天数cout«"请按YYYY格式输入年:
";cin>>year;
cout«"请按mm格式输入月:
”;
cin>>month;
cout«"请按dd格式输入日:
";
cin>>day;if(myDate.setDate(month,day,year))break;
else
cout«"日期输入错误,请重新输入!
"<}
cout«"您输入的日期是:
\n";
myDate.display();
}
8-2、设计一个人口类Population,存储某年的人数、出生的人数和死亡人数,其函数成员能返回出生率和死亡率。
#include
usingnamespacestd;
//类定义//
classPopulation
{intpnum;//存储某年的人数
intbirthnum;//存储出生的人数
intdeadnum;//存储死亡的人数
public:
boolsetData(constint,constint,constint);
floatbirthrate(){returnbirthnum/float(pnum);}
floatdeadrate(){returndeadnum/float(pnum);}
intgetpnum(){returnpnum;}
intgetbirthnum(){returnbirthnum;}
intgetdeadnum(){returndeadnum;}
};
〃返回值:
如果成功赋值则返回true,否则返回false//
boolPopulation:
:
setData(constintp,constintb,constintd)
{if(b>p||b<0)returnfalse;
if(d>p||d<0)returnfalse;
pnum=p;
birthnum=b;
deadnum=d;
returntrue;
}
voidmain(void)
{Populationpeople;
intpn,bn,dn;
while(true)
{
cout<<"请输入总人数:
";cin>>pn;
cout<<"请输入出生的人数:
";cin>>bn;
cout<<"请输入死亡的人数:
";cin>>dn;
if(people.setData(pn,bn,dn))
break;
else
cout<<"输入错误,请重新输入!
"<}
coutvv"出生率是:
"vvpeople.birthrate()vcoutvv"死亡率是:
"vvpeople.deadrate()v}
8-3、设计一个类,具有一个float指针成员,且函数成员如下:
1)构造函数具有一个整型参数count,为指针成员分配count个元素空间;
2)析构函数释放该空间;
3)向指针指向的空间存储数据的函数;
4)返回空间中这些数的平均值的函数。
#include
#include
usingnamespacestd;
classDataArray
{intlength;//存储数组元素个数
float*fltData;//存储数据
public:
DataArray(int=1);//构造函数
~DataArray();//析构函数
boolsetData(constfloat,constint);//设置成员变量
floatgetAverage(void);//计算并返回平均值
};
//构造函数//
〃count:
希望创建的动态数组元素个数。
//
DataArray:
:
DataArray(intcount)
{cout«"调用构造函数…"<if(count>0)
{length=count;
fltData=newfloat[length];
}else
{length=1;
fltData=newfloat[length];
}
for(inti=0;ifltData[i]=0;
}
//析构函数//
DataArray:
:
~DataArray()
{cout«"调用析构函数…"<delete[]fltData;
length=0;
}
//设置成员变量//
//tData:
要赋给指定变量的值。
//
//subscript:
指定要赋值的变量数组元素为第几个。
//〃返回值:
如果成功赋值则返回true,否则返回false。
//boolDataArray:
:
setData(constfloattData,constintsubscript){if(subscript+1>length)
returnfalse;
else
fltData[subscript]=tData;
returntrue;
}
//计算并返回平均值//
//返回值:
返回数组所存储的数据的平均值。
//
floatDataArray:
:
getAverage(void)
{floatsum=0;
for(inti=0;isum+=fltData[i];
return(sum/length);
}
voidmain(void)
{//对DataArray类进行测试
cout<<"创建DataArray对象并初始化..."<DataArrayObj(3);
cout<<"给DataArray对象赋值:
"<for(inti=0;i<3;i++)
{//产生一个随机数
floattemp=(float)rand()/10;
Obj.setData(temp,i);
coutvv"第"vv(i+1)vv"个值为:
"vvtempvvendl;
}
coutvv"平均值为:
"v}
8-4、设计一个薪水类Payroll,数据成员包括单位小时工资、已经工作的小时数、本周应付工资数。
在主函数定义一个具有10个元素的对象数组(10个雇员),询问每个雇员本周已经工作的小时数,然后显示应得的工资。
输入有效性检验:
每周工作的小时数不能大于60,也不能为负数。
#includeviostream>
#includeviomanip>
usingnamespacestd;
//薪水类声明//
classPayroll
{floatpay_per_hour;〃存储每小时的工钱
floathours;//存储雇员工作时间
floattotal_pay;〃存储雇员应得工资
public:
Payroll(constfloat=0);//构造函数
boolsetHours(constfloat);/设置工作时间
floatgetPayment(void);//获取应得工资
};
//构造函数//
//hour:
雇员工作时间。
//
Payroll:
:
Payroll(constfloathour)
{pay_per_hour=5.0f;
hours=0;
total_pay=0;
}
//设置工作时间//
//hour:
雇员工作时间//
〃返回值:
如果变量赋值成功则返回true,否则返回false。
//
boolPayroll:
:
setHours(constfloathour)
{//判断工作时间是否介于0至60之间
if(hour>=0&&hour<=60)
{hours=hour;
total_pay=pay_per_hour*hours;
returntrue;
}else
returnfalse;
}
//获取应得工资//
//返回值:
返回计算得到的雇员应得的工资//
floatPayroll:
:
getPayment(void)
{returntotal_pay;
}
voidmain(void)
{Payrollemployee[10];〃雇员对象数组
//对10个雇员对象进行赋值
for(inti=0;i<10;i++)
{floattHour;
coutvv"请输入第"vvsetw
(2)vv(i+1)vv"个雇员本周已工作的时间(0至60之间):
";
while(true)
{cin>>tHour;
if(employee[i].setHours(tHour))
break;
else
cout<<"您输入的数据不正确,请重新输入!
"<}
//显示每个雇员应得的工资for(i=0;i<10;i++)
coutvv"第"vvsetw
(2)vv(i+1)vv"个雇员应得工资”<:
fixed)<(2)<}
8-5、设计InvoiceItem类和商品销售类,完成如下功能:
1)询问客户购买的商品名称和数量;
2)从InvoiceItem对象获得每个商品的成本价;
3)在成本价基础上加上30%利润,得到每个商品的单价;
4)将商品单价与购买数量相乘,得到商品小计;
5)将商品小计乘以6%,得到商品的零售税;
6)将商品小计加上零售税得到该商品的销售额;
7)显示客户本次交易购买商品的小计、零售税和销售额。
有效性检验:
商品数量不能为负数。
#include
usingnamespacestd;
classInvoiceItem
{char*desc;
intunits;
floatcost;
public:
InvoiceItem(char*d,intu=0,floatc=0)
{desc=newchar[strlen(d)+1];
strcpy(desc,d);
units=u;
cost=c;
}
~InvoiceItem(){delete[]desc;units=0;cost=0;}char*getDesc(){returndesc;}
intgetUnits(){returnunits;}
floatgetCost(){returncost;}};
classSale{
floatprice,salesum,saletax,totalsum;
intbuynum;public:
boolsetnum(int,int);
voidcalcSale(floatp)
{price=p;//单价
salesum=price*buynum;//商品小计
saletax=salesum*0.06;//零售税
totalsum=salesum+saletax;}//销售额floatgetprice(){returnprice;}intgetbuynum(){returnbuynum;}floatgetsalesum(){returnsalesum;}floatgetsaletax(){returnsaletax;}floatgettotalsum(){returntotalsum;}};
boolSale:
:
setnum(intn,intinvoicenum)
{
if(n>=0&&n<=invoicenum)
{buynum=n;
returntrue;
}else
returnfalse;
}voidmain(){
InvoiceItemInventory[3]={
InvoiceItem("ABC",10,0.5f),InvoiceItem("DEF",20,1.2f),InvoiceItem("GHI",30,2.5f),
};
Sales1;
inti,index=-1;
cout<<"库存商品列表:
\n";
for(i=0;i<3;i++){
cout<<"名称:
"<";
cout<";
cout<}//输出库存商品信息
coutvv"请输入购买的商品名称:
";
while(true)
{charname[51];
cin.getline(name,51);
for(i=0;i<3;i++)if(strcmp(Inventory[i].getDesc(),name)==0)index=i;
if(index!
=-1)break;
elsecoutvv"您输入的商品不存在,请重新输入!
"<}
coutvv"请输入购买数量:
";
while(true)
{intnum;
cin>>num;
if(s1.setnum(num,Inventory[index].getUnits()))break;
elsecoutvv"您输入的数量不正确,请重新输入!
"<}
//计算销售额
s1.calcSale(Inventory[index].getCost()*1.3);
//输出销售信息
"vvInventory[index].getDesc()vvendl;
"vvs1.getbuynum()vvendl;
"vvs1.getprice()vv"元"vvendl;
"vvs1.getsalesum()vv元"vvendl;
"vvs1.getsaletax()vv"元"vvendl;
"vvs1.gettotalsum()vv"元"vvendl;
coutvv"本次购买的商品名称coutvv"本次购买的商品数量coutvv"本次购买的商品单价coutvv"本次购买的商品小计coutvv"本次购买的零售税:
coutvv"本次购买的销售额:
}
第9章习题:
9-1、定义NumDays类,功能是将以小时(hour)为单位的工作时间转换为天数
(day)。
构造函数具有一个代表工作小时的参数,其他函数成员实现小时和天的存储和检索。
同时,该类需重载+、—、++、——运算符。
#include
usingnamespacestd;
//NumDays类声明//
classNumDays
{floathour;//以小时存储工作时间
floatday;//以天数存储工作时间
public:
NumDays(constfloat=0);//构造函数
voidsetHours(constfloat);//以小时为参数设置成员变量
voidsetDays(constfloat);//以天数为参数设置成员变量
floatgetHours(void);//返回按小时计的工作时间
floatgetDays(void);//返回按天数计的工作时间
floatoperator+(NumDays&);//重载+操作符
floatoperator-(NumDays&);//重载—操作符
NumDaysoperator++();//重载++前置操作符
NumDaysoperator++(int);〃重载++后置操作符
NumDaysoperator--();//重载——前置操作符
NumDaysoperator--(int);〃重载后置操作符
};
//构造函数//
//tHour:
工作时间(小时)//
NumDays:
:
NumDays(constfloattHour)
{hour=tHour;
day=tHour/8;
}
//以小时为参数设置成员变量//
//tHour:
工作时间(小时)。
//
voidNumDays:
:
setHours(constfloattHour)
{hour=tHour;
day=tHour/8;
}
//以天数为参数设置成员变量//
//tDay:
工作时间(天数)//
voidNumDays:
:
setDays(constfloattDay)
{hour=tDay*8;
day=tDay;
}
//返回按小时计的工作时间////返回值:
返回工作时间(小时)//floatNumDays:
:
getHours(void)
{returnhour;
}
//返回按天数计的工作时间////返回值:
返回工作时间(天数)//floatNumDays:
:
getDays(void)
{returnday;
}
//重载+操作符//
//返回值:
返回两者相加之和(小时)//floatNumDays:
:
operator+(NumDays&NumDaysObj){return(this->hour+NumDaysObj.hour);
}
//重载-操作符////返回值:
返回两者相减之差(小时)//floatNumDays:
:
operator-(NumDays&NumDaysObj){return(this->hour-NumDaysObj.hour);
}
//重载++前置操作符//
NumDaysNumDays:
:
operator++()
{hour++;
day=hour/8;
return*this;
}
//重载++后置操作符//
NumDaysNumDays:
:
operator++(int)
{NumDaystemp=*this;
hour++;
day=hour/8;
returntemp;
//重载--前置操作符//NumDaysNumDays:
:
operator--(){hour--;
day=hour/8;
return*this;}//重载--后置操作符//NumDaysNumDays:
:
operator--(int){NumDaystemp=*this;
hour--;day=hour/8;returntemp;
}
9-2、在9-1的基础上设计TimeOff类,用于计算雇员生病、休假和不支付报酬的时间。
该类包含下面NumDays类型成员。
maxSickDays:
用来记录雇员因生病可以不工作的最多天数;sickTaken:
记录因生病已经不工作的天数;maxVacation:
记录可以带薪休假的最多天数;vacTaken:
记录已经带薪休假的天数;maxUnpaid:
记录在不支付薪水的情况下,雇员可以休假的最多天数;unpaidTaken:
记录在不支付薪水的情况下,雇员已经休假的天数。
第10章习题:
10-7、定义抽象类BasicShape及其子类Circle和Rectangle,创建Circle和Rectangle类的对象,检验程序能否正确计算各形状的面积。
#include
usingnamespacestd;
#definePI3.1415926
//BasicShape类声明//classBasicShape
{public:
doublege