Листинг_DZ(VS)_2014 (Методические указания к лабораторным работам), страница 2
Описание файла
Файл "Листинг_DZ(VS)_2014" внутри архива находится в следующих папках: Методические указания к лабораторным работам, ЛР_15_КЛР_ПКШ. Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.
Онлайн просмотр документа "Листинг_DZ(VS)_2014"
Текст 2 страницы из документа "Листинг_DZ(VS)_2014"
};
/////////////////////
// Методы класса Home
/////////////////////
// Метод печати дома
//////////////////
void Home::printOn(ostream & out) {
//
out << "Номер сп. -" <<no ;
if ( name !=(char *)NULL)
{out << " Имя - " << name << endl; }
else
{out << " Имя не задано " << endl; };
//
if ( Home_Number !=(char *)NULL)
out << "Номер сим. -" << Home_Number << endl;
else
{out << " Символьное имя не задано " << endl; };
//
out << " Номер -" << iHome << endl <<
"Этажей -" << EtagCount << " Жителей -" << MenCount << endl;
if (TypeHome == fast)
cout << "Тип дома - простой ";
if (TypeHome == multiple)
cout << "Тип дома - много строений ";
if (TypeHome == complex)
cout << "Тип дома - сложный ";
if ( HomeRemont ) cout << " Требуется ремонт! ";
else cout << " Ремонт не нужен! ";
cout << " Число квартир - " << NumbApartament << endl<< endl;
}
//////////////////////////// Класс Home
// Метод - Установить имя
//////////////////
void Home::setName(const char *HomName , const char *Number){
// Имя из базового класса - резерв для приска
if ( name != NULL)
delete []name;
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name , strlen(HomName) + 1 , HomName); }
else
name = (char *)NULL;
// Имя дома
if ( Home_Number != NULL)
delete []Home_Number;
if ( Number != NULL)
{
Home_Number= new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) + 1 , Number);
}
else
Home_Number = (char *)NULL;
};
//////////////////////////// Класс Home
// Метод - Установить все параметры
//////////////////
void Home::setAllParam(const char *HomName , const char *Number, int iH, int Etag ,
int Men ,HomeType Type, int Apart , BOOL rem)
{
// Имя из базового класса - резерв для приска
if ( name != NULL)
delete []name;
if ( HomName != (char *)NULL )
{name= new char[strlen(HomName) + 1];
strcpy_s(name, strlen(HomName) + 1, HomName); }
else
name = (char *)NULL;
// Имя из базового класса - резерв для приска
if ( Home_Number != NULL)
delete []Home_Number;
if ( Number != NULL)
{
Home_Number= new char[strlen(Number) + 1];
strcpy_s(Home_Number , strlen(Number) + 1, Number) ;
}
else
Home_Number = (char *)NULL;
//
iHome= iH;
EtagCount= Etag;
MenCount= Men;
TypeHome = Type;
NumbApartament = Apart;
HomeRemont = rem;
};
// Методы дружественные - friend
//////////////////////////// Класс Home
// Перегрузка сложения домов
//////////////////
Home & operator +(Home & H1 , Home & H2)
{
Home *pTemp = new Home; // новый объект для сложения
//
pTemp->no = H1.no;
// Имя базового - сумма имен
pTemp->name = new char[strlen(H1.name) + strlen(H2.name)+ 5 ]; // учтем пробелы!
pTemp->name[0]='\0';
if (H1.name != NULL)
strcpy_s(pTemp->name, strlen(H1.name) + 1 , H1.name);
if (H2.name != NULL)
{
strcat_s(pTemp->name, strlen(H1.name) + strlen(H2.name)+ 5 ," + ");
strcat_s(pTemp->name, strlen(H1.name) + strlen(H2.name)+ 5 ,H2.name);
};
// Имя = сумма имен Home_Number
pTemp->Home_Number = new char[strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ];
pTemp->Home_Number[0]='\0';
if (H1.Home_Number != NULL)
strcpy_s(pTemp->Home_Number, strlen( H1.Home_Number ) + 1 , H1.Home_Number);
if (H2.Home_Number != NULL)
{
strcat_s(pTemp->Home_Number,strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ," + ");
strcat_s(pTemp->Home_Number,strlen(H1.Home_Number) + strlen(H2.Home_Number)+ 5 ,H2.Home_Number);
};
// Параметры
pTemp-> iHome = H1.iHome;
pTemp-> EtagCount = H1.EtagCount;
pTemp-> MenCount = H1.MenCount + H2.MenCount;
pTemp-> TypeHome = complex;
pTemp-> NumbApartament = H1.NumbApartament + H2.NumbApartament;
pTemp->HomeRemont = (H1.HomeRemont || H2.HomeRemont ) ? true : false ;
return *pTemp;
};
//////////////////////////
// Класс улиц Street
/////////////////////
//// Конструкторы Street
////////////////// Класс Street
// Конструктор: - Пустые параметры
//////////////////
Street::Street():AbstrStreet() {
// для базового класса
no = NULL;
name = (char *)NULL;
Name_Street = (char *)NULL;
Homes_num = NULL;
StrType = two;
Remont = false;
RemontStreet = false;
NumberStreet = NULL;
ListOfNear = (Street *)NULL;
} ;
////////////////// Класс Street
// Конструктор: Имя улицы (Name_Street) и имя для поиска (name) общие
//////////////////
Street::Street(const char *sName) :AbstrStreet() {
if ( sName != (char *) NULL )
{ name= new char[strlen(sName) + 1];
strcpy_s(name , strlen(sName) + 1 , sName);
Name_Street= new char[strlen(sName) + 1];
strcpy_s(Name_Street , strlen(sName) + 1 , sName); }
else
{
name = (char *)NULL;
Name_Street = (char *)NULL;
};
no = NULL;
Homes_num = NULL;
StrType = two;
Remont = false;
RemontStreet = false;
NumberStreet = NULL;
ListOfNear = (Street *)NULL;
};
////////////////// Класс Street
// Конструктор: Имя улицы и имя для поиска разные
//////////////////
Street::Street(const char *sName , const char *sNumb)
:AbstrStreet(){
// Имя базового для поиска
if ( sNumb != (char *) NULL )
{ name= new char[strlen(sNumb) + 1];
strcpy_s(name , strlen(sNumb) + 1 , sNumb);
}
else
name = (char *)NULL;
// Имя улицы
if ( sName != (char *) NULL )
{
Name_Street= new char[strlen(sName) + 1];
strcpy_s(Name_Street, strlen(sName) + 1 , sName); }
else
Name_Street = (char *)NULL;
//
no = NULL;
Homes_num = NULL;
StrType = two;
Remont = false;
RemontStreet = false;
NumberStreet = NULL;
ListOfNear = (Street *)NULL;
};
////////////////// Класс Street
// Конструктор: Номер для поиска
//////////////////
Street::Street(int Num) {
name = (char *)NULL;
Name_Street = (char *)NULL;
no = Num; // Номер из базового для поиска
Homes_num = NULL;
StrType = two;
Remont = false;
RemontStreet = false;
NumberStreet = Num;
ListOfNear = (Street *)NULL;
};
////////////////// Класс Street
// Конструктор: Имя улицы и номер для происка
//////////////////
Street::Street(const char *sName , int Num) :AbstrStreet() {
// Имя улицы и для поиска
if ( sName != (char *) NULL )
{ name= new char[strlen(sName) + 1];
strcpy_s(name , strlen(sName) + 1, sName);
Name_Street= new char[strlen(sName) + 1];
strcpy_s(Name_Street, strlen(sName) + 1 , sName); }
else
{
name = (char *)NULL;
Name_Street = (char *)NULL;
};
no = Num; // Номер для поиска
Homes_num = NULL;
StrType = two;
Remont = false;
RemontStreet = false;
NumberStreet = Num;
ListOfNear = (Street *)NULL;
};
////////////////// Класс Street*
// Конструктор копирования
//////////////////
Street::Street(Street & S) :AbstrStreet() {
// Имя для поиска
if ( S.name != (char *) NULL )
{ name= new char[strlen(S.name) + 1];
strcpy_s(name , strlen(S.name) + 1, S.name);
}
else
name = (char *)NULL;
// Имя улицы
if ( S.Name_Street != (char *) NULL )
{
Name_Street= new char[strlen(S.Name_Street) + 1];
strcpy_s(Name_Street , strlen(S.Name_Street) + 1 , S.Name_Street); }
else
Name_Street = (char *)NULL;
//
no = S.no;
Homes_num = S.Homes_num;
StrType = S.StrType;
Remont = S.Remont;
RemontStreet = S.RemontStreet;
NumberStreet = S.NumberStreet;
ListOfNear = S.ListOfNear;
// Цикл формирования новой улицы
int nRazm = 0;
nRazm = (int ) S.GetCount() ;
for ( int i = 0 ; i < nRazm ; i++)
{
Add( ((Home * ) S.GetAt(i)));
};
};
////////////////////////
// Методы класса Street
////////////////////////
////////////////// Класс Street*
// Метод печати улицы
/////////////////////
void Street::printOn(ostream & out) {
if ( Name_Street != (char *)NULL )
{ out << "{{{******* "<<endl<<"Улица - "<< Name_Street ; }
else
{out << "Название не задано! "<<endl;};
if ( name != (char *)NULL )
{ out << " Ключ для поиска - "<< name << endl ; }
else
{out << "Ключ не задан! "<<endl;};
out << "Номер улицы - "<< NumberStreet ;
out << " Номер для поиска - "<< no << endl;
out << "Число домов на улице - "<< Homes_num ;
if ( RemontStreet )
out << " Нужен ремонт улицы."<< endl;
else
out << " Улица отремонтирована."<< endl;
if ( GetRemont() )
out << "Нужен ремонт домов улицы."<< endl;
else
out << "Все эти дома отремонтированы."<< endl;
int nRazm = 1;
nRazm = (int ) GetCount() ;
out << "Число в домов на улице = "<< GetCount()<<"}" << endl;
for ( int i = 0 ; i < nRazm ; i++)
{
((Home * ) GetAt(i))->printOn(cout);
}
out << "*******}}}" << endl;
}
////////////////// Класс Street*
/// Перегрузка присваивания для улицы
/////////////////////
Street Street::operator =(Street & S) {
// Имя для поиска
if ( S.name != (char *) NULL )
{ name= new char[strlen(S.name) + 1];
strcpy_s(name , strlen(S.name) + 1, S.name);
}
else
name = (char *)NULL;
// Имя улицы
if ( S.Name_Street != (char *) NULL )
{
Name_Street= new char[strlen(S.Name_Street) + 1];
strcpy_s(Name_Street , strlen(S.Name_Street) + 1 , S.Name_Street); }
else
Name_Street = (char *)NULL;
//
no = S.no;
Homes_num = S.Homes_num;
StrType = S.StrType;
Remont = S.Remont;
RemontStreet = S.RemontStreet;
NumberStreet = S.NumberStreet;
ListOfNear = S.ListOfNear;
int nRazm = 0;
nRazm = (int ) S.GetCount() ;
// Цикл копирования домов
for ( int i = 0 ; i < nRazm ; i++)
{
Add( ((Home * ) S.GetAt(i)));
};
return *this;
};
////////////////// Класс Street*
// Метод вычисления необходимости ремонта домов улицы
/////////////////////
BOOL Street::GetRemont(){
BOOL Flag = false;
/// Цикл проверки ремонта
int nRazm = 0;
nRazm = (int ) GetCount() ;
// Цикл копирования домов
for ( int i = 0 ; i < nRazm ; i++)
{
if (((Home * ) GetAt(i))->HomeRemont ) Flag = true ;
};
return Flag;
};
////////////////// Класс Street*
// Метод добавления дома на улицу (выбор варианта добавления)
/////////////////////
void Street::add(Home *pH , TypeAddDel t , int Numb , TypeAddDel tcr ) {
if ( t == tail) Add((CObject *) pH); // в Хвост
if ( t == head) InsertAt(0,(CObject *) pH); // в Голову
if ( t == Number) InsertAt(Numb,(CObject *) pH); // По номеру
// Подсчитать число домов
Homes_num = (int) GetCount() ;
} ;
////////////////// Класс Street*
// Метод удаления дома с улицы (выбор варианта удаления)
/////////////////////
void Street::del( TypeAddDel t , int Numb , TypeAddDel tdl) {
if ( t == tail) RemoveAt(GetCount() - 1); // Из головы
if ( t == head) RemoveAt(0); // Из хвоста
if ( t == Number) RemoveAt(Numb); // По номеру
// Подсчитать число домов
Homes_num = (int) GetCount() ;
} ;
////////////////// Класс Street*