Программное обеспечение работы поликлиники

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

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

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

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

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

Министерство образования Республики Беларусь

Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»

Факультетинженерно-экономический

Кафедра экономической информатики

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту по курсу: «Основы конструирования программ»

на тему: ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ РАБОТЫ ПОЛИКЛИНИКИ

Студент Лосиков К. С. гр. 573601

Руководитель Марченко Д. Н.

Минск 2016

Задание по курсовой работе

1. Разработать функциональную схему задачи.

2. Создать программу (консольный режим), выполнив функциональное разбиение, реализующую следующие функции работы с бинарным/текстовым файлом. Предусмотреть создание меню 1-го уровня со следующими пунктами:

a. Вход под администратором;

b. Вход под пользователем;

c. Выход.

Учётные записи администратора и обычного пользователя должна содержать логин и пароль. Сведения об учётных записях должны храниться в отдельном файле, желательно предусмотреть механизм шифрования/дешифрования логинов/паролей.

3. Меню 2-го уровня:

- Для администратора:

a) Создание/открытие файла с данными;

b) Добавление записи;

c) Редактирование записи;

d) Удаление записи;

e) Просмотр всех данных в табличной форме;

f) Различные процедуры поиска и фильтрации данных;

g) Управление пользователями;

h) Выход в меню 1-го уровня.

- Для обычного пользователя:

a) Открытие файла с данными;

b) Просмотр всех данных в табличной форме;

c) Выполнение задачи;

d) Различные процедуры поиска и фильтрации данных;

e) Выход в меню 1-го уровня.

4. Данные должны быть организованы в структуре (struct), не менее 7-ми полей, обязательно предусмотреть использование вложенных структур.

5. Предусмотреть обработку исключительных ситуаций.

6. Построение программного кода должно соответствовать правилам, определенным в документе «Code Conventions» для соответствующего языка (технологии).

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

Содержание

поликлиника данные алгоритм приложение

Введение

1. Описание работы поликлиники в модели IDF0

2. Краткие теоретические сведения

3. Описание организации структур хранимых данных

4. Создание пользовательских функций приложения

5. Схемы алгоритмов работы приложения

6. Описание программы

Заключение

Список использованных источников

Приложение А Листинг кода

Введение

Поликлиника - это многопрофильное или специализированное лечебно-профилактическое учреждение для оказания амбулаторной медицинской помощи больным на приёме и на дому.

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

Первое знакомство посетителей с поликлиникой начинается в регистратуре. Она является основным структурным подразделением по реализации приема больных в поликлинике. От организации работы регистратуры зависит в значительной степени ритмичность работы всех подразделений поликлиники, обеспечение наиболее оптимального распределения потоков посетителей и уменьшение затрат времени больных на посещение поликлиники.

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

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

Основными задачами регистратуры поликлиники являются:

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

- обеспечение регулирования интенсивности потока населения для равномерной нагрузки врачей;

- своевременный подбор и доставка медицинской документации в кабинеты врачей, правильное ведение и хранение картотеки.

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

Экономическая эффективность данного программного обеспечения заключается в следующем:

- увеличение числа обслуживаемых пациентов;

- сокращение времени на оформление медицинской документации;

- уменьшение числа возможных человеческих ошибок.

Для реализации цели курсового проекта нами поставлены следующие задачи:

- изучить особенности работы медицинских учреждений;

- разработать алгоритмы основных функций и построить по ним блок-схемы;

- создать программу для работы поликлиники на языке Си;

- протестировать данную программу.

1. Описание работы поликлиники в модели IDF0

Процесс предоставления услуг пациенту в поликлинике наиболее полно описывает модель IDEF0.

Для решения задачи предоставления услуг поликлиники пациенту нам требуется определить глобальную задачу, которая будет последовательно раскрываться в процессе углубления в модель. Мы её сформулировали так: обеспечение обслуживания пациентов. Построим контекстную диаграмму, которая является вершиной древовидной структуры диаграмм и представляет собой самое общее описание работы поликлиники (см. рисунок 1.1).

Рисунок 1.1 Обеспечение обслуживания пациентов в поликлинике (контекстная диаграмма)

От поликлиники требуется предоставить лечебно-консультативные услуги для населения. Мы выделили следующие блоки, которые являются составляющими нашей контекстной диаграммы: обращение пациента в регистратуру, запись пациента к врачу, приём пациента (см. рисунок 1.2):

Рисунок 1.2 Обеспечение обслуживания пациентов (первый уровень)

В организации обслуживания пациентов в поликлинике необходимо, чтобы первоначально пациент обратился в регистратуру поликлиники с целью оформления амбулаторной карты или её выдачи для приёма, если она уже оформлена. На каждого пациента заводится медицинская амбулаторная карта, в которой указываются следующие данные: паспортные данные; информированное согласие на медицинское вмешательство; лист уточненных диагнозов; лист профилактических осмотров; записи амбулаторных посещений, патронажей; лечебные назначения; результаты дополнительных обследований и консультаций и др. Для того, чтобы пациенту попасть на приём к врачу, ему необходимо обратиться в регистратуру за амбулаторной картой (см. рисунок 1.3).

Рисунок 1.3 Обращение пациента в регистратуру

Следующая диаграмма иллюстрирует процесс записи пациента к врачу (рисунок 1.4). Она содержит несколько блоков, а именно: выбор врача для приёма, выбор даты, выбор времени. Организация записи пациентов к врачу чаще всего осуществляется с помощью талонной системы. В результате талонной системы поток первично обратившихся больных проходит через участковых регистраторов; посетители предварительно получают талоны с указанием порядкового номера очереди, фамилии врача, номера кабинета и времени явки на прием.

Рисунок 1.4 Запись пациента к врачу

На рисунке 5 представлен блок «Приём пациента» (см. рисунок 1.5). Этот блок включает в себя следующие компоненты: 1) «Провести опрос пациента», 2) «Провести осмотр пациента», 3) «Поставить диагноз», 4) «Оформить необходимые документы», 5) «Выписать рецепты», 6) «Ответить на вопросы пациента».

