1、国家二级 C+机试(操作题)模拟试卷 271及答案与解析 一、基本操作题 1 使用 VC6打开考生文件夹下的源程序文件 modi1 cpp,但该程序运行时有错,请改正程序中的错误,使程序输出的结果为: This is a greart! Hello Hello 注意:错误的语句在 *error*的下面,修改该语句即可。 #include lostream h class CMyClass public: void displayl() cout “This is great!“ endl; void display2() *error* char str5=“Hello“; cout str
2、endl; *error* void display3(char string) *error* cout string endl ; void main() CMyClass myclass; myclass display1(); myclass display2(); myclass display3(“Hello“); 二、简单应用题 2 使用 VC6打开考生文件夹下的源程序文件 modi2 cpp。阅读下列函数说明和代码,补充空出的代码。函数 convert(cha*des, char*str)实现的功能是: (1)如果字符串最后面有空格,则全部删除; (2)转换后的数据放到 des
3、,并且指针作为返回值返回。 注意:不能修改程序的其他部分,只能补充 convert()函数。 #include iostream h #include ctype h #define MAXLEN1024 char* convert(char*des, char*str) void main() char destMAXLEN; char*string=“abc def“; cout string “ -“ endl; cout convert(dest, string) “ -“ endl; return; 三、综合应用题 3 使用 VC6打开考生文件夹下的源程序文件 modi3 cpp。学
4、校教务处要为任课老师开发一个学生管理系统,需求如下: (1)学生 的信息是要受到严密保护和限制的,包括姓名、五个英文字符的学号,以及精确到小数点后一位的一科成绩,只有任课老师可以修改,如果学生升学了,比如由本科升到研究生,原来的信息还有效,而只需添加研究生的必要信息,不过现在不必马上实现,但应当有所考虑。 (2)学生的所有信息可以查看,但也只有学生自己才有这个权利。 (3)学生的信息可以从文件中读取来构造信息库,需要把信息输出到屏幕以便核实,但这需要任课老师来完成。 (4)老师能提供所教学生的完整信息列表,同时可按成绩高低排序。 (5)为了便于学校评定奖学金,需要单独查找 成绩最高的同学 (一
5、般不采用把成绩单全部排列后来选取,可能这比较耗费时间,虽然要求不太合理,但要按用户的需求操作,同时需要指出的是,如果成绩最高者有数名,需要一一列出 )。 (6)由于学校的机器比较老,内存严重不足,每个老师带的学生数不一样,但也不会超过 50人。 以上功能的程序框架已经形成,考生需要按照需求来逐个实现。 (1)请在注释 *1*之后添加适当的语句,以便实现功能需求 (1)。 (2)请在注释 *2*处添加适当的语句,成绩单排序功能。 (3)请 在注释 *3*处实现查找成绩最高学生名单。 无需修改 main()主函数,当得到下面的结果,该系统可能被采用。 输入的学生信息: 姓名 学号 成绩 周华 00
6、01 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 #de
7、fine NMAX50 class Teacher; class student public: Student(char*name=“未知 “, char*number=“00000“, doublemark=0 0) int len=strlen(name); m_name=new charlen+1; strcpy(m_name, name); strcpy(m_number, number), m_mark=mark; Student() deletem name; void DisplayMsg() cout m_name “ t“ mnumber “ t“ m_mark endl;
8、 protected: char *m_name; char m_number5; double m_mark; *1* ; class Teacher public: Teacher(); Teacher()( for(int i=0; i m_count; i+) delete m_pStui; m_pStui=NULL; ; int BestScore(Student*pS); void InputScore(); void Display(); void SortScore(); protected: Student *m_pStuNMAX; double m_average; int
9、 m_count; ; void Teacher: InputScore() ifstream in(“data txt“); assert(in); char name20; char number5; double mark=0j m_count=0; cout “姓名 t“ “学号 t“ “成绩 t“ endl; for(inti=0; !in eof(); i+) in name; in number; in mark; m_c6unt+; m_pStui=new Student(name, number, mark); cout name “ t“ number “ t“ mark
10、endl; void Teacher: SortScore() double sum=0; for(int i=0; i m-count; i+) int index=i; for(int j=i+1; j m_count; j+) if(m_pStuj- m_mark m_pStuindex- m_mark) index=j; *2* if() Student*ps=m_pStui; m_pStui=mpStu index; m_pStuindex=ps; void Teacher: Display() cout “姓名 t“ “学号 t“ “成绩 t“ endl; for(int j=0;
11、 j m_count; J+) m_pStuj- DisplayMsg(), int Teacher: BestScore(Student*pS) int index=0; int count=1; *3* for(int j=1; j m_count; j+) if(m_pStuj m_mark m_pStuindex- m_mark) count=1; index=j; pScount+=m_pStuindex; else if(m pStuj- m_mark=m_pStuindex- m_mark) index=j; pScount+ =m_pStuindex; return count
12、; void main() Teacher Teacher; Student*pStudentNMAX; cout “输入的学生信息: “ endl; Teacher InputScore(); Teacher SortScore(); cout endl( “排序后的学生信息: “ endl; Teacher Display(); cout endl “查询成绩最高的学生信息: “ endl; int n=Teacher BeStScore(pStudent); while(n-) pStudentn- DisplayMsg(); 国家二级 C+机试(操作题)模拟试卷 271答案与解析 一、
13、基本操作题 1 【正确答案】 (1)char str6=“Hello“;或 char str=“Hello“; (2)void display3(cha* string)或 void display3(char string) (3)cout String endl; 【试题解析】 (1)”Hello”字符串的长度为 5,存放在字符数组中的话,字符数组的长度至少为 6,因为字符数组的最后一个字符为 NULL,故第 1个标识下字符数组长度为 5太短,应改成 “char str6=“Hello“; ”或 “char str=“Hello“; ”。 (2)char string表示 string为一
14、个 char变量,代表一个字符而不是一串字符,程序要求输出一串字符显然字符变量做不到,应该为字符指针或字符数组,故第 2个标识下应改为 “void display3(char*string)”或 “void display3(char string)”。 (3)编译程序发现第 3标识下有错误,观察程序可知第 3个标识下语句结束没有分号,而 C+语句必须以分号结束,应加上分号,即第 3表示下应改为 “coutstring endl; ”。 二、简单应用题 2 【正确答案】 int length=0; int i; for(length=0; strlength!=NULL; length+);求
15、数组长度 length-;下标从 0 len-1,下标减 1表示最后一个字符的下标值 for(i=length; i =0; i-) if(stri!= )判断结尾是否有空格,从后往前判断直到不是不是空格了跳出循环 break; for(length=0; length =i; length+) deslength=strlength;从前面开始,逐个将 str中的字符拷贝到 des数组中,不含最后面的空格 deslength=NULL;最后一个字符为 NULL return des; 【试题解析】 (1)利用循环将字符串 str的长度求出,然后从字符串的尾部开始检索,用循环从字符串的最后一个
16、字符往前面逐个检查,如果该字符不是空格则退出循环,这个时候就找到了最后一个非空格字符所在的下标位置,然后从下标 0开始到该位置,逐个将 str里面字符拷贝到 des中。 (2)程序当中使用了 3次循环:计算长度、寻找最后一个非空格字符和拷贝三个过程。 三、综合应用题 3 【正确答案】 (1)添加语句: friend elass Teacher; (2)将 “if()”补充完整为: if(index!=j) (3)添加语句: pS0=m_pStu0; 【试题解析】 (1)学生的信息受到严密保护和限制,任课老师可以修改学生数据,比如本科升到研究需要修改学号等信息,因此老师类 (Teacher)可以
17、访问学生类 (Student),故老师类是学生类友元类,故第 1个标识下应添加 “friend class Teacher; ”。 (2)SortScore()成员函数是实现按成绩高低的排序,函数结构是 二重循环,采用的是选择法排序,每次在内层循环中寻找成绩最高的元素的下标,如果找到的最高成绩的元素的下标和现在的位置 (外层循环变量 i+1的值 )不同则两者交换,故第 2个标识下的判断条件为 “if(index!=j)”。 (3)BestScore(Student *pS)实现查找成绩最高学生名单,即利用循环查找数组中的每个元素的成绩值,先假设第一个元素的成绩最高,然后再循环中逐个比较,如果有成绩更高的,那么将更高的成绩保存下来,搜索整个数组就能找到成绩最高的学生,即第 3标识下应添加 “pS0=m_pStu0; ”。