Создание информационной системы "Знаки зодиака"

Разработка информационной системы для предметной области с использованием заданных структур данных. Создание и проверка базы данных, которая позволяет вводить информацию, хранить её в файле, осуществлять поиск, модификацию, сортировку и удаление данных.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 29.03.2016
Размер файла 240,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru

Размещено на http://www.allbest.ru

Постановка задачи

Задачей курсового проекта является разработка информационной системы для заданной предметной области с использованием заданных структур данных.

Создать базу данных, которая позволяет вводить информацию, хранить её в файле, осуществлять поиск, модификацию, сортировку и удаление данных. информационный база данные зодиак

Тип хранимой информации и задание на поиск определяются в соответствии с номером варианта

Вариант 1

Описать структуру с именем ZNAK, содержащую следующие поля:

фамилия, имя;

знак зодиака;

дата рождения (массив из трёх чисел).

Задание на поиск: найти информацию о людях, чей знак зодиака введен с клавиатуры.

Описание структур данных

Данные хранятся в структуре ZNAK

struct ZNAK

{

string secondname;//фамилия

string name; //имя

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

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

};

struct ElementOfList

{

ZNAKinfo; // информацияобанкете

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

};

База данных хранится на диске в виде тестового файла.

Для работы с БД в процессе выполнения программы используется список.

Описание алгоритмов работы программы и описание функций

При запуске программы выводится на экран консоли меню с нумерованными пунктами. Пользователь должен ввести цифру, соответствующую номеру пункта. При этом, если вводится некорректное значение (несуществующий номер пункта или символ), то выведется сообщение «Повторите ввод».

При выборе пункта добавления анкеты, создается новая анкета при помощи вызываемой функции

AddInfo. Пользователь поэтапно вводит имя, фамилию, дату рождения (через пробел, формат указан в скобках). Затем в пункте идет цикл whileс вызовом функции проверки на идентичность анкеты. Пока пользователь не введет уникальные данные и флаг не вернет значение false, программа будет выводить сообщение «Такой человек уже есть. Повторите ввод.» После этого, вызывается функция AddNew и анкета добавляется в список.

При выборе пункта вывода анкет на экран вызывается функция Print.

При выводе функции на экран в отсортированном видесначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция Sort. А затем функция Print.

При выборе пункта редактирования анкеты сначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция BaseSearch.

Если возвращаемое значение «0», это значит, что пользователь отменил ввод, и выполнение пункта прекращается. Иначе BaseSearchнаходит нужную анкету и при помощи вспомогательной функции Search передает её вызываемой функции Edit.

Как работают функции BaseSearchи Editсм. в их описании.

При выборе пункта удаления анкеты сначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция BaseSearch.

Если возвращаемое значение «0», это значит, что пользователь отменил ввод, и выполнение пункта прекращается. Иначе BaseSearchнаходит нужную анкету передает ее вызываемой функции Delete.

Как работает функция Deleteсм. в её описании.

При выборе поиска анкеты сначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция BaseSearch. Найденная анкета выводится в самом пункте.

Как работает функция BaseSearchсм. в её описании.

При выборе поиска по знаку зодиака анкеты сначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция ZodiacSearch.

Как работает функция ZodiacSearchсм. в её описании.

При выборе пункта сохранения в файл сначала происходит проверка на пустоту списка при помощи if. Если список действительно оказывается пустым, выводится сообщение «Данные отсутствуют». Иначе вызывается функция Save. После вызова в этом пункте флагу check присваивается значение true. Это необходимо для того, чтобы перед выходом из программы не напоминать лишний раз пользователю о сохранении.

При выборе пункта загрузки базы данных из файла вызывается функция Download.

При выборе пункта выхода из программы происходит проверка значения check. Если его значение false(база данных еще не сохранялась), на экран консоли выведется нумерованное меню с предложением сохранить базу данных в файл. Пользователь выбирает пункт (1- да; 2 - нет), если «да», то вызывается функция Save, и программа закрывается.

Иначе (база данных уже сохранялась) программа закроется сразу.

Перед закрытием программы выполняется функция Free, очищающая оставшиеся анкеты (если такие имеются).

Добавление информации

DynList AddInfo(DynList *begin)

Функция сохраняет данные, введенные пользователем, для проверки и сохранения в список. Производится проверка корректности введенной даты рождения. Разрешается ввод от 1900 года по 2015. При вводе некорректных значений, программа просит заново ввести дату.

Учитываются високосные года.

Пример работы:

Функция проверки одинаковых анкет

bool СheckForDuplicates(ElementOfList *begin, ElementOfList a)

Функция сравнивает введенную пользователем анкету с анкетами, уже имеющимися в списке. Если обнаруживается полное совпадение, то функция возвращает значение trueи записианкеты не происходит. На экран консоли выводится соответствующее сообщение «Такой человек уже есть, повторите ввод:». Если совпадения нет, то новая анкета добавляется в список. Функция вызывается в mainв пунктах добавления новой анкеты и редактирования анкеты.

Добавление анкеты в список

void AddNew(DynList **begin, DynList **end, DynList a)

