OOP技术:面向对象技术1-10章习题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OOP技术:习题
第1章习题
1. 什么是面向对象技术?
2. 面向对象与面向过程程序设计有什么不同?
3. 面向对象技术有哪些优点?
4. 面向对象技术中的封装性有何优缺点?如何克服这些缺点?
5. 为什么要应用继承机制?
6. C++对多态性的支持体现在哪些方面?
7. 目前常用的面向对象程序设计语言有何异同?
8. 什么是.NET?
第2章习题
1. 写出下面程序的运行结果。
#include <iostream.h>
void main()
{
int* a;
int* &p=a;
int b=10;
p=&b;
cout<<*a<<endl;
cout<<*p<<endl;
}
2. 写出下面程序的运行结果。
#include <iostream.h>
void main()
{
int iarray[10]={0,2,4,6,8,10,12,14,16,18};
int sum=0;
int* iptr=iarray;
for(int i=0;i<10;i++)
{
sum+=*iptr;
iptr++;
}
cout<<"sum is"<<sum<<endl;
}
3. 写出下面程序的运行结果。
#include <iostream.h>
int m=8;
int add3(int x,int y=7,int z=m)
{ return x+y+z; }
void main()
{
int a=1,b=2,c=3;
cout<<add3(a,b)<<endl;
cout<<add3(10)<<endl;
}
4. 编程求所有的水仙花数。
如果一个三位数的个位数、十位数和百位数的立方和等于该数本身,则称该数为水仙花数。
5. 编程求1000以内所有素数。
6. 编写一个可以打印任何一年日历的程序。
7. 在10000以内验证哥德巴赫猜想之“1+1”命题:任意大的偶数,都可以表示为两个素数之和。
8. 编写一个函数,用冒泡法对输入的十个整数从小到大排序。
9. 编写一个函数,输入一个十六进制数,输出相应的十进制数。
10. 将给定的一个二维数组(3×3)转置,即行列互换。
11. 用非递归的函数调用方式求fibonaci数列第n项。
fibonaci数列形如:
0,1,1,2,3,5,8,13,┄
其通项为:F0=0;F1=1;┄;F n=F n-1+F n-2。
12. 编写重载函数max,分别返回字符数组、int数组、long数组、float数组、double 数组和字符串数组的最大元素。
第3章习题
1. 类定义由哪些部分组成?在定义和使用时要注意什么问题?
2. 说明一个类的公有成员、保护成员和私有成员的区别。
3. 何时执行类构造函数及析构函数?若该对象作为类的成员,何时执行其构造函数和析构函数?
4. 创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。
其功能有修改姓名、显示数据信息。
要求其功能函数的原型放在类定义中,构造函数初始化每个成员,显示信息函数要求把对象中的完整信息打印出来。
其中数据成员为保护的,函数为公有的。
5. 修改第4题中的类,将姓名构成Name类,其名和姓在该类中为保护数据成员,其构造函数为接受一个指向完整姓名字符串的指针。
该类可显示姓名。
然后将Employee类中的姓名成员(字符数组)修改为Name类对象。
6. 改正下列程序中的错误,并说明理由。
程序1:
include <iostrea.h>;
class Student
{
public
void Student()
void display()
{
cin<<'number:'<<number<<endl
cout<<name:<<name<<endl;
cout<<score:<<score<<endl;
private:
int number,char* name,float score;
}
程序2:
include <iostream.h>;
class example()
{
private:
int date;
static int count
public;
void example(int y=10)(date=y;)
(
cout<<"date="<<date;
return count;
)
}
7. 写出下面程序的运行结果。
注意:构造函数和析构函数的执行次序、构造函数的初始化表。
#include <iostream.h>
class Ex
{
public:
Ex(int x,char c='c');
~Ex()
{
cout<<'B'<<endl;
}
void outdata(void)
{
cout<<ch<<da<<endl;
}
private:
int da;
char ch;
};
void main()
{
Ex x(3,'a'),y(1);
Ex z[2]={Ex(10,'a'),Ex(1,'d')};
x.outdata();
y.outdata();
z[0].outdata();
}
Ex::Ex(int x,char c):da(x),ch(c) {
cout<<'A'<<endl;
}
8. 写出下面程序的运行结果。
#include <iostream.h>
#include <string.h>
#include <stdio.h>
class Ex
{
public:
Ex(const char* s)
{
len=strlen(s);
p=new char[len+1];
strcpy(p,s);
}
Ex()
{
p=new char[8];
cout<<"****"<<endl;
}
Ex(const Ex& st)
{
len=strlen(st.p);
p=new char[len+1];
strcpy(p,st.p);
}
~Ex()
{
delete p;
}
void outdata(void)
{
printf("%x:%d ,%x:%s\n",&len,len,&p,p);
}
private:
int len;
char* p;
};
void main()
{
Ex x("first");
Ex y=x,z;
x.outdata();
y.outdata();
}
9. 写出下面程序的运行结果。
#include <iostream.h>
class MyClass
{
public:
MyClass();
MyClass(int);
void Display();
~MyClass();
protected:
int number;
};
MyClass::MyClass()
{
cout<<"Constructing normally\n";
}
MyClass::MyClass(int m)
{
number=m;
cout<<"Constructing with a number:"<<number<<endl;
}
void MyClass::Display()
{
cout<<"Display a number:"<<number<<endl;
}
MyClass::~MyClass()
{
cout<<"Destructing\n";
}
void main()
{
MyClass obj1;
MyClass obj2(10);
obj1.Display();
obj2.Display();
}
10. 什么是静态数据成员?它有何特点?
11. 编写一个类,声明一个数据成员和一个静态数据成员。
其构造函数初始化数据成员,并把静态数据成员加1,其析构函数把静态数据成员减1。
(1)编写一个应用程序,创建该类的3个对象,然后显示其数据成员和静态数据成员,再析构每个对象,并显示它们对静态数据成员的影响。
(2)修改该类,增加静态成员函数并访问静态数据成员,并声明静态数据成员为保护成员。
体会静态成员函数的使用,静态成员之间与非静态成员之间互访问题。
12. 假设有两个类Student和Score,使用时,怎样允许Score成员访问Student中的私有成员和保护成员?
13. 为什么要定义友元?友元有哪几种类型?
14.改正下面代码的错误。
#include <iostream.h>
class Animal;
void SetValue(Animal&,int);
void SetValue(Animal&,int,int);
class Animal
{
public:
friend void setValue(Animal&,int);
protected:
int itsWeight;
int itsAge;
};
void SetValue(Animal& ta,int tw)
{
ta.itsWeight=tw;
}
void SetValue(Animal& ta,int tw,int tn)
{
ta.itsWeught=tw;
ta.itsAge=tn;
}
void main()
{
Animal peppy;
SetValue(peppy,5);
SetValue(peppy,7,9);
}
将第14题程序中的友元改成普通函数,为此增加访问类中保护数据的成员函数。
第4章习题
1. 什么是继承?它在软件设计中有什么作用?
2. 比较类的三种继承方式之间的差别。
3. 如果派生类B已经重新定义了基类A的一个成员函数fn1(),没有定义重载成员函数fn2(),怎样调用基类的成员函数fn1()、fn2()?
4. 写出运行结果,分析程序中的访问权限,并回答所列问题。
#include <iostream.h>
class A
{
public:
void f1();
A()
{
cout<<"A Constructor"<<endl;
i1=10;j1=11;
cout<<"i1="<<i1<<"j1="<<j1<<endl;
}
~A(){cout<<"A Destructor"<<endl;}
protected:
int j1;
private:
int i1;
};
class B:public A
{
public:
void f2();
B()
{
cout<<"B Constructor"<<endl;
i2=20;j2=21;
cout<<"i2="<<i2<<"j2="<<j2<<endl;
}
~B(){cout<<"B Destructor"<<endl;} protected:
int j2;
private:
int i2;
};
class C:public B
{
public:
void f3();
C()
{
cout<<"C Constructor"<<endl;
i3=30;j3=31;
cout<<"i3="<<i3<<"j3="<<j3<<endl;
}
~C(){cout<<"C Destructor"<<endl;} protected:
int j3;
private:
int i3;
};
void main()
{
A a;
B b;
C c;
}
(1)派生类B中成员函数f2()能否访问基类A中的成员f1()、i1和j1?
(2)派生类B的对象b能否访问基类A中的成员f1()、i1和j1?
(3)派生类C中成员函数 f3()能否访问直接基类 B中的成员 f2()、j2和i2?能否访问间接基类A中的成员f1()、j1和i1?
(4)派生类C的对象c能否访问直接基类B中的成员f2()、i2和j2呢?能否访问间接基类A中的成员f1()、j1和i1?
(5)根据上述结果总结继承中构造函数和析构函数的调用顺序。
(6)将派生B类的继承方式改为私有继承和保护继承,结果分别怎样?试总结它们的异同。
5. 写出下面程序的运行结果。
#include <iostream.h>
class A
{
public:
A(int i,int j){a=i;b=j;}
void move(int x,int y){a+=x;b+=y;}
void show()
{
cout<<"("<<a<<","<<b<<")"<<endl;
}
private:
int a,b;
};
class B:public A
{
public:
B(int i,int j,int k,int l):A(i,j),x(k),y(l){}
void show()
{
cout<<x<<","<<y<<endl;
}
void fun(){move(3,5);}
void f1(){A::show();}
private:
int x,y;
};
void main()
{
A aa(1,2);
aa.show();
B bb(3,4,5,6);
bb.fun();
bb.A::show();
bb.B::show();
bb.f1();
}
6. 编写一个学生和教师数据输入和显示程序。
学生数据有编号、姓名、班号和成绩,教师数据有编号、姓名、职称和部门。
要求将编号、姓名输入和显示设计成一个类Person,并作为学生类Student和教师类Teacher的基类。
7. 写出下面程序的运行结果,并分析总结。
#include <iostream.h>
class Base
{
public:
void who(){cout<<"Base class"<<endl;}
};
class Derive1:public Base
{
public:
void who(){cout<<"Derivel class"<<endl;}
};
class Derive2:public Base
{
public:
void who(){cout<<"Derive2 class"<<endl;}
};
void main()
{
Base obj1,*p;
Derive1 obj2;
Derive2 obj3;
p=&obj1;
p->who();
p=&obj2;
p->who();
p=&obj3;
p->who();
obj2.who();
obj3.who();
9. 在多继承方式下,派生类的构造函数和析构函数调用顺序是怎样的?
10. 什么是虚基类?有何作用?
第5章习题
1. 什么是多态性?在C++中是如何实现多态的?
2. 虚函数与重载在设计方法上有何异同?
3. 编写一个时间类,实现时间的加、减、读和输出。
4. 定义一个哺乳动物Mammal类,再由此派生出狗Dog类,两者都定义Speak成员函数,基类中定义为虚函数,定义一个Dog类的对象,调用Speak函数,观察运行结果。
5. 写出下面程序的运行结果,并回答问题。
#include <iostream.h>
class Point
{
public:
Point(int x1,int y1){x=x1;y=y1;}
int area() const {return 0;}
private:
int x,y;
};
class Rect:public Point
{
public:
Rect(int x1,int y1,int u1,int w1): Point(x1,y1)
{
u=u1;w=w1;
}
int area() const {return u*w;}
private:
int u,w;
};
void fun(Point &p)
{
cout<<p.area()<<endl;
}
void main()
{
Rect rec(2,4,10,6);
fun(rec);
如果将Point类的area()函数定义为虚函数,其运行结果是什么?为什么?
6. 在C++中,能否声明虚构造函数?为什么?能否声明虚析构函数?有何用途?
7. 什么叫做抽象类?抽象类有何作用?抽象类的派生类是否一定要给出纯虚函数的实现?
8. 定义一个Shape抽象类,在此基础上派生出Rectangle和Circle类,二者都有GetArea()函数计算对象的面积,GetPerim()函数计算对象的周长。
使用Rectangle类派生一个新类Square。
9. 写出下面程序的运行结果,并回答问题。
#include <iostream.h>
class A
{
public:
A(int i):k(i){}
virtual void operator!()
{
cout<<"A: K="<<k<<endl;
}
protected:
int k;
};
class B:public A
{
public:
B(int n=0):A(0),j(n){k++;}
virtual void operator!()
{
cout<<"B: K="<<k<<",J="<<j<<endl;
}
protected:
int j;
};
class C:public B
{
public:
C(int n=0):B(0),m(n){k++;j++;}
virtual void operator!()
{
cout<<"C: K="<<k<<",J="<<j<<",M="<<m<<endl;
}
private:
int m;
};
void main()
{
B b(5);
C c(3);
A a(2);
A* ab=&a;
!*ab;
!b;
!c;
A &ba=(A)b;
!ba;
A &ca=(B)c;
!ca;
B &cb=c;
!cb;
}
如果将类A的虚函数定义为普通成员函数,其结果如何?为什么?如果将C类改为A类的公有派生类,应做如何修改才能使程序正常运行?
10. 前缀自加和后缀自加运算符重载时如何区别?
第6章习题
1. 编写一个函数模板,实现求不同类型的数的相反数。
2. 编写一个函数模板,实现对不同类型的数组排序。
3. 以下是一个整数链表类的定义:
const int maxqueue=10;
class List
{
public:
List();
~List();
void Add(int);
void Remove(int);
int* Find(int);
void PrintList();
protected:
struct Node
{
Node* pNext;
int* pT;
};
Node* pFirst; //链首节点指针
};
(1)编写一个链表的类模板(包括其成员函数定义),让任何类型的对象提供链表结构数据操作。
(2)在应用程序中创建整数链表、字符链表和浮点数链表,并提供一些数据插入链表,在链表中删除一个节点和打印链表所有节点元素,遍历整个链表查找给定对应节点等操作。
第7章习题
1. 什么是流? C++中用什么方法实现数据的输入/输出?
2. C++的I/O流库由哪些类组成?其继承关系如何?
3. C++中进行格式化输入/输出方法有哪几种? 各是如何实现的?
4. 写出下面程序的运行结果。
#include <iostream.h>
void main()
{
int x=77;
cout<<"12345678901234567890\n";
cout.fill('#');
cout.width(10);
cout<<"x=";
cout.width(10);
cout.setf(ios::left);
cout.fill('$');
cout<<x <<"\n";
int y=0x2a;
cout<<"12345678901234567890\n";
cout.unsetf(ios::left);
cout.fill('%');
cout.width(10);
cout<<"y=";
cout.unsetf(ios::right);
cout.width(10);
cout.setf(ios::left);
cout.fill('$');
cout<<y<<"\n";
}
5. 写出下面程序的运行结果。
#include <iostream.h>
#include <iomanip.h>
void main()
{
int a=5,b=7,c=-1;
float x=67.8564,y=-789.124;
char ch='A';
long n=1234567;
unsigned u=65535;
cout<<a<<b<<endl;
cout<<setw(3)<<a<<setw(3)<<b<<"\n";
cout<<x<<","<<y<<endl;
cout<<setw(10)<<x<<","<<setw(10)<<y<<endl;
cout<<setprecision(2);
cout<<setw(8)<<x<<","<<setw(8)<<y;
cout<<setprecision(4);
cout<<x<<","<<y;
cout<<setprecision(1);
cout<<setw(3)<<x<<","<<setw(3)<<y<<endl;
cout<<"%%"<<x<<","<<setprecision(2);
cout<<setw(10)<<y<<endl;
cout<<ch<<dec<<","<<ch;
cout<<oct<<ch<<","<<hex<<ch<<dec<<endl;
cout<<n<<oct<<","<<n<<hex<<","<<n<<endl;
cout<<dec<<u<<","<<oct<<u<<","<<hex;
cout<<u<<dec<<","<<u<<endl;
cout<<"COMPUTER"<<","<<"COMPUTER"<<endl;
}
6. 编写一个程序,从键盘上输入一个八进制数,要求分别以八进制、十进制、十六进制(其中的字母要大写)形式左对齐方式输出,格式如下:
Hex Decimal Octal
xxx xxx xxx
7. 编写一个程序,分别计算并输出6!至15!的值,用setw()控制“=”左右边数值的宽度,使输出结果排列整齐。
要求分别以浮点和定点两种形式输出。
8. 编写一个程序,打印2~100之间数字的自然对数与以10为底的对数表。
要求对表进行格式化,使数字可以显示在宽度为10的范围内,用小数位数占5位的精度进行右对齐。
9.编写一个程序,从键盘上输入5个学生的数据(包括学号、姓名、年龄、三门功课的分数),然后求出每个人的平均分数,把学号、姓名和平均分数输出到磁盘文件STUD.REC中,
最后从STUD.REC文件中读出这些数据,并在屏幕上显示出来。
第8章习题
1. 列出五个常见的异常例子。
2. 写出下面程序的运行结果。
#include <iostream.h>
void main()
{
int wait_time=46;
try
{
cout<<"Try block entered."<<endl;
if (wait_time>30)
throw wait_time;
cout<<"Leaving try block."<<endl;
}
catch(int thrown_value)
{
cout<<"exception thrown with"<<endl
<<"wait_time equal to"<<thrown_value<<endl;
}
cout<<"After catch block."<<endl;
}
如果将“int wait_time=46;”替换成“int wait_time=12;”,其结果如何?
3. 创建一个含有可抛出异常的成员函数的类,在该类中,创建一个被嵌套的类用作一个异常对象,它带有一个char*参数,该参数是一个有意义的字符串。
创建一个可抛出该异常的成员函数。
编写一个try块使它能调用该函数并且捕获异常,以打印该字符串的方式处理该异常。
第9章习题
1. 在应用程序向导AppWizard中能够创建哪些类型的文件?
2. MFC类库的层次结构怎样?将9.2节中表9-5至9-10的内容用层次结构表达出来。
第10章习题
1. MFC应用程序是如何实现Windows消息机制的,请详细解释。
2. 什么是文档模板?
3. 当应用程序向导生成MFC应用程序时,在源代码中找不到WinMain()函数,这是为
什么?
4. 文档类、文档模板类和视图类的结构是如何定义的?
5. 修改DlgDemo程序,使用如图10-27所示的对话框实现作图图形的选择。
图10-27 用于选择作图图形的对话框
第11章习题
1. 在MFC中,构成多文档应用程序的类有哪些?它们的功能是什么?
2. 多文档应用程序中的多种文件类型和多菜单是怎样实现的?
第12章习题
1. 基于表单的应用程序的特点是什么?
2. 修改12.2.2节中的示例程序,设计一个能计算加、减法的计算器。