C++练习题及解答.doc_第1页
C++练习题及解答.doc_第2页
C++练习题及解答.doc_第3页
C++练习题及解答.doc_第4页
C++练习题及解答.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C练习题及解答练习题(一) 一、编程题。根据程序要求,写出函数的完整定义。 1写一个函数,找出给定字符串中大写字母字符(即A-Z这26个字母)的个数(如字符串”China Computer Wrold”中大写字母字符的个数为3个)。函数的原型:int CalcCapital (char *str); 函数参数: str为所要处理的字符串;函数返回值:所给字符串中数字字符的个数2写一个函数,用递归函数完成以下运算:sum(n) = 1 1/2 + 1/3 1/4 + -(1/n)*(-1)n (其中n0) 函数原型:float sum(int n); 函数参数:n为正整数。 函数返回值:相应于给定的n,右边表达式运算结果。提示:你可以使用递归表达式:sum(n) = sum(n-1) -(1/n)*(-1)n 3. 给定新数值,在一个按节点所存放数值从大到小排序的链表中,找适当位置插一个新节点,仍保持有序的链表,写一个函数,完成此操作。 函数的原型:Node * InsNode(Node * head, int newValue); 其中,链表节点的定义如下: struct Nodee int Value; /存放数值 Node * next; /指向链表中的下一个节点 ; 函数参数:函数的第一个参数head指向链表头一节点的指针,如果链表为空,则head的值为NULL。第二个参数newValue为所给定的插入新节点的新数值。 函数返回值:当成功地插入新的节点时,函数返回指向新链表头一节点的指针,否则,若不能申请到内存空间,则返回NULL。 4写一个函数,找出给定数组中具有最小值的元素。 函数的原型: char MinCode(char charAry); 函数参数:charAry所要处理的字符数组名; 函数返回值:返回具有最小ASCII码的字符。 二、理解问答题: 下面的文件stack.h是一个堆栈类模板Stack的完整实现。在这个文件中,首先定义了一个堆栈元素类模板StackItem,然后,在这个类的基础上定义了堆栈类模板Stack。在Stack中使用链表存放堆栈的各个元素,top指针指向链表的第一个节点元素,bottom指针指向链表的最后一个节点元素,成员函数push()将一个新节点元素加入(压进)到堆栈顶部,pop()从堆栈顶部删除(弹出)一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作出相应解答。 1. /*-*/2. /* 文件stack.h */3. /*-*/4. template 5. class Stack;6. /* 定义模板类StackItem */7. template8. class StackItem9. 10. public:11. StackItem(const Type & elem):item(elem) 12. StackItem() 13. private:14. Type item;15. StackItem * nextItem;16. friend class Stack;17. ;18. /* 定义模板类Stack */19. template 20. class Stack21. 22. public:23. Stack():top( NULL), _(A)_ 24. Stack();25. Type pop();26. void push(const Type &);27. bool is_empty() const return _(B) _ ; 28. private:29. StackItem * top;30. StackItem * bottom;31. ;32. /模板类Stack的函数成员pop()的实现。33. /从堆栈顶弹出一个节点,并返回该节点的值34. template35. Type Stack:pop()36. 37. StackItem *ptop; /指向顶部节点的临时指针38. Type retVal; /返回值39. _(C) _;40. retVal = top-item;41. top = top-nextItem;42. delete ptop;43. return retVal;44. 45. /模板类Stack的函数成员push()的实现46. template47. void Stack:push(const Type & newItem)48. 49. StackItem *pNew = new StackItem( newItem);50. _(D)_;51. if (bottom = NULL) bottom = top = pNew;52. else _(E)_;53. 54. /模板类Stack的析构函数Stack()的实现55. template56. Stack:Stack()57. 58. StackItem *p = top, *q;59. while(p != NULL) 60. q = p-nextItem;61. delete p;62. p = q;63. 64. 问题1: 程序中有几处填空,将它们完成。 (A)_(B)_(C)_(D)_(E)_ 问题2:程序第4,5行有什么作用?如果没有这两行语句,程序还正确吗?问题3:程序中多处出现const,请分别说明它们各自表示什么含义。问题4:程序中模板类Stack的析构函数主要做了什么事情?为什么要这么做? 问题5:下面的程序使用了stack.h文件中定义的类模板,请说明下列程序中定义堆栈对象的语句(1-5)是否正确。 #include “stack.h”void main()Stack q1; /1Stack q2; /2Stack q3(10); /3Stack q410; /4Stack *q5 = new Stack; /5/.delete q5; 答:语句号12345对/错 练习题(一)参考答案一,编程题答案 1. 程序为: int CalcCapital (char *str) if (str = NULL) return 0; /判断字符指针是否为空 int num_of_Capital = 0; /记录大写字母字符个数的变量,初值为0 for(int i=0; stri != 0x0; i+) if (stri = Z) num_of_ Capital +; /若是大写字母,则总数加1 return num_of_ Capital; /返回大写字母字符数 2程序为: float sum(int n) if (n = 1) return 1; else return sum(n-1) -(1.0/n)*(-1)n; 3程序为: Node * insNode(Node * head, int newValue) Node * newNode = new Node; /申请新的节点空间 if (newNode = NULL)return NULL;/ newNode-data = newValue; /填充新节点的内容 newNode-next = NULL; Node *pre, *cur; Pre = head; if (head = NULL) head = newNode; /插入到空链表的表头 else if(newValue=head-Value) newNode-next=head; head = newNode; /插入到链表的表头 else /在链表寻找插入点 Node *cur,*pre = head; while(pre-next != NULL) cur = pre-next; if(newValue = cur-Value) break; else pre = cur; if(pre-next!= NULL) newNode-next = cur;/若非末尾,则有下一节点 pre-next = newNode; /将新节点插入 return head; 4程序可以有多种写法,下面是其中一种 char MinCode(char charAry,int len=10) char mixCode = 0x0; for(int i=0; i len; i+) if (charAry i nextItem = top;(E) top = pNew; 问题2,答:不正确。因为类StackItem模板类的定义中用到了模板类Stack, Stack还没有定义,所以,必须先声明Stack是一个模板类,否则,编译程序就不知道标识符Stack代表什么样的含义,无法进行编译。 问题3,答:第11、26和47行的const修饰的都是函数的参数,表示在这个函数体中不能改它所修饰的参数的值。第27行的const修饰的是模板类Stack的成员函数is_empty(),它表示在函数is_empty()的函数体中不能改变任何数据成员的值。 问题4,答:析构函数中主要是释放存放的各个节点所占涌空间。因为Stack对象在其生存期间可能加入了很多节点,从堆中申请了一些内存空间。这些空间应随着对象的消亡而释放掉,所以,需要在析构函数中释放这些空间。 问题5,答: 语句号12345对/错错对错错对 期末练习题(二) 一,理解问答题 请回答下面有模板的定义问题:1下列模板的定义是否合法的?若为非法的,请简单扼要说明理由。(1) template class Container1; template class Container1;(2) template class Container2;(3) template class Container3;(4) template class Container2;(5) template class Container5; 2关于类List的如下定义中有若干错误,请指出其所在行号并改正 (但不要求补充实现成员函数)。 1 template class ListItem; 2 3 template class List 4 5 public: 6 List(): front(NULL), end(NULL) 7 List (const List &); 8 List(); 9 void insert(ListItem *ptr, elemType value); 10 int remove(elemType value); 11 int size( ) return _size; 12 private: 13 ListItem *front; 14 ListItem *end; 15 ; 二、理解问答题 val_ary是一个类模板,类模板的每个实例类实现了某个具体的数据类型的数组,如val_ary是一个整型的数组类。可以通过 运算符来访问数组中的每个元素。还有一个模板函数inv(),其函数原型为: template val_ary inv(const val_ary & x); 该函数的作用是将作为参数的数组x的每个元素的符号取反,并返回得到的新的数组。如原来的数组为: 4 -13 -5 7 -1 将这个数组作为参数传递给函数inv后,函数返回的数组就变成: 4 13 5 -7 1 要求:阅读下列程序,回答后面的问题。 /*/ #include #include /该头文件中定义了模板类val_ary和模板函数inv() #define A_SIZE 10 typedef val_ary INTARY; void main() INTARY iarray(A_SIZE);/定义一长度为A_SIZE的数组对象 for (int i = 0; i A_SIZE; i+) iarrayi =i;/赋初始值 cout Size of iarray = iarray.size() endl; cout The values of iarray before calling inv():n; for (i = 0; i A_SIZE; i+) cout iarrayi ; cout endl; INTARY inv_array = inv(iarray); cout The result of iarray after calling inv():n; for (i = 0; i A_SIZE; i+) cout inv_arrayi ; cout endl; /*/ 问题1,写出程序的输出结果 问题2,关于程序中的语句:INTARY iarray(A_SIZE); 下列说法哪些是正确的,哪些是错误的?在下表相应的位置写上“对”或“错” 题号 A B C D E 对/错 (A) 该语句定义了一个对象irray,这个对象是类val_ary的实例 (B) 该语句说明了一个函数原型,函数的名字为iarray,参数为A_SIZE,函数的返回值类型为INTARY (C) 模板类val_ary一定有一个只带一个参数的构造函数 (D) 模板类val_ary一定有一个只带两个参数的构造函数 (E) A_SIZE将作为参数传递给val_ary的构造函数,初始化val_ary对象 问题3:下面是模板函数inv()的实现。这个实现中有错误,指出错误并写出正确的实现。 template val_ary inv(const val_ary& x) for(int i=0; ix.size(); i+)xi=-xi; return x; 问题4,从上面的程序中,你可以推断出,val_ary模板类中至少重载了哪个或哪些C+的运算符? 三,理解问答题阅读下面的程序,写出程序运行的结果,并给以简单扼要的说明。/*/ #include class Cla_Base private:/.其他成员 public:virtual void fun_Disply(long num) cout class Cla_Base: num endl; void fun_Disply (char * str) cout class Cla_Base: str endl ; void fun_Disply () cout Disply in class Cla_Base without parameter!n ; ; class Cla_Sub: public Cla_Base private:static int obj_n;/.其他成员public:Cla_Sub() obj_n +; Cla_Sub() obj_n -; static int GetObj_n() return obj_n; ;void fun_Disply (long num) cout class Cla_Sub: num endl ; void fun_Disply (char * str) cout class Cla_Sub: str endl ; void fun_Disply () cout fun_Disply (Hello!);pBase- fun_Disply (2000);pBase- fun_Disply ();pSub- fun_Disply (Hi!);pSub- fun_Disply (); coutThere are GetObj_n() objectsendl;delete pSub;coutThere are Cla_Sub:GetObj_n() objectendl; 练习题(二)参考答案一,理解问答题 请回答下面有模板的定义问题:1下列模板的定义是否合法的?若为非法的,请简单扼要说明理由。(1) 非法的,两次声明不一样(2) 合法的(3) 非法的,两个类型参数的名字不能相同(4) 非法的,参数U没有类型说明(5) 合法的2关于类List的如下定义中有若干错误,请指出其所在行号并改正 (但不求补充实现成员函数)。 1 template class ListItem; 2 3 template class List 4 5 public: 6 List (): front(NULL), end(NULL) /有错 7 List (const List &); /有错 8 List(); 9 void insert(ListItem *ptr, elemType value);/有错 10 int remove(elemType value); /有错 11 int size( ) return size; 12 private: 13 ListItem *front; /有错 14 ListItem *end; /有错,以上错均已改正 15 ; 二,理解问答题 问题1. 答:程序的输出结果为: Size of val_array = 10 The values of val_array before calling inv(): 0 1 2 3 4 5 6 7 8 9 The result of val_array after calling i

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论