oop复习资料电子教案.docx
《oop复习资料电子教案.docx》由会员分享,可在线阅读,更多相关《oop复习资料电子教案.docx(27页珍藏版)》请在冰豆网上搜索。
![oop复习资料电子教案.docx](https://file1.bdocx.com/fileroot1/2023-2/3/9deebbbe-d782-4f56-8d78-f7f035c506c0/9deebbbe-d782-4f56-8d78-f7f035c506c01.gif)
oop复习资料电子教案
实验一,补充题:
1.设计一个Student(学生)类,并使Student类具有以下要求:
(bsy1_1.cpp)
(1)该类具有学生姓名、学号、程序设计、信息处理、数据结构三门课程的成绩;
(2)学生全部信息由键盘键入;
(3)通过成员函数统计学生平均成绩,当课程数量增加时,成员函数无须修改仍可求取平均成绩;
(4)输出学生的各科成绩与平均成绩;
(5)学生对象的定义采用对象数组实现;
(6)统计不及格学生人数;
(7)能以最方便的方式实现对课程数量和学生人数的修改。
#include
#include
usingnamespacestd;
constintN=3;
constintM=2;
classStudent
{
public:
Student();
~Student();
voiddisplay();
doubleget_avg();
boolno_pass();
protected:
charname[20];
charid[10];
doublecourse[N];
doubleavg_score;
};
Student:
:
Student()
{
cout<<"请输入学生姓名及学号:
"<cin>>name>>id;
for(inti=0;i{
cin>>course[i];
}
}
Student:
:
~Student()
{
cout<<"执行析构函数"<}
voidStudent:
:
display()
{
cout<cout<for(inti=0;i{
cout<}
cout<cout<}
doubleStudent:
:
get_avg()
{
avg_score=0;
for(inti=0;i{
avg_score+=course[i];
}
avg_score=avg_score/N;
returnavg_score;
}
boolStudent:
:
no_pass()
{
for(inti=0;i{
if(course[i]<60)
returntrue;
}
returnfalse;
}
voidmain()
{
inti,no_pass=0;
cout<<"输入学生信息,不同数据之间以空格分隔:
"<cout<<"姓名学号程序设计信号处理数据结构"<Students[M];
cout<cout<"<cout<<"姓名学号程序设计信号处理数据结构平均成绩"<for(i=0;i{
s[i].display();
if(s[i].no_pass()==true)
no_pass++;
}
cout<<"不及格人数为:
"<"<}
2.商店销售某一商品,商店每天公布统一的折扣(discount)。
同时允许销售人员在销售时灵活掌握售价(price),在此基础上,对一次购10件以上者,还可以享受9.8折优惠。
现已知当天3个销货员的销售情况为:
销货员号(num)销货件数(quantity)销货单价(price)
101523.5
1021224.56
10310021.5
请编程,计算出当日此商品的总销售款sum以及每件商品的平均售价。
要求用静态数据成员和静态成员函数。
(bsy1_2.cpp)
#include
usingnamespacestd;
classProduct
{
public:
Product(intm,intq,floatp):
num(m),quantity(q),price(p){};
voidtotal();
staticfloataverage();
staticvoiddisplay();
private:
intnum;//销售员号
intquantity;//销售件数
floatprice;//销货单价
staticfloatdiscount;//商店统一折扣
staticfloatsum;//总销售款
staticintn;//商品销售总件数
};
voidProduct:
:
total()
{
floatrate=1.0;
if(quantity>10)rate=0.98*rate;
sum+=quantity*price*rate*(1-discount);
n+=quantity;
}
voidProduct:
:
display()
{
cout<<"总销售款:
"<cout<<"销售平均价:
"<}
floatProduct:
:
average()
{
return(sum/n);
}
floatProduct:
:
discount=0.05f;
floatProduct:
:
sum=0;
intProduct:
:
n=0;
intmain()
{
ProductProd[3]={Product(101,5,23.5),Product(102,12,24.56),Product(103,100,21.5)};
for(inti=0;i<3;i++)
{
Prod[i].total();
}
Product:
:
display();
return0;
}
实验二补充题答案
1.声明Book与Ruler两个类,二者都有weight属性,定义二者的一个友元函数totalWeight(),计算二者的重量和。
(bsy2_1.cpp)
#include
usingnamespacestd;
classBook;
classRuler
{
public:
Ruler(){weight=0;}
Ruler(doublex)
{
weight=x;
}
frienddoubletotalWeight(Book&b,Ruler&r);
private:
doubleweight;
};
classBook
{
public:
Book(){weight=0;}
Book(doublex)
{
weight=x;
}
frienddoubletotalWeight(Book&a,Ruler&b);
private:
doubleweight;
};
doubletotalWeight(Book&a,Ruler&b)
{
returna.weight+b.weight;
}
voidmain()
{
Bookb1(3);
Rulerr1(5);
cout<<"totalWeightis:
"<}
1.请将实验二中补充部分的第4题见下,改用抽象类来实现雇员类。
要求用基类指针数组,使它的每一个元素指向一个派生类对象,求若干个雇员的月工资。
(实验二补充:
2.某公司财务部需要开发一个计算雇员工资的程序。
该公司有3类员工,工人的工资为每小时工资额乘当月工作时数再加上工龄工资;销售员工资为每小时工资额乘当月工作时数加上销售额加上工龄工资,其中,销售额提成等于该销售员当月售出商品金额的1%;管理人员工资为基本工资再加上工龄工资。
工龄工资就是雇员在该公司工作的工龄,每增加一年,月工资就增加35元。
请用面向对象方法分析、设计这个程序,并通过main函数测试所设计的类。
)
#include
#include
usingnamespacestd;
classEmployee
{
protected:
stringname;//姓名
intworking_years;//工龄
public:
Employee(){}
Employee(stringna,intwy){
name=na;
working_years=wy;
}
virtualfloatcomputepay()
{
return35*working_years;
}
virtualvoiddisplay()=0;
};
classWorker:
publicEmployee
{
private:
floathours,wage;//工作时数,每小时工资额
public:
Worker(stringna,intwy,floath1,floatw1):
Employee(na,wy)
{
hours=h1;wage=w1;
}
floatcomputepay()
{
returnEmployee:
:
computepay()+wage*hours;
}
voiddisplay()
{
cout<<"WorkerSalaryfor"<cout<}
};
classSalesperson:
virtualpublicWorker
{
private:
floatsales_made;//销售额
public:
Salesperson(stringna,intwy,floath1,floatw1,floatsm):
Worker(na,wy,h1,w1)
{
sales_made=sm;
}
floatcomputepay()
{
returnWorker:
:
computepay()+0.01*sales_made;
}
voiddisplay()
{
cout<<"SalespersonSalaryfor"<cout<}
};
classManager:
publicEmployee
{
private:
floatsalary;//基本工资
public:
Manager(stringnm,intwy,floatsl):
Employee(nm,wy)
{
salary=sl;
}
floatcomputepay()
{
returnEmployee:
:
computepay()+salary;
}
voiddisplay()
{
cout<<"ManagerSalaryfor"<cout<}
};
intmain()
{
Workerming("xiaoming",8,181.5,9.5);
Salespersonwang("wangfang",8,181.5,9.5,30000.0f);
Managerli("xiaoli",8,5000.0f);
Employee*p[3]={&ming,&wang,&li};
for(inti=0;i<3;i++)
{
p[i]->display();
}
return0;
}
2.定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)。
要求:
(1)在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。
在Saleman类中还包含数据成员销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员经理提成比例(totalDeductRate)和总销售额(totalAmount)。
在SaleManager类中不包含其他数据成员。
(2)各类人员的实发工资公式如下:
员工实发工资=基本工资+奖金×出勤率
销售员实发工资=基本工资+奖金×出勤率+个人销售额×销售员提成比例
经理实发工资=基本工资+奖金×出勤率+总销售额×经理提成比例
销售经理实发工资=基本工资+奖金×出勤率+个人销售额×销售员提成比例+总销售额×经理提成比例
(3)每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。
#include
#include
usingnamespacestd;
classStaff//基类
{protected:
intnum;//编号
stringname;//姓名
floatrateOfAttend;
floatbasicSal;
floatprize;
public:
Staff(){}
Staff(intn1,stringname1,floatrate,floatbase,floatprize1)
{
num=n1;name=name1;rateOfAttend=rate;basicSal=base;prize=prize1;
}
~Staff(){}
virtualfloatWage()
{
returnbasicSal+prize*rateOfAttend;
}
voidOutputWage()//计算实发工资
{
cout<<"实发工资:
"<}
voidOutput()//输出员工信息函数
{
cout<<"编号:
"<"<}
};
classSaleman:
virtualpublicStaff//派生类,销售员类
{protected:
floatdeductRate;//按销售额提成百分比
floatpersonAmount;//个人销售额
public:
Saleman(){}
Saleman(intn1,stringname1,floatrate,floatbase,floatprize1,floatdeduct1,floatperson1):
Staff(n1,name1,rate,base,prize1)
{
deductRate=deduct1;
personAmount=person1;
}
floatWage()
{
returnStaff:
:
Wage()+personAmount*deductRate;
}
};
classManager:
virtualpublicStaff//派生类,经理类
{protected:
floattotalDeductRate;
floattotalAmount;
public:
Manager(){}
Manager(intn1,stringname1,floatrate,floatbase,floatprize1,floattotaldeduct1,floattotal1):
Staff(n1,name1,rate,base,prize1)
{
totalDeductRate=totaldeduct1;
totalAmount=total1;
}
floatWage()
{
returnStaff:
:
Wage()+totalAmount*totalDeductRate;
}
};
classSalesmanager:
publicManager,publicSaleman//销售经理类
{public:
Salesmanager(){}
Salesmanager(intn1,stringname1,floatrate,floatbase,floatprize1,floatdeduct1,floatperson1,floattotaldeduct1,floattotal1)
:
Staff(n1,name1,rate,base,prize1),Manager(n1,name1,rate,base,prize1,totaldeduct1,total1),Saleman(n1,name1,rate,base,prize1,deduct1,person1)
{}
floatWage()
{
returnManager:
:
Wage()+Saleman:
:
Wage()-Staff:
:
Wage();
}
};
intmain()//主函数
{
Staffe1(1,"staff",1,500,500);
Managerm1(2,"manager",1,2000,2000,0.8,100000);
Salemans1(3,"saleman",1,1000,1000,0.5,10000);
Salesmanagersm1(4,"salesmanager",1,1000,1000,0.5,10000,0.8,100000);
cout<<"上述人员的基本信息为:
"<Staff*p[4]={&e1,&m1,&s1,&sm1};
for(inti=0;i<4;i++)
{
p[i]->Output();
p[i]->OutputWage();
}
return0;
}
3.下面是一个数组类Carray的定义,请实现print()成员函数打印数组,并重载=,+和-运算符使之能对该数组类对象进行赋值和加减运算。
请通过main函数验证它们。
classCArray
{
private:
int*p_arr;
intsize;
public:
CArray();
CArray(int*p_a,ints);
CArray(constCArray&r_other);
~CArray();
int&operator[](intpos);
CArrayoperator=(constCArray&r_other);
CArrayoperator+(constCArray&r_other);
CArrayoperator-(constCArray&r_other);
voidprint()const;
};
CArray:
:
CArray()
{
p_arr=0;
size=0;
}
CArray:
:
CArray(int*p_a,ints)
{
if(s>0)
{
size=s;
p_arr=newint[size];
for(inti=0;ip_arr[i]=p_a[i];
}
else
{
p_arr=0;
size=0;
}
}
CArray:
:
CArray(constCArray&r_other)
{
size=r_other.size;
if(size)
{
p_arr=newint[size];
for(inti=0;ip_arr[i]=r_other.p_arr[i];
}
}
CArray:
:
~CArray()
{
if(p_arr)
delete[]p_arr;
}
int&CArray:
:
operator[](intpos)
{
if(pos<0||pos>=size)
{cout<<"outofrange"<(1);}
returnp_arr[pos];
}
CArrayCArray:
:
operator+(constCArray&r_other)
{
int*tt;
tt=newint[size];
CArraytemp(tt,size);
for(inti=0;i{
temp.p_arr[i]=p_arr[i]+r_other.p_arr[i];
}
returntemp;
}
CArrayCArray:
:
operator-(constCArray&r_other)
{
int*tt;
tt=newint[size];
CArraytemp(tt,size);
for(inti=0;i{
temp.p_arr[i]=p_arr[i]-r_other.p_arr[i];
}
returntemp;
}
CArrayCArray:
:
operator=(constCArray&r_other)
{
int*tt;
tt=newint[size];
CArraytemp(tt,size);
if(this!
=&r_other)
{
delete[]p_arr;
p_arr=newint[r_other.size+1];
for(inti=0;ip_arr[i]=r_other.p_arr[i];
}
return*this;
}
voidCArray:
:
print()const
{
cout<<"数组的数据为:
"<for(inti=0;icout<}
intmain()
{
inta[5]={1,2,3,4,5};
CArraypa(a,5);
CArraypb(pa),pc(pa);
pc=pa+pb;
pc.print();
pc=pa-pb;
pc.print();
pc[1]=100;
pa=pc;
pa.print();
return0;
}
3.有两个矩阵a和b,均为2行3列。
求两个矩阵之和。
重载运算符“+”,使之能用于