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

书籍源码

开发平台:

Visual C++

  1. //【例8.5】赋值兼容规则与自定义的拷贝构造函数。
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. enum Tsex{mid,man,woman};
  6. struct course{
  7. string coursename;
  8. int grade;
  9. };
  10. class Person{
  11. string IdPerson; //身份证号
  12. string Name; //姓名
  13. Tsex Sex; //性别
  14. int Birthday; //生日,格式1986年8月18日写作19860818
  15. string HomeAddress; //家庭地址
  16. public:
  17. Person(string,string,Tsex,int,string);
  18. Person();
  19. Person(Person &ps);
  20. ~Person();
  21. Person & operator=(Person &);
  22. void PrintPersonInfo();
  23. };
  24. Person::Person(string id,string name,Tsex sex,int birthday,string homeadd){
  25. IdPerson=id;
  26. Name=name;
  27. Sex=sex;
  28. Birthday=birthday;
  29. HomeAddress=homeadd;
  30. }
  31. Person::Person(){
  32. IdPerson="#";Name="#";Sex=mid;
  33. Birthday=0;HomeAddress="#";
  34. }
  35. Person::Person(Person &ps){
  36. IdPerson=ps.IdPerson;
  37. Name=ps.Name;
  38. Sex=ps.Sex;
  39. Birthday=ps.Birthday;
  40. HomeAddress=ps.HomeAddress;
  41. }
  42. Person::~Person(){}
  43. Person & Person::operator=(Person &ps){
  44. IdPerson=ps.IdPerson;
  45. Name=ps.Name;
  46. Sex=ps.Sex;
  47. Birthday=ps.Birthday;
  48. HomeAddress=ps.HomeAddress;
  49. return *this;
  50. }
  51. void Person::PrintPersonInfo(){
  52. int i;
  53. cout<<"身份证号:"<<IdPerson<<'n'<<"姓名:"<<Name<<'n'<<"性别:";
  54. if(Sex==man)cout<<"男"<<'n';
  55. else if(Sex==woman)cout<<"女"<<'n';
  56.      else cout<<" "<<'n';
  57. cout<<"出生年月日:";
  58. i=Birthday;
  59. cout<<i/10000<<"年";
  60. i=i%10000;
  61. cout<<i/100<<"月"<<i%100<<"日"<<'n'<<"家庭住址:"<<HomeAddress<<'n';
  62. }
  63. class Student:public Person{//定义派生的学生类
  64. string NoStudent;//学号
  65. course cs[30];//30门课程与成绩
  66. public:
  67. Student(string id,string name,Tsex sex,int birthday,string homeadd,string nostud);
  68. //注意派生类构造函数声明方式
  69. Student();
  70. Student(Student &Std);
  71. ~Student();
  72. Student & operator=(Student &Std);
  73. int SetCourse(string,int);
  74. int GetCourse(string);
  75. void PrintStudentInfo();
  76. }; //这里省略了一些成员函数,如赋学号、取学号等
  77. Student::Student(string id,string name,Tsex sex,int birthday,string homeadd,string nostud)
  78.              :Person(id,name,sex,birthday,homeadd){//注意Person参数表不用类型
  79. int i;
  80. NoStudent=nostud;
  81. for(i=0;i<30;i++){//课程与成绩清空,将来由键盘输入
  82. cs[i].coursename="#";
  83. cs[i].grade=0;
  84. }
  85. }
  86. Student::Student(){//基类缺省的无参数构造函数不必显式给出
  87. int i;
  88. NoStudent="#";
  89. for(i=0;i<30;i++){//课程与成绩清空,将来由键盘输入 
  90. cs[i].coursename="#";
  91. cs[i].grade=0;
  92. }
  93. }
  94. Student::Student(Student &Std):Person(Std){//按赋值兼容规则Std可为Person实参
  95. int i;
  96. NoStudent=Std.NoStudent;
  97. for(i=0;i<30;i++){
  98. cs[i].coursename=Std.cs[i].coursename;
  99. cs[i].grade=Std.cs[i].grade;
  100. }
  101. }
  102. Student::~Student(){}//基类析构函数不必显式给出
  103. Student & Student::operator=(Student &Std){
  104. int i;
  105. this->Person::operator=(Std);
  106. NoStudent=Std.NoStudent;
  107. for(i=0;i<30;i++){
  108. cs[i].coursename=Std.cs[i].coursename;
  109. cs[i].grade=Std.cs[i].grade;
  110. }
  111. return *this;
  112. }
  113. int Student::SetCourse(string coursename,int grade){
  114. bool b=false;//标识新输入的课程,还是更新成绩
  115. for(int i=0;i<30;i++){
  116. if(cs[i].coursename=="#"){
  117. //判表是否进入未使用部分(如有对应删除应按顺序表方式)
  118. cs[i].coursename=coursename;
  119. cs[i].grade=grade;
  120. b=false;
  121. break;
  122. }
  123. else if(cs[i].coursename==coursename){
  124. cs[i].grade=grade;
  125. b=true;
  126. break;
  127. }
  128. }
  129. if(i==30) return 0;//成绩表满返回0
  130. if(b) return 1;//修改成绩返回1
  131. else return 2;//登记成绩返回2
  132. }
  133. int Student::GetCourse(string coursename){
  134. for(int i=0;i<30;i++)
  135. if(cs[i].coursename=="#") break;//无此句,stcpy()会出错
  136. else if(cs[i].coursename==coursename) return cs[i].grade;
  137. return -1;
  138. }//找到返回成绩,未找到返回-1
  139. void Student::PrintStudentInfo(){
  140. int i;
  141. cout<<"学号:"<<NoStudent<<'n';
  142. PrintPersonInfo();
  143. for(i=0;i<30;i++)//打印各科成绩
  144. if(cs[i].coursename!="#")cout<<cs[i].coursename<<'t'<<cs[i].grade<<'n';
  145. else break;
  146. cout<<"--------完-------- "<<endl;
  147. }
  148. int main(void){
  149. string temp;
  150. int i,k;
  151. Person per1("320102820818161","沈俊",man,19820818,"南京四牌楼2号");
  152. per1.PrintPersonInfo();
  153. Person per2=per1,per3;                      //基类对象拷贝初始化
  154. per2.PrintPersonInfo();
  155. per3=per1;                                //基类对象深拷贝赋值
  156. per3.PrintPersonInfo();
  157. Student stu1("320102811226161","朱海鹏",man,19811226,"南京市黄浦路1号", 
  158. "06000123");
  159. cout<<"请输入各科成绩:"<<'n';              //完整应输入学号,查找,再操作
  160. while(1){                                  //输入各科成绩,输入"end"停止
  161. cin>>temp;                            //输入格式:物理  80
  162. if(temp=="end") break;
  163. cin>>k;
  164. i=stu1.SetCourse(temp,k);
  165. if(i==0)cout<<"成绩列表已满!"<<'n';
  166. else if(i==1)cout<<"修改成绩"<<'n';
  167.      else cout<<"登记成绩"<<'n';
  168.     }
  169. stu1.PrintStudentInfo();
  170. Student stu2=stu1,stu3;//派生类对象深拷贝初始化
  171. stu2.PrintStudentInfo();
  172. stu3=stu2;//派生类对象深拷贝赋值
  173. stu3.PrintStudentInfo();
  174. return 0;
  175. }