问答题 使用VC6打开考生:丈件夹下的源程序文件modi3.cpp。学校教务处要为任课老师开发一个学生管理系统,需求如下: (1)学生的信息是要受到严密保护和限制的,包括姓名、五个英文字符的学号,以及精确到小数点后一位的一科成绩,只有任课老师可以修改,如果学生升学了,比如由本科升到研究生,原来的信息还有效,而只需添加研究生的必要信息,不过现在不必马上实现,但应当有所考虑。 (2)学生的所有信息可以查看,但也只有学生自己才有这个权利。 (3)学生的信息可以从文件中读取来构造信息库,需要把信息输出到屏幕以便核实,但这需要任课老师来完成。 (4)老师能提供所教学生的完整信息列表,同时可按成绩高低排序。 (5)为了便于学校评定奖学金,需要单独查找成绩最高的同学(一般不采用把成绩单全部排列后来选取,可能这比较耗费时间,虽然要求不太合理,但要按用户的需求操作,同时需要指出的是,如果成绩最高者有数名,需要一一列出)。 (6)由于学校的机器比较老,内存严重不足,每个老师带的学生数不一样,但也不会超过50人。 以上功能的程序框架已经形成,考生需要按照需求来逐个实现。 (1)请在注释//********1********之后添加适当的语句,以便实现功能需求(1)。 (2)请在注释//********2********处添加适当的语句,成绩单排序功能。 (3)请在注释//********3********处实现奁找成绩最高学生名单。 无需修改main()主函数,当得到下面的结果,该系统可能被采用。 输入的学生信息: 姓名 学号 成绩 周华 0001 78.5 李强 0002 98 刘星 0003 89 贺兰 0004 78 周红 0005 76.5 赵邦 0006 85 高俊 0007 98 排序后的学生信息: 姓名 学号 成绩 李强 0002 98 高俊 0007 98 刘星 0003 89 赵邦 0006 85 周华 0001 78.5 贺兰 0004 78 周红 0005 76.5 查询成绩最高的学生信息: 高俊 0007 98 李强 0002 98 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。#include<fstream.h>#include<assert.h>#include<string.h>#define NMAX 50class Teacher;class Student{public: Student(char *name=“未知”,char *number=“00000”,doublemark=0.01 { int len=strien(name); m name:new char[len+1]; strcpy(m name,name); strcpy(m number,number); m mark=mark; } ~Student() { delete[]m name; ) void DisplayMsg() { cout<<m name<<"\t"<<mnumber<<"\t"<<m mark<<endl; }protected: char *m name; char m number[5]; double m mark; //********1********};Class Teacher{public: Teacher()(}; ~Teacher(){ for(int i=0;i<m count;i++) { delete m pStu[i]; m pStu[i]=NULL; } }; int BestScore(Student*pS[]); void InputScore(); void mi splay(); void SortScore();protected: Student *m_pStu[NMAX]; double m average; int m count;};void Teacher::InputScore(){ ifstream in("data.txt"); assert(in); char name[20]; char number[5]; double mark=0; m count=0; cout<<"姓名\t"<<"学号\t"<<"成绩\t"<<endl; for( int i=0; !in.eof();i++){ in>>name; in>>number; in>>mark; m_count++; m_pStu[i]=new Student(name,number,mark); cout<<narne<<"\t"<<number<<"\t"<<mark<<endl; }}void Teacher::SortScore(){. double sum=0; for(int i=0; i<m count;i++) f int index=i; for(int j=i+l ; j<m count;j++1 { if(m_pStu[j]->m_mark>m pStu[index]->m_mark) index=j; } //********2******** if() { Student*ps=m pStu[i]; m pStu[i]=m pStu[index]; m_pStu[index]=ps; } }}void Teacher::Display(){ cout<<"姓名\t"<<"学号\t"<<"成绩\t"<<endl; for(int j=0; j<m count;j++) { m_pStu[j]->DisplayMsg(); }}int Teacher::BestScore(Student*pS[]) { int index=0; int count=1; //********3******** for(int j=1;j<m_count;j++) { if(m pStu[j]_>m mark>m pStu[index]_>m mark) { count=1; index=j; pSpcount++]=m pStu[index]; } else if(m pStu[j]->m mark==m_pStu[index]->m_mark) { index=j; pS[count++]=m_pStu[index]; } } return count;}Void main(){ Teacher Teacher; Student *pStudent[NMAX]; cout<<"输入的学生信息:"<<endl; Teacher.InputScore(); Teacher.SortSCOre(); cout<<endl<<"排序后的学生信息:"<<endl; Teacher.Display(); cout<<endl<<"查询成绩最高的学生信息:"<<endl; int n=Teacher.BestScore(pStudent); while(n--) { pStudent[n]->DisplayMsg(); }}
【正确答案】正确答案:(1)添加语句:friend class Teacher; (2)将“if()”补充完整为: if(index!=j) (3)添加语句:ps[0]=m pStu[0];
【答案解析】解析:(1)学生的信息受到严密保护和限制,任课老师可以修改学生数据,比如本科升到研究需要修改学号等信息,因此老师类(Teacher)可以访问学生类(Student),故老师类是学生类友元类,故第1个标识下应添加“friend class Teacher;”。 (2)SortScore()成员函数是实现按成绩高低的排序,函数结构是二重循环,采用的是选择法排序,每次在内层循环中寻找成绩最高的元素的下标,如果找到的最高成绩的元素的下标和现在的位置(外层循环变量i+1的值)不同则两者交换,故第2个标识下的判断条件为“if(index!=j)”。 (3)BestScore(Student*pS[])实现查找成绩最高学生名单,即利用循环查找数组中的每个元素的成绩值,先假设第一个元素的成绩最高,然后再循环中逐个比较,如果有成绩更高的,那么将更高的成绩保存下来,搜索整个数组就能找到成绩最高的学生,即第3标识下应添加“ps[0]=m pStu[0];”。