试卷代号:1008 中央广播电视大学2000-2001学年度第二学期“开放教育(本科)”期末考试(开) 计科技专业面向对象程序设计试题 2001年7月 对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错” (20分,每个题目2分) 1.说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值 类型就可以了。 2.所有的表达式都有值。 3.程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所 带来的编译工作量 4.类的静态数据成员需要在定义每个类的对象时进行初始化。 5.基类中被说明为 protected和 private的成员只能被其派生类的成员函数访问,不能被其 它的函数访问 6.当将一个类S定义为另一个类A的友元类时,类S的所有成员函数都可以直接访问类 A的所有成员。 7.当函数的返回值是数组类型的,传递的是数组第一个元素的地址。 8.如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这 个函数自动继承基类中虚函数的特性。 9.字符串helo, world”在内存中存放时,占用11个字节的空间。 用new动态申请的内存空间,必须用 delete来释放 、简单编程题。根据程序要求,写出函数的完整定义。(共25分) 1.(本小题15分)写一个函数,找出给定字符串中数字字符(即0—9这10个数字)的 个数(如字符串” olympic2000中数字字符的个数为4个。函数的原型为 int CalcDigital(char*str 函数参数:str为所要处理的字符串 函数返回值:所给字符串中数字字符的个数 int Calc Digital(char *str) ∥在下面写出程序的实现 2.(本小题10分)用递归函数完成以下运算: sum(n)=12+22+…+n2 函数的原型如下: long sum(int n) 该函数完成12+22+…+m2的运算,并返回运算结果,其中n>0。 提示:你可以使用递归表达式:sum(n)=sum(n-1)+n ong sum(int n) (本小题30分) 下面的文件 queue. h是一个队列类模板 Queue的完整实现。在这个文件中首先定义了一个 队列元素类模板 Queueltem,然后在这个类的基础上定义了队列类模板 Queue。在 Queue中 使用链表存放队列的各个元素, front指针指向链表的第一个节点元素,back指针指向链表 的最后一个节点元素,成员函数adO将一个新节点元素加入到队列结尾, remove(从队列开
试卷代号:1008 中央广播电视大学 2000—2001 学年度第二学期“开放教育(本科)”期末考试(开) 计科技专业面向对象程序设计试题 2001 年 7 月 一、 对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错”。 (20 分,每个题目 2 分) 题号 1 2 3 4 5 6 7 8 9 10 对/错 1. 说明函数原型时不需要指明每个函数参数的名字,只需要说明每个参数的类型和返回值 类型就可以了。 2. 所有的表达式都有值。 3. 程序的编译是以文件为单位的,因此将程序分到多个文件中可以减少每次对程序修改所 带来的编译工作量。 4. 类的静态数据成员需要在定义每个类的对象时进行初始化。 5. 基类中被说明为 protected 和 private 的成员只能被其派生类的成员函数访问,不能被其 它的函数访问。 6. 当将一个类 S 定义为另一个类 A 的友元类时,类 S 的所有成员函数都可以直接访问类 A 的所有成员。 7. 当函数的返回值是数组类型的,传递的是数组第一个元素的地址。 8. 如果派生类的成员函数的原型与基类中被定义为虚函数的成员函数原型相同,那么,这 个函数自动继承基类中虚函数的特性。 9. 字符串’hello,world”在内存中存放时,占用 11 个字节的空间。 10. 用 new 动态申请的内存空间,必须用 delete 来释放 。 二、简单编程题。根据程序要求,写出函数的完整定义。(共 25 分) 1.(本小题 15 分)写一个函数,找出给定字符串中数字字符(即’0’—‘9’这 10 个数字)的 个数(如字符串”olympic2000”中数字字符的个数为 4 个。函数的原型为: int CalcDigital(char *str); 函数参数:str 为所要处理的字符串。 函数返回值:所给字符串中数字字符的个数。 int CalcDigital(char *str) { //在下面写出程序的实现 } 2.(本小题 10 分)用递归函数完成以下运算: sum(n)=12+22+…+n2 函数的原型如下: long sum(int n); 该函数完成 1 2+22+…+n2 的运算,并返回运算结果,其中 n>0。 提示:你可以使用递归表达式:sum(n)=sum(n-1)+n2 long sum(int n) { } 三、 (本小题 30 分) 下面的文件 queue.h 是一个队列类模板 Queue 的完整实现。在这个文件中首先定义了一个 队列元素类模板 QueueItem,然后在这个类的基础上定义了队列类模板 Queue。在 Queue 中 使用链表存放队列的各个元素,front 指针指向链表的第一个节点元素,back 指针指向链表 的最后一个节点元素,成员函数 add()将一个新节点元素加入到队列结尾,remove()从队列开
头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作 出相应解答。 1 template 3/*******定义模板类 Queueltem*幸*本**幸*事********* 4 template 5 class Queueltem 6{ 7 public Queueltem(const Type &elem): item(elem)1 QueueltemOd 10 1234 Queueltem*nextltem iend class Queue }; 5/本***幸*****幸***定义模板类 Queue'*幸**本***事****幸**** 16 template 17 class Queue public Queue(: front(NULL) (A) Queue 21 Type eo void add( const Type &) bool is emptyOconst return (B) 2 4567 priva Queueltem*back; 2 28∥模板类 Queue的函数成员 remove的实现 29∥从队列头取出一个节点,并返回该节点的值 30 template 31 Type Queue. remove) 32 Queueltem* fRont,∥指向头节点的临时指针 34 Type ret Val;∥返回值 36 ret Val=front->item front=front->nextltem delete pF return ret val 40 ∥模板类 Queue的函数成员ad0实 42 template. add(const Type& newltem) 456 { Queueltem"pNew=new Queueltem pNew->item=newlten (D ew 5555 back->nextItem=pNew
头删除一个节点元素。为方便起见,程序中加上了行号。阅读程序,根据程序后面的问题作 出相应解答。 1 template 2 class Queue; 3 /******************定义模板类 QueueItem*******************************/ 4 template 5 class QueueItem 6 { 7 public: 8 QueueItem(const Type &elem):item(elem){} 9 QueueItem(){} 10 private: 11 Type item; 12 QueueItem *nextItem; 13 friend class Queue; 14 }; 15 /***********************定义模板类 Queue*****************************/ 16 template 17 class Queue{ 18 public: 19 Queue():front(NULL),_______(A)_______{} 20 ~Queue(); 21 Type remove(); 22 void add(const Type &); 23 bool is_empty()const {return ____(B)____;} 24 private: 25 QueueItem *front; 26 QueueItem *back; 27 }; 28 //模板类 Queue 的函数成员 remove()的实现 29 //从队列头取出一个节点,并返回该节点的值 30 template 31 Type Queue::remove() 32 { 33 QueueItem *pFront; //指向头节点的临时指针 34 Type retVal; //返回值 35 ____(C)____; 36 retVal=front->item; 37 front=front->nextItem; 38 delete pFront; 39 return retVal; 40 } 41 //模板类 Queue 的函数成员 add()的实现 42 template 43 void Queue::add(const Type& newItem) 44 { 45 QueueItem *pNew=new QueueItem; 46 pNew->item=newItem; 47 ____(D)____; 48 if(front==NULL) 49 front=back=pNew; 50 else 51 { 52 back->nextItem=pNew; 53 ____(E)____; 54 }
57 template 58 Queue: Que 59{ 61 while(pl=NULL) q=p->nextItem 65 66 问题1:(每个填空3分,共15分)程序中有几处填空,将它们完成。 (B) (C) (D) (E) 问题2:(本小题3分)题中程序第1、2行为什么要说明一下类模板 Queue?如果没有这两 行语句,程序还正确吗? 答 问题3:(本小题4分)程序第22、23行各有一个 const,它们各自表示什么含义? 问题4:(本小题3分)程序中模板类 Queue的析构函数主要做了什么事情?为什么要这么 做 问题5:(本小题5分,每答对一个给1分)下面的程序使用了 queue.h文件中定义的类模板, 说明程序中哪些定义队列对象的语句是不正确的,哪些是正确的? # nclude“ queue. h” Queueq2 Queue q3(100) Queueq4[100] 14 Queueq5=new Queue: /5 delete q5 语句号 对/错 四 (本小题16分)阅读下面的程序,写出程序运行的结果 水*水 #include
55 } 56 57 template 58 Queue::~Queue() 59 { 60 QueueItem *p=front, *q; 61 while(p!=NULL) 62 { 63 q=p->nextItem; 64 delete p; 65 p=q; 66 } 67 } 问题 1:(每个填空 3 分,共 15 分)程序中有几处填空,将它们完成。 (A)______________________________________________ (B)______________________________________________ (C)______________________________________________ (D)______________________________________________ (E)______________________________________________ 问题 2:(本小题 3 分)题中程序第 1、2 行为什么要说明一下类模板 Queue?如果没有这两 行语句,程序还正确吗? 答: 问题 3:(本小题 4 分)程序第 22、23 行各有一个 const,它们各自表示什么含义? 答: 问题 4:(本小题 3 分)程序中模板类 Queue 的析构函数主要做了什么事情?为什么要这么 做? 答: 问题 5:(本小题 5 分,每答对一个给 1 分)下面的程序使用了 queue.h 文件中定义的类模板, 说明程序中哪些定义队列对象的语句是不正确的,哪些是正确的? #include “queue.h” void main() { Queue q1; //1 Queue q2; //2 Queue q3(100); //3 Queue q4[100]; //4 Queue q5=new Queue; //5 //… delete q5; } 答: 语句号 1 2 3 4 5 对/错 四、 (本小题 16 分)阅读下面的程序,写出程序运行的结果。 /*************************************************************/ #include
class At private: …其它成员 public virtual void func(int data)scoutfunc(1) A->func(haha”); eturn o 问题1:(本小题4分)在下面写出程序的运行结果 问题2:(本小题2分)如下句所示,在函数manO中通过pA调用类B中定义的参数表为 空的函数funO: pA->funco 是否正确? 答:(正确/不正确) 问题3:(本小题10分)如果要记录已尼创建的A类的实例(对象)的个数,我们可以借助 于类的静态成员。修改上面类A的定义,使得它包含一个私有的静态成员 object count,记 录属于该类的对象的个数,然后为类A增加必要的成员函数,使得下面的程序 A*pA=new A[3] cout GetObject Count)<<” objects”"< <endl delete pA cout<<"There are<<A: GetObject Count(<<"objects<<endl 得到的输出为: There are 3 objects There are 0 objects 在下面写出类A的定义(将所有的函数成员实现写在类定义体中): 在下面写出初始化类的静态成员 object count的语句: 五、(本题共9分)
class A{ private: //…其它成员 public: virtual void func(int data){coutfunc(1); pA->func(“haha”); return 0; } /*************************************************************************/ 问题 1:(本小题 4 分)在下面写出程序的运行结果: 问题 2:(本小题 2 分)如下句所示,在函数 main()中通过 pA 调用类 B 中定义的参数表为 空的函数 func() : pA->func(); 是否正确? 答:(正确/不正确) 问题 3:(本小题 10 分)如果要记录已尼创建的 A 类的实例(对象)的个数,我们可以借助 于类的静态成员。修改上面类 A 的定义,使得它包含一个私有的静态成员 object_count,记 录属于该类的对象的个数,然后为类 A 增加必要的成员函数,使得下面的程序: void main() { A *pA=new A[3]; coutGetObjectCount()<<” objects”<<endl; delete []pA; cout<<”There are ”<<A::GetObjectCount()<<” objects”<<endl; } 得到的输出为: There are 3 objects There are 0 objects 在下面写出类 A 的定义(将所有的函数成员实现写在类定义体中): 在下面写出初始化类的静态成员 object_count 的语句: 五、(本题共 9 分)
下面的程序定义了一个简单的 SmallInt类,用来表示从-128到127之间的整数。类的唯 的数据成员val存放一个-128到127(包含-128和127这两个数)之间的整数,为了方 类 Smallint还重载了一些运算符。阅读 SmallInt的定义,回答题目后面的问题 class SmallInt( Smallint(int i=o) 重载插入和抽取运算符 friend ostream &operator>(istream &is, SmallInt &si) ∥重载算术运算符 SmallInt operator+(const Smallint &sifreturn SmallInt( val+si. val); j SmallInt operator-(const SmallInt &sifreturn SmallInt(val-si. val); SmallInt operator*(const SmallInt &si)return SmallInt(val *si. val); 3 SmallInt operator/(const SmallInt &si)return SmallInt( val/si. val); ∥重载比较运算符 en: Cool operator=( const SmallInt &si)(return(val=si. val), Smallint SmallInt(int 1) while(i>127) i-=256 while(i>(istream &is, SmallInt &si) Int tmp, Is>>tmp, Si=SmallInt(tmp) return Is 问题1:(本小题4分)上面的类定义中,重载的插入运算符和抽取运算符被定义为类的友 元函数,能不能将这两个运算符定义为类的成员函数?如果能,写出函数原型,如果不能, 说明理由 问题2:(本小题5分)为类 SmallInt增加一个重载的运算符+=’,函数原型如下: class SmallInt( public SmallInt &operator +=(const SmallInt &si) ∥其它函数 private 该函数将返回对当前对象的引用。如:
下面的程序定义了一个简单的 SmallInt 类,用来表示从-128 到 127 之间的整数。类的唯一 的数据成员 val 存放一个-128 到 127(包含-128 和 127 这两个数)之间的整数,为了方便, 类 SmallInt 还重载了一些运算符。阅读 SmallInt 的定义,回答题目后面的问题。 class SmallInt{ public: SmallInt(int i=0); //重载插入和抽取运算符 friend ostream &operator>(istream &is, SmallInt &si); //重载算术运算符 SmallInt operator+(const SmallInt &si){return SmallInt(val+si.val);} SmallInt operator-(const SmallInt &si){return SmallInt(val-si.val);} SmallInt operator*(const SmallInt &si){return SmallInt(val*si.val);} SmallInt operator/(const SmallInt &si){return SmallInt(val/si.val);} //重载比较运算符 bool operator==(const SmallInt &si){return (val==si.val);} private: char val; }; SmallInt::SmallInt(int i) { while(i>127) i-=256; while(i>(istream &is,SmallInt &si) { int tmp; is>>tmp; si=SmallInt(tmp); return is; } 问题 1:(本小题 4 分)上面的类定义中,重载的插入运算符和抽取运算符被定义为类的友 元函数,能不能将这两个运算符定义为类的成员函数?如果能,写出函数原型,如果不能, 说明理由。 答: 问题 2:(本小题 5 分)为类 SmallInt 增加一个重载的运算符’+=’,函数原型如下: class SmallInt{ public: SmallInt &operator +=(const SmallInt &si); //其它函数…… private: char val; }; 该函数将返回对当前对象的引用。如:
Smallint sil(20), Si2(13) 则表达式: 将返回对象sil的引用,并且sil中的的值是 sil. val和s2.va的值之和(但必须正规化为在 128至127之间)。 在下面写出重载的运算符+=的实现: 试题答案 程序为 int CalcDigital(char *str) ∥判断字符指针是否为空 if(str=NULL return 0 ∥记录数字字符个数的变量 int num of digital=0 ∥依次检查各个字符,如果是数字,则总数加1 for(int i=0; str[1=0x0; 1++) if(str[1=0) num of digital++ ∥返回数字字符个数 eturn num of digital 2.程序为 long sum(int n)
SmallInt si1(20),si2(13); 则表达式: si1+=si2 将返回对象 si1 的引用,并且 si1 中的的值是 si1.val 和 si2.val 的值之和(但必须正规化为在 -128 至 127 之间)。 在下面写出重载的运算符+=的实现: 试题答案 一、 题号 1 2 3 4 5 6 7 8 9 10 对/错 对 错 对 错 错 对 错 对 错 对 二、 1. 程序为: int CalcDigital(char *str) { //判断字符指针是否为空 if(str==NULL) return 0; //记录数字字符个数的变量 int num_of_digital=0; //依次检查各个字符,如果是数字,则总数加 1 for(int i=0;str[i]!=0x0;i++) if(str[i]=’0’) num_of_digital++; //返回数字字符个数 return num_of_digital; } 2. 程序为: long sum(int n) {
if(n==1) return 1 return n*n+sum(n-1) 问题1:答案为: (A) back( NULL) (B) front==NULL EX back=NULL C) pFront-front E) PNew->nextltem=NULL back=pNew 问题2: 答:不正确。因为在类 Queueltem模板类的定义中用到了模板类 Queue,而此时 Queue还没 有定义,所以要先声明一下,告诉编译程序 Queue是一个模板类,它将在程序的其它地方 定义。如果没有这个说明,编译程序就不知道标识符 Queue代表什么样的含义了。 问题3: 答:第22行的 const修饰的是函数的参数,表示在这个函数体中不能改它所修饰的参数所 对应的实际参数的值。 第23行的cons修饰的是模板类 Queue的成员函数 is empty,它表示在函数 is empty 的函数体中不能改变任何数据成员的值 问题4: 答:析构函数中主要是释放链表中存放的各个节点的空间。因为 Queue对象在其生存期间 可能加入了很多节点,从堆中申请了一些内存空间,这些空间应该随着对象的消亡而释放掉, 所以需要在析构函数中来解放这些空间。 问题5: 语句号 对/错 四 问题1: 答:输出结果为: class b. 1 class a : haha 问题 答:不正确 问题3:类A的定义如下: private static object count ∥1.其它成员 bli AOf obj AOf object count-;i static int GetObject Countof return object count; j ∥其它函数 virtual void func(int data)i cout<<class A: "<<data<<endl; i void func(char *str)( cout<<class A: <<str<<endl; i object count的初始化语句如下
if(n==1) return 1; else return n*n+sum(n-1); } 三、 问题 1:答案为: (A) back(NULL) (B) front==NULL 或 back==NULL (C) pFront=front (D) pNew->nextItem=NULL (E) back=pNew 问题 2: 答:不正确。因为在类 QueueItem 模板类的定义中用到了模板类 Queue,而此时 Queue 还没 有定义,所以要先声明一下,告诉编译程序 Queue 是一个模板类,它将在程序的其它地方 定义。如果没有这个说明,编译程序就不知道标识符 Queue 代表什么样的含义了。 问题 3: 答:第 22 行的 const 修饰的是函数的参数,表示在这个函数体中不能改它所修饰的参数所 对应的实际参数的值。 第 23 行的 const 修饰的是模板类 Queue 的成员函数 is_empty(),它表示在函数 is_empty() 的函数体中不能改变任何数据成员的值。 问题 4: 答:析构函数中主要是释放链表中存放的各个节点的空间。因为 Queue 对象在其生存期间 可能加入了很多节点,从堆中申请了一些内存空间,这些空间应该随着对象的消亡而释放掉, 所以需要在析构函数中来解放这些空间。 问题 5: 语句号 1 2 3 4 5 对/错 错 对 错 对 对 四、 问题 1: 答:输出结果为: class B: 1 class A: haha 问题 2: 答:不正确。 问题 3:类 A 的定义如下: class A{ private: static object_count; //…其它成员 public: A(){ object_count++;} ~A(){ object_count—; } static int GetObjectCount(){ return object_count; } //其它函数 virtual void func(int data){cout<<”class A: “<<data<<endl; } void func(char *str){ cout<<”class A: “<<str<<endl; } }; object_count 的初始化语句如下: int A::object_count=0;
五 问题1 答:不能将插入运算符和抽取运算符定义为类的成员函数。 因为这两个运算符对第一个运算数有特殊的要求,即必须分别是 ostream和 Istream类的 对象,而不能是用户自己定义的其它类,而类的成员函数默认的第一个参数为指向该类对象 的指针类型,所以不符合插入和抽取运算符的要求。 问题 重载的运算符的实现如下 SmallInt &SmallInt: operator+=(const SmallInt &si) SmallInt tmp(val+si. val) val=tmp. val return *this 或 SmalliNt &smallInt: operator+=(const SmallInt &si) val+=si. val if(val>127) if(val<-128 val=256 eturn *this. 中央广播电视大学20002001学年度第一学期“开放教育(本科)”期末考试 (开)
五、 问题 1: 答:不能将插入运算符和抽取运算符定义为类的成员函数。 因为这两个运算符对第一个运算数有特殊的要求,即必须分别是 ostream 和 istream 类的 对象,而不能是用户自己定义的其它类,而类的成员函数默认的第一个参数为指向该类对象 的指针类型,所以不符合插入和抽取运算符的要求。 问题 2: 重载的运算符的实现如下: SmallInt &SmallInt::operator+=(const SmallInt &si) { SmallInt tmp(val+si.val); val=tmp.val; return *this; } 或 SmallInt &SmallInt::operator+=(const SmallInt &si) { val+=si.val; if(val>127) val-=256; if(val<-128 val=256; return *this; } 中央广播电视大学 2000-2001 学年度第一学期“开放教育(本科)”期末考试 (开)
计科技专业面向对象程序设计试题 2001年1月 对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错” (20分,每个题目2分) 题号「12「345678910 对/错 1、变量必须先定义或说明,后说明。 2、常量不能作为左值使用 3、头文件中一般存放着变量和常量的定义、函数的原型以及类的定义 4、类的友元函数可以直接访问该类的所有成员 5、派生类的成员函数可以直接访问基类的所有成员 6、一个类可以作为另一个类的友元类。 7、函数的参数和返回值类型可以是简单数据类型,也可以是指什、引用、数组和类 8、在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态 的特征 9、下面两个语句是等价的 har str[ ]=hello, world char str[11]="hello, world 10、用new动态申请的内存是在堆中分配的,而不是在栈中分配的。 、简单编程题。根据程序要求,写出函数的完整定义。(共40分) 1、(本每小题15分)写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为 Node AddNode(Node head, int newData 其中,链表节点的定义如下: struct Node f int data //存放数据
计科技专业面向对象程序设计试题 2001 年 1 月 一、对错题。判断以下说法的正确性,在下面表格中对应的编号下面写上“对”或“错”。 (20 分,每个题目 2 分) 题号 1 2 3 4 5 6 7 8 9 10 对/错 1、变量必须先定义或说明,后说明。 2、常量不能作为左值使用。 3、头文件中一般存放着变量和常量的定义、函数的原型以及类的定义。 4、类的友元函数可以直接访问该类的所有成员。 5、派生类的成员函数可以直接访问基类的所有成员。 6、一个类可以作为另一个类的友元类。 7、函数的参数和返回值类型可以是简单数据类型,也可以是指什、引用、数组和类。 8、在基类中被说明为虚函数的类的成员函数必须在每个派生类中说明为虚函数,才能具有多态 的特征。 9、下面两个语句是等价的: char str[ ]="hello,world"; char str[11]="hello,world"; 10、用 new 动态申请的内存是在堆中分配的,而不是在栈中分配的。 二、简单编程题。根据程序要求,写出函数的完整定义。(共 40 分) 1、(本每小题 15 分)写一个函数,完成在链表末尾增加一个节点的操作。函数的原型为: Node * AddNode(Node * head,int newData); 其中,链表节点的定义如下: struct Node{ int data: //存放数据
Node next //指向链表中的下一个节点 函数参数:函数的第一个参数head指向链表的第一个节点,如果链表为空,则head的值 为NULL。第二个参数 newData为要插入的新节点中存放的数据 函数返回值:当成功地插入新的节点进,函数返回指向新节点的指针,否则,如果不能申 请到内存空间,则返回NULL。 Node *k AddNode(Node * &head, int newData) //在下面写出函数的实现 2、(本每小题15分)写一个函数,找出给定字符串中具有最大 ASCII码的字符。如字符串 " world"中字符’w具有最大的 ASCII码。函数的原型为 char Max Character(char str) 函数参数:指向所要处理的字符串 函数返回值:如果不空,则返回具有最大 ASCII码的字符,否则返回空字符0x0或10 char MaxCharacter (char *k str)
Node * next: //指向链表中的下一个节点 }; 函数参数:函数的第一个参数 head 指向链表的第一个节点,如果链表为空,则 head 的值 为 NULL。第二个参数 newData 为要插入的新节点中存放的数据。 函数返回值:当成功地插入新的节点进,函数返回指向新节点的指针,否则,如果不能申 请到内存空间,则返回 NULL。 Node * AddNode(Node * &head,int newData) { //在下面写出函数的实现 2、(本每小题15分)写一个函数,找出给定字符串中具有最大 ASCII 码的字符。如字符串 "world"中字符'w'具有最大的 ASCII 码。函数的原型为: char MaxCharacter(char * str); 函数参数:指向所要处理的字符串; 函数返回值:如果不空,则返回具有最大 ASCII 码的字符,否则返回空字符 0x0 或'\0'。 char MaxCharacter (char * str) {