Ex8_8.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例8.8】学校对在册人员进行奖励,依据是业绩分,但是业绩分的计算方法只能对具体人
  2. //员进行,如学生,教师,行政人员,工人,算法都不同,所以可以将在册人员类作为一个抽
  3. //象类,业绩计算方法作为一个纯虚函数。
  4. #include<iostream>
  5. #include<string>
  6. using namespace std;
  7. class Person{
  8. int MarkAchieve;
  9. string Name;
  10. public:
  11. Person(string name){
  12. Name=name;
  13. MarkAchieve=0;}
  14. void SetMark(int mark){MarkAchieve=mark;};
  15. virtual void CalMark()=0;//CalMark()为虚函数,Person为抽象类
  16. void Print(){cout<<Name<<"的业绩分为:"<<MarkAchieve<<endl;}
  17. };
  18. class Student:public Person{
  19. int credit,grade;//学分和成绩
  20. public:
  21. Student(string name,int cred,int grad):Person(name){
  22. credit=cred;
  23. grade=grad;
  24. }
  25. void CalMark(){SetMark(credit*grade);}
  26. };
  27. class Teacher:public Person{
  28. int classhour,studnum;//授课学时和学生人数
  29. public:
  30. Teacher(string name,int ch,int sn):Person(name){
  31. classhour=ch;
  32. studnum=sn;
  33. }
  34. void CalMark(){
  35. int K=(studnum+15)/30;//工作量系数,30人为一班,15人以下不开课
  36. switch(K){
  37. case 1: SetMark(classhour*studnum);break;
  38. case 2: SetMark(classhour*(30+(studnum-30)*8/10));break;
  39. case 3: SetMark(classhour*(30+24+(studnum-60)*6/10));break;
  40. case 4: SetMark(classhour*(30+24+18+(studnum-90)*4/10));break;
  41. case 5: SetMark(classhour*(30+24+18+12+(studnum-120)*2/10));break;
  42. default:SetMark(classhour*(30+24+18+12+6+(studnum-150)*1/10));break;
  43. }
  44. }
  45. };
  46. int main(){
  47. Person *pp;
  48. Student s1("张成",20,80);
  49. Teacher t1("范英明",64,125),t2("李凯",80,85);
  50. pp=&s1;
  51. pp->CalMark();
  52. pp->Print();
  53. pp=&t1;
  54. pp->CalMark();
  55. pp->Print();
  56. pp=&t2;
  57. pp->CalMark();
  58. pp->Print();
  59. return 0;
  60. }