您好,欢迎来到九壹网。
搜索
您的当前位置:首页程序设计实习2007试题

程序设计实习2007试题

来源:九壹网
装订线内 不要答题 北京大学信息学院考试试卷

考试科目:程序设计实习(A卷) 考试时间 2007年6月 姓名: 学号:

题 一 二 三 四 五 六 七 八 九 十 总分 号 分 数 阅 卷人 考 场 纪 律 1. 请持学生证入场考试,并按指定座位就座;除必要的文具和教师指定的 用具用书外,其他所有物品包括手机、呼机、MP3、电子词典、书籍、笔 记、纸张等严禁带入座位,必须放在指定位置。凡有试题印制问题请向监考教师提出,不得向其他考生询问。 2. 认真、诚实、并在规定时间内完成答卷,严禁任何形式的违纪作弊 行为;否则,本答卷成绩以0分记,并根据《北京大学本科考试工作与学术规范条例》给予纪律处分。3. 提前交卷的考生不要在考场逗留,不要在门口、窗外大声喧哗。考试结 束时间到,请停止答卷,在座位等候监考教师收卷并清点完毕,方可离 开考场;考题和试卷不得带出考场。

以下为答题纸,共 页

一、单项选择题(共20分,每题2分,正确答案只有一项)

1. 以下说法中正确的是:

A. 类的成员不能既是static成员、又是私有成员;

1

B. 函数F是类A的友员,B是A的一个对象,F中可以访问B的私有成

员;

C. 函数F是类A的成员,B是A的一个对象,F中不能访问B的私有成

员;

D. 类A是类B的派生类,函数F是类A的成员,F中可以访问B的私有

成员。 ( )

2. 以下关于类的说法中不正确的是: A. 类可以有多个构造函数; B. 类的构造函数没有返回值; C. 类可以有多个析构函数; D. 类的析构函数不允许带参数。 ( )

3. 以下关于多态的说法中,不正确的说法是:

A. 一个虚函数,在基类和派生类中名字必须相同,但参数可以不同; B. 具有多态行为的函数,在基类中要用virtual声明为虚函数; C. 函数的多态行为,是通过动态联编实现的;

D. 基类和派生类中的同名函数,只要它们的参数不同,就不能构成多态

关系。 ( )

4. 以下关于派生类的说法,不正确的是: A. 派生类拥有基类的全部成员;

B. 创建派生类的对象时,先要调用基类的构造函数;

C. 派生类中可以借助基类的public、protected函数,访问基类的private

成员;

D. 派生类的对象不能赋值给基类的变量。 ( )

5. 以下关于抽象类的说法,不正确的是::

A. 抽象类中,至少有一个成员函数被声明为纯虚函数; B. 不能用抽象类来创建对象;

C. 可以用抽象类的指针来访问派生类的对象; D. 抽象类可以作为函数的参数类型。 ( )

2

6. 关于对象,以下说法错误的是: A. 对象的成员属性也可以是对象; B. 假设B是类A的一个对象,则B的成员包括A中定义的全部属性和函

数;

C. 在创建类的对象时,不需要为其中的static属性分配存储空间; D. 在对象的const成员函数中,可以修改当前对象的const属性。 ( )

7. 以下说法中,错误的是:

E. 在类的友员中,允许访问该类对象的private成员; A. 通过对象名,总能访问其中的public成员;

B. 在对象的成员函数中,不允许访问同类其它对象的protected成员; C. 在派生类的成员函数中,可以访问基类的protected成员。 ( )

8. 运算符 “+” 既可以重载成类A的成员函数,也可以重载成类A的友员函数,下列说法错误的是:

A. 以成员函数方式重载时,成员函数只有一个参数; B. 以成员函数方式重载时,表达式中运算符 “+”的左边必须是A的对象; C. 以友员函数方式重载时,友员函数需要两个参数;

D. 以友员函数方式重载时,表达式中A的对象只可出现在运算符 “+”的

左边; ( )

9. 以下关于 STL 中 set 类模板的正确说法是: A. set中允许多个相同的元素存在

