У вас вопросы?
У нас ответы:) SamZan.net

тема отдела кадров Руководитель До

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

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

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 26.12.2024

Федеральное государственное автономное

образовательное учреждение

высшего профессионального образования

«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Институт космических и информационных технологий

Кафедра вычислительной техники

       

КУРСОВАЯ РАБОТА

Информационная система отдела кадров

        Руководитель                                      Доцент         А.В. Редькина

                                         подпись              дата           должность, ученая степень     инициалы, фамилия

        Студент КИ-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 сложно соревноваться и написать продвинутое приложение с собственным языком и синтаксисом, в данной работе не получится. Здесь будут рассмотрены лишь базовые принципы, на основе которых можно начать создавать свой проект, но чтобы его развивать, вам потребуется новые знания в области создания информационных систем отделов кадров.

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

В данной курсовой работе задачей является создание одного из таких приложений. Цель данной работы будет показать основные этапы разработки программы для работы с отделом кадров, а так же трудности, которые будут появляться при создании подобных программ. Такие трудности будут разобраны, и для каждой из них будет показан оптимальный путь решения.

Для написания программы, сформулируем следующие подзадачи:

  1.  Определить начальные условия, тип предприятия, для которого будет создаваться программный продукт.
  2.  Выделить главные особенности, отличающие его от стандартной программы для работы с отделом кадров, такие как функции сортировок, корректировки и перевода из одних отделов в другие.
  3.  На основе данных представлений, создать эскизную схему программы, представить какие действия могут быть выполнены администратором и пользователем.
  4.  Разработать код для отдельных часто используемых функций. Такие функции как проверка вводимых данных, перевод числа в строку и обратно, и т.д.
  5.  Разработать основной код программы с использованием функций, которые были ранее разработаны, для более быстрого, безопасного и удобного написания основного кода программы.

Эскизная схема алгоритма

 

Список идентификаторов

Классы, структуры, функции

Описание

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».

Изменение информации о работниках, а так же сортировка, производилась со списком, а не непосредственно в файле, что позволяет оставить данные в файле корректными и не открывать файл для чтения лишний раз, после окончания работы со списком, он перезаписывался в файл, если пользователем был администратор.

 

Далее представлен алгоритм выполнения всей программы, который показывает все возможные пути при работе с приложением:

