Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
79
Добавлен:
10.12.2013
Размер:
58.88 Кб
Скачать

Министерство образования Российской Федерации

Пермский Государственный Технический Университет

Кафедра ИТАС

Отчёт по лабораторной работе №2

По дисциплине «Алгоритмические языки программирования»

Тема: «Наследование и виртуальные функции»

Вариант №5

Выполнил: Студент

группы АСУ 04-2

Заколодкин К.А.

Проверил: Ноткин А.М.

Пермь 2005

Постановка задачи:

1. Определить иерархию классов.

2. Определить в классе статическую компоненту - указатель на начало связанного списка объектов и статическую функцию для просмотра списка.

3. Реализовать классы.

4. Написать демонстрационную программу, в которой создаются объекты различных классов и помещаются в список, после чего список просматривается.

5. Сделать соответствующие методы не виртуальными и посмотреть, что будет.

6. Реализовать вариант, когда объект добавляется в список при создании, т.е. в конструкторе

Иерархия классов:

Определение класса:

//class.h

#ifndef CLASS

#define CLASS

//-------------------------------------------------------------------------------

void Rus(char *);

//-------------------------------------------------------------------------------

class Org

{

private:

protected:

char name[20];

int kol_sotr;

static Org* Beg;

public:

Org* next;

static void Print();

Org ();

Org (char* ,int);

Org (const Org&);

~Org();

virtual void Show ()=0;

virtual void Add()=0;

};

//-------------------------------------------------------------------------------

class StrCom: public Org

{

private:

int kol_zastr;

protected:

public:

StrCom();

StrCom(char*,int,int);

StrCom(const StrCom&);

~StrCom();

void Show();

void Add();

};

//-------------------------------------------------------------------------------

class Zavod: public Org

{

private:

int kol_stan;

protected:

public:

Zavod ();

Zavod(char*,int,int);

Zavod(const Zavod&);

~Zavod();

void Show();

void Add();

};

//-------------------------------------------------------------------------------

class SudCom: public Org

{

private:

int kol_kor;

protected:

public:

SudCom();

SudCom(char*, int, int);

SudCom(const SudCom&);

~SudCom();

void Show();

void Add();

};

//-------------------------------------------------------------------------------

#endif

Реализации:

#include <iostream.h>

#include<string.h>

#include "class.h"

//-------------------------------------------------------------------------------

Org::Org()

{

strcpy(name,"Нет Имени");

kol_sotr=0;

next=0;

}

//-------------------------------------------------------------------------------

Org::Org(char* Name,int Kol_sotr)

{

strcpy(name,Name);

kol_sotr=Kol_sotr;

next=0;

}

//-------------------------------------------------------------------------------

Org::Org(const Org& org)

{

strcpy(name,org.name);

kol_sotr=org.kol_sotr;

next=org.next;

}

//-------------------------------------------------------------------------------

Org::~Org()

{}

//-------------------------------------------------------------------------------

StrCom::StrCom():Org()

{ kol_zastr=0;}

//-------------------------------------------------------------------------------

StrCom::StrCom(char* Name,int Kol_sotr,int Kol_zastr):Org(Name,Kol_sotr)

{ kol_zastr=Kol_zastr;}

//-------------------------------------------------------------------------------

StrCom::StrCom(const StrCom& str)

{ kol_zastr=str.kol_zastr;}

//-------------------------------------------------------------------------------

StrCom::~StrCom() {}

//-------------------------------------------------------------------------------

void StrCom::Show()

{

Rus("Строительная компания: ");Rus(name);cout<<endl;

Rus("Кол-во сотрудников: ");cout<<kol_sotr<<endl;

Rus("Кол-во застрахованных: "); cout<<kol_zastr<<endl<<endl;

}

//-------------------------------------------------------------------------------

void StrCom::Add()

{

if (!Beg) Beg=this;

else

{

Org*p=Beg;

while(p->next)

{

p=p->next;

}

if(p!=this) p->next=this;

if(p==this)

{

StrCom*t=new StrCom;

*t=*this;

p->next=t;

}

}

}

//-------------------------------------------------------------------------------

Zavod::Zavod():Org()

{ kol_stan=0;}

//-------------------------------------------------------------------------------

Zavod::Zavod(char* Name,int Kol_sotr,int Kol_stan):Org(Name,Kol_sotr)

{ kol_stan=Kol_stan;}

//-------------------------------------------------------------------------------

Zavod::Zavod(const Zavod& zav)

{ kol_stan=zav.kol_stan;}

//-------------------------------------------------------------------------------

Zavod:: ~ Zavod() {}

//-------------------------------------------------------------------------------

void Zavod::Show()

{

Rus("Завод: ");Rus(name);cout<<endl;

Rus("Кол-во сотрудников: ");cout<<kol_sotr<<endl;

Rus("Кол-во Станков: "); cout<<kol_stan<<endl<<endl;

}

//-------------------------------------------------------------------------------

void Zavod::Add()

{ if (!Beg) Beg=this;

else

{

Org*p=Beg;

while(p->next)

{

p=p->next;

}

if(p!=this) p->next=this;

if(p==this)

{

Zavod*t=new Zavod;

*t=*this;

p->next=t;

}

}

}

//-------------------------------------------------------------------------------

SudCom::SudCom():Org()

{

kol_kor=0;

}

//-------------------------------------------------------------------------------

SudCom::SudCom(char* Name,int Kol_sotr,int Kol_kor):Org(Name,Kol_sotr)

{

kol_kor=Kol_kor;

}

//-------------------------------------------------------------------------------

SudCom::SudCom(const SudCom& sud)

{

kol_kor=sud.kol_kor;

}

//-------------------------------------------------------------------------------

SudCom::~SudCom() {}

//-------------------------------------------------------------------------------

void SudCom::Show()

{

Rus("Судостроительная компания: ");Rus(name);cout<<endl;

Rus("Кол-во сотрудников: ");cout<<kol_sotr<<endl;

Rus("Кол-во кораблей: "); cout<<kol_kor<<endl<<endl;

}

//-------------------------------------------------------------------------------

void SudCom::Add()

{

if (!Beg) Beg=this;

else

{

Org*p=Beg;

while(p->next)

{

p=p->next;

}

if(p!=this) p->next=this;

if(p==this)

{

SudCom*t=new SudCom;

*t=*this;

p->next=t;

}

}

}

//-------------------------------------------------------------------------------

void Rus(char *Str)

{

unsigned char c;

for(int i=0;Str[i]!='\0';i++)

{

c=Str[i];

if(c>127)

{

if(c<240)c-=64;

else c-=16;

}

cout<<c;

}

}

//-------------------------------------------------------------------------------

void Org::Print()

{

Org* p=Beg;

if(!p) {Rus("Список пуст");cout<<endl;}

while (p)

{

p->Show();

p=p->next;

}

}

//-------------------------------------------------------------------------------

Листинг прогпаммы:

#include <iostream.h>

#include "class.h"

#include <string.h>

Org* Org::Beg=0;

void main()

{

StrCom A("РосГосСтрах",100,1234);

Zavod B;

SudCom C("Кораблестой",200,30);

A.Add();

B.Add();

C.Add();

C.Add();

Org::Print();

}

Объяснение необходимости виртуальных функций:

Если бы мы не использовали виртуальные функции, то при работе с указателями (функция Print( ) ) получили бы неверный результат, и усложнилось двойное добавление элемента в список.