Листинг_DZ(VS)_2014 (Методические указания к лабораторным работам), страница 7
Описание файла
Файл "Листинг_DZ(VS)_2014" внутри архива находится в следующих папках: Методические указания к лабораторным работам, ЛР_15_КЛР_ПКШ. Документ из архива "Методические указания к лабораторным работам", который расположен в категории "". Всё это находится в предмете "программирование на основе классов и шаблонов" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "книги и методические указания", в предмете "программирование на основе классов и шаблонов" в общих файлах.
Онлайн просмотр документа "Листинг_DZ(VS)_2014"
Текст 7 страницы из документа "Листинг_DZ(VS)_2014"
ListOfNear = S.ListOfNear;
// Цикл формирования новой улицы
int nRazm = 0;
nRazm = (int ) S.GetCount() ;
// !!! Для LIST!!!
POSITION pos = S.GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
// !!! Для LIST!!!
AddTail( ((Home * ) S.GetAt(pos)));
S.GetNext( pos );
};
///
};
////////////////////////
// Методы класса 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;
// Цикл просмотра списка
POSITION pos = GetHeadPosition();
//
for ( int i = 0 ; i < nRazm ; i++)
{
((Home *)(GetAt( pos )))->printOn(out);
GetNext( pos );
}
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() ;
// Цикл добавления в списке!
POSITION pos = S.GetHeadPosition();
for ( int i = 0 ; i < nRazm ; i++)
{
AddTail( ((Home * ) S.GetAt(pos)));
S.GetNext( pos );
};
return *this;
};
////////////////// Класс Street*
// Метод вычисления необходимости ремонта домов улицы
/////////////////////
// HomeRemont
BOOL Street::GetRemont(){
BOOL Flag = false;
int nRazm = 0;
nRazm = (int ) GetCount() ;
POSITION pos = GetHeadPosition();
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;