tceic.com
学霸学习网 这下你爽了
相关标签
当前位置:首页 >> 数学 >>

上海交通大学试卷(A卷) 2007-2008学年第二学期 程序设计(2) (参考答案 by ccz hust)


程序设计(2)


姓 名



上海交通大学 交 通 大

《C 程序设计》试卷

学 ACM试 试点班 卷(A 卷)
2007.1.13

( 2007 2008 学年 第_二_学期 学至号 成) 绩 学号______________ (2) 姓名 成绩

班级号__ 课程名称

程序设计

一. 选择填空(10 分)
1. C++对 C 语言作了很多改进,下列描述中 成了面向对象。 A 增加了一些新的运算符; B 允许函数重载,并允许设置缺省参数; C 规定函数说明必须用原型; D 引进了类和对象的概念; 2.在一个单链表中, 若 S 所指结点不是最后结点, 在 S 之后插入 T 所指结点, 则执行 A. T→next = S; S→next = T; C. T→next = S→next; S = T; 3.下面叙述正确的是 。 B. T→next = S→next; S→next = T; D. S→next = T; T→next = S; 。 _ 使得 C 语言发生了质变,从面向过程变

A.抽象基类中所有的virtual函数都必须声明为纯virtual函数 B.使用基类指针引用一个派生类的对象是非常危险的 C.如果基类申明了一个纯virtual函数,派生类只有实现该函数才能成为具体类。 D.一个类中有virtual函数,该类就成为抽象类。 4 . 已知类D是类B的公有派生类,并且 D *pd, d ; 是 。

B *pb; 不符合赋值兼容规则的

A. pb = pd; B. pd = pb; C. pb = &d; D. pd = &d; 5. 下面叙述正确的是 。

A. “has-a”关于可以通过继承实现。 B.派生类不会继承基类的构造函数。 C.汽车类Car与车轮类SteeringWheel以及刹车装置类Brakes之间是“is-a”关系。 D. 当销毁派生类对象时, 析构函数的调用顺序和相应的构造函数的调用顺序相同。

第 1 页 共 14 页

程序设计(2)

我承诺,我将严 格遵守考试纪律。 承诺人:

题号 得分 批阅人(流水阅 卷教师签名处)

6. C++支持两种多态,包括编译时多态和运行时多态,编译时多态和运行时多态分别通过 来实现。 A C 重载和虚函数 虚函数和重载 B 重载和重载 D 虚函数和虚函数

7. 关于纯虚函数和抽象类的描述中,错误的是 A B C D 抽象类只能作为基类使用,其纯虚函数的实现由派生类给出 纯虚函数是一个特殊的虚函数,它没有具体的实现 一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类。 抽象类是指具有纯虚函数的类

8. 对类的构造函数和析构函数描述正确的是 A 构造函数可以重载,析构函数不能重载 B 构造函数不能重载,析构函数可以重载 C 构造函数可以重载,析构函数也能重载 D 构造函数不能重载,析构函数也不能重载 9. 在下面四项中,不是用来限制类中成员的访问权限的是 A. private B. public C. protect 。 D. protected 。

10. 在类中说明的友元函数是

A. 可以访问该类对象的私有成员的成员函数 B. 冠以关键词 friend 说明的一般函数 C. 没有 this 指针的成员函数 D. 与静态成员函数具有相同的功能

第 2 页 共 14 页

程序设计(2)

二. 读程序,写结果(40 分)(运行一下就知道答案了)
1. (6 分)
class A { int x,y; public: A(int xx=0,int yy=0):x(xx),y(yy) { cout << "A..." << x << " " << y<<endl;} ~A() }; A* fun(int x, int y) { A *p = new A(x,y); return p; } int main() { A *p1; p1 = fun(123,789); A a1; a1.put(); delete p1; p1 = fun(333,999); cout << "程序结束: " << endl; return 0; } { cout << "~A..." << x << " " << y << endl; } void put() { cout << x << " " << y << endl; }

第 3 页 共 14 页

程序设计(2)

