加载中...

面向对象程序设计例题


程序分析题

分析下列程序运行后的输出结果:

第一题:

void f1(int i){
  cout<<”in void f1(int i)<<endl;
}

void f1(string st){
  cout<<”in void f1(string st)<<endl;
}

int main(){
  int i=0;
  string st=”acb”;
    
  f1(st);
  f1(i);
    
  return 0;
}

/*
答案:
in void f1(string st)
in void f1(int i)
*/

第二题:

class C1{
public:
  C1(){i=1;};
  void incI(){i++;};
  int getI(){return i;};
private:
  int i;
};

void f1(C1 c){
  c.incI();
  cout<<"in f1  "<<c.getI()<<endl;
}

void f1(C1 *c){
  c->incI();
  cout<<"in f1 *  "<<c->getI()<<endl;
}

void f2(C1 &c){
  c.incI();
  cout<<"in f2 &  "<<c.getI()<<endl;
}

int main(){
  C1 c;
  f1(c);
  f1(&c);
  f2(c);
  return 0;
}

/*
答案:
in f1  2
in f1 *  2
in f2 &  3
*/

第三题:

class BC1 {
public:
 BC1( ) { sBC = new char[3];  cout << "BC1 allocates 3 bytes.\n"; }
 ~BC1( ) { delete [ ] sBC; cout << "BC1 free 3 bytes.\n"; }
private:
 char* sBC;
};

class BC2 {
public:
 BC2( ) { sBC = new char[5];  cout << "BC2 allocates 5 bytes.\n"; }
 ~BC2( ) { delete [ ] sBC; cout << "BC2 free 5 bytes.\n"; }
private:
 BC1 bc1;
 char* sBC;
};

int main( ) {
 BC1 bc1;
 BC2 bc2;
 cout <<-------<< endl;
 return 0;
}

/*
答案:
BC1 allocates 3 bytes.
BC1 allocates 3 bytes.
BC2 allocates 5 bytes.
-------
BC2 free 5 bytes.
BC1 free 3 bytes.
BC1 free 3 bytes.
*/

第四题:

class BC {
public:
 BC( ) { sBC = new char[3];  cout << "BC allocates 3 bytes.\n"; }
 ~BC( ) { delete [ ] sBC; cout << "BC free 3 bytes.\n"; }
private:
 char* sBC;
};

class DC : public BC {
public:
 DC( ) { sDC = new char[5];  cout << "DC allocates 5 bytes.\n"; }
 ~DC( ) { delete [ ] sDC; cout << "DC free 5 bytes.\n"; }
private:
 char* sDC;
};

int main( ) {
 DC d;
 cout <<-------<< endl;
 return 0;
}

/*
答案:
BC allocates 3 bytes.
DC allocates 5 bytes.
-------
DC free 5 bytes.
BC free 3 bytes.
*/

第五题:

class TradesPerson {
public:
    virtual void sayHi() { cout << "Just hi." << endl; }
    void run() { cout << "Base::run " << endl; }
};

class Tinker : public TradesPerson {
public:
    virtual void sayHi() { cout << "Tinker." << endl;}
    void run() { cout << "Tinker::run " << endl; }
};

class Tailor : public TradesPerson {
 public:

  void sayHi() { cout << "Tailor." << endl; }

  void run() { cout << "Tailor::run " << endl; }

};

int main( ) {
    TradesPerson* p;
    int which ;
    cout << "1 == TradesPerson, 2 == Tinker, 3 == Tailor ";
    cin >> which;
    switch( which ){
    case 1: p = new TradesPerson; break;
    case 2: p = new Tinker; break;
    case 3: p = new Tailor; break;
    }
    p->sayHi();   p->run();   delete p;
    return 0;
}

/*
答案:
1 == TradesPerson, 2 == Tinker, 3 == Tailor 3  cin>>3
Tailor.
Base::run
*/

编程题

第一题:

采用面向对象的方式编写一个通迅录管理程序,通迅录中的信息包括:姓名,公司,联系电话,邮编。要求的操作有:添加一个联系人,列表显示所有联系人。先给出类定义,然后给出类实现。(提示:可以设计二个类,一个通迅录条目类CommEntry,一个通讯录类Commus)

注意:

在存个人信息时最好是在Comms类中定义一个CommEntry的数组指针,用来存个人信息。

其次要在Comms类中定义一个变量来记录当前有多少联系人。

#include<iostream>
#include<algorithm>

using namespace std;

class CommEntry
{
private:
	string name;
	string qiye;
	string tel;
	string mail;
public:
	void add()
	{
		cout << "请输入名字,公司,电话,邮箱:" << endl;
		cin >> name >> qiye >> tel >> mail;
	}
	void show()
	{
		cout << "名字:" << name << "  公司:" << qiye << "  电话:" << tel << "  邮箱:" << mail << endl;
	}
};

class Comms: public CommEntry
{
private:
	CommEntry* p;
	int total;
public:
	Comms()
	{
		p = new CommEntry[20];
		total = 0;
	}
    ~Comms()
    {
        delete []p;
    }
	void SHOW()
	{
		for (int i = 0; i < total; ++i)
			p[i].show();
	}
	void ADD()
	{
		p[total].add();
		total++;
	}
};