Функция принимает информацию от функции AddInfo, и создает новый элемент списка. Перед добавлением в mainвызывается функция проверки на одинаковые анкеты СheckForDuplicates.

Функция для автоматического определения знака зодиака

string Zodiac(DynList a)

Функция получает дату рождения пользователя и определяет его знак зодиака. Учитываются високосные года.

Пример работы:

Функция вывода анкет для просмотра

voidPrint(ElementOfList *begin)

Функция выводит все элементы списка на экран консоли в порядке их дополнения.

Проводится проверка на пустоту списка. Если список не заполнен, появится сообщение «Анкеты отсутствуют».

Функция для поиска анкеты

ElementOfListBaseSearch(ElementOfList *begin)

Функция для поиска определенной анкеты. Для поиска пользователь постепенно вводит фамилию, затем, если есть однофамильцы, то имя, а если есть полные тезки, то дату рождения.

В функции предусмотрена возможность отмены ввода (пользователь нажимает 0).

Если пользователь пытается найти несуществующую анкету, выводится сообщение «Данная анкета отсутствует».

Проводится проверка на пустоту списка(Перед вызовом функции в main).Если список не заполнен, появится сообщение “Данные отсутствуют”.

Функция используется как и для отдельного пункта в main, так и в качестве вспомогательной в функциях Deleteи Edit.

Функция для поиска анкет по знаку зодиака

void ZodiacSearch(ElementOfList *begin)

Функция ищет анкеты по знаку зодиака, введенным пользователем и выводит их на экран консоли.

Если анкеты с искомым знаком зодиака отсутствуют, выводится сообщение «Нет совпадений».

В функции предусмотрена возможность отмены ввода (пользователь нажимает 0).

Проводится проверка на пустоту списка(Перед вызовом функции в main). Если список не заполнен, появится сообщение “Данные отсутствуют”.

Функция удаления анкеты.

void Delete(ElementOfList **begin, ElementOfList a)

Функция удаляет искомую анкету. Проводится проверка на пустоту списка(Перед вызовом функции в main). Если операция прошла успешно, выводится сообщении «Анкета удалена».

В качестве вспомогательной функции для поиска нужной анкеты используется BaseSearch(вызывается в mainперед удалением).

В функции предусмотрена возможность отмены ввода (пользователь нажимает 0).

Проводится проверка на пустоту списка(Перед вызовом функции в main).Если список не заполнен, появится сообщение “Данные отсутствуют”.

Функция редактирования

void Edit(ElementOfList *begin, ElementOfList *f)

Функция редактирует искомую анкету. При редактировании на экран консоли выводится меню, в котором пользователь может выбрать, какой пункт необходимо отредактировать.

При редактировании даты рождения проводится проверка на корректность введенных данных. При вводе некорректных данных появляется сообщение "Некорректные данные. Повторите ввод:".Учитываются високосные года.

При редактировании происходит проверка на одинаковые анкеты при помощи функции CheckForDuplicates. Таким образов исключается появление в списке анкет с одинаковой информацией. На консоль выводится запись «Идентичная анкета есть в базе данных, введите другую дату рождения».

В качестве вспомогательной функции для поиска нужной анкеты используется BaseSearch(вызывается в mainперед редактированием).

В функции предусмотрена возможность отмены ввода и выхода из меню (пользователь нажимает 0).

Проводится проверка на пустоту списка(в самой функции).Если список не заполнен, появится сообщение “Анкеты отсутствуют”.

Функция сортировки анкет

voidSort(ElementOfList *begin)

Функция сортирует имеющиеся в списке анкеты по фамилии. Если есть анкеты с одинаковыми фамилиями, то сортируются по имени.

Проводится проверка на пустоту списка(в main в соответствующем пункте перед вызовом функции).Если список не заполнен, появится сообщение “Анкеты отсутствуют”.

Функция сохранения анкет в тестовый файл

voidSave(ElementOfList *begin)

Функция сохраняет весь список в текстовый файл, хранящийся в папке с проектом.

Функция вызывается в соответствующем пункте меню и в пункте выхода, если на протяжении работы с программой список не сохранялся (по согласию пользователя).

Проводится проверка на пустоту списка(в mainв соответствующем пункте перед вызовом функции).Если список не заполнен, появится сообщение “Анкеты отсутствуют”.

Функция загрузки анкет из текстового файла

void Download(ElementOfList **begin, ElementOfList **end)

Функция загружает базу данных из тестового файла в список программы.

Производится проверка, если файл поврежден, отсутствует или пуст.

Функция очистки списка

void Free(ElementOfList **begin)

Функция удаляет оставшиеся анкеты из памяти перед выходом из программы. Вызывается автоматически. Это позволяет избежать утечек памяти.

В главной функции main() реализовано меню пользователя, в которой каждому действию соответствует определенная цифра. Реализованы следующие функции работы с базой данных: добавление, редактирование, удаление, сортировка, поиск определенной анкеты, поиск анкет по знаку зодиака, вывод на экран, вывод в отсортированном виде, сохранение в файл, загрузка из файла.

