C++试题二

.(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: 删除与给定值相等的那个元素,并保持剩余元素的有序性。
(注意:集合元素类型上的赋值操作符及所有的比较操

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值