МУ_ДЗ_2014 (Методические указания к лабораторным работам), страница 33
Описание файла
Файл "МУ_ДЗ_2014" внутри архива находится в папке "Методические указания к лабораторным работам". Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.
Онлайн просмотр документа "МУ_ДЗ_2014"
Текст 33 страницы из документа "МУ_ДЗ_2014"
};
//////////////////////////
// Класс улиц 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*
// дружественная функция для операции сложения улиц
/////////////////////
Street & operator +( Street & X , Street & Y )
{
Street *pTemp = new Street;
pTemp->name = new char[strlen(X.name) + strlen(Y.name) + 5 ];
if (X.name != (char *)NULL )
{ strcpy_s(pTemp->name, strlen(X.name) + 1, X.name);}
else
pTemp->name[0]='\0';
if (Y.name != (char *)NULL )
{ strcat_s(pTemp->name, strlen(X.name) + strlen(Y.name) + 5 , " + ");
strcat_s(pTemp->name, strlen(X.name) + strlen(Y.name) + 5 , Y.name); }
// Name_Street
pTemp->Name_Street = new char[strlen(X.Name_Street) + strlen(Y.Name_Street) + 5];
if (X.Name_Street != (char *)NULL )
{ strcpy_s(pTemp->Name_Street, strlen(X.Name_Street) + 1 , X.Name_Street);}
else
pTemp->Name_Street[0]='\0';
if (Y.Name_Street != (char *)NULL )
{
strcat_s(pTemp->Name_Street,strlen(X.Name_Street) + strlen(Y.Name_Street) + 5 ," + ");
strcat_s(pTemp->Name_Street,strlen(X.Name_Street) + strlen(Y.Name_Street) + 5 ,Y.Name_Street);
};
// Параметры Street
pTemp->Homes_num = NULL;
pTemp->NumberStreet = X.NumberStreet;
pTemp->Remont = (X.GetRemont() || Y.GetRemont()) ? true : false; // для домов
pTemp->RemontStreet = (X.RemontStreet || Y.RemontStreet) ? true : false; ;
pTemp->StrType = ( X.StrType == two || Y.StrType == two) ? two : one ;
pTemp->ListOfNear = (Street * )NULL; // резерв, нужно сложить списки соседних улиц
// Массив
int nRazm = 0;
nRazm = (int ) X.GetCount() ;
for ( int i = 0 ; i < nRazm ; i++)
{
pTemp->Add( ((Home * ) X.GetAt(i)));
};
nRazm = (int ) Y.GetCount() ;
for ( int i = 0 ; i < nRazm ; i++)
{
pTemp->Add( ((Home * ) Y.GetAt(i)));
};
pTemp->Homes_num = (int )(pTemp->GetCount()) ;
return *pTemp;
} ;
////////////////// Класс Street*
// Метод подсчета числа жителей
/////////////////////
int Street::GetNumberMens(){
int Summ = 0;
// Цикл подсчета
int nRazm = 0;
nRazm = (int ) GetCount() ;
for ( int i = 0 ; i < nRazm ; i++)
{
Summ = Summ + ((Home *)GetAt( i))->MenCount ;
};
return Summ;
};
////////////////// Класс Street*
// Метод подсчета числа квартир
/////////////////////
int Street::GetNumberApart(){
int Summ = 0;
int nRazm = 0;
// Цикл подсчета
nRazm = (int ) GetCount() ;
for ( int i = 0 ; i < nRazm ; i++)
{
Summ = Summ + ((Home *)GetAt( i))->NumbApartament ;
};
return Summ;
};
////////////////// Класс Street
// Метод установки названия улицы
/////////////////////
void Street::SetNameStreet(const char * NameStr)
{
if (Name_Street != (char *) NULL)
delete []Name_Street;
if ( NameStr != (char *) NULL )
{
Name_Street= new char[strlen(NameStr) + 1];
strcpy_s(Name_Street , strlen(NameStr) + 1, NameStr);
}
else
Name_Street = (char *) NULL;
return;};
////////////////// Класс Street
// Метод установки имени для поиска улицы
/////////////////////
void Street::SetKeyNameStreet(const char * sName)
{
if (name != (char *) NULL)
delete []name;
if ( sName != (char *) NULL )
{
name= new char[strlen(sName) + 1];
strcpy_s(name , strlen(sName) + 1 , sName);
}
else
Name_Street = (char *) NULL;
return;};
////////////////////////
Модуль - DZ_Array.cpp (для массивов)
// DZ_Array.cpp
// Главный модуль проекта для отладки и сдачи системы классов (база списки)
#include "stdafx.h"
#include "DZ_Class.h"
#include <iostream>
using namespace std;
///////////////////////////////// Для ПМИ
//int mainMETOD() // Эту строку нужно раскомментировать, а следующую закоментировать
// при подключении отладочного варианта текста программы (и наоборот для методики испытаний)
int main(void)
{
int iPunkt;
system (" chcp 1251>nul ");
while ( true ) {
system (" CLS ");
cout << endl << "Меню тестового примера системы классов улиц." << endl << endl;
// Новое меню