Рисунок 1.5 Приём пациента

Таким образом, разработанная нами модель IDF0 детально отображает процесс обеспечения обслуживания пациентов в поликлинике. Она показывает основные составляющие этой деятельности, чтобы полностью удовлетворить потребности пациента в лечебно-консультативной сфере. Теперь нам нужно разработать программу на языке программирования С, которая обеспечит автоматизацию работы регистратуры поликлиники. Для этого обратимся к изучению теоретических сведений об основных конструкциях языка программирования С.

2. Краткие теоретические сведения

Язык Си, созданный Денисом Ритчи в начале 70-х годов в Bell Laboratory американской корпорации AT&T, является одним из универсальных языков программирования. Язык Си считается языком системного программирования, хотя он удобен и для написания прикладных программ [1].

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

Программы на Си отличаются компактностью и быстротой исполнения. Структура языка Си побуждает программиста использовать в своей работе нисходящее программирование, структурное программирование, пошаговую разработку модулей [2, с. 8].

В процессе создания любой программы можно выделить несколько этапов [3]:

1. Постановка задачи -- выполняется специалистом в предметной области на естественном языке (русском, английском и т. д.). Необходимо определить цель задачи, ее содержание и общий подход к решению. Возможно, что задача решается точно(аналитически), и без компьютера можно обойтись. Уже на этапе постановки надо учитывать эффективность алгоритма решения задачи на ЭВМ, ограничения, накладываемые аппаратным и программным обеспечением (АО и ПО).

2. Анализ задачи и моделирование -- определяются исходные данные и результат, выявляются ограничения на их значения, выполняется формализованное описание задачи и построение (выбор) математической модели, пригодной для решения на компьютере.

3. Разработка или выбор алгоритма решения задачи -- выполняется на основе ее математического описания. Многие задачи можно решить различными способами. Программист должен выбрать оптимальное решение. Неточности в постановке, анализе задачи или разработке алгоритма могут привести к скрытой ошибке -- программист получит неверный результат, считая его правильным.

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

5. Кодирование -- запись алгоритма на языке программирования. Современные системы программирования позволяют ускорить процесс разработки программы, автоматически создавая часть ее текста, однако творческая работа по-прежнему лежит на программисте. Для успешной реализации целей проекта программисту необходимо использовать методы структурного программирования.

6. Отладка и тестирование программы. Под отладкой понимается устранение ошибок в программе. Тестирование позволяет вести их поиск и, в конечном счете, убедиться в том, что полностью отлаженная программа дает правильный результат. Для этого разрабатывается система тестов -- специально подобранных контрольных примеров с такими наборами параметров, для которых решение задачи известно. Тестирование должно охватывать все возможные ветвления в программе, т. е. проверять все ее инструкции, и включать такие исходные данные, для которых решение невозможно.

7. Анализ результатов -- если программа выполняет моделирование какого-либо известного процесса, следует сопоставить результаты вычислений с результатами наблюдений. В случае существенного расхождения необходимо изменить модель.

8. Публикация результатов работы, передача заказчику для эксплуатации.

9. Сопровождение программы -- включает консультации представителей заказчика по работе с программой и обучение персонала. Недостатки и ошибки, замеченные в процессе эксплуатации, должны устраняться.

Каждой программе (функции) должна соответствовать отдельная блок-схема алгоритма. Схема - графическое представление определения, анализа или метода решения задачи, в котором используются символы для отображения данных, потока, оборудования и т. д. Блок-схема - распространенный тип схем, описывающих алгоритмы или процессы, в которых отдельные шаги изображаются в виде блоков различной формы, соединенных между собой линиями, указывающими направление последовательности [4].

В большинстве задач, встречающихся на практике, вычисления по некоторой группе формул необходимо выполнять многократно. Например, вычислить значение функции в заданных точках отрезка. Этот многократно повторяющийся участок вычислительного процесса называют циклом. Таким образом, под циклом понимается оператор или группа операторов, повторяющихся некоторое количество раз. Каждый проход по телу цикла называется итерацией [5, с. 6].

Блок-схема циклического процесса должна содержать блоки: задания начального значения параметру цикла; блок реализации необходимых вычислений; блок изменения параметра цикла; блок проверки условия окончания цикла [5, с. 7].

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

3. Описание организации структур хранимых данных

Языки программирования C/C++ поддерживает определяемые пользователем структуры - структурированный тип данных. Он является собранием одного или более объектов (переменных, массивов, указателей, других структур и т.д.), которые для удобства работы с ними сгруппированы под одним именем.

Структуры:

- облегчают написание и понимание программ.

- помогают сгруппировать данные, объединяемые каким-либо общим понятием.

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

Как и массив, структура представляет собой совокупность данных, но отличается от него тем, что к ее элементам (компонентам) необходимо обращаться по имени и ее элементы могут быть различного типа. Структуры целесообразно использовать там, где необходимо объединить данные, относящиеся к одному объекту.

Определение структуры состоит из двух шагов:

- объявление шаблона структуры (задание нового типа данных, определенного пользователем);

- определение переменных типа объявленного шаблона.

Некоторые задачи требуют введения структур, способных увеличивать или уменьшать свой размер в процессе работы программы. Основу таких структур составляют динамические переменные, которые хранятся в некоторой области памяти. Обращение к ним производится с помощью указателя. Как правило, такие переменные организуются в виде списков, элементы которых являются структурами (struct).

Список - это совокупность объектов или элементов, в котором каждый объект содержит информацию о местоположении связанного с ним объекта.

Списки являются обобщением стеков и очередей. В списке можно добавлять элементы в любое место: в начало, середину или конец. Из списка можно удалить любой элемент, вне зависимости от его местоположения. Списки бывают линейными и кольцевыми, односвязными и двусвязными [6].

Разработанное нами программное обеспечение для поликлиники имеет следующую структуру:

typedef struct info {

char adress[50];

char sex[10];

int flat;

int year;

int number;

int sector;

struct info *next;

} INFO;

