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

书籍源码

开发平台:

Visual C++

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