2。 (6 分)
class coord { friend coord operator++(coord &op); private: int x,y; public: coord(int i=0,int j=0); void print(); }; coord::coord(int i,int j) { x=i; y=j; } void coord::print() { cout << " x:" << x << ",y:" << y << endl; } coord operator++(coord &op) { ++op.x; ++op.y; return op; } int main() { coord ob(5,10); ob.print(); ++ob; ob.print(); operator++(ob); ob.print(); return 0; }

第 4 页 共 14 页

程序设计(2)

3. (6 分) class A { private: int a; public: A(int M) { a = M;} A() { a=0;} void seta(int x) { a = x; } void showA() { cout << "a=" << a << endl;} }; class B: public A { private: int b; public: void setB(int x, int y) { b = x; seta(y); } void showB(){ showA(); cout << "b=" << b << endl;} }; int main() { B obj; obj.seta(53); obj.showA(); obj.setB(53,58); obj.showB(); return 0; }

第 5 页 共 14 页

程序设计(2)

4.(6分) class C_A { public: C_A(char value) { data = value; m_count++; cout << "Object " << data <<" constructor" <<endl; cout << "The number of objects is " << m_count << endl; } ~C_A() { cout <<"Object " << data << " destructor" << endl; m_count--; } private: char data; static int m_count; }; void Func(); int C_A::m_count = 0; int main() { C_A *pa = new C_A('a'); Func(); delete pa; Func(); return 0; } void Func() { static C_A f('b'); C_A g('c'); }

第 6 页 共 14 页

程序设计(2)

5. (6分) class CAutoMobile{ public: CAutoMobile(const char *); virtual ~CAutoMobile() {delete [] m_Model;} char * getModel() const { return m_Model;} virtual double price() const = 0; virtual void display() const {cout << getModel() << "s’ price is undefined" << endl;} private: char *m_Model; }; CAutoMobile::CAutoMobile(const char *model) { } class CCar:public CAutoMobile { public: CCar(const char *model,double price = 0.0): CAutoMobile(model), m_Price(price) {}; virtual double price() const { return m_Price;} virtual void display() const { cout << "Car:" << CAutoMobile::getModel() << "'s price is " << price() << endl; } private: int m_Price; }; void func1(const CAutoMobile &a ) { } void func2(const CAutoMobile { } int main() { CCar m("Ferrari 430",300); cout<<"In main() "; cout << "In func2() "; a->display(); *a) cout << "In func1() "; a.display(); m_Model = new char[strlen(model) + 1]; strcpy(m_Model,model);

第 7 页 共 14 页

程序设计(2)

m.display(); func1(m); func2(&m); return 0; }

6. (4分) void func( int ) ; int main() { int i = 49; try{ while ( i > 0 ) { func(i); cout << i << endl; i = i / 2 - 1; } } catch( int ex) {cout << return 0; } void func(int num ) { if ( ! (num % 3) ) throw 3; else if ( !(num % 4) ) throw 5; } ex << endl; }

第 8 页 共 14 页

程序设计(2)

7. (6分) class CDoor { public: CDoor() { cout << "Door is up." << endl;} ~CDoor() { cout << "Door is down." << endl;} }; class CWall { public: CWall() { cout << "Wall is up." << endl;} ~CWall() { cout << "Wall is down." << endl;} }; class CRoom { public: CRoom():m_Door(),m_Wall() private: CWall m_Wall; CDoor m_Door; }; int main() { } CRoom room; return 0; { cout << "Room is up." << endl;} ~CRoom() { cout << "Room is down" << endl;}

第 9 页 共 14 页

程序设计(2)

三. 程序填空(30 分)
1. 完成下列 string 类的定义。请填空。 (6 分) class string{ char *str; public: string(char *s) {str = new char[strlen( strcpy(str,s) ~string() { delete []str ;} ;} s )+1];

string &operator=(string &s) {if ( this==&s delete []str ) return *this; ;

str = new char[strlen(s.str)+1]; strcpy(str, s.str); return *this ;} };