typedef struct card {

char surname[30];

INFO* head;

struct card *previous, *next;

}CARD;

typedef struct ticket {

char name[30];

char time[30];

char profession[30];

char doctor_name[30];

int number;

struct ticket *previous, *next;

}TICKET;

typedef struct user {

char login[50];

char password[255];

char status[20];

char state[20];

struct user *previous, *next;

}USER;

4. Содержание пользовательских функций приложения

Функция - это самостоятельная единица программы, созданная для решения конкретной задачи. Как и переменные, функции надо объявлять до ее использования. Таким образом, любая программа на языке Cи состоит из функций. Минимальная программа на Си содержит, как уже известно, единственную функцию main (основная, главная), с которой и начинается выполнение программы [7].

При работе программного обеспечения поликлиники используются следующие функции:

ФУНКЦИИ МЕНЮ:

1) int menu();

2) int enter_menu(char*);

3) int user_menu() ;

4) int admin_menu() ;

5) int admin_user_menu().

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

ФУНКЦИИ РЕГИСТРАЦИИ/АВТОРИЗАЦИИ:

1) void registration();

2) int authorization();

3) int admin_authorization().

Данные функции являются функциями для обеспечения регистрации и авторизации администратора и пользователя. Так, функция int admin_authorization() осуществляет авторизацию администратора. В случае успешной авторизации возвращает «1», в случае ошибки при открытии файла «0», в случае выбора выхода из данной функции возвращает «-1». Также данная функция необходима для проверки логина и пароля. К примеру, если какой-то логин уже есть, то его использовать нельзя. Функция void registration() осуществляет регистрацию и пользователя, и администратора. Функция int authorization()осуществляет авторизацию только пользователя аналогично администратору.

ФУНКЦИИ РАБОТЫ С ДАННЫМИ:

1) void add().

2) int read(CARD **, CARD **).

3) void shaw(CARD **, CARD **).

4) void edit(CARD **, CARD **).

5) void del(CARD **, CARD **).

6) void filt(CARD **, CARD **).

7) void search(CARD **, CARD **).

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

Функция int read(CARD **, CARD **) считывает информацию из файла в массив. Это происходит с помощью считывания целой строки данных, а затем разбиения её на части. В случае ошибки при открытии файла возвращают «0», при успешном выполнении возвращается количество обработанных записей.

Функция void shaw(CARD **, CARD **) выводит информацию, которая была получена из файла. Получают указатели на начало соответствующих массивов и размер этих массивов. Информация выводится в форме таблицы.

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

Функция void del(CARD **, CARD **) предоставляет возможность удалить медицинскую карту пациента из базы данных поликлиники. Для этого необходимо ввести номер медицинской карты. Пользователю предоставляется выбор того, какую запись он хочет удалить. При успешном удалении появится сообщение, что удаление прошло успешно.

Функция void filt(CARD **, CARD **) предоставляет возможность фильтрации. Переменная Flag реализует выбор необходимой фильтрации. Реализована фильтрация по номеру участка. При завершении работы функция выводит на экран информацию в соответствии с заданными требованиями в табличной форме.

Функция void search(CARD **, CARD **) реализует операцию поиска. Данная функция осуществляет поиск по фамилии, имени пациента. По окончанию работы выводится список пациентов, которые соответствуют заданным требованиям.

ФУНКЦИИ РАБОТЫ С АДМИНИСТРАТОРОМ/ПОЛЬЗОВАТЕЛЕМ:

1) int read_users(USER**, USER**).

2) void shaw_users().

3) void ban().

4) void antiban().

5) void newadmin().

6) void antiadmin().

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

Функция int read_users(USER**, USER**) предоставляет возможность считывания информации о логинах и паролях пользователя и администратора. Функция void shaw_users предоставляет возможность вывода информации о логинах, паролях администратора и пользователя на экран.

Функции void newadmin() и void antiadmin() позволяют изменить статус пользователя на администратора и наоборот.

5. Схемы алгоритмов работы приложения

Листинг программного кода:

int main() {

CARD *begin = NULL, *end = NULL;

TICKET *start = NULL, *finish = NULL;

char login[40];

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

while (1) {

int admin = 1;

int flag = 0;

int user = 1;

int enter_user = 1;

int enter_admin = 1;

int sort = 1;

int user_admin = 1;

switch (menu()) {

case 1:

flag = admin_authorization();

if (!flag) {

admin = 1;

while (admin) {

switch (admin_menu()) {

case 1:

shaw(&begin, &end);

break;

case 2:

while (user_admin) {

switch (admin_user_menu()) {

case 1:

shaw_users();

break;

case 2:

ban();

break;

case 3:

antiban();

break;

case 4:

newadmin();

break;

case 5:

antiadmin();

break;

case 6:

user_admin = 0;

break;

}

}

break;

case 3:

del(&begin, &end);

break;

case 4:

search(&begin, &end);

break;

case 5:

filt(&begin, &end);

break;

case 6:

shaw_ticket(&start, &finish);

break;

case 7:

admin = 0;

break;

}

}

}

break;

case 2:

enter_user = 1;

while (enter_user) {

switch (enter_menu("Пользователь")) {

case 1:

flag = authorization();

if (!flag) {

user = 1;

while (user) {

switch (user_menu()) {

case 1:

shaw(&begin, &end);

break;

case 2:

add();

break;

case 3:

edit(&begin, &end);

break;

case 4:

add_ticket(&begin, &end);

break;

case 5:

user = 0;

break;

}

}

}

break;

case 2:

registration();

user = 1;

while (user) {

switch (user_menu()) {

case 1:

shaw(&begin, &end);

break;

case 2:

add();

break;

case 3:

edit(&begin, &end);

break;

case 4:

add_ticket(&begin, &end);

break;

case 5:

user = 0;

break;

}

}

break;

case 3:

enter_user = 0;

break;

}

}

break;

case 3:

return 0;

break;

}

}

}

