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

书籍源码

开发平台:

Visual C++

  1. //【例8.1】由在册人员类公有派生学生类。
  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; //身份证号,18位数字
  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();
  20. void SetName(string);
  21. string GetName(){return Name;}
  22. void SetSex(Tsex sex){Sex=sex;}
  23. Tsex GetSex(){return Sex;}
  24. void SetId(string id){IdPerson=id;}
  25. string GetId(){return IdPerson;}
  26. void SetBirth(int birthday){Birthday=birthday;}
  27. int GetBirth(){return Birthday;}
  28. void SetHomeAdd(string );
  29. string GetHomeAdd(){return HomeAddress;}
  30. void PrintPersonInfo();
  31. };
  32. Person::Person(string id, string name,Tsex sex,int birthday, string homeadd){
  33. IdPerson=id;
  34. Name=name;
  35. Sex=sex;
  36. Birthday=birthday;
  37. HomeAddress=homeadd;
  38. }//作为一个管理程序,这个构造函数并无必要,因为数据总是另外输入的。仅为说明语法存在。
  39. Person::Person(){
  40. IdPerson="#";Name="#";Sex=mid;
  41. Birthday=0;HomeAddress="#";
  42. }
  43. Person::~Person(){}  //string内部动态数组的释放,由string自带的析构函数完成
  44. void Person::SetName(string name){
  45. Name=name;                    //拷入新姓名
  46. }
  47. void Person::SetHomeAdd(string homeadd){
  48. HomeAddress=homeadd;
  49. }
  50. void Person::PrintPersonInfo(){
  51. int i;
  52. cout<<"身份证号:"<<IdPerson<<'n'<<"姓名:"<<Name<<'n'<<"性别:";
  53. if(Sex==man)cout<<"男"<<'n';
  54. else if(Sex==woman)cout<<"女"<<'n';
  55.      else cout<<" "<<'n';
  56. cout<<"出生年月日:";
  57. i=Birthday;
  58. cout<<i/10000<<"年";
  59. i=i%10000;
  60. cout<<i/100<<"月"<<i%100<<"日"<<'n'<<"家庭住址:"<<HomeAddress<<'n';
  61. }
  62. class Student:public Person{                     //定义派生的学生类
  63. string NoStudent;                        //学号
  64. course cs[30];                             //30门课程与成绩
  65. public:
  66. Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud);
  67. //注意派生类构造函数声明方式
  68. Student();
  69. ~Student();
  70. int SetCourse(string,int);
  71. int GetCourse(string);
  72. void PrintStudentInfo();
  73. }; //这里省略了一些成员函数,如赋学号、取学号等
  74. Student::Student(string id, string name,Tsex sex,int birthday, string homeadd, string nostud)
  75.              :Person(id,name,sex,birthday,homeadd){    //注意Person参数表不用类型
  76. int i;
  77. NoStudent=nostud;
  78. for(i=0;i<30;i++){                            //课程与成绩清空,将来由键盘输入
  79. cs[i].coursename="#";
  80. cs[i].grade=0;
  81. }
  82. }
  83. Student::Student(){                     //基类缺省的无参数构造函数不必显式给出
  84. int i;
  85. NoStudent="#";
  86. for(i=0;i<30;i++){               //课程与成绩清空,将来由键盘输入 
  87. cs[i].coursename="#";
  88. cs[i].grade=0;
  89. }
  90. }
  91. Student::~Student(){}   //基类析构函数以及成员对象析构函数自动调用
  92. int Student::SetCourse(string coursename,int grade){
  93. int i;
  94. bool b=false;                        //标识新输入的课程,还是更新成绩
  95. for(i=0;i<30;i++){
  96. if(cs[i].coursename=="#"){
  97. //判表是否进入未使用部分(如有对应删除,应按顺序表方式)
  98. cs[i].coursename=coursename;
  99. cs[i].grade=grade;
  100. b=false;
  101. break;
  102. }
  103. else if(cs[i].coursename==coursename){
  104. //是否已有该课程记录
  105. cs[i].grade=grade;
  106. b=true;
  107. break;
  108. }
  109. }
  110. if(i==30) return 0;      //成绩表满返回0
  111. if(b) return 1;          //修改成绩返回1
  112. else return 2;          //登记成绩返回2
  113. }
  114. int Student::GetCourse(string coursename){
  115. for(int i=0;i<30;i++) if(cs[i].coursename==coursename) return cs[i].grade;
  116. return -1;
  117. }//找到返回成绩,未找到返回-1
  118. void Student::PrintStudentInfo(){
  119. int i;
  120. cout<<"学号:"<<NoStudent<<'n';
  121. PrintPersonInfo();
  122. for(i=0;i<30;i++)//打印各科成绩
  123. if(cs[i].coursename!="#")cout<<cs[i].coursename<<'t'<<cs[i].grade<<'n';
  124. else break;
  125. cout<<"--------完-------- "<<endl;
  126. }
  127. int main(void){
  128. char temp[30];
  129. int i,k;
  130. Person per1("320102820818161","沈俊",man,19820818,"南京四牌楼2号");
  131. Person per2;
  132. per2.SetName("朱明");
  133. per2.SetSex(woman);
  134. per2.SetBirth(19780528);
  135. per2.SetId("320102780528162");
  136. per2.SetHomeAdd("南京市成贤街9号");
  137. per1.PrintPersonInfo();
  138. per2.PrintPersonInfo();
  139. Student stu1("320102811226161","朱海鹏",man,19811226,"南京市黄浦路1号",
  140. "06000123");
  141. cout<<"请输入各科成绩:"<<'n';         //完整的程序应输入学号,查找,再操作
  142. while(1){                            //输入各科成绩,输入"end"停止
  143. cin>>temp;                       //输入格式:物理  80
  144. if(!strcmp(temp,"end")) break;
  145. cin>>k;
  146. i=stu1.SetCourse(temp,k);
  147. if(i==0)cout<<"成绩列表已满!"<<'n';
  148. else if(i==1)cout<<"修改成绩"<<'n';
  149.      else cout<<"登记成绩"<<'n';
  150.     }
  151. stu1.PrintStudentInfo();
  152. while(1){
  153. cout<<"查询成绩"<<'n'<<"请输入科目:"<<'n';
  154. cin>>temp;
  155. if(!strcmp(temp,"end")) break;
  156. k=stu1.GetCourse(temp);
  157. if(k==-1)cout<<"未查到"<<'n';
  158. else cout<<k<<'n';
  159. }
  160. return 0;
  161. }