Пользователь вводит цифру для выбора необходимого ему пункта. Если такого пункта нет, на экран консоли выведется сообщение «Повторите ввод».

Если на протяжении работы с программой, пользователь не сохранял базу данных в файл, перед выходом выведется меню с предложением сохранить имеющийся список.

Описание пользовательского интерфейса

Пример пользовательского интерфейса

Гороскоп

Меню

1. Добавить анкету

2. Вывод на экран

3. Вывод на экран (отсортированный вид)

4. Редактировать анкету

5. Удалить анкету

6. Найти анкету

7. Найти анкеты по знаку зодиака

8. Сохранить в базу данных

9. Загрузка из базы данных

0. Выход

5. Результаты тестирования программы

Вывод:

Добавить анкету

Ввод: 1

Вывод:

Введите имя:

Ввод: Прасковья

Вывод:

Введите фамилию:

Ввод: Орлова

Вывод:

Введите дату рождения (гггг мм дд):

Ввод: 1815 10 17

Вывод:

Вы ввели некорректные данные.

Введите дату рождения (гггг мм дд):

Ввод: 1915 10 17

Вывод:

Анкета добавлена

Ввод: 1

Вывод:

Введите имя:

Ввод: Прасковья

Вывод:

Введите фамилию:

Ввод: Орлова

Вывод:

Введите дату рождения (гггг мм дд):

Ввод: 1915 10 17

Вывод:

Такой человек уже есть, повторите ввод.

Загрузка базы данных из файла

Ввод: 9

Вывод:

База данных загружена

Вывод анкет

Ввод: 2

Вывод:

Вывод в отсортированном виде

Ввод: 3

Вывод:

Редактирование анкеты

Ввод: 4

Вывод:

Ввод: Орлова

Вывод:

Ввод:

Вывод:

Ввод: 0

Удаление анкеты

Ввод: 5

Вывод:

Ввод: Журавлёва

Вывод:

Анкета удалена

Поиск анкеты

Ввод: 6

Вывод:

Ввод: Тихонова

Вывод:

Ввод: Лариса

Вывод:

С такими именем и фамилией найдено несколько человек. Продолжайте ввод.

Тихонова Лариса 9 12 1985 Стрелец

Тихонова Лариса 28 3 2000 Овен

Ввод: 2000 3 28

Вывод:

Тихонова Лариса 28 3 2000 Овен

Поиск по знаку зодиака

Вывод:

Ввод: Стрелец

Вывод:

Выход из программы

Ввод: 0

Вывод:

Ввод: 1

Заключение

В процессе выполнения курсового проекта была реализована база данных позволяющая: вводить информацию, хранить её в файле, осуществлять поиск, модификацию, сортировку и удаление данных. Все поставленные задачи были выполнены. Программа работает корректно, без ошибок и «вылетов».

Плюсы программы:

Реализован удобный и понятный на интуитивном уровне пользователю интерфейс;

Программа полностью русифицирована;

При вводе данных происходят проверки на корректность введенной даты рождения. Учитываются високосные годы;

В функциях, работающих с анкетами, реализованы проверки на пустоту списка;

Автоматически определяется знак зодиака;

Полностью исключена возможность создания полностью идентичных анкет. При этом программа работает с тезками;

В некоторых функциях реализована возможность отмены ввода данных;

Реализовано напоминание о сохранении анкет в текстовой файл перед выходом из программы, если оно не проводилось;

В функции редактирования осуществлена возможность выбора пункта анкеты, который нужно изменить;

Исключена возможность утечки памяти;

Минусы:

В функции добавления анкеты нет возможности отмены ввода;

При добавлении имени и фамилии нет проверки на посторонние символы;

Приложение

include <iostream>

#include <fstream>

#include <string>

#include <windows.h>

//утечки памяти

#include <crtdbg.h>

#define new new(_CLIENT_BLOCK, __FILE__, __LINE__)

//________________________________

using namespace std;

//структуры данных

//________________________________

struct ZNAK

{

string secondname;

string name;

string zodiac;

int bday[3];

};

struct ElementOfList

{

ZNAK info;

ElementOfList *next;

};

//________________________________

//определение знака зодиака

//________________________________

string Zodiac(ElementOfList a)