Полная функциональная схема программы представлена в блок-схеме (См. Рисунки 5.1, 5.2):

Рисунок 5.1 Блок-схема «Функциональная схема программы»

Рисунок 5.2 Блок-схема «Функциональная схема программы» (продолжение)

Листинг программного кода:

void filt(CARD **begin, CARD **end) {

system("cls");

int x = read(begin, end);

if (!x) {

int flag = 0, flag2 = 0, sector = 0;

while (true) {

printf("Введите номер участка: ");

cin >> sector;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

printf("%-27s %-15s %-15s %-27s %-15s %-15s %-10s\n\n", "Фамилия Имя", "Номер", "Пол", "Адрес", "№ Квартиры", "Год рождения", "№ Участка");

CARD *p = *begin;

while (p) {

if (sector == p->head->sector) {

flag++;

printf("%-27s ", p->surname);

printf("%-15d ", p->head->number);

printf("%-15s ", p->head->sex);

printf("%-27s ", p->head->adress);

printf("%-15d ", p->head->flat);

printf("%-15d ", p->head->year);

printf("%-10d\n", p->head->sector);

}

p = p->next;

}

if (!flag) {

system("cls");

puts("Нет таких медкарт");

}

}

*begin = *end = NULL;

}

Схема работы функции представлена в блок-схеме (См. Рисунок 5.3):

Рисунок 5.3 Блок-схема функции «Фильтрация медицинских карт по участку»

Листинг программного кода:

void antiadmin() {

system("cls");

USER *begin = NULL, *end = NULL;

int z = read_users(&begin, &end), flag = 0;

if (!z) {

USER *p = begin;

printf("%-10s %-10s %-13s %-10s\n\n", "Логин", "Пароль", "Статус", "Кем Вы являетесь?");

while (p) {

printf("%-10s ", p->login);

printf("%-10s ", p->password);

printf("%-14s", p->status);

printf("%-10s\n", p->state);

p = p->next;

}

char name[50];

printf("\nВведите логин пользователя, которого вы хотите лишить администраторских полномочий: ");

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

cin.getline(name, 50);

USER *u = begin;

while (u) {

if (!strcmp(name, u->login)) {

strcpy_s(u->state, "user");

flag++;

}

u = u->next;

}

system("cls");

if (!flag) {

printf("Нет такого пользователя\n");

}

write_users(begin);

}

}

Схема работы функции представлена в блок-схеме (См. Рисунок 5.4):

Рисунок 5.4 Блок-схема функции «Лишение пользователя администраторских полномочий»

Листинг программного кода:

void shaw(CARD **begin, CARD **end) {

int z = read(begin, end);

if (!z) {

CARD *p = *begin;

printf("%-27s %-15s %-15s %-27s %-15s %-15s %-10s\n\n", "Фамилия Имя", "Номер", "Пол", "Адрес", "№ Квартиры", "Год рождения", "№ Участка");

while (p) {

printf("%-27s ", p->surname);

printf("%-15d ", p->head->number);

printf("%-15s ", p->head->sex);

printf("%-27s ", p->head->adress);

printf("%-15d ", p->head->flat);

printf("%-15d ", p->head->year);

printf("%-10d\n", p->head->sector);

p = p->next;

}

}

printf("\n");

*begin = *end = NULL;

}

Схема работы функции представлена в блок-схеме (См. Рисунок 5.5):

Рисунок 5.5 Блок-схема функции «Вывод медицинских карт на экран»

6. Описание программы

В начале работы программы появляется меню первого уровня, которое предоставляет выбор входа в программу:

1. Меню для администратора;

2. Меню для пользователя;

3. Выход (см. Рисунок 6.1):

Рисунок 6.1 Меню 1-ого уровня

Рассмотрим работу администратора. Для входа в программу под администратором ему вначале необходимо зарегистрироваться, для чего ввести логин и пароль (см. Рисунок 6.2):

Рисунок 6.2 Регистрация администратора

При входе пароль шифруется и заносятся в файл вместе с логином. Для авторизации администратора можно использовать 3 попытки, после чего следует выход в меню 1-ого уровня (см. Рисунок 6.3):

Рисунок 6.3 Авторизация администратора

Если логин и пароль были введены правильно, то программа предложит сделать выбор из меню третьего уровня (см. Рисунок 6.4):

Рисунок 6.4 Меню 3-ого уровня администратора

Первое, что можно сделать администратору при входе в меню 3-ого уровня, это просмотреть список медицинских карт. При выборе этого пункта будет открыт файл для работы с записями. Информация будет выведена в табличном виде (см. Рисунок 6.5):

Рисунок 6.5 Просмотр списка медицинских карт

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

Рисунок 6.6 Меню работы с пользователями

Данное меню предусматривает просмотр пользователей, заблокировать или разблокировать пользователей, возложить на пользователя администраторские полномочия, или, наоборот, лишить пользователя возможности выполнять функции администратора. Выполнение этих модулей представлено на рисунках 6.7 - 6.11:

Рисунок 6.7 Просмотреть пользователей

Рисунок 6.8 Заблокировать пользователя

Рисунок 6.9 Разблокировать пользователя

Рисунок 6.10 Сделать пользователя администратором

Рисунок 6.11 Лишить пользователя полномочий администратора

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

Рисунок 6.12 Удаление медицинской карты

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

Рисунок 6.13 Поиск по фамилии

Полученный результат выводится на экран в табличном виде (см. Рисунок 6.14):

Рисунок 6.14 Результат поиска по фамилии

Кроме поиска в программе предусмотрена фильтрация медицинских карт по номеру участка пациента (см. Рисунок 6.15):

Рисунок 6.15 Фильтрация медицинских карт по номеру участка

Всю информацию можно просмотреть в текстовом файле (см. Рисунок 6.16):

Рисунок 6.16 Просмотр отфильтрованной информации

Последним пунктом в меню администратора является выполнение задачи. Данная задача решается следующим образом: происходит просмотр талонов на приём к врачу. По окончанию работы данная функция выводит список на экран в табличной форме (см. Рисунок 6.17):

Рисунок 6.17 Просмотр талонов

Пользователь может выполнить такую же функцию, как и администратор: просмотреть список медицинских карт (см. Рисунок 6.18):

Рисунок 6.18 Меню пользователя

Данная функция выполняются аналогично такой же функции администратора (см. Рисунок 6.19):

Рисунок 6.19 Просмотреть список медицинских карт

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

Рисунок 6.20 Добавление медицинской карты

При выборе в меню пользователя функции «Изменить медкарту» пользователю предоставляется возможность отредактировать данные по выбранному полю (см. Рисунки 6.21-6.23):

Рисунок 6.21 Редактирование

Рисунок 6.22 Редактирование (продолжение)

Рисунок 6.23 Результат редактирования

Для выхода из программы необходимо вернуться в меню первого рода и выбрать пункт «выход из программы».

Заключение

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

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

Решены такие задачи:

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

- обеспечение регулирования интенсивности потока населения для равномерной нагрузки врачей;

- своевременный подбор и доставка медицинской документации в кабинеты врачей, правильное ведение и хранение картотеки.

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

Список литературы

[1] Введение в язык Си [Электронный ресурс]. Режим доступа: http://dfe.petrsu.ru/koi/posob/c/c.htm

[2] Батура, М.П. Основы алгоритмизации и программирования. Язык Си / М.П. Батура, В.Л. Бусько, А.Г. Корбит, Т.М. Кривоносова. Минск: БГУИР, 2007. 240 с.

[3] Этапы разработки [Электронный ресурс]. Режим доступа: http://tat67183862.narod.ru/jazik1.htm.

[4] Блок-схема [Электронный ресурс]. Режим доступа: https://ru.wikipedia.org/wiki/Блок-схема.

[5] Луцик, Ю.А. Основы алгоритмизации и программирования. Язык Си / Ю.А. Луцик, А.М. Ковальчук, И.А. Лукьянова. Минск: БГУИР, 2007. 160 с.

[6] Связные списки [Электронный ресурс]. Режим доступа: http://saod.narod.ru/saod3/List003.html.

[7] Функция в языке С [Электронный ресурс]. Режим доступа: http://prog-cpp.ru/c-functions/.

Приложение

Листинг

#include "Header.h"

int menu() {

int n;

do {

while (true) {

printf("\tМеню 1-го уровня\n");

printf("1. Меню для администратора\n");

printf("2. Меню для пользователя\n");

printf("3. Выход\n");

printf("\tСделайте выбор чтобы продолжить: ");

cin >> n;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

} while (n < 1 || n>3);

return n;

}

int enter_menu(char *status) {

int n;

do {

while (true) {

printf("\tМеню 2-го уровня(%s)\n", status);

printf("1. Авторизация\n");

printf("2. Регистрация\n");

printf("3. Выход\n");

printf("\tСделайте выбор чтобы продолжить: ");

cin >> n;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

} while (n < 1 || n>3);

return n;

}

void registration() {

FILE *fp;

char log[255];

char pass[255];

fopen_s(&fp, "user.txt", "a+");

printf("Регистрация");

printf("\nВведите логин: ");

scanf("%s", log);

fprintf(fp, "%s ", log);

printf("\nВведите пароль: ");

scanf("%s", pass);

int a = strlen(pass);

for (int i = 0; i < a; i++) pass[i] += 2;

fprintf(fp, "%s ", pass);

fprintf(fp, "%s ", "notbanned");

fprintf(fp, "%s\n", "user");

fclose(fp);

system("cls");

}

int authorization() {

USER *start = NULL, *finish = NULL;

int flag = read_users(&start, &finish);

if (!flag) {

char log[50];

char pass[50];

printf("Авторизация\n");

printf("\nВведите логин: ");

scanf("%s", log);

printf("\nВведите пароль: ");

scanf("%s", pass);

USER *p = start;

while (p) {

if (!strcmp(p->password, pass) && !strcmp(p->login, log)) {

if (!strcmp(p->status, "banned")) {

system("cls");

printf("Вас забанили\n");

return 1;

}

flag++;

system("cls");

return 0;

}

p = p->next;

}

if (!flag) {

system("cls");

printf("Неверный логин или пароль\n");

return 1;

}

}

return 1;

}

int admin_authorization() {

USER *start = NULL, *finish = NULL;

int flag = read_users(&start, &finish);

if (!flag) {

char log[50];

char pass[50];

printf("Авторизация\n");

printf("\nВведите логин: ");

scanf("%s", log);

printf("\nВведите пароль: ");

scanf("%s", pass);

USER *p = start;

while (p) {

if (!strcmp(p->password, pass) && !strcmp(p->login, log)) {

if (!strcmp(p->state, "user")) {

system("cls");

printf("Вы являетесь всего лишь пользователем\n");

return 1;

}

flag++;

system("cls");

return 0;

}

p = p->next;

}

if (!flag) {

system("cls");

printf("Неверный логин или пароль\n");

return 1;

}

}

else {

system("cls");

FILE *fp;

char log[255];

char pass[255];

fopen_s(&fp, "user.txt", "a+");

printf("Регистрация");

printf("\nВведите логин: ");

scanf("%s", log);

fprintf(fp, "%s ", log);

printf("\nВведите пароль: ");

scanf("%s", pass);

int a = strlen(pass);

for (int i = 0; i < a; i++) pass[i] += 2;

fprintf(fp, "%s ", pass);

fprintf(fp, "%s ", "notbanned");

fprintf(fp, "%s\n", "admin");

fclose(fp);

system("cls");

}

}

int admin_menu() {

int n;

do {

while (true) {

printf("\tМеню 3-го уровня(Администратор)\n");

printf("1. Просмотреть список медицинских карт\n");

printf("2. Меню работы с пользователями\n");

printf("3. Удалить медицинскую карту\n");

printf("4. Поиск карты по фамилии\n");

printf("5. Фильтрация карт по участку\n");

printf("6. Просмотр талонов\n");

printf("7. Выход\n");

printf("\tСделайте выбор, чтобы продолжить: ");

cin >> n;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

} while (n < 1 || n>7);

return n;

}

int user_menu() {

int n;

do {

while (true) {

printf("\tМеню 3-го уровня(Пользователь)\n");

printf("1. Просмотреть список медицинских карт\n");

printf("2. Добавить медкарту\n");

printf("3. Изменить медкарту\n");

printf("4. Добавить талон\n");

printf("5. Выход\n");;

printf("\tСделайте выбор чтобы продолжить: ");

cin >> n;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

} while (n < 1 || n>5);

return n;

}

int admin_user_menu() {

int n;

do {

while (true) {

printf("\tМеню работы с пользователями\n");

printf("1. Просмотреть пользователей\n");

printf("2. Забанить\n");

printf("3. Разбанить\n");

printf("4. Сделать админом\n");

printf("5. Лишить администраторских полномочий\n");

printf("6. Выход\n");

printf("\tСделайте выбор чтобы продолжить: ");

cin >> n;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

} while (n < 1 || n>6);

return n;

}

void add() {

FILE *fp;

char surname[100], sex[50], adress[50];

int year = 0, flat = 0, sector = 0, number = 0;

fopen_s(&fp, "cards.txt", "a+");

printf("Добавление медицинской карты \n");

printf("\nВведите фамилию и имя: ");

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

cin.getline(surname, 100);

fputs(surname, fp);

fprintf(fp, "\n");

printf("\nВведите номер медкарты: ");

while (true) {

cin >> number;

if (cin.good())

{

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

break;

}

cin.clear();

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

}

fprintf(fp, "%d ", number);

fprintf(fp, "\n");

printf("\nВведите пол: ");

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

cin.getline(sex, 100);

fputs(sex, fp);

fprintf(fp, "\n");

printf("\nВведите улицу и дом: ");

cin.getline(adress, 100);

fputs(adress, fp);

fprintf(fp, "\n");

printf("\nВведите № квартиры: ");

while (true) {

cin >> flat;

if (cin.good())

{

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

break;

}

cin.clear();

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

printf("Пожалуйста, введите корректное значение\n");

}

fprintf(fp, "%d ", flat);

printf("\nВведите год рождения: ");

while (true) {

cin >> year;

if (cin.good())

{

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

break;

}

cin.clear();

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

printf("Пожалуйста, введите корректное значение\n");

}

fprintf(fp, "%d ", year);

printf("\nВведите № участка: ");

while (true) {

cin >> sector;

if (cin.good())

{

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

break;

}

cin.clear();

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

printf("Пожалуйста, введите корректное значение\n");

}

fprintf(fp, "%d\n", sector);

fclose(fp);

system("cls");

}

int read(CARD **begin, CARD **end) {

FILE *fp;

if (!(fp = fopen("cards.txt", "r+"))) {

puts("Ошибка открытия");

return 1;

}

else {

CARD *p = new CARD;

INFO *l;

int a = 0;

while (!feof(fp)) {

if (!(p = new CARD)) {

printf("Ошибка выделения памяти\n");

return 1;

}

p->head = NULL;

if (!*end) {

fgets(p->surname, 100, fp);

a = strlen(p->surname);

p->surname[a - 1] = '\0';

l = new INFO;

fscanf(fp, "%d ", &l->number);

fgets(l->sex, 100, fp);

a = strlen(l->sex);

l->sex[a - 1] = '\0';

fgets(l->adress, 100, fp);

a = strlen(l->adress);

l->adress[a - 1] = '\0';

fscanf(fp, "%d ", &l->flat);

fscanf(fp, "%d ", &l->year);

fscanf(fp, "%d ", &l->sector);

l->next = NULL;

p->head = l;

p->next = NULL;

p->previous = NULL;

(*end) = (*begin) = p;

}

else {

fgets(p->surname, 100, fp);

a = strlen(p->surname);

p->surname[a - 1] = '\0';

l = new INFO;

fscanf(fp, "%d ", &l->number);

fgets(l->sex, 100, fp);

a = strlen(l->sex);

l->sex[a - 1] = '\0';

fgets(l->adress, 100, fp);

a = strlen(l->adress);

l->adress[a - 1] = '\0';

fscanf(fp, "%d ", &l->flat);

fscanf(fp, "%d ", &l->year);

fscanf(fp, "%d ", &l->sector);

l->next = p->head;

p->head = l;

p->previous = *end;

p->next = NULL;

(*end)->next = p;

*end = p;

}

}

fclose(fp);

return 0;

}

}

void write(CARD *begin) {

CARD *p = begin;

FILE *fp;

fopen_s(&fp, "cards.txt", "w+");

while (p) {

fputs(p->surname, fp);

fprintf(fp, "\n");

fprintf(fp, "%d\n", p->head->number);

fputs(p->head->sex, fp);

fprintf(fp, "\n");

fputs(p->head->adress, fp);

fprintf(fp, "\n");

fprintf(fp, "%d ", p->head->flat);

fprintf(fp, "%d ", p->head->year);

fprintf(fp, "%d\n", p->head->sector);

p = p->next;

}

fclose(fp);

}

void edit(CARD **begin, CARD **end) {

int x = read(begin, end);

int number;

if (!x) {

system("cls");

int n, flag=0;

CARD *p = *begin;

printf("Список медкарт\n");

printf("%-10s %-10s \n", "Номер ", " Фамилия Имя");

while (p) {

printf("%-10d %-10s\n ", p->head->number, p->surname);

p = p->next;

}

printf("\n");

while (true) {

printf("Напишите номер мед карты, информацию о которой вы хотите редактировать: ");

cin >> number;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

p = *begin;

while (p) {

if (number == p->head->number) {

flag++;

printf("%-27s %-15s %-15s %-27s %-15s %-15s %-10s\n\n", "1.Фамилия Имя", "2.Номер", "3.Пол", "4.Адрес", "5.№ Квартиры", "6.Год рождения", "7.№ Участка");

printf("%-27s ", p->surname);

printf("%-15d ", p->head->number);

printf("%-15s ", p->head->sex);

printf("%-27s ", p->head->adress);

printf("%-15d ", p->head->flat);

printf("%-15d ", p->head->year);

printf("%-10d\n", p->head->sector);

do {

printf("Введите номер поля,которое вы хотите изменить: ");

scanf_s("%d", &n);

} while (n < 1 || n>7);

switch (n) {

case 1:

printf("Введите новое значение: ");

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

cin.getline(p->surname, 100);

system("cls");

puts("Фамилия и имя успешно заменены");

break;

case 2:

printf("Введите новое значение: ");

while (true) {

cin >> p->head->number;

if (cin.good())

{

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

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

puts("Номер медкарты успешно заменен");

break;

case 3:

printf("Введите новое значение: ");

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

cin.getline(p->head->sex, 100);

system("cls");

puts("Пол успешно заменено");

break;

case 4:

printf("Введите новое значение: ");

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

cin.getline(p->head->adress, 100);

system("cls");

puts("Адрес успешно заменен");

break;

case 5:

printf("Введите новое значение: ");

while (true) {

cin >> p->head->flat;

if (cin.good())

{

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

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

puts("Номер квартиры успешно заменен");

break;

case 6:

printf("Введите новое значение: ");

while (true) {

cin >> p->head->year;

if (cin.good())

{

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

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

puts("Год рождения успешно заменен");

break;

case 7:

printf("Введите новое значение: ");

while (true) {

cin >> p->head->sector;

if (cin.good())

{

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

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

puts("Номер участка успешно заменен");

break;

}

}

p = p->next;

}

if (!flag) {

printf("Нет такой медкарты\n");

}

write(*begin);

}

*begin = *end = NULL;

}

void del(CARD **begin, CARD **end) {

int flag = read(begin, end);

if (!flag) {

system("cls");

int number, n, c, flag = 0, flag2 = 0, flg = 0;

CARD *p = *begin, *key;

printf("Список медкарт\n");

printf("%-10s %-10s \n", "Номер ", " Фамилия Имя");

while (p) {

printf("%-10d %-10s\n ", p->head->number, p->surname);

p = p->next;

}

printf("\n");

while (true) {

printf("Напишите номер мед карты, которую вы хотите удалить: ");

cin >> number;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

p = *begin;

while (p) {

if (number == p->head->number) {

flg++;

key = p;

if (*end == *begin) {

*end = (*end)->previous;

*end = NULL;

*begin = NULL;

delete p;

system("cls");

puts("Медкарта успешно удалена");

remove("cards.txt");

*end = *begin = NULL;

return;

}

if (p == *end) {

*end = (*end)->previous;

(*end)->next = NULL;

delete key;

system("cls");

puts("Медкарта успешно удалена");

write(*begin);

*end = *begin = NULL;

return;

}

if (p == *begin) {

*begin = (*begin)->next;

(*begin)->previous = NULL;

delete key;

system("cls");

puts("Медкарта успешно удалена");

write(*begin);

*end = *begin = NULL;

return;

}

if (p != (*end) && p != (*begin)) {

(key->previous)->next = key->next;

(key->next)->previous = key->previous;

delete p;

system("cls");

puts("Медкарта успешно удалена");

write(*begin);

*end = *begin = NULL;

return;

}

}

p = p->next;

}

if (!flg) {

printf("Нет такой медкарты\n");

}

write(*begin);

}

*begin = *end = NULL;

}

void filt(CARD **begin, CARD **end) {

system("cls");

int x = read(begin, end);

if (!x) {

int flag = 0, flag2 = 0, sector = 0;

while (true) {

printf("Введите номер участка: ");

cin >> sector;

if (cin.good())

{

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

system("cls");

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

system("cls");

printf("%-27s %-15s %-15s %-27s %-15s %-15s %-10s\n\n", "Фамилия Имя", "Номер", "Пол", "Адрес", "№ Квартиры", "Год рождения", "№ Участка");

CARD *p = *begin;

while (p) {

if (sector == p->head->sector) {

flag++;

printf("%-27s ", p->surname);

printf("%-15d ", p->head->number);

printf("%-15s ", p->head->sex);

printf("%-27s ", p->head->adress);

printf("%-15d ", p->head->flat);

printf("%-15d ", p->head->year);

printf("%-10d\n", p->head->sector);

}

p = p->next;

}

if (!flag) {

system("cls");

puts("Нет таких медкарт");

}

}

*begin = *end = NULL;

}

void search(CARD **begin, CARD **end) {

system("cls");

int x = read(begin, end);

if (!x) {

char name[200];

int flag = 0, flag2 = 0, sector = 0;

printf("Введите фамилию и имя: ");

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

cin.getline(name, 100);

system("cls");

printf("%-27s %-15s %-15s %-27s %-15s %-15s %-10s\n\n", "Фамилия Имя", "Номер", "Пол", "Адрес", "№ Квартиры", "Год рождения", "№ Участка");

CARD *p = *begin;

while (p) {

if (!strcmp(name, p->surname)) {

flag++;

printf("%-27s ", p->surname);

printf("%-15d ", p->head->number);

printf("%-15s ", p->head->sex);

printf("%-27s ", p->head->adress);

printf("%-15d ", p->head->flat);

printf("%-15d ", p->head->year);

printf("%-10d\n", p->head->sector);

}

p = p->next;

}

if (!flag) {

system("cls");

puts("Нет таких медкарт");

}

}

*begin = *end = NULL;

}

int read_users(USER **start, USER **finish) {

FILE *fp;

if (!(fp = fopen("user.txt", "r+"))) {

printf("Ни один пользователь не зарегестрирован\n");

return 1;

}

else {

char log[100];

char pass[100];

int flag = 0;

USER *p;

while (!feof(fp)) {

if (!*start) {

p = new USER;

fscanf(fp, "%s ", p->login);

fscanf(fp, "%s ", p->password);

int a = strlen(p->password);

for (int i = 0; i < a; i++) p->password[i] -= 2;

fscanf(fp, "%s ", p->status);

fscanf(fp, "%s ", p->state);

p->next = p->previous = NULL;

*start = *finish = p;

}

else {

p = new USER;

fscanf(fp, "%s ", p->login);

fscanf(fp, "%s ", p->password);

int a = strlen(p->password);

for (int i = 0; i < a; i++) p->password[i] -= 2;

fscanf(fp, "%s ", p->status);

fscanf(fp, "%s ", p->state);

p->previous = *finish;

p->next = NULL;

(*finish)->next = p;

*finish = p;

}

}

fclose(fp);

}

return 0;

}

void write_users(USER *begin) {

USER *p = begin;

FILE *fp;

fopen_s(&fp, "user.txt", "w+");

while (p) {

fprintf(fp, "%s ", p->login);

int a = strlen(p->password);

for (int i = 0; i < a; i++) p->password[i] += 2;

fprintf(fp, "%s ", p->password);

fprintf(fp, "%s ", p->status);

fprintf(fp, "%s\n", p->state);

p = p->next;

}

fclose(fp);

}

void antiban() {

system("cls");

USER *begin = NULL, *end = NULL;

int flag = 0;

int z = read_users(&begin, &end);

if (!z) {

USER *p = begin;

printf("%-10s %-10s %-13s %-10s\n\n", "Логин", "Пароль", "Статус", "Кем Вы являетесь?");

while (p) {

printf("%-10s ", p->login);

printf("%-10s ", p->password);

printf("%-14s", p->status);

printf("%-10s\n", p->state);

p = p->next;

}

char name[50];

printf("\nВведите логин пользователя, которого вы хотите разбанить: ");

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

cin.getline(name, 50);

USER *u = begin;

while (u) {

if (!strcmp(name, u->login)) {

flag++;

strcpy_s(u->status, "notbanned");

}

u = u->next;

}

system("cls");

if (!flag) {

printf("Нет такого пользователя\n");

}

write_users(begin);

}

}

void ban() {

system("cls");

USER *begin = NULL, *end = NULL;

int flag = 0;

int z = read_users(&begin, &end);

if (!z) {

USER *p = begin;

printf("%-10s %-10s %-13s %-10s\n\n", "Логин", "Пароль", "Статус", "Кем Вы являетесь?");

while (p) {

printf("%-10s ", p->login);

printf("%-10s ", p->password);

printf("%-14s", p->status);

printf("%-10s\n", p->state);

p = p->next;

}

char name[50];

printf("\nВведите логин пользователя, которого вы хотите забанить: ");

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

cin.getline(name, 50);

USER *u = begin;

while (u) {

if (!strcmp(name, u->login)) {

flag++;

strcpy_s(u->status, "banned");

}

u = u->next;

}

system("cls");

if (!flag) {

printf("Нет такого пользователя\n");

}

write_users(begin);

}

}

void add_ticket(CARD **begin, CARD **end) {

int z = read(begin, end);

if (!z) {

char name[30];

char time[30];

char profession[30];

char doctor_name[30];

int number;

printf("\nВведите номер медкарты: ");

while (true) {

cin >> number;

if (cin.good())

{

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

break;

}

cin.clear();

system("cls");

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

printf("Пожалуйста, введите корректное значение\n");

}

CARD *p = *begin;

while (p) {

if (number == p->head->number) {

system("cls");

FILE *fp;

fopen_s(&fp, "tickets.txt", "a+");

printf("Запись к врачу\n");

fputs(p->surname, fp);

fprintf(fp, "\n");

printf("\nВведите специалильность врача: ");

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

cin.getline(profession, 100);

fputs(profession, fp);

fprintf(fp, "\n");

printf("\nВведите ФИО врача: ");

cin.getline(doctor_name, 100);

fputs(doctor_name, fp);

fprintf(fp, "\n");

printf("\nВведите время записи: ");

cin.getline(time, 100);

fputs(time, fp);

fprintf(fp, "\n");

fprintf(fp, "%d\n", number);

fclose(fp);

system("cls");

}

p = p->next;

}

}

*begin = *end = NULL;

}

int read_ticket(TICKET **start, TICKET **finish) {

FILE *fp;


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

  • Краткие теоретические сведения об используемых алгоритмах. Описание организации структур хранимых данных. Функции организации работы для администратора и пользователя. Схемы алгоритмов работы приложения. Вспомогательные функции и функции расчёта, меню.

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

  • Логическая и физическая структура базы данных. Аппаратное и программное обеспечение системы. Создание представлений, хранимых процедур, пользовательских функций, триггеров. Описание основной структуры ASP.NET документов. Пользовательский интерфейс.

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

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

    курсовая работа [931,5 K], добавлен 27.09.2012

  • Разработка программного продукта - приложения, позволяющего заносить данные анкетирования в базу данных MS SQL. Описание логики работы приложения, особенности пользовательского интерфейса. Формы просмотра анкет, описание процедур и функций программы.

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

  • Метод имитационного моделирования, построение программа на языке GPSS\PS. Укрупненная схема моделирующего алгоритма. Математическая модель и ее описание. Возможные улучшения в работе системы. Результаты моделирования оптимизации работы поликлиники.

    курсовая работа [148,6 K], добавлен 29.06.2011

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

    курсовая работа [537,9 K], добавлен 28.06.2011

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

    дипломная работа [3,2 M], добавлен 09.10.2013

  • Разработка программного приложения WindowsForms для работы с базой данных на языке высокого уровня C# в автономном режиме с использованием ADO.NET. Проектирование реляционной модели базы данных, интерфейса приложения, основных функций и возможностей.

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

  • Разработка клиентского приложения для работы с базой данных (БД) санатория. Классификации БД и приложений для работы с ними. Алгоритмическое и программное конструирование БД. Описание объектов предметной области, их атрибутов и связей между ними.

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

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

    отчет по практике [4,1 M], добавлен 07.08.2012

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