2004年自考面向对象程序设计模拟试题(四) | |
---|---|
http://www.sina.com.cn 2004/10/21 14:25 华夏大地教育网 | |
四,完成程序题(本大题共5小题,每小题4分,共20分) 根据题目要求,完成程序填空。 26.仔细阅读下列求两个点之间距离的程序,根据程序的输出结果在划线处填入正确语句。 #include #include class point { float x,y; public: point(float a,float b) { x=a; y=b; } float distance(point &p) { float dx=_____①______; float dy=_____②______; return (float)srrt(da*da+dy*dy); } }; void main() { point p1(2,3),p2(32,43); cout<<_____③_____< } 输出结果:50 答:① p.x-x ② p.y-y ③ distance(p2) [解析]由于求两点之间距离的函数“distance”为成员函数,所以由该函数的this指针所指对象可用作起点(参数之一),另一个用作终点的参数,必须在函数的参数表中显式地给出。dx 和dy分别计算两个结点间x和y坐标间的距离,因此应该为:dx=p.x – x 和 dy =p.y – y。对它们求平方相加后开方即可,得到两点间的距离:(float)srrt(da*da+dy*dy)。在主程序中求p1和p2两个结点之间的距离,由于由p1调用距离函数,所以由p2作为它的参数,即distance(p2)。 27.完成如下的程序,使得输出为: base::10 base::12 derived::24 #include class base { int x; public: base(int a) { x=a; } _________①__________; }; class derived:public base { int y; public: derived(int a,int b):base(a) { y=b; } _________②_________; }; void main() { base b(10),*p; derived d(12,24); b.print(); p=&d; p->print(); } 答:① virtual void print() { cout<<”base::”< ② viod print() { base::print(); cout<<”derived::”< [解析]从主程序可见,“b.print();”是由基类的对象调用它的成员函数,要输出的是“base::10”,意味着基类中必须定义一个成员函数“print()”,该函数手它必须有输出语句“cout<<”base::”< 28.下面是一个菜单程序,请在空格处填上正确的语句,使之能正常地工作。 #include class Menu { public: virtual void fun()=0; }; class Menu1:public Menu { public: void fun() { cout<<”do something for Menu1 !\n”; } }; class Menu2:public Menu { public: void fun() { cout<<”do something for Menu2 !\n”; } }; class Menu3:public Menu { public: void fun() { cout<<”do something for Menu3 !\n”; } }; void main() { Menu *pm[3]; pm[0]= new Menu1; pm[1]=new Menu2; pm[2]=new Menu3; int num; do { cout<<”1—Menu1 \n”; cout<<”2—Menu2 \n”; cout<<”3—Menu3 \n”; cout<<”enter your choose !\n”; cin>>num; if(______①______) _______②_______fun(); } while(_____③_____); } 答:① num>=1&&num<=3 ② pm[num-1]. ③ num!=0 [解析]这个程序要完成的是菜单功能。在基类中定义了一个纯虚函数“fun()”,在下面的三个派生类中,各自分别对函数“fun()”进行了重新定义,以便完成各自的功能。因为只有三个菜单项,所以只在num取值范围在1和3之间时,才能执行所需功能,故在①处填入“num>=1&&num<=3”。当num取值范围在1和3之间时,分别执行菜单Menu1~Menu3的功能,也即执行派生类中相应函数“fun()”,为此要由指向各个派生类对象的基类指针来完成。由主程序可见,基类指针数组的各元素分别被赋给了各派生类的对象地址,考虑到C++数组的下标从0开始,②处填入“pm[num-1].”是正确的。为了使菜单循环工作,只有当输入0时才退出循环,③处应填入“num!=0”。 29.两个复数只有当它们的实部和虚部分别相等时,才被认为它们相等。在空格处填入合适的内容,以完成下面的程序,使其重载运算符“==”,用以比较两个复数的相等。请在主函数中输出比较的结果。 #include class complex { double real,imag; public: complex(double r,double i) { real=r; imag=i; } bool operator==(complex &); }; int complex:: operator==(complex &com) { return(_____①_____) } void main() { complex c1(12.3,32.5),c2(21.7,18.6); if(______②______) return cout<<”true\n”; else return cout<<”false\n”; } 答:① (real==com.real)&&(imag==com.imag) ② c1==c2或c1.operator==(c2) [解析]若两个复数的相等,则必有它们的实数部分和虚数部分都相等,所以运算符重载函数中返回“(real==com.real)&&(imag==com.imag)”,只有real==com.real与imag==com.imag都为真时,该函数的返回值才为真。在主程序中,为了比较两个复数c1和c2,可以隐式地写成“c1==c2”,也可显式写成“c1.operator==(c2)”。 30.下列程序中声明了两个类AA和BB,其中函数“print”是类AA的成员函数,但是类BB的友元函数。请在①、②和③处各填入正确的内容,使程序能正常运行。 #include _____①______; class AA { int t; public: AA(int x) { t=x; } void print(BB &b); }; class BB { int s; public: BB(int y) { s=y; } friend void ___②___print(BB &); }; void ____③_____ { cout<<”AA:”< void main() { AA m(6); BB n(8); m.print(n); } 输出结果为:AA:6;BB:8 答:① class BB; ② AA:: ③ AA::print(BB &w) [解析]由于AA类的成员函数“print”是类BB的友元函数,因此它必须有一个BB类的引用作为参数,以便有引用BB类数据成员的接口。但此时BB类还未定义,为解决此矛盾,在①处先对BB类作引用性声明“class BB;”,告诉系统BB类在后面定义。因为函数“print”是类AA的成员函数,在类外定义必须加上类名和作用域分辨符,即在②处加上“AA::”。在BB类外定义“print”时,因是友元,所以没有加上“BB::”的必要,但“AA::”还是必须加的,所以在③处填“AA::print(BB &w)”。 |