№ п/п | Наименование файла | Назначение |
1 | Appointment.h | Содержит объявление (интерфейс) класса Appointment (свидание) |
2 | Appointment.cpp | Содержит реализацию класса Appointment, представляющего объект предметной области «свидание». |
3 | Suitor.h | Содержит объявление (интерфейс) класса Suitor (поклонник) |
4 | Suitor.cpp | Содержит реализацию класса Suitor, представляющего объект предметной области «поклонник» |
5 | SuitorManager.h | Содержит объявление функций, реализующих логику взаимодействия объектов предметной области: обработку списка поклонников. |
6 | SuitorManager.cpp | Содержит определение функций, реализующих логику взаимодействия объектов предметной области: обработку списка поклонников. |
7 | Console_interface.h | Содержит объявление функций, реализующих интерфейс взаимодействия с пользователем |
8 | Console_interface.cpp | Содержит определение функций, реализующих интерфейс взаимодействия с пользователем |
9 | POLLY_LAB_№2.cpp | Содержит описание главной функции программы |
На рисунке 27 представлена диаграмма зависимости модулей программного проекта друг от друга.
|
|
Рис. 27. Диаграмма зависимостей модулей программного проекта
Прямоугольниками со сплошной границей на рисунке 27 обозначены исходные файлы, прямоугольниками с пунктирной границей – заголовочные. Стрелками обозначен факт подключения одного модуля к другому. Модуль, от которого исходит стрелка, подключается директивой #include к модулю, к которому стрелка направлена.
Все объявления, которые содержит заголовочный файл, становятся доступными в тех модулях, к которым он подключен. Объявления, описанные в файле Application.h, становятся доступными в модуле Suitor.h, к которому он подключается явно при помощи директивы #include <Application.h>. Опосредовано, через файл Suitor.h, объявления файла Application.h становятся доступными во всех модулях, к которым он подключается. Console_interface.cpp «знает» о все[ модулях, подключенных к нему опосредованно через прямое подключение файла Console_interface.h.
//-------------------------------------------------------------------------------------------
// файл Appointment.h с определением интерфейса класса Appointment
//-------------------------------------------------------------------------------------------
#pragma once // защита от повторного включения заголовочного файла
#include <string> // для строк
#include <sstream> // для wostringstream
#include <iomanip> // для setw()
using namespace std; // стандартное пространство имен
class Appointment
{
public:
Appointment();
Appointment(wstring date, wstring time, wstring duration);
Appointment(wstring date, wstring time, wstring duration,
int mark);
Appointment(const Appointment& app);
~Appointment();
|
|
// чтение закрытых полей
wstring GetDate() const; // получить дату
wstring GetTime() const; // получить время
wstring GetDuration() const; // получить продолжительность
int GetMark() const; // получить оценочный балл
// запись в закрытые поля, доступные по смыслу задачи
void SetDate(wstring date); // задать дату
void SetTime(wstring time); // задать время
void SetDuration(wstring duration); // задать продолжительность
void SetMark(int mark); // задать оценочный балл
wstring ToString(bool IsFull = false);
private: //закрытые поля класса
wstring _date; // дата свидания
wstring _time; // время свидания
wstring _duration; // продолжительность свидания
int _mark; // оценочный балл по результатам свидания
};
//-------------------------------------------------------------------------------------------
// файл Appointment.cpp с реализацией методов класса Appointment
//-------------------------------------------------------------------------------------------
#include "StdAfx.h"
#include "Appointment.h"
//-------------------------------------------------------------------------------------------
// конструктор по умолчанию: поля инициализируются значениями,
// принятыми по умолчанию для системных типов данных wstring и int;
// если конструктор по умолчанию не реализовывать явно, он все равно
// будет создан компилятором автоматически, при этом
// для инкапсулированных полей автоматически будут
// вызываться соответствующие их типам конструкторы по умолчанию
Appointment::Appointment():_date(), _time(), _duration(), _mark()
{}
// конструктор инициализации
// для полей явно вызываются контрукторы инициализации
// соответствующих системных типов
Appointment::Appointment(wstring date, wstring time, wstring duration):
date(date),
_time(time),
_duration(duration),
_mark()
{}
// конструктор инициализации: так как оценочный бал выставляется
// по пятибалльной шкале, поле оценки инициализируется значением
// параметра только в том случае, если он находится в диапазоне от 0-5;
// иначе поле оценки инициализируется значением по умолчанию
Appointment::Appointment(wstring date, wstring time,
wstring duration, int mark):
_date(date),
_time(time),
_duration(duration),
_mark()
{
if (mark>=0 && mark<=5) _mark = mark;
}
// так как все поля данного класса по времени создания статические,
// конструктор копирования можно было бы не реализовывать;
// тогда при создании нового объекта на основе существующего,
// приведенный ниже код (присваивание значений полей
// объекта-параметра соответствующим полям создаваемого объекта)
// автоматически генерировался бы на этапе компиляции
Appointment::Appointment(const Appointment& app)
{
_date = app._date;
_time = app._time;
_duration = app._duration;
_mark = app._mark;
}
// деструктор: для полей вызываются деструкторы системных типов;
// в данном случае деструктор также можно было бы не реализовывать,
// так как все поля являются статическими по времени создания полями
// системных типов, для которых реализованы корректные деструкторы
|
|
// при уничтожении объекта, уничтожаются его поля, соответственно
// системные деструкторы для них будут вызваны автоматически.
Appointment::~Appointment() // деструктор
{
_date.~basic_string();
_time.~basic_string();
_duration.~basic_string();
}
//-------------------------------------------------------------------------------------------
// чтение/запись значений закрытых полей
wstring Appointment::GetDate() const
{ return _date; }
wstring Appointment::GetTime() const
{ return _time; }
wstring Appointment::GetDuration() const
{ return _duration; }
int Appointment::GetMark() const
{ return _mark; }
void Appointment::SetDate(wstring date)
{ _date = date; }
void Appointment::SetTime(wstring time)
{ _time = time; }
void Appointment::SetDuration(wstring duration)
{ _duration = duration; }
void Appointment::SetMark(int mark)
{
if (mark>=0 && mark<=5) _mark = mark;
}
//-------------------------------------------------------------------------------------------
wstring Appointment::ToString(bool IsFull)
{
wostringstream os;
if (!IsFull)
{
os << setw(12) << _date << setw(10) << _time <<
setw(10) << _duration << setw(8) <<_mark;
}
else
{
os<<L"Дата и время проведения свидания..."<<endl;
os<<L"Дата: "<<_date<<endl;
os<<L"Время: "<<_time<<endl;
os<<L"Продолжительность: "<<_duration<<endl;
os<<L"Выставленная оценка: "<<_mark<<endl;;
}
if (os) return os.str();
return wstring();
}
//-------------------------------------------------------------------------------------------
// файл Suitor.h с определением интерфейса класса Suitor
//-------------------------------------------------------------------------------------------
#pragma once // защита от повторного включения заголовочного файла
#include <string> // включаем описание класса string
#include <sstream> // для строковых потоков (wstringstream)
#include <iomanip> // для setw()
#include "Appointment.h" // включаем файл с описанием класса Appointment
using namespace std; // включение стандартного пространства имен
class Suitor
{
public: // открытые методы и поля класса
|
|
Suitor();
Suitor(wstring surname, wstring name, int height, int weight,
wstring phoneNumber);
Suitor(const Suitor& suitor);
~Suitor(); // деструктор
// метод, создающий копию объекта класса Suitor
void CopyFrom(const Suitor& suitor);
// чтение закрытых полей
int GetId() const; // получить Id поклонника
wstring GetSurname() const; // получить фамилию
wstring GetName() const; // получить имя
int GetHeight() const; // получить вес
int GetWeight() const; // получить рост
wstring GetPhoneNumber() const; // получить номер телефона
// запись в закрытые поля, доступные по смыслу задачи
void SetSurname(wstring surname); // изменить фамилию
void SetName(wstring name); // изменить имя
void SetHeight(int height); // изменить рост
void SetWeight(int weight); // изменить вес
// изменить номер телефона
void SetPhoneNumber(wstring phoneNumber);
//-------------------------------------------------------------------------------------------
// работа со списком свиданий
// добавить свидание в список
void AddAppointment(const Appointment& app);
// удалить свидание из списка по дате и времени проведения
bool DeleteAppointment(wstring date, wstring time);
// получить количество свиданий
int GetAppointmentsCount() const;
// поиск свидания по дате и времени проведения
Appointment FindAppointment(wstring date, wstring time) const;
// получить свидание по индексу в списке
Appointment FindAppointment(int idx) const;
//-------------------------------------------------------------------------------------------
static const int MAX_WEIGHT = 500; //ограничение на рост
static const int MAX_HEIGHT = 300; //ограничение на вес
wstring ToString(bool IsFull = false) const;
//-------------------------------------------------------------------------------------------
private: // закрытые методы и поля
// генерация следующего уникального значения Id
int _getUniqueId();
int _id; // уникальный идентификационный номер поклонника
wstring _surname; // фамилия поклонника
wstring _name; // имя поклонника
int _height; // рост поклонника
int _weight; // вес поклонника
wstring _phoneNumber; // номер телефона
Appointment* _arrayList; // список свиданий
int _countInList; // число свиданий в списке
};
//-------------------------------------------------------------------------------------------
// файл Suitor.cpp с реализацией методов класса Suitor
//-------------------------------------------------------------------------------------------
#include "StdAfx.h"
#include "Suitor.h"
//-------------------------------------------------------------------------------------------
// данный метод является вспомогательным и предназначен для того,
// чтобы упростить назначение поклонникам Id
// при формировании временного (в пределах исполнения программы)
// демонстрационного списка объектов класса Suitor
int Suitor::_getUniqueId()
{
// при первом (и только при первом) после запуска программы
// обращении к данному методу
// статическое поле ID инициализируется нулевым значением,
static int ID = 0;
// при первом и каждом последующем вызове данного метода
// статическое поле наращивает значение на единицу
return ID++;
}
Suitor::Suitor()// конструктор по умолчанию
{
// автоматическое формирование и назначение уникального Id
_id = _getUniqueId();
// инициализация пустого списка свиданий;
// если в конструкторе не инициализировать
// указатель на список свиданий нулевым значением явно,
// то ему автоматически бцдет присвоено случайное значение;
// может возникнуть ошибка, если поклоннику не будет
// назначено ни одного свидания, и будет предпринята попытка
// освободить память по данному случайному адресу
// (при вызове деструктора, например)
_arrayList = 0;
_countInList = 0;
}
// конструктор инициализации
Suitor::Suitor(wstring surname, wstring name, int height, int weight,
wstring phoneNumber): _surname(surname),
_name(name),
_phoneNumber(phoneNumber)
{
_id = _getUniqueId(); // формирование и назначение Id
if (height > 0 && height < MAX_HEIGHT) _height = height;
else _height = 0;
if (weight > 0 && weight < MAX_WEIGHT) _weight = weight;
else _weight = 0;
_countInList = 0; // инициализация пустого списка свиданий
_arrayList = 0;
}
Suitor::Suitor(const Suitor& suitor) // конструктор копирования
{
// копируются статические (по времени создания) поля
_name = suitor._name;
_surname = suitor._surname;
_height = suitor._height;
_weight = suitor._weight;
_phoneNumber = suitor._phoneNumber;
_countInList = suitor._countInList;
_id = suitor._id;
// чтобы исключить возникновение висячей ссылки
// (когда два указателя ссылаются на одну область памяти),
// в памяти создается копия списка свиданий, на которую
// будет ссылаться соответствующее поле текущего объекта
if (_countInList)
{
_arrayList = new Appointment[_countInList];
for (int i=0;i<_countInList;i++)
_arrayList[i] = suitor._arrayList[i];
}
else _arrayList = 0;
}
//создание копии объекта (вместо оператора приваивания)
void Suitor::CopyFrom(const Suitor& suitor)
{
// так как для представления списка свиданий используется
// динамический массив, то при использовании оператора
// присваивания будет копироваться адрес – значение
// соответствующего указателя; деструктор вызывается,
// чтобы исключить возникновение потерянной ссылки
this->~Suitor();
// копируются статические (по времени создания поля)
_id = suitor._id;
_name = suitor._name;
_surname = suitor._surname;
_height = suitor._height;
_weight = suitor._weight;
_phoneNumber = suitor._phoneNumber;
_countInList = suitor._countInList;
if (_countInList) // создается копия списка свиданий
{
_arrayList = new Appointment[_countInList];
for (int i=0;i<_countInList;i++)
_arrayList[i] = suitor._arrayList[i];
}
else _arrayList = 0;
}
Suitor::~Suitor()// деструктор
{
// вызов деструкторов статических (по времени создания)
// полей; если их не вызывать явно, это произойдет
// автоматически
_surname.~basic_string();
_name.~basic_string();
_phoneNumber.~basic_string();
// при реализации деструктора необходимо принудительно
// освобождать память, выделенную под динамические поля
// если их не вызывать явно, возникнет потерянная ссылка
delete[] _arrayList;
}
//-------------------------------------------------------------------------------------------
// чтение закрытых полей
int Suitor::GetId() const
{
return _id;
}
wstring Suitor::GetSurname() const
{
return _surname;
}
wstring Suitor::GetName() const
{
return _name;
}
int Suitor::GetHeight() const
{
return _height;
}
int Suitor::GetWeight() const
{
return _weight;
}
wstring Suitor::GetPhoneNumber() const
{
return _phoneNumber;
}
//-------------------------------------------------------------------------------------------
// запись в закрытые поля, доступные по смыслу задачи
void Suitor::SetSurname(wstring surname)
{
_surname = surname;
}
void Suitor::SetName(wstring name)
{
_name = name;
}
void Suitor::SetHeight(int height)
{
if (height > 0 && height < MAX_HEIGHT) _height = height;
}
void Suitor::SetWeight(int weight)
{
if (weight > 0 && weight < MAX_WEIGHT) _weight = weight;
}
void Suitor::SetPhoneNumber(wstring phoneNumber)
{
_phoneNumber = phoneNumber;
}
//-------------------------------------------------------------------------------------------// работа со списком свиданий
// получить количество назначенных поклоннику свиданий
int Suitor::GetAppointmentsCount() const
{
return _countInList;
}
// поиск свидания по дате и времени проведения
Appointment Suitor::FindAppointment(wstring date, wstring time) const
{
for (int i=0; i<_countInList; i++)
if (_arrayList[i].GetDate() == date &&
_arrayList[i].GetTime() == time)
return _arrayList[i];
return Appointment();
}
// поиск свидания по индексу в списке
Appointment Suitor::FindAppointment(int idx) const
{
if (idx>=0 && idx<_countInList)
return _arrayList[idx];
return Appointment();
}
// добавить свидание в список
void Suitor::AddAppointment(const Appointment &app)
{
Appointment* arr = _arrayList;
_countInList++;
_arrayList = new Appointment[_countInList];
for (int i=0;i<_countInList-1;i++)
_arrayList[i] = arr[i];
_arrayList[_countInList-1] = app;
delete[] arr;
}
// удалить свидание из списка по дате и времени проведения
bool Suitor::DeleteAppointment(wstring date, wstring time)
{
if (!_countInList) return false;
int idx = -1;
for (int i=0; i<_countInList; i++)
if (_arrayList[i].GetDate() == date &&
_arrayList[i].GetTime() == time)
{
idx = i;
break;
}
if (idx == -1) return false;
_countInList--;
Appointment* arr = _arrayList;
_arrayList = new Appointment[_countInList];
for (int i = 0; i < idx; i++)
_arrayList[i] = arr[i];
for (int i = idx; i < _countInList; i++)
_arrayList[i] = arr[i+1];
delete[] arr;
return true;
}
//-------------------------------------------------------------------------------------------
wstring Suitor::ToString(bool IsFull) const
{
wostringstream os;
if (!IsFull)
{
os << setw(4) << _id << setw(10) << _name <<
setw(10) << _surname << setw(5) << _height <<
L" cm" << setw(5) << _weight << L" kg" << setw(7) <<
GetAppointmentsCount() << L":" << setw(9) <<
_phoneNumber;
}
else
{
os << L"Имя: " << GetName() << endl;
os << L"Фамилия: "<<GetSurname() << endl;
os << L"Рост: "<<GetHeight()<<" cm" << endl;
os << L"Вес: "<<GetWeight()<<" kg" << endl;
os << L"Номер телефона: " <<
GetPhoneNumber() << endl;
os << L"Число свиданий: " <<
GetAppointmentsCount() << endl;
}
if (os) return os.str();
else return wstring();
}
//-------------------------------------------------------------------------------------------
// файл SuitorManager.h с объявлением функций,
// реализующихлогику работы со списком поклонников
//-------------------------------------------------------------------------------------------
#pragma once
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
//-------------------------------------------------------------------------------------------
// подключение заголоочных файлов, содержашихобъявления классов,
// реализующих основные сущности предметнойобласти
#include "Appointment.h"
#include "Suitor.h"
//-------------------------------------------------------------------------------------------
using namespace std;
//-------------------------------------------------------------------------------------------
// объяявление внешних (директива extern) глобальных переменных
extern Suitor* SuitorList; // список поклонников (динамический массив)
extern int CountInSuitorList; // количество поклонников в списке
//-------------------------------------------------------------------------------------------
// добавление нового поклонника в глобальный список SuitorList
void AddToSuitorList(const Suitor suitor);
// поиск поклонника в глобальном списке по идентификатору
int FindSuitorById(int id);
// удаление поклонника из SuitorList
bool DeleteFromSuitorList(int id);
//-------------------------------------------------------------------------------------------
// файл SuitorManager.cpp с определением функций,
// реализующихлогику работы со списком поклонников
//-------------------------------------------------------------------------------------------
#pragma once
#include "stdafx.h"
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
#include "SuitorManager.h"
using namespace std;
//-------------------------------------------------------------------------------------------
// инициализация пустого глобального списка поклонников
Suitor* SuitorList = 0; // список поклонников (динамический массив)
int CountInSuitorList = 0; // количество поклонников в списке
//-------------------------------------------------------------------------------------------
// добавление поклонника в список SuitorList
void AddToSuitorList(const Suitor& suitor)
{
Suitor* temp = SuitorList;
CountInSuitorList++;
SuitorList = new Suitor[CountInSuitorList];
for (int i=0;i<CountInSuitorList-1;i++)
SuitorList[i].CopyFrom(temp[i]);
SuitorList[CountInSuitorList-1].CopyFrom(suitor);
delete[] temp;
}
//-------------------------------------------------------------------------------------------
//поиск поклонника в списке SuitorList по номеру Id
int FindSuitorById(int id)
{
int idx = -1;
for (int i=0;i<CountInSuitorList;i++)
if (SuitorList[i].GetId() == id)
{
idx = i;
break;
}
return idx;
}
//-------------------------------------------------------------------------------------------
// удаление поклонника из списка SuitorList
bool DeleteFromSuitorList(int id) // удаление поклонника из SuitorList
{
if (!CountInSuitorList) return false;
int idx = FindSuitorById(id);
if (idx == -1) return false;
CountInSuitorList--;
Suitor* temp = SuitorList;
SuitorList = new Suitor[CountInSuitorList];
for (int i=0;i<idx;i++)
SuitorList[i].CopyFrom(temp[i]);
for (int i=idx;i<CountInSuitorList;i++)
SuitorList[i].CopyFrom(temp[i+1]);
delete[] temp;
return true;
}
//-------------------------------------------------------------------------------------------
// файл Console_interface.h с объявлениями функций,
// реализующих интерфейс взаимодействия с пользователем
//-------------------------------------------------------------------------------------------
#pragma once
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
#include "Appointment.h"
#include "Suitor.h"
#include "SuitorManager.h"
using namespace std;
//-------------------------------------------------------------------------------------------
// определяется тип MenuFunction, который можно использовать
// для того, чтобы объявить указатель на функцию без параметров и
// возвращающую пустое значение
typedef void(*MenuFunction)(void);
const int CountMenuFunctions; // количество функций в меню
//-------------------------------------------------------------------------------------------
// объявление прототипов функций меню (сигнатура всех функций
// соответствует сигнатуре, определенной для типа MenuFunction)
// добавить случайным образом сгенерированных поклонников в список
void AddRandom(void);
// добавить поклонника в список
void AddSuitor(void);
// удалить поклонника из списка
void DeleteSuitor(void);
// изменить характеристики поклонника
void ChangeSuitor(void);
// добавить свидание поклоннику
void AddAppointment(void);
// удалить свидание
void DeleteAppointment(void);
// изменить характеристики свидания
void ChangeAppointment(void);
// вывод списка поклонников в полном виде
void FullInformation(void);
// завершение работы программы
void Exit(void);
//-------------------------------------------------------------------------------------------
// дополнительные функции
void PrintSuitorList(void);
void PrintAppointmentList(int numSuitor);
int SelectNumberOfSuitor(void);
wstring InputDate(void);
wstring InputTime(void);
Suitor InputSuitor(void);
Appointment InputAppointment(void);
wstring GetRandomPhoneNumber();
wstring GetRandomDate(void);
wstring GetRandomTime(void);
wstring GetRandomDuration(void);
//-------------------------------------------------------------------------------------------
// файл Console_interface.cpp с определениями функций,
// реализующих интерфейс взаимодействия с пользователем
//-------------------------------------------------------------------------------------------
#pragma once
#include "stdafx.h"
#include <string>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
#include "Console_interface.h"
using namespace std;
// количество функций, реализующих отдельные пункты главного меню
const int CountMenuFunctions = 9;
// функция, реализующая главное меню диалога с пользователем
void MainMenuFunction(void)
{
// объявление массива указателей на функции
// реализующие отдельные пункты главного меню
MenuFunction Functions[CountMenuFunctions] =
{
&Exit,
&AddRandom,
&AddSuitor,
&DeleteSuitor,
&ChangeSuitor,
&AddAppointment,
&DeleteAppointment,
&ChangeAppointment,
&FullInformation
};
wcout.imbue(locale("rus_rus.866"));
wcin.imbue(locale("rus_rus.866"));
srand((unsigned)time(0));
do
{
int select;
system("cls");
wcout<<L"Привет Полли!!!"<<endl;
wcout<<L"Список поклонников содежит... "<<endl;
PrintSuitorList();
wcout<<endl;
wcout<<L"Чего ты желаешь?"<<endl;
wcout<<L"1 - Добавить в список поклонников."<<endl;
wcout<<L"2 - Добавить поклонника."<<endl;
wcout<<L"3 - Удалить поклонника."<<endl;
wcout<<L"4 – Редактировать поклонника."<<endl;
wcout<<L"5 - Назначить свидание."<<endl;
wcout<<L"6 - Удалить свидание."<<endl;
wcout<<L"7 – Редактировать свидание."<<endl;
wcout<<L"8 - Увидеть подробный отсчет."<<endl;
wcout<<L"0 - Выйти."<<endl;
wcout<<L"Ваш выбор: ";
do
{ // ввод номера интересующего пункта меню
wcin>>select;
}
while (select<0 || select>=CountMenuFunctions);
wcout<<endl;
// Functions – массив указателей на функции меню,
// select – индекс элемента массива, ссылающего на
// функцию, реализующую выбранный пункта меню
(Functions[select])(); // вызов функции через указатель
}
while (true);
}
void AddRandom(void)
{
int count = rand()%5+1;
int prevCount = CountInSuitorList;
wstring Names[10] = { L"Иван", L"Петр", L"Михаил",
L"Евгений", L"Александр", "Кирилл",
L"Василий", L"Станислав", L"Егор", L"Алексей"};
wstring Surnames[10] = { "Иванов", L"Петров", L"Сидоров",
L"Кержаков", L"Сахаров", L"Смолов",
L"Ушаков", L"Лосев", L"Тихонов", L"Титов"};
for (int i=0;i<count;i++)
{
AddToSuitorList(Suitor(Surnames[rand()%10],
Names[rand()%10],
rand()%70+150, rand()%60+50,
GetRandomPhoneNumber()));
int num = rand()%5;
for (int j = 0; j < num; j++)
{
SuitorList[i+prevCount].AddAppointment(
Appointment(GetRandomDate(),
GetRandomTime(),
GetRandomDuration(),
rand()%6));
}
}
wcout<<L"Поклонники были успешно добавлены!"<<endl;
}
//-------------------------------------------------------------------------------------------
void AddSuitor(void)
{
wcout<<L"Добавление поклонника... "<<endl;
Suitor suitor = InputSuitor();
AddToSuitorList(suitor);
wcout<<L"Поклонник успшешно добавлен в список!"<<endl;
}
void DeleteSuitor(void)
{
int id;
wcout<<L"Удаление поклонника... "<<endl;
wcout<<L"Введите ID поклонника: ";
wcin>>id;
if (DeleteFromSuitorList(id))
wcout<<L"Удаление было успешно завершено!"<<endl;
else
wcout<<L"Поклонник c данным Id не найден..."<<endl;
}
//-------------------------------------------------------------------------------------------
void ChangeSuitor(void)
{
int numSuitor = SelectNumberOfSuitor();
if (numSuitor == -1)
{
wcout<<L"Поклонника с таким ID нет..."<<endl;
return;
}
int select;
int wh;
wstring str, numb;
wcout<<SuitorList[numSuitor].ToString(true);
PrintAppointmentList(numSuitor);
wcout<<L"Что вы хотите изменить?"<<endl;
wcout<<L"1 - имя"<<endl;
wcout<<L"2 - фамилию"<<endl;
wcout<<L"3 - рост"<<endl;
wcout<<L"4 - вес"<<endl;
wcout<<L"5 - номер телефона"<<endl;
wcout<<L"0 - отмена"<<endl;
wcout<<L"Ваш выбор: ";
wcin>>select;
switch (select)
{
case 1:
wcout<<L"Введите новое имя: ";
wcin>>str;
SuitorList[numSuitor].SetName(str);
break;
case 2:
wcout<<L"Введите новую фамилию: ";
wcin>>str; SuitorList[numSuitor].SetSurname(str);
break;
case 3:
wcout<<L"Введите новый рост: ";
wcin>>wh;
SuitorList[numSuitor].SetHeight(wh);
break;
case 4:
wcout<<L"Введите новый вес: ";
wcin>>wh;
SuitorList[numSuitor].SetWeight(wh);
break;
case 5:
wcout<<L"Введите новый номер телефона: ";
wcin>>numb;
SuitorList[numSuitor].SetPhoneNumber(numb);
break;
default:
return;
}
wcout<<L"Измения были приняты!"<<endl;
}
void AddAppointment(void)
{
int numSuitor = SelectNumberOfSuitor();
if (numSuitor == -1) return;
wcout<<L"Информация..."<<endl;
wcout<<SuitorList[numSuitor].ToString(true);
PrintAppointmentList(numSuitor);
wcout<<L"Добавление свидания... "<<endl;
Appointment app = InputAppointment();
SuitorList[numSuitor].AddAppointment(app);
wcout<<L"Свидание было успешно добавлено!"<<endl;
}
//-------------------------------------------------------------------------------------------
void DeleteAppointment(void)
{
int numSuitor = SelectNumberOfSuitor();
if (numSuitor == -1) return;
int number = SelectNumberOfAppointment(numSuitor);
if (number == -1) return;
SuitorList[numSuitor].DeleteAppointment(
SuitorList[numSuitor].FindAppointment(
number).GetDate(),
SuitorList[numSuitor].FindAppointment(
number).GetTime()
);
wcout<<L"Удаление было успешно завершено!"<<endl;
}
void ChangeAppointment(void)
{
int numSuitor = SelectNumberOfSuitor();
if (numSuitor == -1) return;
int number = SelectNumberOfAppointment(numSuitor);
if (number == -1) return;
int select;
int mark;
wstring dt, tm;
Appointment temp =
SuitorList[numSuitor].FindAppointment(number);
wcout<<L"Что вы хотите изменить?"<<endl;
wcout<<L"1 - Дату проведения свидания"<<endl;
wcout<<L"2 - Время проведения свидания"<<endl;
wcout<<L"3 - Продолжительность свидания"<<endl;
wcout<<L"4 - Выставленную оценку"<<endl;
wcout<<L"0 - Выйти"<<endl;
wcout<<L"Ваш выбор: ";
wcin>>select;
switch (select)
{
case 1:
wcout<<L"Введите новую дату..."<<endl;
dt = InputDate();
temp.SetDate(dt);
break;
case 2:
wcout<<L"Введите новое время..."<<endl;
tm = InputTime();
temp.SetTime(tm);
break;
case 3:
wcout<<L"Введите продолжительность..."<<endl;
tm = InputTime();
temp.SetDuration(tm);
break;
case 4:
wcout<<L"Введите новую оценку: ";
wcin>>mark;
temp.SetMark(mark);
break;
default:
return;
}
// так как непосредственный доступ к списку свиданий закрыт,
// изменить характеристики одного из его элементов,
// можно только через соответствующие методы класса,
// например, заменив объект со «старыми» значениями полей
// на «новый» объектет с измененными значениями
// удаление «старого» (изменяемого) объекта из списка
SuitorList[numSuitor].DeleteAppointment(
SuitorList[numSuitor].FindAppointment(
number).GetDate(),
SuitorList[numSuitor].FindAppointment(
number).GetTime());
// добавление «нового» (измененного) объекта в список
SuitorList[numSuitor].AddAppointment(temp);
wcout<<L"Изменение характеристик завершено!"<<endl;
}
void FullInformation(void)
{
wcout<<L"/Полная информация/"<<endl; system("pause");
wcout<<L"*************************************"<<endl;
for (int i=0; i<CountInSuitorList; i++)
{
wcout << L"Информация..." << endl;
wcout << SuitorList[i].ToString(true);
PrintAppointmentList(i);
wcout<<L"*******************************"<<endl;
}
}
void Exit(void)
{
int select;
wcout<<L"Вы уверены в том, что хотите выйти?"<<endl;
wcout<<L"1 - да"<<endl;
wcout<<L"0 - отмена"<<endl;
wcout<<L"Ваш выбор: ";
wcin>>select;
if (select) exit(1);
}
//-------------------------------------------------------------------------------------------
void PrintSuitorList(void)
{
if (!CountInSuitorList)
{
wcout << L"Cписок поклонников пуст!" << endl;
return;
}
wcout << setw(4) << L"ID" << setw(10) << L"Имя" <<
setw(10) << L"Фамилия" << setw(8) << L"Рост" << setw(8) <<
L"Вес" << setw(9) << L"Рейтинг" << setw(9) <<
L"Телефон" << endl;
for (int i=0;i<CountInSuitorList;i++)
wcout<<SuitorList[i].ToString()<<endl;
}
//-------------------------------------------------------------------------------------------
void PrintAppointmentList(int numSuitor)
{
if (numSuitor<0 || numSuitor>=CountInSuitorList)
return;
int count = SuitorList[numSuitor].GetAppointmentsCount();
if (!count)
{
wcout<<L"Список свиданий поклонника пуст!"<<endl;
return;
}
wcout << setw(3) << L"№" << setw(12) << L"Дата" <<
setw(10) << L"Время" << setw(10) << L"Длилось" << setw(8) <<
L"Оценка" << endl;
for (int i=0;i<count;i++)
wcout << setw(3) << i+1 << SuitorList[numSuitor].
FindAppointment(i).ToString() << endl;
wcout<<endl;
}
//-------------------------------------------------------------------------------------------
Appointment InputAppointment(void)
{
int mark = 0;
wcout<<L"Вводим характеристики нового свидания..."<<endl;
wstring dt = InputDate();
wcout<<L"Дата и время назначения..."<<endl;
wstring tm = InputTime();
wcout<<L"Продолжительность..."<<endl;
wstring dur = InputTime();
wcout<<L"Ставим оценку: ";
wcin>>mark;
return Appointment(dt,tm, dur,mark);
}
wstring InputDate(void)
{
wstring date;
wcout<<L"Вводим дату (формат: ГГГГ-[М]М-[Д]Д): ";
wcin>>date;
return date;
}
Suitor InputSuitor(void)
{
wstring name, surname, number;
int height, weight;
wcout<<L"Вводим данные нового поклонника..."<<endl;
wcout<<L"Введите имя: ";
wcin>>name;
wcout<<L"Введите фамилию: ";
wcin>>surname;
wcout<<L"Введите рост: ";
wcin>>height;
wcout<<L"Введите вес: ";
wcin>>weight;
wcout<<L"Введите номер телефона: ";
wcin>>number;
return Suitor(surname, name, height, weight, number);
}
wstring InputTime()
{
wstring time;
wcout<<L"Вводим время (формат: [Ч]Ч:MM): ";
wcin>>time;
return time;
}
int SelectNumberOfSuitor()
{
int id;
wcout<<L"Выберите поклонника... "<<endl;
wcout<<L"Введите ID поклонника: ";
wcin>>id;
int idx = FindSuitorById(id);
if (idx == -1)
wcout<<L"Поклонника с таким ID нет..."<<endl;
return idx;
}
int SelectNumberOfAppointment(int idx)
{
wcout << L"Информация о поклоннике..." << endl;
wcout << SuitorList[idx].ToString(true);
PrintAppointmentList(idx);
int number;
wcout << L"Введите номер свидания в списке: ";
wcin >> number;
number--;
if (number < 0 ||
number >= SuitorList[idx].GetAppointmentsCount())
{
wcout<<L"Ттакого номера не существует!"<<endl;
return -1;
}
return number;
}
wstring GetRandomPhoneNumber()
{
wostringstream os;
for (int i=0;i<6;i++)
os<<(rand()%9+1);
return os.str();
}
wstring GetRandomDate()
{
wostringstream os;
os<<(rand()%3+2007)<<'-'<<rand()%12+1<<'-'<<rand()%28;
return os.str();
}
wstring GetRandomTime()
{
wostringstream os;
int hours = rand()%10+12;
int min = (rand()%4)*15;
os<<hours<<':'<<((min<10)? "0": "")<<min;
return os.str();
}
wstring GetRandomDuration()
{
wostringstream os;
int hours = rand()%3+1;
int min = (rand()%4)*15;
os<<hours<<':'<<((min<10)? "0": "")<<min;
return os.str();
}