{

int year[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if (a.info.bday[2] % 4 == 0 && a.info.bday[2] % 400 == 0)

{

year[1] = 29;

}

string z;

if ((a.info.bday[0] >= 21 && a.info.bday[1] == 3) || (a.info.bday[0] <= 19 && a.info.bday[1] == 4))

z = "Овен";

else if ((a.info.bday[0] >= 20 && a.info.bday[1] == 4) || (a.info.bday[0] <= 20 && a.info.bday[1] == 5))

z = "Телец";

else if ((a.info.bday[0] >= 21 && a.info.bday[1] == 5) || (a.info.bday[0] <= 20 && a.info.bday[1] == 6))

z = "Близнецы";

else if ((a.info.bday[0] >= 21 && a.info.bday[1] == 6) || (a.info.bday[0] <= 22 && a.info.bday[1] == 7))

z = "Рак";

else if ((a.info.bday[0] >= 23 && a.info.bday[1] == 7) || (a.info.bday[0] <= 22 && a.info.bday[1] == 8))

z = "Лев";

else if ((a.info.bday[0] >= 23 && a.info.bday[1] == 8) || (a.info.bday[0] <= 22 && a.info.bday[1] == 9))

z = "Дева";

else if ((a.info.bday[0] >= 23 && a.info.bday[1] == 9) || (a.info.bday[0] <= 22 && a.info.bday[1] == 10))

z = "Весы";

else if ((a.info.bday[0] >= 23 && a.info.bday[1] == 10) || (a.info.bday[0] <= 21 && a.info.bday[1] == 11))

z = "Скорпион";

else if ((a.info.bday[0] >= 22 && a.info.bday[1] == 11) || (a.info.bday[0] <= 21 && a.info.bday[1] == 12))

z = "Стрелец";

else if ((a.info.bday[0] >= 22 && a.info.bday[1] == 12) || (a.info.bday[0] <= 19 && a.info.bday[1] == 1))

z = "Козерог";

else if ((a.info.bday[0] >= 20 && a.info.bday[1] == 1) || (a.info.bday[0] <= 18 && a.info.bday[1] == 2))

z = "Водолей";

else if ((a.info.bday[0] >= 19 && a.info.bday[1] == 2) || (a.info.bday[0] <= 20 && a.info.bday[1] == 3))

z = "Рыба";

else

z = "Неверно задано";

return z;

}

//________________________________

//Вывод списка на экран

//________________________________

void Print(ElementOfList *begin)

{

if (begin == NULL)

{

cout << "Анкеты отсутствуют.\n" << endl;

return;

}

ElementOfList *a = begin;

int i = 1;

while (a)

{

cout << a->info.secondname << " " << a->info.name << " " << a->info.bday[0] << "." << a->info.bday[1] << "." << a->info.bday[2] << " " << a->info.zodiac << endl;

a = a->next;

i++;

}

cout << endl;

}

//________________________________

//Сохранение нового звена в список

//________________________________

void AddNew(ElementOfList **begin, ElementOfList **end, ElementOfList a)

{

static bool x = true;

if (*begin == NULL)

x = true;

if (x)

{

*begin = new ElementOfList;

(*begin)->info = a.info;

(*begin)->next = NULL;

*end = *begin;

x = false;

return;

}

(*end)->next = new ElementOfList;

*end = (*end)->next;

(*end)->info = a.info;

(*end)->next = NULL;

}

int LastEl(ElementOfList *begin)

{

ElementOfList *temp = begin;

int i = 0;

while (temp)

{

++i;

temp = temp->next;

}

return i;

}

//удалениеанкеты

//________________________________

void Delete(ElementOfList **begin, ElementOfList a)

{

ElementOfList *temp = *begin;

if (*begin == NULL)

{

cout << "Анкеты отсутствуют.\n" << endl;

return;

}

if (temp->info.name == a.info.name && temp->info.secondname == a.info.secondname && temp->info.bday[0] == a.info.bday[0] && temp->info.bday[1] == a.info.bday[1] && temp->info.bday[2] == a.info.bday[2])

{

*begin = (*begin)->next;

delete temp;

cout << "Анкетаудалена." << endl;

return;

}

ElementOfList *t1 = temp->next;

bool flag = true;

while (t1)

{

if (t1->info.name == a.info.name && t1->info.secondname == a.info.secondname && t1->info.bday[0] == a.info.bday[0] && t1->info.bday[1] == a.info.bday[1] && t1->info.bday[2] == a.info.bday[2])

{

temp->next = t1->next;

delete t1;

flag = false;

cout << "Анкетаудалена." << endl;

return;

}

temp = t1;

t1 = t1->next;

}

if (flag)

cout << "Данная анкета отсутствует\n" << endl;

}

//________________________________

//добавление информации о пользователе

//________________________________

ElementOfList AddInfo(ElementOfList *begin)

{

ElementOfList a;

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

getline(cin, a.info.name);

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

getline(cin, a.info.secondname);

int temp[3];

int year[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if (temp[2] % 4 == 0 && temp[2] % 400 == 0)

{

year[1] = 29;

}

cout << "Введите дату рождения (гггг мм дд):\t ";

while ((!(cin >> temp[2] && temp[2] >= 1900 && temp[2] <= 2014)) || (!(cin >> temp[1] && temp[1] >= 1 && temp[1] <= 12)) || (!(cin >> temp[0] && temp[0] >= 1 && temp[0] <= year[temp[1] - 1])))

{

cin.clear();

cin.sync();

cout << "Вы ввели некорректные данные\n ";

cout << "Введите дату рождения (гггг мм дд):\t ";

}

for (int i = 0; i < 3; i++)

a.info.bday[i] = temp[i];

a.info.zodiac = Zodiac(a);

cin.get();

return a;

}

//________________________________

//поиск

//________________________________

ElementOfList BaseSearch(ElementOfList *begin)

{

ElementOfList a;

ElementOfList *temp = begin;

int s;

do {

Print(begin);

cout<< "Дляотменывводанажмите 0.\n";

cout<< "ВведитеФамилию:\t";

s = 0;

getline(cin, a.info.secondname);

while (1)

{

if (a.info.name == "0")

{

return a;

}

else break;

}

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.secondname == temp->info.secondname)

s++;

temp = temp->next;

}

temp = begin;

if (s == 0)

{

system("cls");

cout<< "Нет совпадений. Повторите ввод:\n " << endl;

}

else break;

} while (1);

if (s == 1)

{

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.secondname == temp->info.secondname)

{

a.info.name = temp->info.name;

a.info.bday[0] = temp->info.bday[0];

a.info.bday[1] = temp->info.bday[1];

a.info.bday[2] = temp->info.bday[2];

a.info.zodiac = temp->info.zodiac;

return a;

}

temp = temp->next;

}

}