2. (4 分)请填空使得输出为:4+3I class complex { int real; // 实部 int imag; // 虚部 public: complex(int r=0, int i=0){ real=r ; imag=i void show() { cout<<real<<"+"<<imag<<"I";} complex operator++() { real++; return * this; } }; int main() { complex c(3,3); ++c ; c.show() ; }

;}

第 10 页 共 14 页

程序设计(2)

3. 下列程序通过把函数 Distance 定义为类 Point 的友元来实现计算两点之间距离 的功能,请完成程序(6 分) class Point { public: friend float Dis(Point &p,Point &q) ; Point( float a, float b ) { X = a;Y = b;} void Print() {cout << "X=" << X<< endl; cout << "Y=" << Y << endl;} private: float X, Y; }; float Dis(Point &p, Point &q) { float result; result=sqrt((q.X-p.X)*(q.X-p.X)+(q.Y-p.Y)*(q.Y-p.Y)) ; cout << result << endl; return result; } int main() { Point p(1,1), q(10,10); Dis(p,q); } 4. (8 分)在空中补上语句使得输出结果为 class data 5 class a class data 5 class b class c class data{ int x; public: data(int x){ data::x=x; cout<<"class data "<<x<<endl ; } };

第 11 页 共 14 页

程序设计(2)

class a{ data d1; public: a(int x):d1(x) { cout<<"class a"<<endl }; class b:public a{ data d2; public: b(int x):a(x),d2(x) { };

;}

cout<<"class b"<<endl

;}

class c:public b{ public: c(int x):b(x) { cout<<"class c"<<endl ;} }; int main() { c object(5); return 0; } 5. (6 分)补充函数 max 使得程序结果为 The max of i,j is: 56 The max of x1,x2 is: 56.56 The max of y1,y2 is: 673.365 template <typename T> T max ( T a, T b ) { return a>b ?a :b ;} int main() { int i = 10, j = 56; float x1 = 50.3, x2 = 56.56; double y1 = 673.365, y2 = 465.972; cout<<"the max of i,j is:"<<max(i,j)<<"\n"; cout<<"the max of x1,x2 is:"<<max(x1,x2)<<"\n"; cout<<"the max of y1,y2 is:"<<max(y1,y2)<<"\n"; return 0; }

第 12 页 共 14 页

程序设计(2)

四. 编程题(20 分)
1.编写一个出租车收费类,创建该类对象时告知路程,该对象能告知该收多少费。计费方 式是起价 11 元,其中含 3 公里费用,以后每半公里 1 元。 (10 分) 参考答案:
class calfee{ public: calfee(double DIS=3):dis(DIS){ fee=calfun(dis); cout<<"Total fee in "<<dis<<" miles is: "<<fee<<endl; } int calfun(double dis) const; private: int fee; double dis; }; int calfee::calfun(double dis) const { int sum=11; double start=3; if(dis>start) sum=(dis-start)/0.5+sum+1; return sum; }

第 13 页 共 14 页

程序设计(2)

2.设计一个小型公司的人员信息管理系统。该公司主要有四类人员:老板(Boss) 、销售人 员 (Salesman) 、 兼职技术人员 (technician) 。 人员基本信息包括: 姓名 (name) 、 编号(no)。 具体要求:(10分) (1)人员编号的起始值为8000,每增加一个人员信息,编号顺序加1。 (2)月薪计算方法:老板拿固定月薪10000元;销售人员月薪为底薪1000元加当月销 售额的5%提成;兼职技术人员按每小时100元领取月薪,如果月工作时间超过30 小时,超出部分按每小时150元计算。 (3)对每个成员变量必须完成相应的get和set函数。 (4)编写全局函数input完成输入一个人员信息的功能。 (5)编写全局函数display,显示所有员工的全部信息以及当月月薪总额。 (6)尽可能多地用到面向对象设计各种特性(虚函数、抽象类、const等) 。

第 14 页 共 14 页


推荐相关:
网站首页 | 网站地图
All rights reserved Powered by 学霸学习网 www.tceic.com
copyright ©right 2010-2021。
文档资料库内容来自网络,如有侵犯请联系客服。zhit325@126.com