Шаги    Операции

  1.  Вводим строки соответствующие логину и паролю, после этого переходим к шагу 2.
  2.  Проверяем введенную строку на ошибки, если ошибок нет, то шаг 3, иначе шаг 1.
  3.  Проверяем логин и пароль на соответствие существующим логинам и паролям, если такого пароля не существует, то шаг 13, иначе шаг 4.
  4.  Определяем статус для пользователя, если статус администратор, то переходим к шагу 5, если статус суперадминистратор, то к шагу 14, если статус пользователь, то переходим к шагу 23.
  5.  Выводим все доступные команды для администратора, если администратор выбрал выход, то переходим к шагу 13, если администратор выбрал вывод списка работников, то переходим к шагу 6.
  6.  Выводим первого работника из списка, всю информацию о нем в специальной форме, и делаем самую верхнюю опцию активной, если администратор выбрал опцию выхода, то сохраняем все изменения и переходим к шагу 5, если администратор выбрал опцию сортировки, то переходим к шагу 10, если администратор нажал клавишу влево, вправо, вниз или вверх, переходим к шагу 9, если администратор нажал клавишу Del, то переходим к шагу 7.
  7.  Выводим строчку с подтверждением о удалении указанной записи, если администратор выбрал ответ «Да», то работник удаляется и переходим к шагу 6, если администратор выбрал ответ «Нет», то переходим к шагу 8.
  8.  Выводим на экран работника, который на данный момент активен и выводим соответственно активную опцию, если администратор выбрал опцию выхода, то сохраняем все изменения и переходим к шагу 5, если администратор выбрал опцию сортировки, то переходим к шагу 10, если администратор нажал клавишу влево, вправо, вниз или вверх, переходим к шагу 9, если администратор нажал клавишу Del, то переходим к шагу 7.
  9.  Выполняем проверку на нажатие клавиши, если нажатая клавиша соответствует «вправо», то делаем активной следующую запись и переходим к шагу 8, если нажатая клавиша соответствует «влево», то делаем активной предыдущую запись и переходим к шагу 8, если нажатая клавиша соответствует «вверх», то перемещаем активную опцию вверх и возвращаемся к шагу 8, если нажатая клавиша соответствует «вниз», то перемещаем активную опцию вниз и возвращаемся к шагу 8.
  10.  Выводим для администратора ряд опций с названиями полей, которые он может отсортировать и опцию выхода, если администратор выбрал опцию выхода, то переходим к шагу 8, если администратор выбрал любую другую опцию, то переходим к шагу 11.
  11.  Выводим строку выбора типа сортировки, по убыванию, либо по возрастанию для администратора, после выбора одной из опций, переходим к шагу 12.
  12.  Сортируем весь список работников по заданному полю, и выбранному типу сортировки и переходим к шагу 6.
  13.  Выходим из программы.
  14.  Выводим все доступные команды для суперадминистратора, если суперадминистратор выбрал выход, то переходим к шагу 13, если суперадминистратор выбрал добавление пользователя, то переходим к шагу 15, если суперадминистратор выбрал удаление пользователя, то переходим к шагу 16, если суперадминистратор выбрал добавление категории, то переходим к шагу 18.
  15.  Запрашиваем у суперадминистратор ввод логина, пароля и статуса для нового пользователя, после этого возвращаемся к шагу 14.
  16.  Выводим всех имеющихся на данный момент пользователей в виде списка и опцию выхода, если суперадминистратор выбрал выход, то возвращаемся к шагу 14, если суперадминистратор выбрал одну из записей, то переходим к шагу 17.
  17.  Выводим для суперадминистратор строку с подтверждением удаления указанного пользователя, если суперадминистратор нажимает «Да», то удаляем выбранную запись из базы и возвращаемся к шагу 16, если суперадминистратор нажимает «Нет», то возвращаемся к шагу 16.
  18.  Выводим для суперадминистратора все категории, которые он может изменять и опцию выхода, если суперадминистратор выбрал опцию выхода, то переходим к шагу 14, если суперадминистратор выбрал одну из категорий для изменения, то переходим к шагу 19.
  19.  Выводим все содержимое выбранной категории и добавляем две опции выхода и добавления новой категории, если суперадминистратор выбрал выход, то сохраняем все изменения и возвращаемся к шагу 18, если суперадминистратор выбрал одну из категорий то переходим к шагу 20, если пользователь выбрал добавление новой категории, то переходим к шагу 22.
  20.  Запрашиваем у суперадминистратора новое значение для выбранного поля, после нажатия клавиши «Enter», переходим к шагу 21.
  21.  Если данные введены верно, то возвращаемся к шагу 19, если данные введены не верно, уведомляем об этом суперадминистратора и переходим к шагу 20.
  22.  Запрашиваем у суперадминистратора значение для новой категории, если данные введены верно, то добавляем новую категорию и возвращаемся к шагу 19, если данные введены не верно, уведомляем об этом суперадминистратора и начинаем шаг 22 снова.
  23.  Выводим для пользователя все доступные для него опции, если пользователь выбирает выход, то возвращаемся к шагу 13, если пользователь выбирает опцию просмотра информации о рабочих, то переходим к шагу 24.
  24.  Выводим для пользователя всю информацию о первом работнике, в виде формы и опции сортировки и выхода, при этом запрещаем ему изменять поля и добавлять новых работников, если пользователь выбирает выход, то возвращаемся к шагу 23, если пользователь выбирает опцию сортировки, то переходим к шагу 25, если пользователь нажимает кнопку «вверх», «вниз», «влево» или «вправо», то переходим к шагу 27.
  25.  Выводим для пользователя все поля, которые он может отсортировать и опцию выхода, если пользователь выбирает выход, то переходим к шагу 24, если пользователь выбирает одно из полей, запрашиваем у пользователя тип сортировки, по убыванию, либо возрастанию, после этого переходим к шагу 26.
  26.  Сортируем всех работников по заданному полю и типу сортировки, после этого возвращаемся к шагу 24.
  27.  Если нажатая кнопка соответствует кнопке вверх, то перемещаем активную опцию вверх и переходим к шагу 28, если нажатая кнопка соответствует кнопке вниз, то перемещаем активную опцию вниз и переходим к шагу 28, если нажатая кнопка соответствует кнопке влево, то перемещаем указатель активного работника влево и переходим к шагу 28, если нажатая кнопка соответствует кнопке вправо, то перемещаем указатель активного работника вправо и переходим к шагу 28.
  28.  Выводим всю информацию о активном пользователе в виде формы и активную на данный момент опцию и опцию выхода и сортировки, если пользователь выбирает выход, то переходим к шагу 24, если пользователь выбирает одно из полей, запрашиваем у пользователя тип сортировки, по убыванию, либо возрастанию, после этого переходим к шагу 26.