if (s >= 2)

{

cout << "С такой фамилией найдено несколько человек. Продолжайте ввод:\t" << endl;

}

do {

short qq = 1;

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.secondname == temp->info.secondname)

{

cout << temp->info.secondname << " " << temp->info.name << " " << temp->info.bday[0] << " " << temp->info.bday[1] << " " << temp->info.bday[2] << " " << temp->info.zodiac << endl;

qq++;

}

temp = temp->next;

}

temp = begin;

s = 0;

cout << "\nДля отмены ввода нажмите 0.\n";

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

getline(cin, a.info.name);

while (1)

{

if (a.info.name == "0")

{

return a;

}

else break;

}

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.name == temp->info.name && a.info.secondname == temp->info.secondname)

s++;

temp = temp->next;

}

temp = begin;

if (s == 0)

{

system("cls");

cout << "Нетсовпадений. Повторитеввод\t: " << endl;

}

else break;

} while (1);

if (s == 1)

{

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.name == temp->info.name && a.info.secondname == temp->info.secondname)

{

a.info.name = temp->info.name;

a.info.bday[0] = temp->info.bday[0];

a.info.bday[1] = temp->info.bday[1];

a.info.bday[2] = temp->info.bday[2];

a.info.zodiac = temp->info.zodiac;

return a;

}

temp = temp->next;

}

}

if (s >= 2)

{

cout << "\nС таким именем и фамилией найдено несколько человек. Продолжайтеввод:\t" << endl;

}

temp = begin;

do {

short qq = 1;

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.name == temp->info.name && a.info.secondname == temp->info.secondname)

{

cout << temp->info.name << " " << temp->info.name << " " << temp->info.bday[0] << " " << temp->info.bday[1] << " " << temp->info.bday[2] << temp->info.zodiac << endl;

qq++;

}

temp = temp->next;

}

temp = begin;

s = 0;

cout << "Введите дату рождения (год):\t ";

int date[3];

while (!(cin >> date[2] && date[2] >= 1900 && date[2] <= 2014))

{

cin.clear();

cin.sync();

cout << "Некорректные данные. Повторите ввод:\t ";

}

cout << "Введите дату рождения (месяц): ";

while (!(cin >> date[1] && date[1] >= 1 && date[1] <= 12))

{

cin.clear();

cin.sync();

cout << "Некорректные данные. Повторите ввод:\t ";

}

cout << "Введите дату рождения (день):\t ";

int year[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if (date[2] % 4 == 0 && date[2] % 400 == 0)

{

year[2] = 29;

}

while (!(cin >> date[0] && date[0] >= 1 && date[0] <= year[date[1] - 1]))

{

cin.clear();

cin.sync();

cout << "Некорректныеданные." << "Повторитеввод:\t ";

}

for (int i = 0; i < LastEl(begin); i++)

{

if (temp->info.name == a.info.name && temp->info.secondname == a.info.secondname && temp->info.bday[0] == a.info.bday[0] && temp->info.bday[1] == a.info.bday[1] && temp->info.bday[2] == a.info.bday[2])

s++;

temp = temp->next;

}

temp = begin;

for (int i = 0; i < 3; i++)

a.info.bday[i] = date[i];

if (s == 0)

{

system("cls");

cout << "Нет совпадений. Повторите:\t " << endl;

}

else break;

} while (1);

if (s == 1)

{

for (int i = 0; i < LastEl(begin); i++)

{

if (temp->info.name == a.info.name && temp->info.secondname == a.info.secondname && temp->info.bday[0] == a.info.bday[0] && temp->info.bday[1] == a.info.bday[1] && temp->info.bday[2] == a.info.bday[2])

{

a.info.secondname = temp->info.secondname;

a.info.bday[0] = temp->info.bday[0];

a.info.bday[1] = temp->info.bday[1];

a.info.bday[2] = temp->info.bday[2];

a.info.zodiac = temp->info.zodiac;

return a;

}

temp = temp->next;

}

}

cin.get();

} ElementOfList* Search(ElementOfList *begin, ElementOfList a)

