Программирование / си++ / 2Semestr / Lab_2 / Отчет
.docМинистерство образования Российской Федерации
Пермский Государственный Технический Университет
Кафедра ИТАС
Отчёт по лабораторной работе №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( ) ) получили бы неверный результат, и усложнилось двойное добавление элемента в список.