B. 对于set上的迭代器p,不能够执行 p++ 操作 C. set一般用平衡二叉树实现

D. 可以用 sort 算法对set 进行排序 ( )

10. 关于继承,以下说法错误的是: A. 类B和类C都是类A的派生类,则B和C的对象共享A的static成员; B. 使用基类的protected成员函数,在派生类中也可以访问到基类的

private成员;

C. 派生类自动拥有基类的全部成员,因此派生类中定义的成员不能与基

类的成员同名;

3

D. 在创建一个派生类的对象时,总是先执行基类的构造函数; ( )

二.以下程序编译、连接都能通过,请写出运行时输出的结果。你认为没有输出的,就写\"无输出\"(每题4分,共28分)。 程序1

#include class A { private: static int d; public: int b; A() { d++; }; A(A &a) { d++; }; ~A() {d--;}; int fun() { return d; }; };

int A::d = 0; void func(A b) { cout << \"in func: \" << b.fun() << endl; return; }

void main() { A a; cout << \"in main before function call: \" << a.fun() << endl; func(a);

cout << \"in main after function call: \" << a.fun() << endl; A* c; c = new A;

cout << \"in main after new operation: \" << a.fun() << endl; delete c; return; }

4

程序2

#include class A { public: void fun1() { cout<<\"A::fun1\"<class B:public A { public: void fun1() { cout<<\"B::fun1\"<void main() { A *ptrA, a; B b; A = b; a.fun1(); a.fun2(); ptrA = &b; ptrA->fun1(); ptrA->fun2(); return; }

5

程序3

#include class A { int x,y; public: A(int x_=0, int y_=0) { x = x_ % 10; y = x_ + y_; } int operator<(const A &a)

{ if ( x==a.x ) return( y < a.y ); return( x < a.x );}; friend ostream &operator<<(ostream &, const A &); };

ostream &operator<<(ostream &out, const A &a) { out<<'('<void main() { A a[5] = {A(5, 8), A(8, 3), A(15, 2), A(32, 50), A(7, 3)}, temp(5,0); int i; for (i=0; i<5; i++) if ( a[i] < temp ) cout<程序5

#include #include #include

6

class A { int x,y; public: A(int x_=0, int y_=0) { x = x_ % 10; y = x_ + y_; } int operator<(const A &a)

{ if ( x==a.x ) return( y < a.y ); return( x < a.x );}; friend ostream &operator<<(ostream &, const A &); };

ostream &operator<<(ostream &out, const A &a) { out<<'('<void main() { A a[5] = {A(5, 8), A(8, 3), A(15, 2), A(32, 50), A(7, 3)}; std::vector v(a, a+5); std::vector::iterator i; std::sort(v.begin(), v.end()); v.insert(v.begin()+3, A(27,8)); for ( i = v.begin(); i < v.end(); i++ ) cout<<*i<程序5

#include

#include using namespace std;

7

void main() { double a[5] = {3.5, 2.8, 3.5, 4.3, 2.2}; ostream_iterator output(cout,\"*\"); pair::iterator, bool> p; set s1(a, a+5); multiset s2(a, a+5); copy(s1.begin(), s1.end(), output); cout<程序6

#include class A { int x,y; public: A(int x_=0, int y_=0) { x = x_ % 10; y = x_ + y_; } A operator+(const A &a) { return( A(x*a.x+1, y+a.y) );}; friend ostream &operator<<(ostream &, const A &); };

ostream &operator<<(ostream &out, const A &a) { out<<'('<8

template class B { private: T ele[N]; int max, size; public: B() { max = N; size = 0 ;}; bool insert(T a) { if (size==max) return false; ele[size]=a; size++; return true;} T sum(); };

template T B::sum() { T x; for(int i=0; ivoid main() { B b; b.insert(A(50, 3)); b.insert(A(10, 85)); b.insert(A(30, 20)); cout<9

程序7

#include class A { int a; public: A( int a_ ) { a=a_; cout<<\"A:\"<class B{ A a; public: B( int a_ , int b_):a(a_+b_) {cout<<\"B:\"<class C : public B { int c; public : C(int a_, int b_, int c_ ):B(a_, b_)

{c=c_; cout<<\"C:\"<void main() { A * pa = new A(5); delete pa; C * pc = new C(6,7,8); delete pc; return; }

10

三、程序填空(38分):

已知以下程序的输出结果,请填出缺少的部分。您填写的内容里不能包含分号和逗号。假设您需要的头文件前面都已经有#include 语句包含进来了(即可以随意使用标准库中的类、模板等)

1) (6分)

大家都知道八皇后问题。而N皇后问题就是将N个皇后摆放在一个N行N列的棋盘上,要求任何两个皇后不能互相攻击。

下面的程序,运行时,输入一个正整数N,则程序输出N皇后问题的全部摆法。

输出结果里的每一行都代表一种摆法。一行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。 皇后的行、列编号都是从1开始算。

比如,如果输入4,则程序输出全部2种摆法: 2 4 1 3 3 1 4 2

上面输出结果的第一行,就代表如下符合要求的摆法: 第1行的皇后放在第2列 第2行的皇后放在第4列 第3行的皇后放在第1列 第4行的皇后放在第3列

#include #include int N;

int * pQueenPos; void NQueen( int n) { int i; if( n == N ) { for( i = 0; i < n;i ++ ) cout << pQueenPos[i] + 1 << \" \"; cout << endl; return ; }

11

for( i = 0;i < N;i ++ ) { for( int j = 0; j < n; j ++ ) { if( pQueenPos[j] == i || abs(pQueenPos[j] - i) == abs(n-j)) { break; } } if( j == n ) { _________________; _________________; } } }

main() { cout << \"Please input the queen number:\"; cin >> N; cout << \"The solutions are: \" << endl; pQueenPos = new int [N]; NQueen(0); delete []pQueenPos; }

2) (8分)

下面的程序用枚举法解决如下问题,请填空。

平面上的一个矩形,如果其边平行于坐标轴,我们就称其为“标准矩形”。给定不重复的 n 个整点(横、纵坐标都是整数的点),求从这n个点中任取4点作为顶点所构成的四边形中,有多少个是标准矩形。

输入数据:

第一行是点的数目

其后每一行都代表一个点,由两个整数表示,第一个是x坐标,第二个是y坐标

输出要求:

输出标准矩形的数目

12

输入样例: 6 2 3 2 5 4 5 4 4 2 4 4 3

输出样例: 3

#include #include #include using namespace std; struct Point { int x; int y; Point( int x_,int y_):x(x_),y(y_) { } };

bool operator < ( const Point & p1, const Point & p2) { if( p1.y < p2.y ) return true; else if( p1.y == p2.y ) return p1.x < p2.x; else return false; }

main() { int t; int x,y; cin >> t; vector v; while( t -- ) { cin >> x >> y;

13

}

3) (6分)

下面的程序输出结果是: (4,5) (7,8)

请填空

#include class Point { private: int x; int y; public: Point(int x_,int y_ ):x(x_),y(y_) { }; __________________________________________________; };

____________ operator << ( ________________, const Point & p) { ___________________________________; return _________________; }

v.push_back(Point(x,y)); }

_____________________; vector::iterator i,j; int nTotalNum = 0;

for( i = v.begin(); i < v.end() - 1;i ++ ) for(___________; ______________; _____________) { if(binary_search( v.begin(),v.end(),Point( j->x, i->y)) &&

___________________________________________ && ____________________________________________ && ______________________________________________ )

nTotalNum ++; }

cout << _________________;

14

main() { cout << Point(4,5) << Point(7,8);

}

4) (4分)

下面的程序输出结果是:1 2 6 7 8 9 请填空

main() { int a[] = {8,7,8,9,6,2,1}; ___________________; for( int i = 0;i < 7;i ++ ) ___________________; ostream_iterator o(cout,\" \"); copy( v.begin(),v.end(),o); }

5) (3分)

下面的程序输出结果是: A::Fun A::Do A::Fun C::Do

请填空

#include class A { private: int nVal; public: void Fun()

{ cout << \"A::Fun\" << endl; }; virtual void Do() { cout << \"A::Do\" << endl; } };

15

class B:public A { public: virtual void Do() { cout << \"B::Do\" << endl;} };

class C:public B { public: void Do( )

{ cout <<\"C::Do\"<{ cout << \"C::Fun\" << endl; } };

void Call(____________) { p->Fun(); p->Do(); }

main() { Call( new A()); Call( new C()); }

6) (6分)

下面的程序输出是:TomHanks

请填空。注意,不允许使用任何常量。 #include #include using namespace std; template class myclass { _________; int nSize; public: myclass ( ______________, int n) { p = new T[n]; for( int i = 0;i < n;i ++ ) p[i] = a[i]; nSize = n; }

16

~myclass( ) { delete [] p; } void Show() { for( int i = 0;i < nSize;i ++ ) { cout << p[i]; } } };

void main() { char * szName = \"TomHanks\"; myclass obj(_________________________); obj.Show(); }

7) ( 4 分)

下面程序的输出结果是: 5*3*4*2*1* 1*2*3*4*5* 1*2*9*4*5*

请填空

using namespace std; template

class MyClass:public list {

public: ____________________ (int n) { iterator i; int k = 0; for( ____________________________) { if( k == n) return _______________; k ++;

17

} } MyClass(int n):___________________ { } }; main() { MyClass obj(5); int a[] = { 5, 3, 4, 2,1 }; copy( a, a + 5, obj.begin()); ostream_iterator output(cout,\"*\"); copy( obj.begin(),obj.end(),output); cout << endl; obj.sort(); copy( obj.begin(),obj.end(),output); cout << endl; obj[2] = 9; copy( obj.begin(),obj.end(),output);}

四、编程题(14分)

1.(6分)下面的程序输出结果是: 5,5 4,4 8,4

请补足class B中缺失的部分。要求补足的部分都必须都是class B的成员,而且class B最多只能有一个构造函数

#include using namespace std; class A { public: int i; A(int n):i(n) { }; };

class B :public A{

18

public: int nVal; ………………….. }; main() { B b1,b2(4); cout << b1.nVal<< \cout << b2.nVal<< \ b1 = b2; cout << b1.nVal<< \}

<< endl;

<< endl; << endl; 19

2. ( 8分)

写一个自己的 CMyostream_iterator 模板,使之能和 ostream_iterator 模板达到一样的效果,即 #include #include #include using namespace std; main(){

int a[5] = {1,2,3,4,5};

CMyostream_iterator output(cout,\"*\"); vector v(a,a+5);

copy(v.begin(),v.end(),output); }

程序的输出结果是: 1*2*3*4*5*

注意,编写CMyostream_iterator时不能使用 ostream_iterator ,假定所有需要的头文件都已经包含。

20

考试科目:程序设计实习(B卷) 考试时间2007年6月

题 一 号 分 数 阅卷人 二 三 四 五 六 七 八 九 十 总分

1. POJ上的1013是称硬币问题,有12枚硬币,其中1枚是假币,根据三

次称量的结果,判断哪枚硬币是假币,数据保证有唯一解。请遵照原题的本意回答:测试数据中可否出现这样的测试数据 ABCD EFGH even, ABCD EFJK up, ABEF EFJK up?

2. 2007年1月1日是周一,现在已知今天是2007年第n天,请写出一个

函数返回今天是星期几(周一到周日分别为数字1- 7)。

3. 在作业POJ1565中,我们实现了一段把二进制串转换为十进制数的程

序。现假设char a[]中存储了0,1字符(非0,1数字),请补全下面的代码。 …

#define MAXLENGTH 100 char a[MAXLENGTH];

cin>>a; //输入二进制字符串,不超过99字符长 int number = 0;

int length = strlen(a);

for(int i = 0; i < length ; i++) {

21

}

cout<4. 在讲到链表的时候,留了一道POJ2746作业题,该题大意是有n只猴

子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再重新报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王。题目要求使用循环链表,现假设链表每一个节点都代表一个猴子,如不能使用额外的变量存储剩下的猴子的数量,请问应该如何设计程序使得程序在选出猴王时候终止。

5. POJ上1222的熄灯问题,以及一道类似的作业POJ1166画家刷墙的问

题,在问题中每一刷都会影响到自己和周围的方格。在解该题时,我们采用了哪一种编程思想?

6. 在讲到递归方法时,我们讲了POJ2753菲波那契数列的例题,请补全

求数列中第n个数的递推函数。(n >= 1) int f( int n) {

}

7. 我们在第六讲时,曾经做过一个时钟问题的题目1166。

在这个题目中有一个拨钟的动作是ABDE,请问给定如下图的输入情况,使用拨钟动作ABCD两次,时钟会变成什么样子。用一个由9个数字组成的序列表示结果。其中,0表示12点, 1表示3点, 2表示6点, 3表示9点。例如右图的时钟序列表示为330222212。

22

8. 我们在第六讲中曾经做过一道滑雪的题目1008,大体意思是:有一个

二维的数组表示雪地的高度,要你在这个二维空间中找到一个最长的下降路径(4连通)。请你简述一下你的解题思路。

9. 在第13讲类和对象后,留了书上作业 6.15写一个大整数类

HugeInteger, 要求在该类中给出一些比较对象的成员方法,例如:isEqualTo, 请写出你所实现的isEqualTo的函数。

10. 在第14讲运算符重载后,留了一个作业写一个大整数类,并重载一些

运算符,使得给定的一段程序可以正常运行。在下面给定的程序段中,为使得注释处语句能实现其功能,请写出其对应的函数(包括函数实现)。

void main(){

hugeInt a(\"123454543634242435435436529834234235\"); hugeInt

b(\"3453555623234576669567601199439201990001356\"); hugeInt temp;

float f;

temp = a * 436; temp++;

cin>>temp>>f;//输入大整数,再输入一个浮点数 }

23

11. 第15讲继承过后,留了一个作业几何形体练习1 - 编写一个程序,计

算任给一个几何形体的面积和周长。几何形体可以是矩形、三角型、圆形、扇型、梯形。这个题目是否要有用户界面,如果有,你的用户界面是什么样的?

12. 在第16讲后,留了一个作业几何形体练习2 – 要求在几何形体练习

1的基础上,对用户输入的全部几何形体按照面积从小到大进行排序,并输出排序的结果。假定几何形体的数量不超过100。几何形体练习2与几何形体练习1相比,用到了哪些不同的面向对象的技术。

13. 在第17讲几何形体练习3中,几何形体在文件中的存储格式是什么?

(举出两个几何形体的存储格式, 顺序不限)。

14. 在第18讲作业中的压缩算法设计中,我们接触过一种压缩算法RLE,

请简述其大致思想,该算法是否保证将文件压缩得更小?

24

15. 在第19讲后,留了书上20.14作业,编写一个函数模板palindrome, 取

const vector参数并根据vector是否正向逆向都一样而返回true或false。假设一样返回true,不一样返回false。补全下面函数模板。 template

bool palindrome(vector &temp) {

vector::iterator i;

vector::reverse_iterator j;

for(i = temp.begin(), j = temp.rbegin(); i != temp.end() && j !=temp.rend(); i ++, j ++){ }

return true; }

16. 在第20讲后,留了一个过滤单词的程序,in1.txt ,in2.txt 都是纯

文本文件,每行一个英文单词,最多可能有二十万行,一个单词长度最多可以有2000个字符。要求编程输出out.txt,out.txt里是in2.txt里有,而in1.txt里没有的单词,每个单词一行。单词不分大小写 。在这个程序里,你是如何存储单个单词的?

17. 在第21讲后,作业要求写一个自己的 CMyostream_iterator 模板,

题目要求它和哪个模板达到一样的效果?你在做这个题目中遇到过哪些问题?

18. 本学期所有作业中,有哪些作业是你完成的?哪些是在同学的帮

助下完成的?哪些是在助教的帮助下完成的?

25

19. 你觉得教材还有哪方面需要改进?

20. 你觉得课堂授课和助教最需要改进的地方是什么?

26

Copyright © 2019- 91gzw.com 版权所有 湘ICP备2023023988号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务