Состав и назначение файлов проекта

№ п/п Наименование файла Назначение
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();

}














Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: