资源描述
华侨大学 面向对象程序设计(二) 试卷B
班 级 学 号
姓 名 成 绩
注意:请将所有答案写在答卷上!
一、填空题(15分,每小题1分)
1. 如果用户自定义的函数在调用点之后再定义,则在调用点之前,必须用(1)对被调函数进行说明。
2. 函数的递归调用可以有直接递归调用和(2)递归调用。
3. 静态全局变量的作用域是(3) 。
4. 若将某函数定义为静态型(static),则该函数只能被(4)所调用。
5. main(int argc,char *argv[]))函数中的参数argv用于(5) 。
6. (6)提供了一种在程序内和程序之间组织和使用名称的技术。
7. 用“const 类型标识符& 引用名=目标变量名;”声明引用,此处const的含义是(7) 。
8. C++语言中,(8)定义一个结构体类型,该结构类型中包含指向自身结构类型的指针成员。(填“可以”或“不可以”)
9. 若有类型定义“typedef char STRING[80]; STRING s;”,则s的类型为(9) 。
10. 类的对象可以直接访问类中的(10)成员。(private/protected/public)
11. 在定义类时,若没有为类提供析构函数,则编译系统会自动为该类创建一个默认的析构函数,其形式为(11) 。
12. 拷贝构造函数的功能是实现对象值的拷贝,通过将一个同类对象的值拷贝给一个新对象,来完成对新对象的初始化。定义一个拷贝构造函数的方式是(12) 。
13. 当希望一个类(如A)可以存取另一个类(如B)的私有成员时,可以将该类(A)声明为另一类(B)的友元类,友元类(A)的所有成员函数都可视为该类(B)的(13)函数。
14. 在静态成员函数的实现中不能直接引用类中说明的非静态成员,但可以引用类中说明的(14)成员。
15. C++支持两种不同类型的多态:一种是编译时的多态,另一种是(15)时的多态。
二、选择题(18分,每小题2分)
1. 进行文件操作时,需要包含(1)_文件。
A) iostream B) fstream C) stdio.h D) stdlib.h
2. 若有定义:enum Weekday { sun=7,mon=1,tue,wed,thu,fri,sat }day;,以下正确的语句是(2) 。
A) mon++; B)int k=mon+1; C) day=7; D)day++;
3. 若有定义:int (*p)(int,int); ,则错误的叙述是(3) 。
A) p是一个指向返回值类型为int,带有两个int型参数的函数的指针
B) 该类型的变量p可以作为另外一个函数的参数
C) 若已定义了函数int Sum(int x,int y),则p可以指向函数Sum。
D) p可以作自增运算p++
4. 若已有定义:struct Student{ char *name,int age,float mark;}s[8]; Student* p=s;,以下语句(组),正确的是(4) 。
A) cin>>s[0].name>>s[0].age>>s[0].mark;
B) cin>>p->age>>p->mark;p->name="Liuhua";
C) s[1].name=new char[10];strcpy(p->name, "Liuhua");
D) p->name=new char[10]; strcpy(p->name, "Liuhua");
5.若有定义:int a,b;,下面引用变量的声明中,(5)是正确的。
A) int& ra=a; int& &rra=ra; B) int& y=10;
C) int& z=int; D) int &x=a; int &y=b;
6. 对于下面定义的类Myclass,在函数f中可以将对象obj的成员data值修改为50的语句是(6)。
class Myclass{
public:
Myclass(int x){ data=x; }
void SetNum(int value){ data=value; }
private:
int data;
};
void f(void){
Myclass obj(45),*ptr=&obj;
(6)
}
A) obj.data=50; B)obj.Myclass(50); C)ptr->SetNum(50); D)ptr->data=50;
7.下面叙述正确的是(7) 。
A) 基类的protected成员不能被派生类的成员函数访问
B) 基类的public成员能被派生类的对象直接访问
C) 基类的protected成员在派生类中可能是privated的
D) 基类的private成员不能被基类的成员函数访问
8. 构造函数不具备的特征的是 (8) 。
A) 构造函数的函数名与类名相同 B)构造函数可以重载
C) 构造函数必须有返回值类型 D)构造函数可以设置默认参数
9. 下面叙述错误的是(9) 。
A) 基类指针可以指向派生类对象 B) 基类指针可以指向基类对象
C) 派生类指针可以指向派生类对象 D) 派生类指针可以指向基类对象
三、阅读程序题(45分)
1.阅读下面程序,给出程序的运行结果。(15分,每小题5分)
1)
#include<iostream>
using namespace std;
void Fun(int x,int *py,int& z){
x++; (*py)--; z*=2;
cout<<"x="<<x<<","<<"*py="<<*py<<","<<"z="<<z<<endl;
}
void main(void){
int a=1,b=2,c=3;
Fun(a,&b,c);
cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;
}
2)
#include<iostream>
using namespace std;
void P(int w){
if (w==0) return;
P(w-1);
cout<<w;
P(w-1);
}
void main(void){ P(3); }
3)
#include<iostream>
using namespace std;
void print(int,int,int (*p_fun)(int,int));
int add(int,int);
int substract(int,int);
void main(void){
int a=10,b=-20,Choice;
int(*p)(int,int);
cout<<"Enter your choice:";
cin>>Choice;
switch(Choice){
case 1: p=add; break;
default: p=substract;
}
print(a,b,p);
}
int add(int x,int y){ return x+y; }
int substract(int x,int y){ return x-y; }
void print(int i,int j,int (*p_fun)(int,int)){
cout<<"The result is "<<p_fun(i,j)<<endl;
}
程序运行时:
Enter your Choice:1
2.阅读下面程序,回答相关问题。(30分)
1)(7分)
#include <iostream>
using namespace std;
struct Student{
int num;
char name[20];
char sex;
int age;
};
void main(void){
Student* Fun(Student *,int);
Student stu[]={ {11,"lilin",'M',18},{3,"sunny",'M',24},
{2,"zhao",'M',20}, {4,"Liu yanhong",'F',30} };
int size=sizeof(stu)/sizeof(Student);
Student *p=Fun(stu,size);
cout<<p->num<<'\t'<<p->name<<'\t'<<p->age<<endl;
}
Student* Fun(Student *s, int n){ //问题a和b
int index=0,i;
for(i=1;i<n;i++)
if(s[i].num>s[index].num) index=i;
return s+index;
}
a) (3分)给出函数Fun()的功能;
b) (4分)若将函数Student* Fun(Student *s, int n)的返回值类型改为Student& ,要完成相同的功能,给出源程序中其它需要修改的语句并作相应的修改。
2)(6分)
#include<iostream>
using namespace std;
class Student{
char* name;
int age;
float score;
public:
Student(char* n,int a,float s):age(a),score(s){
cout<<"constructing..."<<n<<endl;
name=new char[strlen(n)+1];
strcpy(name,n);
}
~Student(){
cout<<"destructing..."<<name<<endl;;
delete[] name;
}
};
void main(void){
Student s("Liu",18,86.5);
Student *p_st1=new Student("Chen",18,86.5);
delete p_st1; //问题b)
}
a)(4分)给出程序的运行结果;
b)(2分)若去掉语句delete p_st1;,程序运行结果会不同吗?
3)(9分)
#include<iostream>
using namespace std;
class Point{
private:
char *name;
float X,Y;
public:
Point(char* s,float a,float b){
X=a;Y=b;
name=new char[strlen(s)+1];
strcpy(name,s);
cout<<"Initializing Point: "<<name
<<", X="<<X<<" ,Y="<<Y<<endl;
}
Point(Point &p);
float GetX(){ return X; }
float GetY(){ return Y; }
void Show(){ cout<<"name:"<<name<<", X="<<X<<",Y="<<Y<<endl; }
~Point(){
cout<<"deleting Point: "<<name<<", "<<X<<","<<Y<<endl;
delete []name;
}
};
class Line{
Point p1,p2;
public:
Line(char* p1name,float x1,float y1,char* p2name,float x2,
float y2):p1(p1name,x1,y1),p2(p2name,x2,y2){
cout<<"Line constructor."<<endl;
}
~Line(){
cout<<"Line destructor."<<endl;
}
};
Point::Point(Point &p){ //问题b
name=new char[strlen(p.name)+1];
strcpy(name,p.name);
X=p.X;
Y=p.Y;
cout<<"Coping Point: "<<p.name<<","<<X<<","<<Y<<endl;
}
void fun(Point p){ p.Show(); }
void main(void){
Point A("objA",12,24);
fun(A);
Line L1("p1",1,2,"p2",3,4);
}
a)(6分)给出程序的运行结果;
b)(3分)给出拷贝构造函数Point(Point &p)的功能。是否可以去掉该函数?
4)(8分)
#include<iostream>
using namespace std;
class Base{
public:
int Bvalue;
Base(int v){
Bvalue=v;
cout<<"Base constructor."<<endl;
}
int getBvalue(){ return Bvalue; }
};
class D1:public Base{
public:
int D1value;
D1(int v,int b):Base(v){
D1value=b;
cout<<"D1 constructor."<<endl;
}
int getD1value(){ return D1value; }
};
class D:public D1{
public :
int Dvalue;
int getDvalue(){ return Dvalue; }
D(int v1,int v2,int a):D1(v1,v2){
Dvalue=a;
cout<<"D constructor."<<endl;
}
};
void main(void){
D obj(1,2,3);
cout<<obj.getDvalue()<<endl;
cout<<obj.getBvalue()<<endl; //问题b)
cout<<obj.getD1value()<<endl;
}
a)(6分)给出程序的运行结果;
b)(2分)能否将表达式obj.getBvalue()改为obj.Bvalue?
四、编程题(22分)
1. 一个简单分数类的结构如下,请补充相应代码,使之完成程序功能。
#include<iostream.h>
int gcd(int m,int n){ //(1)完成求两个数的最大公因数(5分)
?
}
class FractionalNumber{ //分数类的定义
int numerator; //分子
int denominator; //分母
public:
FractionalNumber(int n=0,int d=1){ //完成构造函数的实现(5分)
?
}
~FractionalNumber(){
cout<<"Destructor is called."<<endl;
}
FractionalNumber(const FractionalNumber& x){//拷贝构造函数
numerator=x.numerator;
denominator=x.denominator;
Simplify();
cout<<"Copy constructor is called."<<endl;
}
void Simplify(void){ //对分数的分子和分母进行化简
int g=gcd(denominator,numerator);
numerator/=g;
denominator/=g;
}
void Output(){ cout<<numerator<<"/"<<denominator<<endl; } //分数的输出
void add(const FractionalNumber& x){ //分数的加法(5分)
?
}
friend FractionalNumber operator+(FractionalNumber& num1,
FractionalNumber& num2); //友元函数的声明
};//类定义结束
FractionalNumber operator+(FractionalNumber& num1,FractionalNumber& num2){
int nresult,dresult;
dresult=num1.denominator*num2.denominator;
nresult=num1.numerator*num2.denominator+
num1.denominator*num2.numerator;
return FractionalNumber(nresult,dresult);
}
void main(void){
//设计测试程序,创建类对象,使用output()、add()和运算符‘+’(7分)
?
}//end of main()
华侨大学 面向对象程序设计(二) 答卷
姓 名 学号 成绩
一、填空题(15分,每小题1分)
(1) (2) (3)
(4) (5) (6)
(7) (8) (9)
(10) (11) (12)
(13) (14) (15)
二、选择题(18分,每小题2分)
(1) (2) (3) (4) (5)
(6) (7) (8) (9)
三、阅读程序题(45分)
1.阅读下面程序,给出程序的运行结果。(15分,每小题5分)
1) 运行结果:
2)运行结果:
3)运行结果:
2.阅读下面程序,回答相关问题。(30分)
1)(7分)
a) (3分)函数Fun()的功能:
b) (4分)需要修改:
2)(6分)
a)(4分)运行结果:
b)(2分)
3)(9分)
a)(6分)运行结果:
b) (3分)
4)(8分)
1)(6分)运行结果:
2)
四、编程题(22分)
1. 一个简单分数类的结构如下,请补充相应代码,使之完成程序功能。
int gcd(int m,int n){ //(1)完成求两个数的最大公因数(5分)
}
FractionalNumber(int n=0,int d=1){ //完成构造函数的实现(5分)
}
void add(const FractionalNumber& x){ //分数的加法(5分)
}
void main(void){
//设计测试程序,创建类对象,使用output()、add()和运算符‘+’(7分)
}//end of main()
参考答案
一、填空题(15分,每小题1分)
(1)函数原型 (2)间接 (3)定义它所在的源程序文件 (4)定义该函数的源程序所在文件的其他函数 (5)指针数组中各元素分别指向命令行中的各个字符串(6)命名空间
(7)引用的目标变量是常量 (8)可以 9.字符数组 10.public 11.~类名{} 12.类名(const 类名& 对象名){…} 13.友元函数 14.静态 15.运行
二、选择题(18分,每小题2分)
(1)B (2)B (3)D (4)D (5)D (6)C (7)C (8)C (9)D
三、阅读程序题(45分)
1.阅读下面程序,给出程序的运行结果。(15分,每小题5分)
1)
2) 1 2 1 3 1 2 1
3)
2.阅读下面程序,回答相关问题。(30分)
1)(7分)
a)函数返回最大学号的学生指针;
b)需要修改的地方:
Student& Fun(Student *,int);//修改1
Student p=Fun(stu,size); //修改2
cout<<p.num<<'\t'<<p.name<<'\t'<<p.age<<endl;//修改3
return s[index];//修改4
2)(6分)
a)
b)去掉语句后,结果不同:
3)(9分)
a)
b)
拷贝构造函数Point(Point &p)实现点类对象的拷贝。不能去掉该函数。否则会因“浅拷贝”出现异常。
4)(8分)
a)
b) 可以。
四、编程题(22分)
1. 一个简单分数类的结构如下,请补充相应代码,使之完成程序功能。
int gcd(int m,int n){ //求最大公因数-------------------5分
if(m%n==0) return n;
return gcd(n,m%n);
}
FractionalNumber(int n=0,int d=1){ //完成构造函数的实现---5分
numerator=n;
denominator=d;
Simplify();
cout<<"Constructor is called."<<endl;
}
void add(const FractionalNumber& x){ //分数的加法------5分
int a=x.numerator,b=x.denominator;
int c=numerator,d=denominator;
numerator=c*b+a*d;
denominator=b*d;
Simplify();
}
void main(void){
//设计测试程序,创建类对象,使用output()、add()和运算符‘+’(7分)
FractionalNumber f1(10,50),f2(2,10),f3(20,5);
f1.Output(); f2.Output();f3.Output();
cout<<"-----------------"<<endl;
f1.add(f3);
f1.Output();
cout<<"---------------"<<endl;
f3=f2+f1;
f3.Output();
}
16
第 页
展开阅读全文