Файл: Применение объектно-ориентированного подхода при проектировании информационной системы.pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 01.04.2023

Просмотров: 97

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

set<string> zodiaks = { "овен", "телец", "близнецы", "рак", "лев", "дева", "весы",

"скорпион", "стрелец", "козерог", "водолей", "рыбы" };

class ZNAK

{

public:

string name; // фамилия, имя

string zodiak; // знак зодиака

int birthday[3]; // дата рождения

ZNAK() {}

// Ввод данных - фамилия, имя, знак зодиака и дата рождения

void inputData()

{

// проверки добавляются в соответствии с заданной предметной областью

cin.ignore(cin.rdbuf()->in_avail());

string name, surname;

cout << "Введите фамилию: ";

getline(cin, surname);

while (cin.fail() || isEmpty(surname))

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите фамилию: ";

getline(cin, surname);

}

cout << "Введите имя: ";

getline(cin, name);

while (cin.fail() || isEmpty(name))

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите имя: ";

getline(cin, name);

}

this->name = surname + " " + name;

this->name = std::string(RUS(this->name.c_str()));

cout << "Введите знак зодиака (строчными буквами): ";

getline(cin, this->zodiak);

this->zodiak = std::string(RUS(this->zodiak.c_str()));

while (cin.fail() || isEmpty(this->zodiak) || zodiaks.find(this->zodiak) == zodiaks.end())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Введите знак зодиака (строчными буквами): ";

getline(cin, this->zodiak);

this->zodiak = std::string(RUS(this->zodiak.c_str()));

}

cout << "День рождения: ";

cin >> this->birthday[0];

while (cin.fail() || this->birthday[0] < 1 || this->birthday[0] > 31)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. День рождения: ";

cin >> this->birthday[0];

}

cout << "Месяц рождения: ";

cin >> this->birthday[1];

while (cin.fail() || this->birthday[1] < 1 || this->birthday[1] > 12)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Месяц рождения: ";

cin >> this->birthday[1];

}

cout << "Год рождения: ";

cin >> this->birthday[2];

while (cin.fail() || this->birthday[2] < 1900 || this->birthday[2] > 2019)

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите значение повторно. Год рождения: ";

cin >> this->birthday[2];

}

}

// вспомог. функция для вывода одной записи в поток os

void printData(ostream &os)

{

os << this->name << " " << this->zodiak << " " << this->birthday[0]

<< "." << this->birthday[1] << "." << this->birthday[2] << endl;

}

};

class List

{

public:

ZNAK data; // информационное поле (данные) узла списка

List* next; // указатель на следующий узел списка

List(){}

// Вывод элементов списка на экран или в файл

void PrintList(ostream &os)

{

List* p = this;

while (p != NULL)

{

p->data.printData(os);

p = p->next;

}

}

// Поиск элемента в списке по имени, знаку зодиака, дате рождения


List* FindElem(ZNAK elem)

{

List* p = this;

while (p != NULL)

{

if ((p->data.name.compare(elem.name) == 0) && (p->data.zodiak.compare(elem.zodiak) == 0)

&& (p->data.birthday[0] == elem.birthday[0]) && (p->data.birthday[1] == elem.birthday[1])

&& (p->data.birthday[2] == elem.birthday[2]))

break;

p = p->next;

}

return p;

}

// Поиск элемента в списке по фамилии

void FindElem(string sur)

{

List* p = this;

bool f = false;

while (p != NULL)

{

string surname = p->data.name.substr(0, p->data.name.find(" "));

if (surname.compare(sur) == 0)

{

f = true;

p->data.printData(cout);

}

p = p->next;

}

if (!f)

cout << "Данные не найдены" << endl;

}

};

// Редактирование списка

void UpdateElem(List** ptr, ZNAK r2)

{

List* p = *ptr;

p->data.birthday[0] = r2.birthday[0];

p->data.birthday[1] = r2.birthday[1];

p->data.birthday[2] = r2.birthday[2];

p->data.name = r2.name;

p->data.zodiak = r2.zodiak;

}

// Добавление элемента в конец списка

void AddElem(List** begin, List** cur, ZNAK elem)

{

List* p = new List;

p->data = elem; //проверка, является ли список пустым

if (*begin == NULL)

{

p->next = NULL;

*begin = p;

}

else

{

p->next = (*cur)->next;// или p->next = NULL;

(*cur)->next = p;

}

*cur = p;

}

// Добавление элемента в начало списка

void AddFirstElem(List** begin, ZNAK elem)

