面向对象程序设计C++练习题(1)

把学校课程网站上的C++作业做了个总结,方便以后的复习。

1-1.教材习题4_13:定义Circle类并计算面积
【问题描述】
定义一个Circle类,有数据成员radius(半径),成员函数getArea()计算圆的面积。构造一个Circle的对象进行测试(注:圆周率取值3.14)。

【输入形式】
程序参考的输入(提示“Input Radius:”):
Input Radius:10

【输出形式】
程序参考的输出:
Area:314

【样例输入】
Input Radius:10
【样例输出】
Area:314

#include
#define Pi 3.14
using namespace std;
class Circle {
public:
	float getArea();
private:
	double radius;

};

float Circle::getArea() {
	cout << "Input Radius:";
	cin >> radius;
	return Pi * radius * radius;
}

int main()
{
	Circle radius;
	float area = radius.getArea();
	cout << "Area:" << area << endl;

}

1-2.教材习题4_8:定义Dog类,包含age和weight信息
【问题描述】
定义一个Dog类,包含age,weight等属性,以及对这些属性操作的方法。实现并测试这个类。

【输入形式】
程序参考的输入(提示“Input Age and Weight:”):
Input Age and Weight:3 20

【输出形式】
程序参考的输出:
Dog Age:3 years
Dog Weight:20kg

#include
#define Pi 3.14
using namespace std;
class Dog
{
public:
    void setdog();
    void showdog();
private:
    int age;
    int weight;
};

void Dog::setdog()
{
    cout << "Input Age and Weight:";
    cin >> age >> weight;
}

void Dog::showdog()
{
    cout<<"Dog Age:"<

2-1.教材习题4_9:通过屏幕两点确定矩形类Rectangle
【问题描述】
设计并测试一个名为Rectangle的矩形类,其属性为矩形的左下角与右上角两个点的坐标,根据坐标能计算矩形的面积。

【输入形式】
程序参考的输入(提示“Input Point A:”输入左下角的坐标;提示“Input Point B:”输入左下角的坐标):
Input Point A:0 0
Input Point B:8.2 4.5

【输出形式】
程序参考的输出:
Rectangle Area:36.9

【样例输入】
Input Point A:0 0
Input Point B:8.2 4.5

【样例输出】
Rectangle Area:36.9

#include 

using namespace std;

class Rectangle {
public:
	void getPoint();
	float getArea();
private:
	double x1;
	double x2;
	double y1;
	double y2;
	double Area;
};

void Rectangle::getPoint() {
	cout << "Input Point A:";
	cin >> x1 >> y1;
	cout << "Input Point B:";
	cin >> x2 >> y2;
}

float Rectangle::getArea(){
    Area=(x1-x2)*(y1-y2);
    if(Area<0){
        Area=-Area;
    }
    return Area;
}
int main()
{
    Rectangle a;
    a.getPoint();
    float area = a.getArea();
    cout << "Rectangle Area:" << area << endl;
    return 0;
}

2-2.教材习题4_20:定义满足要求的复数类Complex类
【问题描述】
定义一个复数类Complex,使得下面的代码能够工作。(注:下列代码需放在主函数中。)
Complex c1(3,5);    //用复数3+5i初始化c1
Complex c2=4.5;     //用实数4.5初始化c2
c1.add(c2);   //将c1与c2相加,结果保存在c1中
c1.show(); //将c1输出(这时的结果应该是7.5+5i)

【输入形式】

【输出形式】
7.5+5i

#include 
using namespace std;
class Complex
{
private:
double real;
double imag;
public:
    Complex(){real=0;imag=0;}
    Complex(double r){real=r;imag=0;};
    Complex(double r,double i){real=r;imag=i;};
    void add(Complex c1){real += c1.real;imag += c1.imag;};
    void show();
};
void Complex::show()
{
    cout<0)cout<<"+"<

3-1.使用Visual C++ 6.0或CodeBlocks集成环境来编辑编译并运行程序
【问题描述】
使用Visual C++ 6.0或CodeBlocks集成环境来编辑、编译并运行程序:

【输入形式】

【输出形式】
constructor.
3,4
x+y=7
constructor.
30,40
x+y=70
destructor.
30,40
destructor.
3,4

#include 
using namespace std;
class TAdd
{
public:
 TAdd(int a,int b)
 {
    x=a;y=b;
    cout<<"constructor."<#include 
using namespace std;
class Date
{
public:
  Date()
  {
    cout<<"Input Date:";
    cin>>y>>m>>d;
  }
  int beLeapYear()
  {
    return ((y%4==0&&y%100!=0)||(y%400==0));
  }
  void addOneDay()
  {
      d++;
      		switch(m)
      		{
      			case 1:
      			case 3:
      			case 5:
      			case 7:
      			case 8:
      			case 10:
      			case 12:
      				{
      					if(d > 31)
      					{
      						d -= 31;
      						m=1;
      						y++;
      					}
      					break;
      				}
      			case 4:
      			case 6:
      			case 9:
      			case 11:
      				{
      					if(d > 30)
      					{
      						d-= 30;
      						m++;
      					}
      					break;
      				}
      			case 2:
      				{
      					if(beLeapYear())
      					{
      						if(d > 29)
      						{
      							d -= 29;
      							m++;
      						}
      					}
      					else
      					{
      						if(d > 28)
      						{
      							d -= 28;
      							m++;
      						}
      					}
      					break;
      				}
      			default:
      				{
      					break;
      				}
      		    
      		} 

  }
  void showDate()
  {
    cout<

4-1.教材习题5_3:全局变量与局部变量
【问题描述】
下面程序的运行结果是什么?实际运行一下,看看与你的设想有何不同。
注:只需调试一下代码即可,原样输入。

#include 

using namespace std;
int x=5,y=7;
void myFunction(){
    int y=10;
    cout<<"x from myFunction:"<

4-2.教材习题5_7:利用静态变量统计小猫Cat的数量
【问题描述】
定义一个Cat类,拥有静态数据成员numOfCats,记录Cat的个体数目;静态成员函数getNumOfCats(),读取numOfCats。设计程序测试这个类,体会静态数据成员和静态成员函数的用法。

主函数如下:

int main()
{
    Cat c;
    cout<<"Num:"<

参考的输出结果为:
Num:1
Num:5

【输入形式】

【输出形式】
Num:1
Num:5

#include 
using namespace std;
class Cat
{
public:
    Cat()
    {
        numOfCats++;
    }
    ~Cat()
    {
        numOfCats--;
    }
    static int getNumOfCats()
    {
        return numOfCats;
    }
private:
    static int numOfCats;
};

int Cat::numOfCats = 0;
int main()
{
    Cat c;
    cout<<"Num:"<

5-1.教材习题5_14:定义Boat与Car两个类,友元计算总重量
【问题描述】
定义Boat与Car两个类,二者都有weight属性,定义二者的一个友元函数getTotalWeight(),计算二者的重量和。

【输入形式】
参考的输入(数字前为提示文字):
Input boat weight:3
Input car weight:5

【输出形式】
参考的输出:
Total weight:8

【样例输入】
Input boat weight:3
Input car weight:5

【样例输出】
Total weight:8

#include 
using namespace std;
class car;
class boat{
private:
	int weight;
public:
	boat();
	friend int gettotalweight(boat &b,car &c);
};
boat::boat(){
    cout <<"Input boat weight:";
    cin>>weight;
}
class car{
private:
	int weight;
public:
	car();
	friend int gettotalweight(boat &b,car &c);
};
car::car(){
    cout <<"Input car weight:";
    cin>>weight;
}
int gettotalweight(boat &b,car &c){
	return b.weight+c.weight;
}
int main(){
	boat b;
	car c;
	cout<<"Total weight:"<

5-2.教材习题5_13:定义类X,Y,Z,按要求实现友元
【问题描述】
定义类X,Y,Z,函数h(X*),满足:类X有私有成员i,Y的成员函数g(X*)是X的友元函数,实现对X的成员i加1;类Z是类X的友元类,其成员函数f(X*)实现对X的成员i加5;函数h(X*)是X的友元函数,实现对X的成员i加10。主函数实现测试。主函数需要定义如下:

int main()
{
    int a;
    cin>>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

【输入形式】
参考的输入:
3

【输出形式】
参考的输出:
19

【样例输入】
3
【样例输出】
19

#include 
using namespace std;
class X;

class Y
{
public:
    void g(X &x);
};

class Z
{
public:
    void f(X &x);
};

class X
{
public:
    X(int i):i(i) {}
    friend void Y::g(X &x);
    friend class Z;
    friend void h(X &x);
    void print()
    {
        cout<>a;
    X x(a);
    Y y;
    Z z;
    y.g(x);
    z.f(x);
    h(x);
    x.print();
}

6-1.利用对象数组,计算10个顶点组成折线的长度
【问题描述】
假设有一个点类point,具有两个实数坐标。希望主程序使用这个类完成下述功能:
(l)主程序为类point定义10个点的对象数组(也可以动态申请空间)。
(2)要求调用一个函数Set()从键盘输入10个对象的属性。
(3)要求调用一个函数Display()显示10个对象的值。
(4)要求调用一个函数Lenth(),计算将这些点连成一条折线时,这条折线的长度。

【输入形式】
参考的输入(每个点要求提示“Input x,y:”):
Input x,y:0 0
Input x,y:3 5
Input x,y:2 4
Input x,y:9 8
Input x,y:2 3
Input x,y:8 9
Input x,y:7 6
Input x,y:2 9
Input x,y:5 8
Input x,y:6 6

【输出形式】
参考的输出:
(0,0)
(3,5)
(2,4)
(9,8)
(2,3)
(8,9)
(7,6)
(2,9)
(5,8)
(6,6)
Length:46.7866

#include 
#include 
using namespace std;
#define MAX 10
#define col 0
class CPoint
{
private:
    int array[MAX][2];
    float DisAB;
    float sum;
public:
    void CSetPoint();
    void Display();
    void Lenth();
    float PowerX_X(int i);
    float PowerY_Y(int i);
    float Twodist();
};
void CPoint::CSetPoint()
{
    //cause this is a point,so the col is 2,and i made the default value is 0
    for(int i=0; i> array[i][col]
            >>array[i][col+1];  //Store the two values of input
    }
}
void CPoint::Display()  //display the point that your input
{
    for(int i=0; i

6-2.定义Employee类,输出编号和姓名
【问题描述】
定义一个Employee类,在Employee类中增加一个数据(静态数据成员)来设置本公司员工编号基数,新增加的员工编号将在创建对象的同时自动在基数上增加(程序输入2个人员)。

【输入形式】
参考的输入如下(提示“Input name:”):
Input name:zhangsan
Input name:lisi

【输出形式】
参考的输出如下:
ID:1001 Name:zhangsan
ID:1002 Name:lisi

#include 
#include 
using namespace std;
class Employee
{
public:
    Employee();
    void display();
private:
    static int base_id;
    int id;
    string name;
};
int  Employee::base_id=0;
Employee::Employee(){
    base_id++;
    id=1000+base_id;
    cout<<"Input name:";
    cin>>name;

}
void  Employee::display(){
    cout<<"ID:"<

7-1.教材习题7_5:Shape类派生Rectangle和Circle类
【问题描述】
定义一个基类Shape,在此基础上派生出Rectangle和Circle,二者都有getArea()函数计算对象面积。使用Rectangle类创建一个派生类Square。
注:圆周率取3.14

【输入形式】
参考的输入(数字前面的文字为提示):
Input a,b:5 10
Input r:10

【输出形式】
参考的输出:
Rectangle Area:50,Circle Area:314

#include
#include
#define PAI 3.14
using namespace std;
class Shape{
public:
    int getarea();
};

class Rectangle:public Shape{
public:
    void setab();
    void getab(){
        cout<<"Input a,b:";
        cin>>a>>b;
    }
    int getarea(){
        return a*b;
    }
private:
    int a;
    int b;
};

class Circle:public Shape{
public:
    void setr();
    void getr(){
        cout<<"Input r:";
        cin>>r;
    }
    float getarea(){
        return r*r*PAI;
    }
private:
    int r;
};

class Square:public Rectangle{
public:
    void setside();
    void getside();
    int getarea();
private:
    int side;
};

int main(){
    Rectangle a;
    Circle b;
    a.getab();
    b.getr();
    cout<<"Rectangle Area:"<

7-2.教材习题7_6:哺乳动物类Mammal派生出狗类Dog
【问题描述】
定义一个哺乳动物类Mammal,再由此派生出狗类Dog,定义一个Dog类的对象,观察基类与派生类的构造函数和析构函数的调用顺序。

【输入形式】
参考的输入为("Input Dog Name:"为提示文字):
Input Dog Name:wangcai

【输出形式】
参考的输出为:
Con.Mammal
Con.Dog:wangcai
Des.Dog:wangcai
Des.Mammal

#include 
#include 
using namespace std;
class Mammal
{
public:
    Mammal(string name):name(name)
    {
        cout<<"Con.Mammal"<>name;
    Dog d(name);
    return 0;
}

7-3.教材习题6_20:实现一个简单圆类
【问题描述】
实现一个名为SimpleCircle的简单圆类。其数据成员int *itsRadius为一个指向其半径值的指针,存放其半径值。设计对数据成员的各种操作并计算面积,给出这个类的完整实现并测试这个类。
注:简单计算半径为10的圆面积,不需要输入,圆周率取3.14。

【输入形式】

【输出形式】
Area:314

#include 
using namespace std;
const float pi=3.14;
class SimpleCircle
{
public:
SimpleCircle(float Radius = 0)
    {
        itsRadius = new float(Radius);
 
    }

    void setRadius(float r)
    {
        *itsRadius=r;
    }
    float getRadius()
    {
        return *itsRadius;
    }
    float getArea()
    {
        return (*itsRadius)*(*itsRadius)*pi;
    }
private:
    float *itsRadius;
};
int main()
{
    SimpleCircle c;
    c.setRadius(10);
    cout<<"Area:"<

8-1.教材习题7_8:定义一个Document类和Book类
【问题描述】
定义一个Document类,有数据成员name,从Document派生出Book类,增加数据成员pageCount。

【输入形式】
程序参考的输入(数据前面文字为提示):
Input Name and Page:Math 280

【输出形式】
程序参考的输出:
Name:Math
Page:280

#include 
#include 
using namespace std;
class Document{
public:
    Document(){};
    Document(const char *name);
    char *Name;
    void PrintNameOf();
};

Document::Document(const char *name){
    Name=new char[strlen(name)+1];
    strcpy(Name,name);
};

void Document::PrintNameOf(){
    cout<>Name>>PageCount;
}

void Book::PrintNameOf(){
    cout<<"Name:";
    Document::PrintNameOf();
}

void Book::PrintPage(){
    cout<<"Page:"<

8-2.教材习题7_10:定义一个Object类和Box类
【问题描述】
定义一个Object类,有数据成员weight及相应的操作函数,由此派生出Box类,增加数据成员height和width及相应的操作函数,声明一个Box对象,观察构造函数和析构函数的调用顺序。
【输入输出形式】
参考的输入及输出(其中Input开头的两段文字为输入提示和输入数据,其他均为输出):
Constructing Object!
Constructing Box!
Input weight:50
Input height and width:20 30
Weight:50
Height and width:20,30
Destructing Box!
Destructing Object!

#include 
#include 
using namespace std;
class Object
{
public:
    Object()
    {
        cout<<"Constructing Object!"<>weight;
    }
    void showInfo()
    {
        cout<<"Weight:"<>height>>width;
    }
    void  showInfo()
    {
        Object::showInfo();
        cout<<"Height and width:"<

9-1.教材习题7_13:编写程序输出各个类各自的地址
【问题描述】
思考例7-6和例7-8中Derived类的各个数据成员在Derived对象中存放的位置,编写程序输出它们各自的地址来验证自己的判断。
录入下面的代码,自行分析输出结果。

//7_8.cpp

#include 

using namespace std;

class Base0 {    //定义基类Base0
public:
    int var0;
    void fun0() { cout << "Member of Base0" << endl; }
};

class Base1: virtual public Base0 {    //定义派生类Base1
public:    //新增外部接口
    int var1;
};

class Base2: virtual public Base0 {    //定义派生类Base2
public:    //新增外部接口
    int var2;
};

class Derived: public Base1, public Base2 {    //定义派生类Derived
public:    //新增外部接口
    int var;
    void fun() { cout << "Member of Derived" << endl; }
};

int main() {    //程序主函数
    Derived d;    //定义Derived类对象d
    d.var0 = 2;    //直接访问虚基类的数据成员
    d.fun0();    //直接访问虚基类的函数成员
    if(&d.Base1::var0==&d.Base2::var0)
        cout<<"true"<

9-2.教材习题7_15:下面的程序能得到预期的结果吗?
【问题描述】
下面的程序能得到预期的结果吗?如何避免类似问题的发生?
请修改程序,使它得到我们想要的结果。即希望两个输出的值相同。
提示:struct在C++中也可以用来定义类,它与class的不同在于struct定义的类成员的默认访问权限是public。

#include
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;};
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    void *pv = pd;
    Base2 *pb=static_cast(pv);
    cout<y<<" "<y<     delete pd;
    return 0;
}

【输入形式】

【输出形式】
2 2

#include 
using namespace std;
struct Base1 {int x;};
struct Base2 {float y;}
struct Derived : Base1,Base2{};
int main()
{
    Derived *pd=new Derived;
    pd->x=1;pd->y=2.0f;
    Derived *pv = pd;
    Base2 *pb=static_cast(pv);
    cout<y<<" "<y<

9-3.教材习题7_11:基类BaseClass派生出类DerivedClass
【问题描述】
定义一个基类BaseClass,从它派生出类DerivedClass。BaseClass有成员函数fn1(),fn2(),DerivedClass也有成员函数fn1(),fn2()。在主函数中声明一个DerivedClass的对象,分别用DerivedClass的对象以及BaseClass和DerivedClass的指针来调用fn1(),fn2(),观察运行结果。

主函数如下:
int main()
{
    DerivedClass dc;
    BaseClass *pb = &dc;
    DerivedClass *pd = &dc;
    dc.fn1();
    dc.fn2();
    pb->fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}


【输入形式】

【输出形式】
程序的输出结果为:
DerivedClass:fn1()
DerivedClass:fn2()
BaseClass:fn1()
BaseClass:fn2()
DerivedClass:fn1()
DerivedClass:fn2()

#include 
using namespace std;
class BaseClass{
public:
void fn1(){
cout<<"BaseClass:fn1()"<fn1();
    pb->fn2();
    pd->fn1();
    pd->fn2();
}

10-1.录入程序分析结果
【问题描述】
输入以下程序,分析运行结果

#include 
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<

【输入形式】

【输出形式】
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4

10-2.修改下面的4个类,添加析构函数
【问题描述】
修改下面的4个类,添加析构函数,在析构函数中输出各私有数据成员的值。并分析结果。
修改后程序的输出结果为:
Constructing B2.2
Constructing B1.1
Constructing B3.3
Constructing A.4
1
2
4
Destructing A.4
Destructing B3.3
Destructing B1.1
Destructing B2.2


待修改的程序源代码如下:

#include 
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<
#include 
using namespace std;
class B1
{
public:
    B1(int i)
    {
        b1 = i;
        cout<<"Constructing B1."<

10-3.定义一个员工类、经理类、销售员类和销售经理类
【问题描述】
定义一个员工类Employee,有数据成员姓名,编号。定义一个销售员继承自员工类Sales,工资为销售额的提成10%,定义一个经理类Manager,固定工资8000,定义一个销售经理类,继承自销售员类和经理类,工资为固定工资5000加销售额的提成5%。每个类均有display()函数输出信息,编写主函数测试。主函数中定义一个销售经理对象,销售额为100000,输出信息。

【输入形式】
程序参考的输入(第一行为提示文字):
Input id name and sale:
M001 zhangsan 100000

【输出形式】
程序参考的输出结果如下:
ID:M001
Name:zhangsan
Salary:10000

#include 
using namespace std;
class Employee
{
public:
    Employee(string id,string name):id(id),name(name)
    {}
    void display()
    {
        cout<<"ID:"<>id>>name>>sale;
    if(sale<0)
    {
        cout<<"Input Error!"<

你可能感兴趣的:(面向对象程序设计C++练习题(1))