Инструкция к программе

При первом входе в программу, нужно запустить режим суперадминистратора. Для этого введите соответствующий логин: “Super” и пароль: “Admin”. Далее добавьте пользователей: выберите поле «добавить нового пользователя» и нажмите клавишу «Enter». После этого введите соответствующие данные о имени, пароле и статусе пользователя (1 – пользователь, 2 – администратор, 7 – суперадминистратор). Внесите несколько категорий для названия подразделений, номеру подразделений, руководителям и должностям. После этого можете завершить работу программы и зайти под пользователем, либо администратором, чтобы добавить новых работников в базу.

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

Общий алгоритм программы:

  1.  Авторизация пользователя в системе.
  2.  Работа с пользователем
  3.  Сохранение изменений вносимых пользователем
  4.  Выход из программы

Алгоритм входа, аутентификации:

  1.  Ввод данных
  2.  Проверка имени среди имеющихся имен из базы логинов, хранящейся в файле
  3.  Проверка пароля для совпадающего введенного имени с именем из списка
  4.  Определение прав доступа для авторизовавшегося пользователя
  5.  Вызов главной функции ввода команд для пользователя

Алгоритм добавления/удаления работника из базы:

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

Алгоритм корректировки данных о работнике

  1.  Выбор соответствующего поля для изменения.
  2.  Ввод пользователем нового значения для поля
  3.  Проверка на корректность ввода новых данных
  4.  Добавление новых данных с заменой старой информации

Заключение

Результатом данной курсовой работы, является программа, которая полностью решает поставленные задачи и достигает главную цель – реализацию «информационной системы отдела кадров».

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

Недостатками данного приложения являются: отсутствие графического интерфейса, в файле с логинами всегда должна оставаться запись суперадминистратора, иначе необходимо заменить файл с логинами «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 с.




1. Фашизм
2. Життя не насолода і не страждання а серйозна справа яку покладено на нас і яку потрібно завершити з честю
3. Королевские династии в истории Франции
4. Доклад Тассо Торквато
5. Отравление угарным газом
6. Великобританія та Німеччина - провідні високорозвинені європейські країн
7. Тема 2 Фактори зовнішнього впливу на поведінку споживачів Мета лекції- розуміння аудиторією сутності фак
8. тематикалы~ моделін
9. Фитофармацевтические средства защиты растений
10. мистический образ жизни проповедуемый Пифагором
11. БАШКИРСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ Кафедра истории истории государства и права
12. живильник; 2 ~ відбійний козирьок; 3ротор; 4 рухома щока; 5 регульована ребриста щока; 6 колосникова решітка;
13. Гусеничный движитель
14. Понятие функции и виды юридической ответственности за экологические правонарушения
15. УТВЕРЖДАЮ Зав1
16. Мониторинг природных ресурсов г Саратова
17. Дані лабораторних інструментальних досліджень хворого Г
18. Инферно Дэн БраунИнферно Моим родителям Самое жаркое место в аду предназнач
19.  Уголовное право предмет метод функции
20. Содержание углерода в чугуне не менее 214 точка предельной растворимости углерода в аустените на диаграмм