{

bool flag = true;

ElementOfList *temp = begin;

if (begin == NULL)

{

cout << "Анкетыотсутствуют.\n" << endl;

return 0;

}

else

{

while (temp)

{

if (temp->info.name == a.info.name && temp->info.secondname == a.info.secondname && temp->info.bday[0] == a.info.bday[0] && temp->info.bday[1] == a.info.bday[1] && temp->info.bday[2] == a.info.bday[2])

{

flag = false;

break;

}

temp = temp->next;

}

if (!flag)

{

cout << "Анкетанайдена.\n" << endl;

return temp;

}

else

{

cout << "Такойанкетынетвбазе.\n" << endl;

return 0;

}

}

cout << endl;

}

void ZodiacSearch(ElementOfList *begin)

{

ElementOfList *temp = begin, a;

do{

Print(begin);

int s = 0;

cout << "\nДляотменывводанажмите 0.\n";

cout << "Введите знак зодиака:\t ";

getline(cin, a.info.zodiac);

while (1)

{

if (a.info.zodiac == "0")

{

return;

}

else break;

}

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.zodiac== temp->info.zodiac)

s++;

temp = temp->next;

}

temp = begin;

if (s == 0)

{

system("cls");

cout << "Нет совпадений в знаках зодиака. Повторитеввод:\n" << endl;

}

else break;

} while (1);

system("cls");

short qq = 1;

for (int i = 0; i < LastEl(begin); i++)

{

if (a.info.zodiac== temp->info.zodiac)

{

cout << temp->info.secondname << " " << temp->info.name << " " << temp->info.bday[0] << "." << temp->info.bday[1] << "." << temp->info.bday[2]<< " " << temp->info.zodiac << endl;

qq++;

}

temp = temp->next;

}

cout << endl;

}

//________________________________

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

//________________________________

bool СheckForDuplicates(ElementOfList *begin, ElementOfList a)

{

bool flag = false;

ElementOfList *temp = begin;

while (temp)

{

if (temp->info.name == a.info.name && temp->info.secondname == a.info.secondname && temp->info.bday[0] == a.info.bday[0] && temp->info.bday[1] == a.info.bday[1] && temp->info.bday[2] == a.info.bday[2])

{

flag = true;

break;

}

temp = temp->next;

}

return flag;

}

//________________________________

//редактирование анкет

//________________________________

void Edit(ElementOfList *begin, ElementOfList *f)