{

List* p = new List;

p->data = elem; //проверка, является ли список пустым

if (*begin == NULL)

{

p->next = NULL;

}

else

{

p->next = *begin;

}

*begin = p;

}

// Удаление элемента из списка

void DelElem(List** begin, List* ptrCur)

{

List* p;

if (ptrCur == *begin)

{

// удаляем первый элемент

*begin = (*begin)->next;

}

else

{

// устанавливаем вспомогательный указатель на элемент, предшествующий удаляемому

p = *begin;

while (p->next != ptrCur)

p = p->next; // удаление элемента

p->next = ptrCur->next;

}

delete ptrCur;

}

// Очистка памяти

void Free(List** begin)

{

if (*begin == 0)

return;

List* p = *begin;

List* t;

while (p)

{

t = p;

p = p->next;

delete t;

}

*begin = NULL;

}

int main()

{

List* head = NULL;

List* cur = NULL;

setlocale(LC_CTYPE, "Russian");

int n = -1;

ZNAK r;

// Меню пользователя

while (n != 0)

{

cout << endl << "1 - Добавить в конец" << endl <<

"2 - Вывод списка" << endl <<

"3 - Добавить в начало" << endl <<

"4 - Поиск" << endl <<

"5 - Поиск по фамилии" << endl <<

"6 - Удаление" << endl <<

"7 - Редактировать" << endl <<

"8 - Сохранить в файл" << endl <<

"9 - Считать из файла" << endl <<

"0 - Выход\nВыберите действие: ";

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cin >> n;

while (cin.fail() || (n < 0) || (n > 9))

{

cin.clear();

cin.sync();

cout << "Ошибка ввода, выберите действие: ";

cin >> n;

}

switch (n)

{

case 1:

{

r.inputData();

AddElem(&head, &cur, r);

break;

}

case 2:


{

if (head)

head->PrintList(cout);

else

cout << "Нет данных!" << endl;

break;

}

case 3:

{

r.inputData();

AddFirstElem(&head, r);

break;

}

case 4:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

ptr->data.printData(cout);

break;

}

case 5:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

string surname;

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите фамилию: ";

getline(cin, surname);

surname = std::string(RUS(surname.c_str()));

head->FindElem(surname);

break;

}

case 6:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

{

DelElem(&head, ptr);

cout << "Запись удалена!" << endl;

};

break;

}

case 7:

{

if (!head)

{

cout << "Нет данных!" << endl;

break;

}

List* ptr;

r.inputData();

ptr = head->FindElem(r);

if (ptr == NULL)

cout << "Запись не найдена!" << endl;

else

{

ZNAK r2;

r2.inputData();

UpdateElem(&ptr, r2);

cout << "Запись отредактирована!" << endl;

};

break;

}

case 8:

{

string fname;

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите имя файла для сохранения списка: ";

getline(cin, fname);

ofstream file;

file.open(fname);

while (!file.is_open())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Невозможно открыть файл для сохранения списка! Введите имя файла для сохранения списка: ";

getline(cin, fname);

}

if (head)

{

head->PrintList(file);

cout << "Список сохранен в файл!" << endl;

}

else

file << "Нет данных!" << endl;

file.close();

break;

}

case 9:

{

string fname;

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Введите имя файла для открытия списка: ";

getline(cin, fname);

ifstream file;

file.open(fname);

while (!file.is_open())

{

cin.clear();

cin.ignore(cin.rdbuf()->in_avail());

cout << "Невозможно открыть файл для открытия списка! Введите имя файла для открытия списка: ";

getline(cin, fname);

}

char dot;

string s;

ZNAK r;

while (getline(file, s))

{

istringstream ss(s);

string surname, name, zodiak;

int b1, b2, b3;

if (ss >> surname >> name >> zodiak >> b1 >> dot >> b2 >> dot >> b3)

{

name = string(RUS(surname.c_str())) + " " + string(RUS(name.c_str()));

zodiak = string(RUS(zodiak.c_str()));

if (!isEmpty(surname) && !isEmpty(name) && !isEmpty(zodiak) && zodiaks.find(zodiak) != zodiaks.end()

&& (b1 >= 1) && (b1 <= 31) && (b2 >= 1) && (b2 <= 12) && (b3 >= 1900) && (b3 <= 2019))

{

r.name = name;

r.zodiak = zodiak;

r.birthday[0] = b1;

r.birthday[1] = b2;

r.birthday[2] = b3;

AddElem(&head, &cur, r);

}

}

}

cout << "Список получен из файла!" << endl;