void caidan()
{
	cout << "添加一个人的信息:1" << endl;
	cout << "列表显示所有人:2" << endl;
	cout << "退出程序:0" << endl;
}
int main()
{
	Comms p;
	while (1)
	{
		int flag;
		caidan();
		cout << "请输入操作:" << endl;
		cin >> flag;
		switch (flag)
		{
		case 1:p.ADD(); break;
		case 2:p.SHOW(); break;
		case 0:return 0;
		}
	}
	return 0;
}

第二题:

在一个公司中有两个类型的人员:雇员(employee)和管理者(manager),注意管理也是一个(is a)雇员。每个雇员有以下基本信息:姓名(name)、年龄(age)、工作年限(workYear)和部门号(depNo)。并且一个管理者还有更多的属性:级别(level)和管理的雇员(numOfEmployee,可以用数组定义)。一个雇员或是管理者具有以下的行为:

void  main(){  
    Employee  e(“Jack”, 24, 2, “Development”);  
    Manager  m(“Tom”, 30, 5, “Development”, 2);  
    m.addMember(&e);   // m管理e  
    e.printOn();      // 显示Jack所有数据成员的信息  
    m.printOn();      //显示Tom所有数据成员的信息  
    Employee* p = &e;  
    bool b = p->retire();   // 如果雇员的年龄是55,则b为true  
    p = &m;  
    b = p->retire ();    // 如果管理者的年龄是60,则 b为true
}

分别定义并实现类Employee 和 Manager。

注意:

判断退休要用到多态,所以两个退休函数都要加 virtual 关键字

析构函数和构造函数都尽量写上,析构函数最好加上 virtual

继承自父类的子类,在写构造函数时,必须将不带缺省构造函数的父类的构造函数写在初始化列表中。

 #include<iostream>
#include<algorithm>

using namespace std;

class Employee
{
private:
    string name;
    int age;
    int workage;
    string dep;
public:
    int getage()
    {
        return age;
    }
    virtual int retire()
    {
        if (age == 55)return true;
        return false;
    }
    Employee(string n, int a, int w, string d)
    {
        name = n, age = a, workage = w, dep = d;
    }
    Employee()
    {
    }
    virtual ~Employee()
    {
    }
    void printOn()
    {
        cout << "名字:" << name << "  年龄:" << age << "  工作年龄:" << workage << "  部门号:" << dep << endl;
    }
};

class Manager : public Employee
{
private:
    int level;
    Employee *num;
    int total;
public:
    Manager(string n,int a,int w,string d,int l):Employee(n,a,w,d)
    {
        num = new Employee[20];
        total = 0;
    }
    Manager()
    {
        num = new Employee[20];
        total = 0;
    }
    ~Manager()
    {
        delete []num;
    }
    void addMember(Employee * k)
    {
        num[total++] = *k;
    }
    void printOn()
    {
        Employee::printOn();
        cout << " 等级:" <<level<< "  管理的人:" <<endl;

        for (int i = 0; i < total; ++i)
            num[i].printOn();
    }
    virtual int retire()
    {
        if (getage() == 60)return true;
        return false;
    }

};

int  main() 
{
    Employee  e("Jack", 55, 2, "Development");
    Manager  m("Tom", 59, 5, "Developmen", 2);
    m.addMember(&e);   // m管理e  
    e.printOn();      // 显示Jack所有数据成员的信息  
    m.printOn();      //显示Tom所有数据成员的信息  
    Employee* p = &e;
    bool b = p->retire();   // 如果雇员的年龄是55,则b为true  
    cout << b << endl;
    p = &m;
    b = p->retire();    // 如果管理者的年龄是60,则 b为true*/
    cout << b;
    return 0;
}



第三题:

已知类的定义如下:

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, string 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); // 此时显示出: 20
}

注意:

当基类中给出纯虚函数时,派生类必须给出该虚函数具体的函数定义,否则无法定义具体实例。

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 
{
private:
    string name;
public:
    Sub1(int i, string s)
    {
        iBody = i;
        name = s;
    }
    virtual void printOn()
    {
        cout << iBody << ": " << name << endl;
    }
};
class Sub2 : public Base 
{
private:
    int name;
public:
    Sub2(int i, short s)
    {
        iBody = i;
        name = s;
    }
    virtual void printOn()
    {
        cout << iBody << " and " << name << endl;
    }
};

第四题:

在一个GUI程序中,有一系列相关的类,如circle,triangle,square等等,其中square由二个triangle对象构成. circle,triangle,square等类的对象都有相似的行为print(string)(打印出该类对象的相应信息,如类circler的此函数输出”Circle”),draw()(画出相应的类对象的图形),我们应如何组织这些类,使得系统易于扩充和维护?请用UML语言画出类图,并给出相应类中方法的界面(头文件).

注意:

这个题实在是不太明白,现在学性价比太低,就在网上找了张图,感觉也不太对,聊胜于无吧。

1358881-20190628204631590-1044474682.png


文章作者: 心意
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 心意 !
评论
  目录