{

ElementOfList t = *f;

if (begin == NULL)

{

cout << "Анкеты отсутствуют\n" << endl;

return;

}

char c;

do {

system("cls");

cout << f->info.secondname << " " << f->info.name << " " << f->info.bday[0] << "." << f->info.bday[1] << "." << f->info.bday[2] << endl;

cout << "Чтовыхотитеизменить:\n1. Имя\n2. Фамилию\n3. Дату рождения\n0. Выход" << endl;

cout << "Выберите значение: ";

cin >> c;

switch (c)

{

case '1':

{

cin.sync();

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

while (1)

{

getline(cin, t.info.name);

if (СheckForDuplicates(begin, t))

{

cout << "Человек с идентичными данными уже есть, введите другое имя: ";

}

else break;

}

break;

}

case '2':

{

cin.sync();

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

while (1)

{

getline(cin, t.info.secondname);

if (СheckForDuplicates(begin, t))

{

cout << "Человек с идентичными данными уже есть, введите другую фамилию: ";

}

else break;

}

break;

}

case '3':

{

do {

cin.sync();

cout << "Введите дату рождения (год): ";

int temp[3];

while (!(cin >> temp[2] && temp[2] >= 1900 && temp[2] <= 2014))

{

cin.clear();

cin.sync();

cout << "Неккоректныеданные. Повторите ввод: ";

}

cout << "Введите дату рождения (месяц): ";

while (!(cin >> temp[1] && temp[1] >= 1 && temp[1] <= 12))

{

cin.clear();

cin.sync();

cout << "Неккоректныеданные. Повторите ввод: ";

}

cout << "Введите дату рождения (день): ";

int year[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

if (temp[2] % 4 == 0 && temp[2] % 400 == 0)

{

year[1] = 29;

}

while (!(cin >> temp[0] && temp[0] >= 1 && temp[0] <= year[temp[1] - 1]))

{

cin.clear();

cin.sync();

cout << "Неккоректныеданные. Повторитеввод: ";

}

for (int i = 0; i < 3; i++)

t.info.bday[i] = temp[i];

if (СheckForDuplicates(begin, t))

{

cout << "Идентичнаяанкетаестьвбазеданных, введитедругуюдатурождения: " << endl;

}

else break;

} while (1);

break;

}

}

*f = t;

} while (c != '0');

cin.get();

cout << endl;

}

//________________________________

//сортировка списка

//________________________________

void Sort(ElementOfList *begin)

{

ElementOfList *a = begin;

ElementOfList *buf = new ElementOfList[LastEl(begin)];

for (int i = 0; i < LastEl(begin); i++)

{

buf[i] = *a;

a = a->next;

}

for (int i = 0; i < LastEl(begin); i++)

{

for (int j = 0; j < LastEl(begin); j++)

{

if (buf[i].info.secondname < buf[j].info.secondname)

{

swap(buf[i].info.name, buf[j].info.name);

swap(buf[i].info.secondname, buf[j].info.secondname);

swap(buf[i].info.bday[0], buf[j].info.bday[0]);

swap(buf[i].info.bday[1], buf[j].info.bday[1]);

swap(buf[i].info.bday[2], buf[j].info.bday[2]);

swap(buf[i].info.zodiac, buf[j].info.zodiac);

}

else if (buf[i].info.secondname == buf[j].info.secondname)

{

if (buf[i].info.secondname < buf[j].info.secondname)

{

swap(buf[i].info.name, buf[j].info.name);

swap(buf[i].info.secondname, buf[j].info.secondname);

swap(buf[i].info.bday[0], buf[j].info.bday[0]);

swap(buf[i].info.bday[1], buf[j].info.bday[1]);

swap(buf[i].info.bday[2], buf[j].info.bday[2]);

swap(buf[i].info.zodiac, buf[j].info.zodiac);

}

else if (buf[i].info.secondname == buf[j].info.secondname)

{

if (buf[i].info.name < buf[j].info.name)

{

swap(buf[i].info.secondname, buf[j].info.secondname);

swap(buf[i].info.name, buf[j].info.name);

swap(buf[i].info.bday[0], buf[j].info.bday[0]);

swap(buf[i].info.bday[1], buf[j].info.bday[1]);

swap(buf[i].info.bday[2], buf[j].info.bday[2]);

swap(buf[i].info.zodiac, buf[j].info.zodiac);

}

}

}

}

}

ElementOfList *t = begin;

for (int i = 0; i < LastEl(begin); i++)

{

*t = buf[i];

t = t->next;

}

delete[] buf;

cout << "Анкеты отсортированы.\n" << endl;

}

//________________________________

//сохранение в бд

//________________________________

void Save(ElementOfList *begin)

{

ofstream fout;

ElementOfList *temp = begin;

fout.open("DataBase.txt", ios::trunc);

fout << LastEl(begin) << endl;

for (int i = 0; i < LastEl(begin); i++)

{

fout << temp->info.secondname << " " << temp->info.name << " " << temp->info.bday[0] << " " << temp->info.bday[1] << " " << temp->info.bday[2] << " " << temp->info.zodiac << endl;

temp = temp->next;

}

fout.close();

}

//________________________________

//загрузка из бд

//________________________________

void Download(ElementOfList **begin, ElementOfList **end)

{

ifstream fin;

ElementOfList temp;

fin.open("DataBase.txt");

if (!fin.is_open())

{

cout << "База данных еще не сохранена.\n" << endl;

return;

}

int a, b[3] = {};

fin >> a;

fin.get();

string str1, str2, str3;

for (int i = 0; i < a; i++)

{

fin >> str1; fin.get();

fin >> str2; fin.get();

fin >> b[0]; fin.get();

fin >> b[1]; fin.get();

fin >> b[2]; fin.get();

fin >> str3; fin.get();

temp.info.secondname = str1;

temp.info.name = str2;

temp.info.zodiac = str3;

temp.info.bday[0] = b[0];

temp.info.bday[1] = b[1];

temp.info.bday[2] = b[2];

AddNew(begin, end, temp);

}

cout << "База данных загружена." << endl;

fin.close();

}

//________________________________

//очистка

//________________________________

void Free(ElementOfList **begin)

{

if (*begin == 0) return;

ElementOfList *p = *begin;

ElementOfList *t;

while (p)

{

t = p;

p = p->next;

delete t;

}

*begin = NULL;

}

//________________________________

int main()

{

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);//проверкаутечекпамяти

SetConsoleOutputCP(1251);

SetConsoleCP(1251);

ElementOfList *begin = NULL;

ElementOfList *end = NULL;

bool exit = false;

bool check = false;

char c;

do

{

cout << "\t\t\t Гороскоп\n\n";

cout << "\t\t\t Меню\n\n";

cout << "1. Добавить анкету\n" << "2. Вывод на экран\n" << "3. Вывод на экран (отсортированный вид)\n" << "4. Редактировать анкету\n" << "5. Удалить анкету\n" << "6. Найти анкету\n"<<"7. Найти анкеты по знаку зодиака\n"<< "8. Сохранить в базу данных\n" << "9. Загрузка из базы данных\n" << "0. Выход\n";

cout << endl;

cout << "Выберите действие\t";

cin >> c;

switch (c)

{

case '1':

{

system("cls");

cin.sync();

ElementOfList a = AddInfo(begin);

while (СheckForDuplicates(begin, a))

{

cout << "Такойчеловекужеесть, повторитеввод:\n " ;

a = AddInfo(begin);

}

AddNew(&begin, &end, a);

cout << "\nАнкета добавлена" << endl;

break;

}

case '2':

{

system("cls");

cin.sync();

Print(begin);

cout << endl;

break;

}

case '3':

{

system("cls");

if (begin == 0)

{

cout << "Данные отсутствуют" << endl << endl;

break;

}

cin.sync();

Sort(begin);

Print(begin);

break;

}

case '4':

{

system("cls");

cin.sync();

if (begin == 0)

{

cout << "Данные отсутсвуют\n" << endl;

break;

}

ElementOfList x;

x = BaseSearch(begin);

if (x.info.name == "0" || x.info.secondname == "0")

{

break;

}

ElementOfList *_q;

_q = Search(begin, x);

Edit(begin, _q);

break;

}

case '5':

{

system("cls");

cin.sync();

if (begin == 0)

{

cout << "Данные отсутсвуют" << endl << endl;

break;

}

cout << "Введите данные:\n" << endl;

ElementOfList b;

b = BaseSearch(begin);

if (b.info.name == "0" || b.info.secondname == "0")

{

break;

}

Delete(&begin, b);

cout << endl;

break;

}

case '6':

{

system("cls");

cin.sync();

if (begin == 0)

{

cout << "Данныеотсутсвуют" << endl << endl;

break;

}

ElementOfList b;

b = BaseSearch(begin);

cout << endl;

cout << b.info.secondname << " " << b.info.name << " " << b.info.bday[0] << " " << b.info.bday[1] << " " << b.info.bday[2] << " " << b.info.zodiac << endl;

break;

}

case '7':

{

system("cls");

cin.sync();

if (begin == 0)

{

cout << "Данныеотсутсвуют" << endl << endl;

break;

}

ZodiacSearch(begin);

break;

}

case '8':

{

system("cls");

cin.sync();

if (begin == 0)

{

cout << "Данные отсутсвуют" << endl << endl;

break;

}

Save(begin);

check = true;

break;

}

case '9':

{

system("cls");

cin.sync();

Download(&begin, &end);

break;

}

case '0':

{

system("cls");

if (check == false){

cout << " Сохранить анкеты в базу данных перед выходом?\n 1. Да\n 2. Нет" << endl;

short c;

cout << " Выберите значение: ";

while (!((cin >> c) && (c == 1 || c == 2)))

{

cin.clear();

cin.sync();

cout << endl << " Повторите ввод: ";

}

if (c == 1)

{

system("cls");

Save(begin);

}

else

{

system("cls");

}

exit = true;

break;}

else {

exit = true;

break;

}

}

default:

{

system("cls");

cin.sync();

cout << "Повторитеввод\n" << endl;

break;

}

}

} while (!exit);

Free(&begin);

return 0;

}

