Файл: Применение объектно-ориентированного подхода при проектировании информационной системы.pdf
Добавлен: 01.04.2023
Просмотров: 87
Скачиваний: 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;