1、国家二级 C+机试(操作题)模拟试卷 33及答案与解析 一、基本操作题 1 使用 VC6打开考生文件夹下的源程序文件 modil cpp,该程序运行时有错,请改正其中的错误,使得程序正常运行,并使程序输出的结果为: init TestClass del TestClass 注意:不要改动 main函数,不能增行或删行,也不能更改程序的结构,错误的语句在 *error*的下面。 1 #include 2 class TeStClass 3 4 *error* 5 6 *error* 7 int TestClass()fcout 2 #define N 10 3 void sort(int AN,
2、 int n) 4 5 6 7 int main() 8 9 int AN=1, 2, 10, 5, 7, 19, 34, 78, -3, 8; 10 sort(A, 10); Ii for(int i=0; i 2 #include 3 class CBook 4 5 public: 6 int ID ; 7 char Author32; 8 public: 9 CBook(int ID_Number, char*Author_Name) 10 11 this-ID=ID_Number; 12 *1* 13 14 15 ; 16 class CBooks 17 18 private: 19
3、C1ass Node 20 21 public: 22 Node*next ; 23 CBook*book; 24 *m_pBook ; 25 public: 26 CBooks() 27 28 m_pBook=NULL; 29 30 CBooks() 31 32 *2* 33 while() 34 35 Node* p = m_pBook-next ; 36 delete m_pBook-book; 37 delete m_pBook; 38 m_pBook=p ; 39 40 41 int AddBookMenber(intnID, char*Author) 42 43 Node* p=m
4、_pBook; 44 Node* q=NULL; 45 *3* 46 while() 47 48 if ( nlD=p-book-ID) 49 50 return 0 ; 51 52 q=p ; 53 p=p-next; 54 55 if(p=NULL) 56 57 p=new Node ; 58 p-next=NULL; 59 p-book=new CBook(nID, Author); 60 61 if(q=NULL) 62 63 m_pBook=p ; 64 65 else 66 67 q-next=P ; 68 69 return 1; 70 71 Char*GetBookAuthor
5、(int nID) 72 73 Node* p=m_pBook ; 74 *4* 75 while() 76 77 if(P-book-ID=nID) 78 79 return P- book-Author; 80 81 p=p-next ; 82 83 return 0; 84 85 ; 86 int main() 87 88 CBooks booksl ; 89 books 1 AddBookMenber (1, “Tom“); 90 books1 AddBookMenbe r (3, “Lee“); 91 books 1 AddBookMenber (4, “Lily“); 92 boo
6、ks 1 AddBookMenber (5, “Harry“); 93 coutAj+1) 如果前面的数比后面的大则进行交换 7 8 int t=Aj;做交换 9 Aj =Aj+1; 10 Aj+1 =t ; 11 12 13 【试题解析】 选择法的思路是:将相邻两个数比较,将小的调到前头。这样下标从 0到 n-1的数与其后面相邻的数交换,可以把最大的数交换到数组的末端。进行n次下标从 0到 n-1的交换,则数组则会变成有序的,而且是由小到大的顺序。 解题思路 (1)数组 AN中有 n个数,进行 n-1趟比较,在每一趟比较中两两比较的次数逐渐减少,比如若有 6个数 9,8,5,4,2,0。第一
7、次将 8和 9对调,第二次将第 2和第 3个数 (9和 5)对调, ,如此共进行 5次,得到 8-5-4-2-0-9的顺序,可以看到:最大的数 9已 “沉底 ”,成为最下面一个数,而小的数 “上升 ”。最小的数 0已向上“浮起 ”一个位置。经第一趟 (共 5次 )后,已得到最大的数。然后进行第二趟比较,对余下的前面 5个数按上法进行比较,经过 4次比较,得到次大的数 8。如此进行下去。可以推知, 6个数要比较 5趟。在第一趟中要进行两两比较 5次,在第二趟中比 4次, 第 5趟比 1次。因此设置两层循环,外层循环变量 i从 0变化大到n-1,内层循环变量 j从 0到 n-j,在内层循环体内,比
8、较相邻两数,如果前面比后面的大则交换。 (2)在 内层循环体内,如果前面的元素比后面的元素大,则用一个临时变量记录前面的第 i个元素,然后将第 i+1个元素赋值给第 j个元素,临时变量值赋给第j+1个元素,如此完成两个元素的交换。 三、综合应用题 3 【正确答案】 (1)添加语句: strcpy(Author, Author Name); (2)将 “while()”补充完整为: while(m pBook!=NULL) (3)将 “while()”补充完整为: while(p!=NULL) (4)将 “while()”补充完整为: while(p !=NULL) 【试题解析】 程序当中定义了
9、 CBook类和 CBooks类, CBook类描述书的基本信息,包含 ID和 Author数组两个成员变量, CBooks类描述由 Node对象组成的链表,每个 Node对象包含指向 CBook对象的指针和下一个 Node对象的指针。第一个 Node对象的 next指针指向第二个 Node对象,同样第二个 Node对象的 next指针指向第三个 Node对象,如此形成一个链表结构。成员函数AddBookMenber(int nID, char*Author)实现向链表中添加一个 Node节 点,成员函数 GetBookAuthor(int nlD)返回某个 Node节点的 CBook对象的
10、ID为 nlD的CBook对象的 Author数组名。 解题思路 (1)第 1个标识下完成 CBook类的构造函数,对成员变量整 ID和作者 Author进行初始化,因此第 1个标识下应添加 “strcpy(Author,AuthorName); ”,利用 strcpy函数,将 Author_Name数组内容拷贝到 Author数组中。 (2) CBooksO为 CBooks类的析构函数,由于 CBooks类在运行过程中会动态申请 内存空间,因此在析构函数中必须将这些内存释放。 CBooks类是由 Node对象组成的链表,因此可利用循环逐个搜索这个链表,逐个释放内存空间,故第 2个标识下应改为
11、 while(m pBook!=NULL),在 while循环体不断的搜索下一个节点直到 m pBook为空为止,删除所以节点。 (3)AddBookMenber(int nlD, char*Author)函数在链表的最后添加一个新的节点,因此必须先找到最后一个节点,同样利用循环寻找最后一个节点,故第 3个标识下为 while(p!=NULL)。 (4)GetBookAuthor(int nlD)返回某个 Node节点的 CBook对象的 1D为 nlD的CBook对象的 Author数组名,同样需要利用循环来查找各个节点 CBook对象的ID是否为 nlD,故第 4个标识下应为 while(p!=NULL)。