Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Федеральное государственное автономное
образовательное учреждение
высшего профессионального образования
«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
Институт космических и информационных технологий
Кафедра вычислительной техники
КУРСОВАЯ РАБОТА
Информационная система отдела кадров
Руководитель Доцент А.В. Редькина
подпись дата должность, ученая степень инициалы, фамилия
Студент КИ-11 07Б 031100053 К.И. Плесцов
номер группы номер зачетной книжки подпись инициалы, фамилия
Красноярск 2012
Содержание
Задание Реферат Введение Эскизная схема алгоритма Список идентификаторов Словесное описание алгоритма Инструкция к программе Заключение Приложение Список литературы |
3 4 5 6 7 10 13 14 15 27 |
Задание
Информационная система отдела кадров. Информация: работники - фамилия, имя, отчество, личный номер, дата рождения, образование, профессия, должность, номер подразделения, семейное положение, количество детей; название подразделения, руководитель. Операции: прием и увольнение работников, перевод работников из одного подразделения в другое, просмотр списка работников по какому-либо полю с каким-либо условием с коррекцией информации о работнике.
Реферат
Общие сведения: тема работы: информационная система отдела кадров, количество страниц: 20, количество приложений: 1, использованных источников: 3, перечень ключевых слов: отдел кадров.
Консольное приложение, написанное на языке С++, для работы с информацией о работниках из отдела кадров, хранимой в бинарном файле. Предоставление пользователю просмотра и сортировки информации о работниках. Программа так же предусматривает добавление и удаление информации о работниках и их корректировке. Программный продукт так же может быть использован в качестве экземпляра, при написании собственных программ.
Введение
Значительная роль в работе предприятия принадлежит управлению кадрами [1]. Программы для работы с отделом кадров являются одними из наиболее востребованных продуктов в сфере научных и экономических предприятий. Они позволяют улучшить и ускорить прием сотрудников на работу, вести по ним детальный отчет, организовывать структуру самого предприятия определением мест для каждого работника. Автоматизированные информационные системы отдела кадров очень специфичны для каждого предприятия, поэтому каждое из них нуждается в разработке своего собственного приложения для организации работы сотрудников, их учете, увольнению, повышению и найму.
Приложение для работы с отделом кадров является важным для больших предприятий. Количество сотрудников становится очень большим, что замедляет работу программ и требует разработки достаточно эффективной и быстрой программы для работы с ними. Она позволит развиваться предприятию в дальнейшем еще быстрее, чем раньше.
В мире уже есть готовые и достаточно универсальные программы для работы с базами данных не только для отделов кадров, но и для любой другой базы. Такими программами являются Microsoft Office Excel, Microsoft SQL Server. С мощностью и эффективностью такой программы как Microsoft SQL Server сложно соревноваться и написать продвинутое приложение с собственным языком и синтаксисом, в данной работе не получится. Здесь будут рассмотрены лишь базовые принципы, на основе которых можно начать создавать свой проект, но чтобы его развивать, вам потребуется новые знания в области создания информационных систем отделов кадров.
Часто разработка информационных программ приводит к столкновению с основными проблемами, которые являются типичными при создании таких приложений. На основе решения данных проблем, происходит создание таких программных продуктов.
В данной курсовой работе задачей является создание одного из таких приложений. Цель данной работы будет показать основные этапы разработки программы для работы с отделом кадров, а так же трудности, которые будут появляться при создании подобных программ. Такие трудности будут разобраны, и для каждой из них будет показан оптимальный путь решения.
Для написания программы, сформулируем следующие подзадачи:
Эскизная схема алгоритма
Список идентификаторов
Классы, структуры, функции |
Описание |
struct StringList { char c[32]; StringList *next, *back; StringList(); void fill(char *st); void write(); void writeR(); }; |
Структура для хранения и обработки списка строк Массив символов для строки Указатели на следующий и предыдущий элемент списка Конструктор структуры Добавление строки с заменой предыдущей строки Вывод на экран содержимого массива символов c[32] Вывод русских символов на экран |
struct Data { сhar DateOfBirth[32], Family[32], F[32], I[32], O[32], IndividualNum[32], Education[32], Profession[32], Post[32], PodNumber[32], PodName[32], Boss[32]; int Kids; }; |
Структура, хранящая информацию о работнике Массив символов, соответствует дате рождения работника Массив символов, соответствует семейному положению работника Массив символов, соответствует фамилии работника Массив символов, соответствует имени работника Массив символов, соответствует отчеству работника Массив символов, соответствует индивидуальному номеру работника Массив символов, соответствует образованию работника Массив символов, соответствует профессии работника Массив символов, соответствует должности работника Массив символов, соответствует номеру подразделения работника Массив символов, соответствует названию подразделения работника Массив символов, соответствует имени руководителя работника Число, соответствует количеству детей работника |
struct DataDinamic { Data *D; DataDinamic *Next, *Back; DataDinamic() }; |
Структура, динамический список, хранящий указатель на структуру информации о работнике Указатель на структуру информации о работнике Указатель на следующий и предыдущий элемент списка Конструктор структуры |
struct user { char login[22], password[22]; int status; }; |
Структура, информация о логине, пароле и статусе пользователя (администратор, пользователь, суперадминистратор) Массив символов, хранящий информацию о логине Массив символов, хранящий информацию о пароле Массив символов, хранящий информацию о статусе |
struct str32 { char c[32]; int s; }; |
Структура, для хранения строки размеров 32 символа Массив символов, хранящий строку Целое число, соответствующее длине строки, чтобы не обращаться к функции strlen() несколько раз. |
class Firewall { private: int Work_Status; public: Firewall() int getStatus() void setStatus(int num) }; |
Класс, проверяющий статус работы пользователя Целое число, соответствующее статусу пользователя Конструктор класса Функция, возвращающая статус пользователя Функция, устанавливающая статус пользователя |
void writeLogin (char login[22]) { char ch; int i = 1; ch = login[0]; while(ch != '\0') { cout << ch; ch = login[i]; i++; } return; } |
Функция поэлементного вывода логина, принимает массив из 22 символов в качестве аргумента Временная переменная символьного типа Счетчик, целочисленного типа, определяет позицию конца строки Присваивание начальному значению для временной переменной значение первого символа из массива символов Цикл, пока временная переменная не будет равна концу строки Вывод временной переменной Присваивание следующего значения Инкремент счетчика Выход из функции |
void DeleteUser() |
Функция удаления пользователя Удаляет, указанного суперадминистратором, пользователя из базы |
bool Russ(char c) |
Функция, определяющая, является ли символ буквой русского алфавита, возвращает истину, если символ буква русского алфавита, ложь в обратном случае |
bool UsersMatch (user A, user B) |
Функция проверки соответствия пароля и логина двух пользователей А и B, которая используется в цикле, после ввода логина и пароля пользователя, для поиска соответствующего логина и пароля в файле существующих логинов и паролей. |
void SetText (char *stroka, int size) |
Функция, для ввода строки в массив строк stroka размером size. А так же проверяет вводимые символы на соответствие буквам английского алфавита и цифрам, не позволяет вводить русские буквы |
void SetTextR (char *stroka, int size) |
Функция, для ввода строки в массив строк stroka размером size. А так же проверяет вводимые символы на соответствие буквам русского алфавита и цифрам, не позволяет вводить английские буквы |
void SetTextDate (char *stroka, int size) |
Функция, для ввода строки в массив строк stroka размером size. А так же проверяет вводимые символы на соответствие формату даты ДД.ММ.ГГГГ |
void SuperUserListing() |
Функция, вызывающая главное окно команд суперадминистратора |
void UserListing() |
Функция, вызывающая главное окно команд пользователя |
void AdminListing() |
Функция, вызывающая главное окно команд администратора |
void AddUser() |
Функция, добавляющая нового пользователя в базу пользователей |
void Category() |
Функция, вызывающая окно команд для изменения базы категорий |
void categoryWork (char *filename, char *additionalStr) |
Функция, вызывающая окно списка категории из базы категорий filename. Принимает в качестве дополнительного аргумента массив символов содержащих строку приветствия additionalStr, чтобы пользователь не забыл, какую категорию он корректирует |
StringList *categorySelect (char *filename, char *additionalStr) |
Функция, возвращающая указатель на структуру StringList. Аргумент 1, имя базы требуемой категории Аргумент 2, массив символов содержащих строку приветствия additionalStr, чтобы пользователь не забыл, какую категорию он выбирает |
void dataList() |
Функция, вызывающая окно списка всех работников из базы, предоставляет администратору возможность добавления, удаления, сортировки и изменению указанного поля работника |
void dataListUser() |
Функция, вызывающая окно списка всех работников из базы, предоставляет пользователю возможность сортировки работников |
int options (int num, char **opt) |
Функция, вызывающая окно выбора поля из списка двумерного массива opt, и возвращает соответствующий этому полю целочисленный номер. В качестве целочисленного аргумента num, принимает число полей в списке. |
Словесное описание алгоритма
Аутентификация пользователя производится сравнением введенной строки логина, пароля со всеми логинами и паролями пользователей, которые хранятся в отдельном файле «login.dat». Вся информация о пользователях представлена в виде структуры, хранящей информацию о логине, пароле и статусе указанного пользователя. Статусам пользователей соответствуют: «1» - пользователь, «2» - администратор, «7» - суперадминистратор. Пользователю доступна функция вывода всех работников и их сортировка по какому-либо полю. Администратору доступны те же функции, что и пользователю, но администратор может при этом добавлять, удалять работников и изменять информацию о них в каком-либо поле. Супер администратор обладает возможностью создавать подразделения, номера подразделений, руководителей и должности, которые хранятся в виде строк в соответствующих файлах «categoryNameP.dat», «categoryNumP.dat», «categoryDirector.dat», «categoryD.dat».
Работа с файлами производится через библиотеку «stdio.h». Вывод и запись строк осуществляется через библиотеку «iostream», однако не везде. Используется стандартный ввод/вывод, где учитывается нажатие какого-либо символа, а так же библиотека «conio.h», для реакции на нажатие какой-либо клавиши, к примеру, при вводе пароля, символ читается, но на его месте выводится «*», для сокрытия вводимых данных.
Информация о работниках хранится в файле «Data.dat», в виде структуры с данными строкового типа, и одного целочисленного, где хранятся данные о количестве детей работника.
Для хранения информации об отдельных данных, таких как имя, фамилия, количество детей, использовались стандартные указатели на переменные в виде массивов, но для функции удаления пользователя, был использован вектор из библиотеки STL «vector». Для обработки информации о работниках использовались динамические двусвязные списки, но не из библиотеки STL.
Библиотека «cstdlib» использовалась для вызова функции system(), которая в свою очередь принимала аргумент «cls», для очистки экрана. Библиотека «windows.h» была использована для работы с выводимым текстом, его цветом и задним фоном. Для поддержки русскоязычного интерфейса была подключена библиотека «locale.h».
Изменение информации о работниках, а так же сортировка, производилась со списком, а не непосредственно в файле, что позволяет оставить данные в файле корректными и не открывать файл для чтения лишний раз, после окончания работы со списком, он перезаписывался в файл, если пользователем был администратор.
Далее представлен алгоритм выполнения всей программы, который показывает все возможные пути при работе с приложением:
Шаги Операции
Инструкция к программе
При первом входе в программу, нужно запустить режим суперадминистратора. Для этого введите соответствующий логин: “Super” и пароль: “Admin”. Далее добавьте пользователей: выберите поле «добавить нового пользователя» и нажмите клавишу «Enter». После этого введите соответствующие данные о имени, пароле и статусе пользователя (1 пользователь, 2 администратор, 7 суперадминистратор). Внесите несколько категорий для названия подразделений, номеру подразделений, руководителям и должностям. После этого можете завершить работу программы и зайти под пользователем, либо администратором, чтобы добавить новых работников в базу.
Используются двусвязные списки для хранения информации о работниках. Информация о работниках описывается в структуре хранящей информацию в символьном и целочисленном типе для отдельных полей.
Общий алгоритм программы:
Алгоритм входа, аутентификации:
Алгоритм добавления/удаления работника из базы:
Алгоритм корректировки данных о работнике
Заключение
Результатом данной курсовой работы, является программа, которая полностью решает поставленные задачи и достигает главную цель реализацию «информационной системы отдела кадров».
По результатам выполнения программы следует отметить её стабильность, даже при долгом доступе к отдельным функциям и многочисленным изменениям данных. Программа поддерживает безопасность и сохранность данных содержащихся в файлах. При некорректном выходе из программы, вся информация в файлах не пострадает. Все функции и методы, которые были предложены в варианте курсовой работы, полностью реализованы. Результаты работы программы корректны и не вызывают вопросов. Преимуществом в реализации именно тех методов, что были использованы в работе, является их дальнейшая расширяемость и удобство. Данные методы пригодятся для построения не только задач, указанных в варианте. К примеру, метод создания интерфейса, может использоваться не только в информационной системе отдела кадров, он так же подойдет для информационной системы товаров или банковских переводов.
Недостатками данного приложения являются: отсутствие графического интерфейса, в файле с логинами всегда должна оставаться запись суперадминистратора, иначе необходимо заменить файл с логинами «login.dat» на настроенный по умолчанию «file.dat». Так же к недостаткам относятся: низкая скорость прорисовки, что может сильно замедлить работу с программой на компьютерах с низкими техническими показателями, а так же программа не восстановит некорректно введенные данные, так как нет возможности отмены предыдущих изменений.
Приложение
Фрагмент кода программы
Функция вывода главного окна с командами для суперадминистратора.
void SuperUserListing()
{
do
{
int active = 0;
char ch;
char **Option = new char*[5];
for (int h = 0; h < 5; h++)
Option[h] = new char[60];
strcpy(Option[0],"Здравствуйте, Суперадминистратор!");
strcpy(Option[1],"0. Выход");
strcpy(Option[2],"1. Добавить нового пользователя");
strcpy(Option[3],"2. Удалить пользователя");
strcpy(Option[4],"3. Добавить/Удалить категорию");
active = options(5,Option);
if (active == 0)
return;
else if (active == 1)
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(LOGIN,5000);
if(dwWaitResult!=WAIT_OBJECT_0)
{
cout << endl << "TIMEOUT 5 second, access is closed..." << endl;
}
else
{
AddUser();
ReleaseSemaphore(LOGIN,1,NULL);
}
}
else if (active == 2)
{
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(LOGIN,5000);
if(dwWaitResult!=WAIT_OBJECT_0)
{
cout << endl << "TIMEOUT 5 second, access is closed..." << endl;
}
else
{
DeleteUser();
ReleaseSemaphore(LOGIN,1,NULL);
}
}
else if (active == 3)
Category();
}
while(1);
};
Функция вывода главного окна обработки информации о работниках для администратора.
void dataList()
{
Data *Dat; ///Элемента из файла
DataDinamic *DinDat, *ptr, *ctr, *activeLink, *buf; /// Списки с
элементами DinDat = Top, остальные ptr
//////buf нужен при удалении списка, чтобы хранить старый конец файла
StringList *IO; ////Для обработки вывода
DinDat = NULL;
int num = 0;
FILE *in;
in = fopen("Data.dat","r+b");
Dat = new Data;
fread(Dat,sizeof(*Dat),1,in);
if (!feof(in))
{
num = 1; ///Кол-во данных
DinDat = new DataDinamic;
DinDat->D = Dat;
ptr = DinDat;
Dat = new Data;
fread(Dat,sizeof(*Dat),1,in);
if (!feof(in))
{
num = 2;
ptr = new DataDinamic;
ptr->D = Dat;
DinDat->Next = ptr;
ptr->Back = DinDat;
Dat = new Data;
fread(Dat,sizeof(*Dat),1,in);
while(!feof(in))
{
ctr = new DataDinamic;
ctr->D = Dat;
ptr->Next = ctr;
ctr->Back = ptr;
ptr = ptr->Next;
num++;
Dat = new Data;
fread(Dat,sizeof(*Dat),1,in);
}
}
}
if (Door.getStatus() == 1)
{
fclose(in);
return;
ReleaseSemaphore(DATA,1,NULL);
}
int active = 0;
int page = 0;
char ch2;
activeLink = DinDat;
if (DinDat == NULL)
ptr = NULL;
do
{
system("cls");
if (page != num)
{
if (active == 0)
{
SetColor(Red,White);
cout << "0. Выход";
SetColor(Blue,White);
}
else
cout << "0. Выход";
cout << endl;
if (active == 1)
{
SetColor(Red,White);
cout << "1. Сортировка";
SetColor(Blue,White);
}
else
cout << "1. Сортировка";
cout << endl;
cout << "--------------------------------------";
cout << "Номер записи: " << page+1;
cout << endl;
WriteInfo(active, 2, "Имя: ", activeLink->D->I);
WriteInfo(active, 3, "Фамилия: ", activeLink->D->F);
WriteInfo(active, 4, "Отчество: ", activeLink->D->O);
WriteInfo(active, 5, "Семейное положение: ",
activeLink->D->Family);
WriteInfo(active, 6, "Личный номер: ",
activeLink->D->IndividualNum);
WriteInfo(active, 7, "Образование: ", activeLink->D->Education);
WriteInfo(active, 8, "Профессия: ", activeLink->D->Profession);
WriteInfo(active, 9, "Должность: ", activeLink->D->Post);
WriteInfo(active, 10, "Номер подразделения: ",
activeLink->D->PodNumber);
WriteInfo(active, 11, "Название подразделения: ",
activeLink->D->PodName);
WriteInfo(active, 12, "Руководитель: ", activeLink->D->Boss);
if (active == 13)
{
SetColor(Red,White);
cout << "Количество детей: ";
cout << activeLink->D->Kids;
SetColor(Blue,White);
}
else
{
cout << "Количество детей: ";
cout << activeLink->D->Kids;
}
cout << endl;
WriteInfo(active, 14, "Дата рождения: ",
activeLink->D->DateOfBirth);
}
else
{
if (active == 0)
{
SetColor(Red,White);
cout << "0. Выход";
SetColor(Blue,White);
}
else
cout << "0. Выход";
cout << endl;
if (active == 1)// 1
{
SetColor(Red,White);
cout << "1. Сортировка";
SetColor(Blue,White);
}
else
cout << "1. Сортировка";
cout << endl;
cout << "--------------------------------------";
cout << endl;
if (active == 2)// 2
{
SetColor(Red,White);
cout << "2. Добавить нового рабочего";
SetColor(Blue,White);
}
else
{
cout << "2. Добавить нового рабочего";
}
cout << endl;
}
do
{
ch2 = _getch();
if (ch2 == -32)
{
ch2 = _getch();
if(page != num)
{
if(ch2 == 'P') //Вниз
{
if(active < 14)
{
active++;
}
else if (active == 14)
{
active = 0;
}
}
else if(ch2 == 'H') //Вверх
{
if(active > 0)
{
active--;
}
else if (active == 0)
{
active = 14;
}
}
else if(ch2 == 'K') //Влево
{
active = 0;
page--;
if (page < 0)
{
page = num;
if (ptr != NULL)
activeLink = NULL;
}
else if (activeLink != NULL)
activeLink = activeLink->Back;
}
else if(ch2 == 'M') //Вправо
{
active = 0;
page++;
if (page > num)
{
page = 0;
if (DinDat != NULL)
activeLink = DinDat;
}
else if (activeLink != NULL)
activeLink = activeLink->Next;
if (activeLink != NULL && page == num)
activeLink = new DataDinamic;
}
else if(ch2 == 'S')
{
char **yesno = new char*[3];
for (int i = 0; i < 3; i++)
yesno[i] = new char[60];
strcpy(yesno[0],"Вы действительно хотите
удалить данную запись?");
strcpy(yesno[1],"Нет");
strcpy(yesno[2],"Да");
if (activeLink != NULL && page < num &&
options(3,yesno))
{
num--;
if (activeLink->Next == NULL &&
activeLink->Back == NULL)
{
delete activeLink;
activeLink = NULL;
ptr = NULL;
DinDat = NULL;
page = 0;
}
else if (activeLink->Next == NULL)
{
ctr = activeLink->Back;
ctr->Next = NULL;
delete activeLink;
activeLink = ctr;
page--;
ptr = ctr;
}
else if (activeLink->Back == NULL)
{
ctr = activeLink->Next;
ctr->Back = NULL;
DinDat = ctr;
delete activeLink;
activeLink = ctr;
page = 0;
}
else
{
buf = new DataDinamic;
buf = ptr;
ctr = activeLink->Back;
ptr = activeLink->Next;
delete activeLink;
ctr->Next = ptr;
ptr->Back = ctr;
activeLink = ctr;
page--;
ptr = buf;
}
}
}
}
else if (page == num)
{
if(ch2 == 'P') //Вниз
{
if(active < 2)
{
active++;
}
else if (active == 2)
{
active = 0;
}
}
else if(ch2 == 'H') //Вверх
{
if(active > 0)
{
active--;
}
else if (active == 0)
{
active = 2;
}
}
else if(ch2 == 'K') //Влево
{
active = 0;
page--;
if (page<0)
page=num;
if (ptr != NULL)
activeLink = ptr;
}
else if(ch2 == 'M') //Вправо
{
active = 0;
page = 0;
if (DinDat != NULL)
activeLink = DinDat;
}
}
}
}
while(ch2 != 'M' && ch2 != 'K' && ch2 != 'P' &&
ch2 != 'H' && ch2 != ENTER && ch2 != 'S');
if (active == 1 && ch2 == ENTER)
{
DinDat = DataSort(DinDat);
active = 0;
page = 0;
ptr = new DataDinamic;
ptr = DinDat;
while(ptr->Next!=NULL)
{
ptr = ptr->Next;
}
activeLink = new DataDinamic;
activeLink = DinDat;
}
else if (active == 2 && ch2 == ENTER && page == num) //Т.е.
выбрали вкладку добавить пользователя
{
////Отпрашивай семафоры для изменения данных
DWORD dwWaitResult;
dwWaitResult = WaitForSingleObject(CATEGORY,5000);
if(dwWaitResult!=WAIT_OBJECT_0)
{
cout << endl << "TIMEOUT 5 second, access is closed..."
<< endl;
}
else
{
activeLink=addData(activeLink,DinDat);
if (DinDat == NULL)
{
DinDat = activeLink;
ptr = DinDat;
}
else
{
ptr->Next = activeLink;
activeLink->Back = ptr;
ptr = activeLink;
}
ReleaseSemaphore(CATEGORY,1,NULL);
num++;
active = 0;
activeLink = DinDat;
page = 0;
}
}
else if (active == 0 && ch2 == ENTER)
{
break; ///Заканчиваем сеанс
}
else if (ch2 == ENTER && page != num)
{
switch(active)
{
case 2:
system("cls");
cout << "Введите новое имя работника:" << endl;
SetTextR(activeLink->D->I,32);
break;
case 3:
system("cls");
cout << "Введите новую фамилию работника:" << endl;
SetTextR(activeLink->D->F,32);
break;
case 4:
system("cls");
cout << "Введите новое отчество работника:" << endl;
SetTextR(activeLink->D->O,32);
break;
case 5:
system("cls");
cout << "Введите новое семейное положение
работника:" << endl;
SetTextR(activeLink->D->Family,32);
break;
case 6:
system("cls");
cout << "Введите новый личный номер работника:"
<< endl;
SetTextR(activeLink->D->IndividualNum,32);
break;
case 7:
system("cls");
cout << "Введите новое образование работника:"
<< endl;
SetTextR(activeLink->D->Education,32);
break;
case 8:
system("cls");
cout << "Введите новую профессию работника:" << endl;
SetTextR(activeLink->D->Profession,32);
break;
case 9:
system("cls");
strcpy(activeLink->D->Post,
categorySelect("categoryD.dat",
"Выберите новую должность работника:")->c);
break;
case 10:
system("cls");
strcpy(activeLink->D->PodNumber,
categorySelect("categoryNumP.dat",
"Выберите новый номер подразделения")->c);
break;
case 11:
system("cls");
strcpy(activeLink->D->PodName,
categorySelect("categoryNameP.dat",
"Выберите название подразделения")->c);
break;
case 12:
system("cls");
strcpy(activeLink->D->Boss,
categorySelect("categoryDirector.dat",
"Выберите руководителя")->c);
break;
case 13:
system("cls");
cout << "Введите новое количество детей работника:"
<< endl;
cin >> activeLink->D->Kids;
break;
case 14:
system("cls");
cout << "Введите новую дату рождения работника:"
<< endl;
SetTextDate(activeLink->D->DateOfBirth,32);
break;
}
}
}
while(1);
/////Сохранение информации если мы были админом
if (Door.getStatus() == 2)
{
fclose(in);
in = fopen("Data.dat","w+b"); ////Открываем для полной перезаписи
данных
for (int jk = 0; jk < num; jk++) ////Учесть удаление записей и
вывод пустого файла без записей
{
Dat = new Data;
Dat = DinDat->D;
fwrite(Dat,sizeof(*Dat),1,in);
DinDat = DinDat->Next;
}
fclose(in);
ReleaseSemaphore(DATA,1,NULL);
}
}
Функция, отображающая окно с опциями
int options (int num, char **opt)
{
system("cls");
char ch;
int active = 1;
if (opt[0])
cout << opt[0] << endl;
for (int i = 1; i < num; i++)
{
if (i == 1)
{
SetColor(Red,White); // для активной записи
cout << opt[i] << endl;
SetColor(Blue,White);
}
else
{
cout << opt[i] << endl;
}
}
while((ch = _getch())!=ENTER)
{
if (ch == -32)
{
ch = _getch();
if(ch == 'P') //Вниз
{
if(active < num-1)
active++;
else if (active == num-1) //Эффект
перелистывания
active = 1;
}
else if(ch == 'H') //Вверх
{
if(active > 1)
active--;
else if (active == 1) //Эффект
перелистывания
active = num-1;
}
}
else if(ch >= '0' && ch <= '0'+num-1)
active = ch-'0';
if(ch == 'P' || ch == 'H' || (ch >= '0' && ch <= '0'+num-1))
{
system("cls");
SetColor(Black,White);
if (opt[0])
cout << opt[0] << endl;
SetColor(Blue,White);
for (int h = 1; h < num; h++)
{
if (h == active)
{
SetColor(Red,White); // для активной
записи
cout << opt[h] << endl;
SetColor(Blue,White); // для остальных
записей
}
else
{
cout << opt[h] << endl;
}
}
}
}
return active-1;
}
Блок-схемы
Список литературы
1. Шкатулла В.И. Настольная книга менеджера по кадрам, М: НОРМАИНФРА-М, 2000, 560 с.
2. Кнут Д.Э., Искусство программирования (Том 1. Основные алгоритмы), 3-е издание, М.: Издательский дом «Вильямс», 2000, 682 с.
3. Дэвис, Стефан Р., С++ для «чайников», 4-е издание, М.: Издательский дом «Вильямс», 2003, 336 с.