.(15分)
阅读下面的程序,写出main的输出。
int h(int iCount, const int* ipIndex, int& irObj)
{
iCount %= 3;
if (*ipIndex >= 6)
irObj += iCount;
return *ipIndex + irObj;
}
main()
{
int i, j = 1, k = 2, m;
for (i = 0; i < 15; i++, j++) {
m = h(i, &j, k);
printf("i = %2d, j = %2d, k = %2d, m = %2d./n", i, j, k, m);
}
}
2.(20分)
已知strcpy、strlen库函数的原型分别如下:
void strcpy(char *strDest, const char *strSrc); //strDest是目的字符串,strSrc是源字符串
int strlen(char a[ ]);
请不要调用C++/C的字符串库函数(否则0分!),自行编写函数 strcpy、strlen,要求其功能和原型与相应的C++/C中的库函数相同。
3.(20分)
阅读下面类的定义,然后:(1)在每个类中用注释描述该类所有数据成员的内部能见度;(2)在函数f中用示例性的语句描述这4个类所有数据成员的外部能见度;(3)根据函数f,用图分别表示类B和类D对象的存储结构和初始状态(设:sizeof(int) = sizeof(long) = sizeof(<指针>) = 4*sizeof(char),字对齐规则为4*sizeof(char))。
extern "C" char* strncpy(char *, const char *, size_t); /* strncpy(t, s, n):将字符数组s的前n个元素复制到字符数组t中 */
class A {
char* cpA1;
protected:
int iA2;
public:
long* lpA3;
A(char* p, int i, long* q) : cpA1(p),iA2(i),lpA3(q){}
// 以下描述类A的内部能见度(例:cpA1:可见/不可见;…)… …
};
class B : protected A {
int iB1;
public:
char cpB2[5];
B(char* p, int i, long* q, int j, const char* s) : A(p, i, q),iB1(j)
{ strncpy(cpB2, s, 4); }
// 以下描述类B的内部能见度 … …
};
class C : private A {
int iC1;
protected:
char cpC2[6];
C(char* p, int i, long* q, int j, const char* s) : A(p, i, q),iC1(j)
{ strncpy(cpC2, s, 5); }
// 以下描述类C的内部能见度 … …
};
class D : public C {
int iD1;
public:
char cpD2[16];
D(char* p, int i, long* q, int j, const char* s, int k, const char* t)
: C(p, i, q, j, s, k, t),iD1(k) { strncpy(cpD2, t, 15); }
// 以下描述类D的内部能见度 … …
};
f()
{
char s1[] = "A string", s2[] = "in a derived class",
s3[] = "in a subclass";
long g1 = 1000, g2 = 2000;
A a(s1, 1, &g2);
B b(s1, 2, &g1, 3, s2);
C c(s1, 3, &g1, 4, s2);
D d(s1, 4, &g2, 5, s2, 6, s3);
/* 以下插入示范性语句。例如:
a. cpA1;// public(或private或protected)
*/
}
4.(15分)
用C++语言定义MyString(包括成员函数的实现代码),使之能符合下面程序及在注释中描述的运行结果的要求:
main()
{
MyString s1 = "0123456789", s2(5), s3;
s1.display(); // 此时显示出: <0123456789>
s2.display(); // 此时显示出(<>之间是五个空格): < >
s3.display(); // 此时显示出: <>
s3 = s1;
s3.display(); // 此时显示出: <0123456789>
s2 = s1[2];
s2.display(); // 此时显示出: <23456789>
s1.display(); // 此时显示出: <0123456789>
s3 = s2++;
s2.display(); // 此时显示出: <3456789>
s3.display(); // 此时显示出: <23456789>
}
5.(15分)
已知类的定义如下:
class Base {
protected:
int iBody;
public:
virtual void printOn() = 0;
Base(int i = 0) : iBody(i) {}
virtual int display(int x=60):iBody(x){return iBody;}
};
class Sub1 : public Base {
// …
public:
// …
Sub1(int i, char* s);
};
class Sub2 : public Base {
// …
public:
// …
Sub2(int i, short s);
};
试完成类Sub1和Sub2的定义和操作的实现代码,使之能符合下面程序及在注释中描述的运行结果的要求:
main()
{
Sub1 s1(1000, "This is an object of Sub1");
Sub2 s2(1000, 20);
s1.printOn(); // 此时显示出: <1000: This is an object of Sub1>
s2.printOn(); // 此时显示出: <20 and 1000>
cout<<s2.display(20); // 此时显示出: 60
}
6.(15分)
定义类模板SortedSet,即元素有序的集合,集合元素的类型和集合元素的最大个数可由使用者确定。要求该类模板对外提供三种操作:
(1) insert: 加入一个新的元素到合适的位置上,并保证集合元素的值不重复;
(2) get: 返回比给定值大的最小元素的地址。若不存在,返回0。
(3) del: 删除与给定值相等的那个元素,并保持剩余元素的有序性。
(注意:集合元素类型上的赋值操作符及所有的比较操