程序分析题
分析下列程序运行后的输出结果:
第一题:
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语言画出类图,并给出相应类中方法的界面(头文件).
注意:
这个题实在是不太明白,现在学性价比太低,就在网上找了张图,感觉也不太对,聊胜于无吧。