МУ_ДЗ_2014 (1079920), страница 38
Текст из файла (страница 38)
for ( int i = 0 ; i < nRazm ; i++)
{
if (((Home * ) GetAt(pos))->HomeRemont ) Flag = true ; // Хотя бы одна требует ремонта
GetNext( pos );
};
return Flag;
};
////////////////// Класс Street*
// Метод добавления дома на улицу (выбор варианта добавления)
//////////////////////
void Street::add(Home *pH , TypeAddDel t , int Numb , TypeAddDel tcr ) {
//
if ( t == tail) AddTail((CObject *) pH);
if ( t == head) AddHead((CObject *) pH);
// Добавление по номеру
if ( t == Number)
{
if( GetCount() < Numb )
{ cout << endl << "Добавление невозможно, проверьте номер!" << endl;
return; };
int nRazm = (int ) GetCount() ;
POSITION pos = GetHeadPosition();
for ( int i = 0 ; i < Numb ; i++)
{
// Навигация по списку
GetNext( pos );
};
InsertAfter (pos , (CObject *) pH);
};
// Запомним число домов на улице
Homes_num = (int) GetCount() ;
} ;
////////////////// Класс Street*!!!!!!!!!!!!!!!!!
// Метод удаления дома с улицы (выбор варианта удаления)
/////////////////////
void Street::del( TypeAddDel t , int Numb , TypeAddDel tdl) {
if ( t == head) RemoveHead();
if ( t == tail) RemoveTail();
// Удаление по номеру
if ( t == Number)
{
if( GetCount() < Numb )
{ cout << endl << "Удаление невозможно, проверьте номер!" << endl;
return; };
int nRazm = (int ) GetCount() ;
POSITION pos = GetHeadPosition();
for ( int i = 0 ; i < Numb ; i++)
{
// Навигация по списку
GetNext( pos );
};
RemoveAt (pos );
};
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() ;
POSITION pos = X.GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
// Добавить на улицу
pTemp->AddTail( ((Home * ) X.GetAt(pos)));
X.GetNext( pos );
};
// Второй список
nRazm = (int ) Y.GetCount() ;
pos = Y.GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
// Добавить на улицу
pTemp->AddTail( ((Home * )Y.GetAt(pos)));
Y.GetNext( pos ); };
pTemp->Homes_num = (int )(pTemp->GetCount()) ;
return *pTemp;
} ;
////////////////// Класс Street*!!!!!!!!!!!!!!!!!
// Метод подсчета числа жителей
/////////////////////
int Street::GetNumberMens(){
int Summ = 0;
// Цикл
int nRazm = 0;
nRazm = (int ) GetCount() ;
POSITION pos = GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
Summ = Summ + ((Home *)GetAt( pos))->MenCount ;
GetNext( pos );
};
return Summ;
};
////////////////// Класс Street*!!!!!!!!!!!!!!
// Метод подсчета числа квартир
/////////////////////
int Street::GetNumberApart(){
int Summ = 0;
int nRazm = 0;
nRazm = (int ) GetCount() ;
POSITION pos = GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
Summ = Summ + ((Home *)GetAt( pos))->NumbApartament ;
GetNext( pos );
};
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_List.cpp (для списков)
// DZ_List.cpp
// Главный модуль проекта для отладки и сдачи системы классов (вариант списки)
#include "stdafx.h"
#include "DZ_Class.h"
#include <iostream>
using namespace std;
int main(void)
//int mainMETOD()
{
int iPunkt;
system (" chcp 1251>nul ");
while ( true ) {
system (" CLS ");
cout << endl << "Меню тестового примера системы классов улиц." << endl << endl;
// Новое меню
cout << endl << "1. ТЗ - 5.1.1 Создание улиц с домами " << endl;
cout << "2. ТЗ - 5.1.2 Создание объектов для домов улицы " << endl;
cout << "3. ТЗ - 5.1.3 Создание объектов для домов улицы на основе других " << endl;
cout << "4. ТЗ - 5.1.4 Учет свойств дома(см. ТЗ) " << endl;
cout << "5. ТЗ - 5.1.5 Задание и получение характеристик дома " << endl;
cout << "6. ТЗ - 5.1.6 Сложение двух домов " << endl;
cout << "7. ТЗ - 5.1.7 Перегрузить оператор присваивания для домов " << endl;
cout << "8. ТЗ - 5.1.8 Распечатка характеристик дома " << endl;
cout << "9. ТЗ - 5.1.9 Учет свойств улицы(см. ТЗ) " << endl;
cout << "10. ТЗ - 5.1.10 Распечатка содержания улицы и ее свойств " << endl;
cout << "11. ТЗ - 5.1.11 Задание характеристик улицы " << endl;
cout << "12. ТЗ - 5.1.12 Получение характеристик улицы " << endl;
cout << "13. ТЗ - 5.1.13 Сложение двух улиц " << endl;
cout << "14. ТЗ - 5.1.14 Добавление дома на улицу " << endl;
cout << "15. ТЗ - 5.1.15 Удаление дома с улицы " << endl;
cout << "16. ТЗ - 5.1.16 Установка и снятие признака ремонта улицы " << endl;
cout << "17. ТЗ - 5.1.17 Автоматическое получение признака ремонта домов улицы " << endl;
cout << "18. ТЗ - 5.1.18 Перегрузка оператора присваивания для улиц " << endl;
cout << endl << "0.Выход " << endl;
// system (" pause ");
cin >> iPunkt;
// cout << "Ввели - " << iPunkt<< endl;
switch(iPunkt )
{
////////////////////
case 1:
cout << endl << "ТЗ - 5.1.1 Создание улиц с домами " << endl;
{
Street S1("Ленинский проспект");
S1.printOn(cout);
Home H1("Жилой","д.2", 7,2,3, fast , 5);
Home H2("Магазин", "д.3", 3);
Home H3("ДЭЗ", "д.4а", 4,2);
S1.add(&H1);
S1.add(&H2);
S1.add(&H3);
S1.printOn(cout);
}
system (" pause ");
system (" pause ");
break;
///
case 2:
cout << "5.1.2 Создание объектов для домов улицы " << endl;
{
Home H1;
Home H2("Жилой","д.2");
Home H3("Жилой", "д.3", 3);
Home H4("Жилой", "д.4а", 4,2);
Home H5("ДЭЗ", "д.5", 5,2,3);
Home H6("Жилой", "д.6", 6,2,3, fast);
Home H7("Магазин", "д.7", 7,2,3, multiple , 5);
H1.printOn(cout);
H2.printOn(cout);
system (" pause ");
H3.printOn(cout);
H4.printOn(cout);
system (" pause ");
H5.printOn(cout);
H6.printOn(cout);
system (" pause ");
H7.printOn(cout);
}
system (" pause ");
break;
///
case 3:
cout << "5.1.3 Создание объектов для домов улицы на основе других " << endl;
{
Home H6("Жилой", "д.6", 6,2,3, fast, 100);
Home H7("Магазин", "д.7", 7,2,3, multiple , 5);
Home Test(H6);
H6.printOn(cout);
Test.printOn(cout);
system (" pause ");
system (" pause ");
cout << "Указатель!!! " << endl;
Home *pHome = new Home (H7);
H7.printOn(cout);
pHome->printOn(cout);
delete pHome;
}
system (" pause ");
break;
//
case 4:
cout << "5.1.4 Учет свойств дома(см. ТЗ) " << endl;
{
Home H6("Жилой", "д.6", 6,2,3, fast, 100);
H6.printOn(cout);
Home H7("Магазин", "д.7", 7,2,3, multiple , 5);
H7.printOn(cout);
}
system (" pause ");
system (" pause ");
break;
//
case 5:
cout << "5.1.5 Задание и получение характеристик дома " << endl;
{
Home H6("Жилой", "д.6", 6,2,3, fast, 100);
H6.printOn(cout);
int iH, Etag , Men , Apart ;
HomeType Type;
// Получение
H6.getParam(iH , Etag, Men, Type , Apart);
cout << "Номер -" << iH <<
" Этажей -" << Etag << " Жителей -" << Men << endl;
if (Type == fast)
cout << "Тип дома - простой ";
if (Type == multiple)
cout << "Тип дома - много строений ";
if (Type == complex)
cout << "Тип дома - сложный ";
cout << " Число квартир - " << Apart << endl;
H6.setParam( 11,12,13,fast, 15 );
H6.printOn(cout);
system (" pause ");
system (" pause ");
// Задание
cout << "Признак ремонта!!! " << endl;
Home H7("Магазин", "д.7", 7,2,3, multiple , 5);
H7.printOn(cout);
H7.setAllParam("Аптека", "10/8", 1,2,3,fast, 5 , true);
H7.printOn(cout);
}
system (" pause ");
break;
//
case 6:
cout << "5.1.6 Сложение двух домов " << endl;
{
Home H1("Жилой", "д.6", 6,2,3, fast , 3);
Home H2("Ашан", "д.7", 9,10,11, multiple , 5);
Home Temp;
Temp = H1 + H2;