Размещено на Allbest.ru


Подобные документы

  • Определение понятия и общее описание базы данных как упорядоченной информационной системы на носителе информации. Описание предметной области и разработка приложения базы данных, содержащей информацию о расписании занятий, для преподавателей кафедры.

    курсовая работа [1,3 M], добавлен 08.08.2012

  • Создание базы данных для информационной системы "Грузоперевозки". Анализ предметной области, разработка концептуальной и логической модели базы данных, с использованием средства MS Micrоsоft SQL Server 2005, реализация физического проектирования базы.

    курсовая работа [1,3 M], добавлен 01.07.2011

  • Создание базы данных с помощью на СУБД Access. Разработка программы, которая позволяет принимать управленческие решения, хранить данные о клиентах, о продукции, а так же хранить данные о продажах, производить их анализ и выдавать результат в виде таблиц.

    курсовая работа [2,2 M], добавлен 16.10.2011

  • Создание средствами Microsoft Access базы данных фруктового склада: добавление, удаление и изменение данных в записной книжке, поиск данных по конкретным признакам. Соответствие информационной системы бизнес-правилам. Разработка инструкции пользователя.

    курсовая работа [2,5 M], добавлен 30.06.2009

  • Назначение для информационной системы OpenPOS для автоматизации рабочих процессов в заведениях общественного питания. Состав и структура исходных данных. Основные сведения о предметной области, ее моделирование. Создание и запуск базовых запросов SQL.

    курсовая работа [2,2 M], добавлен 28.01.2016

  • Выбор инструментальной среды для разработки базы данных. Подсистема сбора, обработки и загрузки данных. Укрупненный алгоритм разрабатываемой информационной системы. Формирование области запросов базы, интерфейс ввода и редактирования входных данных.

    курсовая работа [2,2 M], добавлен 25.12.2012

  • Разработка автоматизированной информационной системы предприятия на основе баз данных, которая обеспечивает качественный контроль данных, автоматизацию документооборота, быстрое составление отчетов. Создание форм, отчетов и макросов, меню базы данных.

    курсовая работа [4,8 M], добавлен 20.05.2014

  • Создание структуры базы данных. Таблица реквизитов входных данных информационной системы "Видеобиблиотека". Процессы, составляющие действие в базе данных. Формирование ведомостей с использованием MS Excel. Использование интегрированной среды Delphi.

    курсовая работа [455,8 K], добавлен 05.01.2013

  • Создание файла со списком студентов. Реализация программы для работы с "базой данных", которая позволяет добавить, удалить, редактировать, сохранять информацию о студентах. Упорядочивание списка студентов методом прямого слияния и поиск по базе.

    курсовая работа [299,8 K], добавлен 27.06.2014

  • Разработка базы данных информационной системы для автоматизации предметной области. Программа контроля и просмотра услуг, предоставляемых магазином "Стройматериалы". Схема данных, создание запросов, отчёты. Описание технологии ведения базы данных.

    курсовая работа [2,5 M], добавлен 21.10.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.