курсач4x

advertisement
Титульный лист БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Контрольная работа по курсу: «Основы конструирования программ»
Вариант № 18
Студент-заочник 1 курса
Группы № 402341
Сырников С.А
Преподаватель
Мытник Н. П.
Минск, 2014
Содержание
Задание №18 ............................................................................................................................................... 3
Введение ...................................................................................................................................................... 3
Краткие теоретические сведения об используемых алгоритмах ........................................................... 4
Описание организации структур хранимых данных ................................................................................ 4
Создание пользовательских функций приложения ................................................................................. 5
Схемы алгоритмов работы приложения .................................................................................................11
Описание программы ...............................................................................................................................14
Меню пользователя ..................................................................................................................................14
Меню Администратор ...............................................................................................................................15
Меню Поиск ...............................................................................................................................................17
Вернуться назад .........................................................................................................................................20
Управление пользователями ...................................................................................................................20
Меню пользователя ..................................................................................................................................23
Заключение ................................................................................................................................................24
Список использованных источников .......................................................................................................25
Приложение А Листинг программы.........................................................................................................26
2
Задание №18
Создать файл, содержащий сведения о наличии билетов на рейсы Аэрофлота.
Структура записи: номер рейса, пункт назначения, время вылета, время
прибытия, количество свободных мест в салоне. На печать вывести: ВРЕМЯ
ВЫЛЕТЫ САМОЛЕТОВ В ГОРОД Х, НАЛИЧИЕ СВОБОДНЫХ МЕСТ НА
РЕЙС В ГОРОД Х С ВРЕМЕНЕМ ОТПРАВЛЕНИЯ У (Х и У вводятся с
клавиатуры).
Введение
В этой курсовой работе я буду разрабатывать приложение для хранения
данных всех полетов авиакомпании.
Курсовой проект будет написан в visual studio 2012 на языке С++.
Microsoft Visual Studio 2010 — средство для разработчиков ПО, которое
позволяет решать основные задачи разработки: система упрощает создание,
отладку и развёртывание приложений на различных платформах, включая
SharePoint и облачную среду.
Основными преимуществами Visual Studio являются:
 Использование вычислительных мощностей локального компьютера и
облака
 Простая реализация общих задач и индивидуальный подход
 Быстрое создание высококачественного кода
 Функция поддержки нескольких мониторов
 Возможность реализации идей и решений для широкого спектра
платформ, включая Windows, Windows Server, веб-среду, облачную
среду, Office и SharePoint
Приложение должно быть с удобным консольным интерфейсом. В
программе будут использованы меню выбора действий, и по выбранному
элементу меню, должны будут выполняться выбранные действия. Она будет
иметь администраторскую и пользовательскую форму. Сделаем возможность
в администраторной части использовать управление пользователями, их
редактирование, добавление, изменение. Так же добавление рейсов,
изменение и удаление рейсов. В пользовательской части, будет
3
ограниченный функционал, рассчитанный на обычного пользователя. Он
будет выполнять поиск из массива рейсов по выбранному критерию.
В заключении приведены выводы по курсовой работе.
Список использованных источников содержит полный перечень технической
литературы, использованной для написания данной курсовой работы.
Краткие теоретические сведения об используемых алгоритмах
Нужно создать приложение для содержащий сведения о наличии
билетов на рейсы Аэрофлота. Оно будет хранить данные всех рейсов, с
возможностью поиска. Приложение должно быть разделено на
пользовательское и администраторское. Администраторское должно иметь
защиту, и шифрование пароля.
Используется алгоритм шифрования по сдвигу на 5 элементов вверх по
таблице ASCII. При дешифрации используется обратный сдвиг на 5
элементов. Этот алгоритм легко поддаётся взлому, и предназначен для
поверхностного шифрования, с целью показать пользователю, что данные
шифруются и программа безопасна. Его преимущество это быстрое
шифрование и дешифрование.
Описание организации структур хранимых данных
Для данного приложения было использовано 2 структуры хранимых
данных. Одна называется avia, она отвечает за хранения данных
авиакомпании (Таблица 1). Структура предназначена для хранения массива
данных авиакомпании обо всех рейсах компании. Массив этой структуры
будет сохраняться в файл avia.txt расположенный в корне программы.
Таблица 1. Структура данных avia.
Тип
int
char
char
char
int
Имя
nomer
dest
timeOut
timeIn
mest
Описание
Номер рейса авиакомпании
Название пункта назначения
время вылета
время прибытия
количество свободных мест
4
Другая структура называется autoriz она отвечает за хранения
промежуточных значений при авторизации (Таблица 2). В ней храняться
логин и пароль, также и уровень доступа к приложению. Массив этой
структуры будет сохраняться в файл autor.txt расположенный в корне
программы. При чтении и записи из файла будет применяться шифрование и
дешифрование данных.
Таблица 2. Структура данных autoriz.
Тип
char
char
int
Имя
login
pass
access
Описание
Логин при авторизации
Пароль при авторизации
Уровень доступа (1-2)
Создание пользовательских функций приложения
Для создания пользовательских функций мы должны продумать
хорошо ее иерархию, я начал по восходящему проектированию. И начал
реализацию с главного меню, первой функции «main()». Она должна
вызывать выбранную функцию пользователем. С полным списком функции
используемых в приложении можно ознакомиться в Таблица 3. Функция
main() не получает параметров и не возвращает их.
Далее она вызывает функцию «autorizated()» которая выполняет
функцию авторизации пользователя, по выбранному доступу, логину и
паролю. Возвращает значение число 1 при верной авторизации и 0 при
неверной. В случае успешной авторизации он запускает соответствующую
функцию “user()” для пользователя и ‘admin()’ для администратора.
Функция пользователя ”user()” отображает доступные пользователю
функции. И в зависимости от того какой пункт в меню выберет, ту функцию
и запускает. К функциям меню пользователя относят:
1) Открытие файла с данными – функция open();
2) Время вылета самолетов в город - poiskpoNaznach( );
3) Наличие свободных мест на рейс - poiskIsSetMestXY( );
4) Просмотр всех данных в табличной форме - VuvodT( );
5) Поиск - Poisk( );
5
Функция администратора «admin()» отображает все доступные
функции. И в зависимости от того какой пункт в меню выберет, ту функцию
и запускает. К функциям меню администратора относят:
1) Открытие/создание файла с данными – функция open();
2) Время вылета самолетов в город - poiskpoNaznach( );
3) Наличие свободных мест на рейс - poiskIsSetMestXY( );
4) Просмотр всех данных в табличной форме - VuvodT( );
5) Поиск - Poisk( );
6) Добавление записи- add();
7) Редактирование записи- izm();
8) Удаление записи - del();
9) Управление пользователями - userTune() ;
Вызвав в администраторном меню «управления пользователями»
(userTune()), мы увидим меню выбора. И в зависимости от того какой пункт в
меню выберет, ту функцию и запускает. К функциям меню управления
пользователя относят:
1) Добавление пользователя – addUser();
2) Изменения пользователя - izmUser();
3) Удаления пользователя - delUser();
4) Вывод всех пользователей - vuvodUser();
Функция добавления пользователя называется addUser(). Она
отображает список всех доступных пользователей, после чего добавляет
введеного нового пользователя в конец этого списка. Функция в случае удачи
возвращает 1, в случае неудачи 0;
Функция удаления пользователя называется delUser(). Она отображает
список всех доступных пользователей, после чего удаляет выбранный
элемент из списка по коду id. Функция возвращает 1 если все верно, в случае
неудачи возвращает 0;
6
Функция изменения пользователя называется izmUser(). Она
отображает список всех доступных пользователей, после чего изменяет
выбранный элемент из списка по коду id. Функция возвращает 1 если все
верно, в случае неудачи возвращает 0;
Функция вывода пользователей называется vuvodUser(). Она
отображает список всех доступных пользователей. Функция возвращает 1
если все верно, в случае неудачи возвращает 0;
Функция поиска (Poisk()) так же содержит меню выбора в себе. И в
зависимости от того какой пункт в меню выберет, ту функцию и запускает. К
функциям меню поиска относят:
1) Поиск по номеру рейса - poiskNomer();
2) Поиск по пункту назначения - poiskpoNaznach();
3) Поиск по времени вылету - poiskpoTimeOut();
4) Поиск по времени прибытия - poiskpoTimeIn();
5) Поиск по количеству свободных мест poiskpoKolMest();
Функция поиска по времени прибытия вызывается как poiskpoTimeIn().
Она выполняет поиск по времени прибытия самолета авиакомпании.
Функция возвращает 1 если все верно, в случае неудачи возвращает 0;
Функция поиска по времени отбытия вызывается как poiskpoTimeOut().
Она выполняет поиск по времени отбытия самолета авиакомпании. Функция
возвращает 1 если все верно, в случае неудачи возвращает 0;
Функция поиска по пункту назначения вызывается как
poiskpoNaznach(). Она выполняет поиск по пункту назначения самолета
авиакомпании. Функция возвращает 1 если все верно, в случае неудачи
возвращает 0;
Функция поиска по количеству мест вызывается как poiskpoKolMest().
Она выполняет поиск по количеству мест в самолетах авиакомпании.
Функция возвращает 1 если все верно, в случае неудачи возвращает 0;
Функция поиска наличие свободных мест на рейс вызывается как
poiskIsSetMestXY(). Она выполняет поиск по наличие свободных мест на
рейс в самолетах авиакомпании по пункту назначения и времени
7
отправления. Функция возвращает 1 если все верно, в случае неудачи
возвращает 0;
Функция поиска по номеру самолета вызывается как poiskNomer(). Она
выполняет поиск по номеру самолета авиакомпании. Функция возвращает 1
если все верно, в случае неудачи возвращает 0;
Функция удаления рейса вызывается как del(). Она отображает все
рейсы авиакомпании, после чего можно удалить выбранный рейс по его id. .
Функция возвращает FILE если все верно, в случае неудачи возвращает 0;
Функция изменения рейса вызывается как izm(). Она отображает все
рейсы авиакомпании, после чего можно изменить выбранный рейс по его id. .
Функция возвращает FILE если все верно, в случае неудачи возвращает 0;
Функция добавления рейса вызывается как add(). Она отображает все
рейсы авиакомпании, после чего можно добавить несколько рейсов на выбор
в конец списка. Функция возвращает FILE если все верно, в случае неудачи
возвращает 0;
Функция добавления рейсов вызывается как create( ). Она добавляет
введенные рейсы авиакомпании. Функция возвращает FILE если все верно, в
случае неудачи возвращает 0;
Функция сохранения пользователей вызывается как saveAutor( ). Она
сохраняет переданный ей массив пользователей в файл. Функция возвращает
общее количество сохранённых пользователей если все верно, в случае
неудачи возвращает 0;
Функция сохранения рейсов вызывается как save( ). Она сохраняет
переданный ей массив рейсов в файл. Функция возвращает общее
количество сохранённых рейсов если все верно, в случае неудачи возвращает
0;
Функция ввода пользователя вызывается как elemAutor ( ). Она дает
возможность ввести пользователя. Функция возвращает структуру
пользователя autoriz.
Функция ввода рейса вызывается как Elem().Функция служит для ввода
рейса с клавиатуры. Функция возвращает структуру рейса avia;
Функция вывода массива рейсов из массива вызывается как
VuvodMassT().Функция служит для вывода рейсов на экран из массива.
8
Функция принимает значение указателя на массив avia. Функция не
возвращает значение.
Функция вывода массива рейсов из файла вызывается как
VuvodT().Функция служит для вывода рейсов на экран из файла. Функция
принимает значение указателя на файл. Функция возвращает количество
выведенных рейсов.
Функция получения массива avia из файла вызывается как
getmass().Функция служит получения массива avia из файла. Функция
принимает значение указателя на файл FILE. Функция возвращает массив
структур avia.
Функция получения массива autoriz из файла вызывается как
getMassAutor().Функция служит получения массива autoriz из файла.
Функция принимает значение указателя на файл FILE. Функция возвращает
массив структур autoriz.
Функция получения количества элементов из файла вызывается как
getsizeN().Функция служит для получения количества элементов из файла.
Функция принимает значение указателя на файл FILE. Функция возвращает
количества элементов из файла.
Функция создания / открытия файла вызывается как create(char * path).
Функция служит создания / открытия файла используется из
администраторного пути. Функция принимает значение пути на файл.
Функция возвращает указатель на файл.
Функция открытия файла вызывается как open(char * path). Функция
служит открытия файла если он существует по указанному пути. Функция
принимает значение пути на файл. Функция возвращает указатель на файл.
Функция кодирования вызывается как code(char* lpName). Функция
служит для кодирования строки. Функция принимает строку. Функция
возвращает строку.
Функция декодирования вызывается как decode(char* lpName).
Функция служит для декодирования строки. Функция принимает строку.
Функция возвращает строку.
Функция выделения памяти массива вызывается как mem(int n).
Функция служит для создания массива. Функция принимает размерность
массива. Функция возвращает массив структур avia.
9
Возвра
щает
avia *
char *
char *
file *
file *
Вызов функции
Описание функции
Для создания массива размером n
Функция шифрования данных
Функция дешифрования данных
Функция открытия файла по пути path
Функция открытия / создание файла по
пути path
int
getsizen (file *file, int kol) Функция получения размера массива
autoriz* getmassautor (file *file, int Функция получить массива
n)
авторизационных данных
avia*
getmass (file *file, int n)
Функция получить массива структур
avia из файла
int
vuvodt(file* f)
Функция вывода массива структуры
avia из файла в табличном виде
void
vuvodmasst(avia* a, int n) Функция вывода массива структуры
avia в табличном виде
avia
elem (bool gen)
Функция для ввода структуры avia.
Параметр gen определяет нужно ли
генерировать автоматически.
autoriz
elemautor ()
Функция для ввода структуры autoriz.
Возвращает структуру autoriz
int
save(avia* m, int n)
Функция для сохранения массива
структуры avia в файл
int
saveautor(autoriz * m, int Функция для сохранения массива
n)
структуры autoriz в файл
file *
add(file *f)
Функция для создания массива
структур avia и сохранения их в файл
file *
izm(file *f)
Функция для изменения выбранного
элемента пользователем
file *
del(file *f)
Функция для удаления выбранного
элемента пользователем
int
poisknomer (file *f)
Функция для поиска по номеру рейса
(структура avia) из файла
int
poiskissetmestxy (file *f) Функция по поиску свободных мест на
рейс в выбранный город по выбранному
времени отправления
int
poiskpokolmest (file *f)
Функция поиска по количеству мест на
рейс
int
poiskponaznach (file *f)
Функция поиска по выбранному городу
void
main()
Главная функция
int
autorizated(int intadmin)
Авторизация пользователя
Таблица 3. Пользовательские функции
mem(int n)
code(char* lpname)
decode(char* lpname)
open(char * path)
create(char * path)
10
Схемы алгоритмов работы приложения
Приложение работает по такой последовательности, сначала выполняется
авторизация, и в зависимости от уровня доступа, открывается меню
администратора или меню пользователя (схема 1).
Схема 1 Авторизация
11
После авторизации под администратором мы увидим меню
администратора (Схема 2). Или же можем авторизоваться под пользователем
и увидим меню пользователя (Схема 3).
Схема 2 Меню администратора
12
Схема 3 меню пользователя
13
Описание программы
При запуске приложения мы видим выбор между режимом пользователя и
администратора (Рисунок 1).
Рисунок 1 Главное меню
После выбора режима входа начинается авторизация (Рисунок 2).
Рисунок 2 Авторизация
Меню пользователя
Если выбрать 0 в главном меню, то выйдет из приложения. Режим
администратора дает больше возможностей, чем пользователю. В режиме
администратора, мы можем управлять пользователями, добавлять рейсы. А
вот пользователь, может лишь выполнять поиск среди присутствующих
рейсов.
14
Меню Администратор
В меню администратора можно зайти при запуске приложения введя верный
логин и пароль администратора. Если войдем от имени администратора, то
увидим меню администратора (Рисунок 3).
Рисунок 3 Меню администратора
Например, нам нужно впервые создать наш файл (или открыть) для работы,
для этого выберем 1 пункт меню (Рисунок 4).
Рисунок 4 Создание / открытия файла
Видим что файл успешно создан / открыт для чтения.
Чтобы просмотреть текущие рейсы выбираем пункт 5 (Рисунок 5).
15
Рисунок 5 Вывод текущих рейсов в виде таблицы
Для добавления записи (рейса) используем пункт 2 и следуем инструкциям
(Рисунок 6).
Рисунок 6 Добавление записи рейса
Как видим, мы успешно добавили нашу первую строку. Для изменения
строки, выберем пункт 3 и следуем инструкциям (Рисунок 7).
Рисунок 7 Изменение записи рейса
16
Для удаления записи используем цифру 4 (Рисунок 8) в меню
администратора.
Рисунок 8 Удаление записи рейса
Меню Поиск
Выбрав в меню администратора (цифра 6) или пользователя (цифра 5) пункт
«Поиск» увидим меню поиска (Рисунок 9).
Рисунок 9 Меню поиска
Чтобы выполнить поиск по номеру рейса выберем цифру 1 в меню поиска
(Рисунок 10).
17
Рисунок 10 Поиск по номеру рейса
Для поиска по пункту назначения выберем цифру 2 в меню (Рисунок 11).
Рисунок 11 Поиск по пункту назначения
Так же можем выполнить поиск по времени вылета самолета цифра 3
(Рисунок 12):
18
Рисунок 12 Поиск по времени вылета самолета
Поиск по времени вылета самолета можно цифрой 4 (Рисунок 13).
Рисунок 13 Поиск по времени прибытия
Поиск рейса по нужному количеству мест выберем цифру 5 (Рисунок 14).
19
Рисунок 14 Поиск по количеству мест
Вернуться назад
Чтобы вернуться назад в предыдущее меню нужно выбрать 0 в любом меню
(Рисунок 15).
Рисунок 15 Вернуться назад
Управление пользователями
Для того чтобы зайти в это меню, нужно войти под именем администратора и
выбрать 7ой пункт (Рисунок 16).
20
Рисунок 16 Меню управления пользователями
Тут мы можем добавить пользователя, выбрав 1 (Рисунок 17).
Рисунок 17 Добавление пользователя
В этом меню можем выбрать изменение пользователя цифрой 2 (Рисунок 18).
21
Рисунок 18 Изменения пользователя
Чтобы выполнить удаление, выбираем цифру 3 (Рисунок 19).
Рисунок 19 Удаление пользователя
Выбрав цифру 4 в меню управления пользователями, мы увидим (Рисунок 9),
список всех пользователей и администраторов.
22
Рисунок 20 Меню управления пользователями
Меню пользователя
В меню пользователя можно зайти при запуске приложения введя верный
логин и пароль пользователя (Рисунок 21). Выбрав цифру 5 в меню
пользователя, мы попадем в меню Поиска (Рисунок 9).
Рисунок 21 Меню пользователя
Если выбрать 1, то будет открыт файл рейсов (Рисунок 4) как и у
администратора. Для того чтобы узнать время вылета в город выберем цифру
2 (Рисунок 11). Чтобы узнать о наличии мест на рейс по выбранному городу
и времени отправления выберем цифру 3 (Рисунок 22).
23
Рисунок 22 Наличие мест на рейс, по выбранному городу и времени вылета
Чтобы вывести таблицу рейсов в меню пользователя выберем цифру 4
(Рисунок 23).
Рисунок 23 Вывод Таблицы рейсов
Заключение
Приложение выполнено в соответствии с заданиями, и выполняет, все
те функции, что требовались в полной мере. Программа работает без ошибок,
интерфейс максимально упрощен. В программе проработаны все возможные
исключения. Программа прекрасно работает с файлами, код динамично и
удобно разработан с целью последующего улучшения. Приложение
позволяет пользователю, выполнять поиски по рейсам, в соответствии с его
желаниями.
24
Список использованных источников
1. Культин, Н.А. C++ Builder в задачах и примерах. М.: Аспект Пресс,
2005. – 336 с.
2. Никулин, В.В. С++ для начинающих. Информационное издание. - М.:
МоскваАрт, 2000. – 523 с.
3. Культин, Н.А. C++ Builder в задачах и примерах. М.: Аспект Пресс,
2005. – 336 с.
4. Лапчик, М. П. Метод блок-схем в программировании: Пособие для
студентов / М-во просвещения РСФСР. Омский гос. пед. ин-т им. А. М.
Горького. - Омск, 1969. – 39 с.
5. Брайан Керниган, Деннис Ритчи. Язык программирования C. —
Москва: Вильямс, 2006. — 304 с.
25
Приложение А Листинг программы
#include <stdio.h>
#include <iostream>
#include <fstream> // работа с файлами
#include <iomanip> // манипуляторы ввода/вывода
#include <memory.h>
#define AVIA "avia.txt"
#define AUTOR "autor.txt"
#define PASS "123"
struct avia {
int nomer; // номер рейса
char dest[100]; // пункт назначения
char timeOut[100]; // время вылета
char timeIn[100]; // время прибытия
int mest; // количество свободных мест
};
struct autoriz {
char login[10];
char pass[10];
int access;
};
avia * mem(int n){
avia* mass=(avia*)calloc(n,sizeof(avia));
return mass;
}
char * code(char* lpName)
{
unsigned int a = 0;
// пока существует строка lpResult
while (lpName[a])
{
lpName[a]+=5;
a++;
}
return lpName;
}
char * decode(char* lpName)
{
unsigned int a = 0;
// пока существует строка lpResult
while (lpName[a])
{
lpName[a]-=5;
a++;
}
return lpName;
26
}
FILE * open(char * path){
FILE *file;
file = fopen(path,"r");
if(file == 0)
printf("не могу открыть файл '%s'\n", path);
else
printf("Файл успешно открыт '%s'\n", path);
return file;
}
FILE * create(char * path){
FILE *file;
file = fopen(path,"a+");
if(file == NULL)
printf("не могу открыть файл '%s'\n",path);
else
printf("Файл успешно открыт '%s'\n",path);
return file;
}
int getsizeN(FILE *file, int kol){ // размер массива
rewind(file); // в начало
int n=0;
char s[200]="";
while(fscanf(file,"%s\n",s) != EOF)
n++;
n=n/kol; // yyf количество элементов структур
rewind(file); // в начало
return n;
}
autoriz * getMassAutor(FILE *file,int n){ // получить массив из файла
rewind(file); // в начало
autoriz* mass=(autoriz*)calloc(n,sizeof(autoriz));
for (int i=0; i<n; i++){
decode( mass[i].pass);
fscanf (file, "%s\n%s\n%d\n", mass[i].login, mass[i].pass, &mass[i].access);
}
fclose(file);
return mass;
}
avia * getmass(FILE *file,int n){ // получить массив из файла
rewind(file); // в начало
avia * a=mem(n);
for (int i=0; i<n; i++)
fscanf (file, "%d\n%s\n%s\n%s\n%d\n", &(a[i].nomer), a[i].dest, a[i].timeOut,
a[i].timeIn, &(a[i].mest));
return a;
}
int VuvodT(FILE* f){
27
if(f == 0)
{
printf("Файл не был открыт\n");
return 0;
}else
printf("Начал вывод файла в ввиде таблицы\n");
fseek(f,0,SEEK_SET); // в начало
printf("%5s%10s%10s%20s%20s%10s\n","id","Номер", "Назначение", "Время вылета",
"Время прибытия", "мест");
int i=0;
int n=0;
avia *a=mem(1);
while (fscanf (f, "%d\n%s\n%s\n%s\n%d\n", &(a[i].nomer), a[i].dest, a[i].timeOut,
a[i].timeIn, &(a[i].mest)) != EOF) {
n++;
printf ("%5d",n);
printf ("%10d\0\n",(a[i].nomer));
printf ("%10s\0\n",(a[i].dest));
printf ("%20s\0\n",(a[i].timeOut));
printf ("%20s\0\n",(a[i].timeIn));
printf ("%10d\n\0",(a[i].mest));
}
return n;
}
void VuvodMassT(avia* a, int n){
int num=1;
printf("%5s%10s%10s%20s%20s%10s\n","id","Номер", "Назначение", "Время
вылета", "Время прибытия", "мест");
for (int i=0;i<n;i++){
printf ("%5d",num);
printf ("%10d\0\n",(a[i].nomer));
printf ("%10s\0\n",(a[i].dest));
printf ("%20s\0\n",(a[i].timeOut));
printf ("%20s\0\n",(a[i].timeIn));
printf ("%10d\n\0",(a[i].mest));
num++;
}
}
avia Elem(bool gen){
avia m ;
if (gen){
m.nomer=rand()%100-50; // от минус 50 до 50
}else{
printf("Номер рейса\n");
scanf("%d",&m.nomer);
}
if (gen){
*m.dest=(char)(2);
}else{
28
printf("Пункт назначения\n");
fflush(stdin);
gets(m.dest);
}
if (gen){
*m.timeOut=(char)(2);
}else{
printf("Время отправления\n");
fflush(stdin);
gets(m.timeOut);
}
if (gen){
*m.timeIn=(char)(2);
}else{
printf("Время прибытия\n");
fflush(stdin);
gets(m.timeIn);
}
if (gen){
m.mest=rand()%100-50; // от минус 50 до 50
}else{
printf("Свободных мест\n");
scanf("%d",&m.mest);
}
return m;
}
autoriz elemAutor (){
autoriz m;
char text[9]="";
char pass[9];
printf("Введите логин\n");
fflush(stdin);
gets(m.login);
printf("Введите пароль\n");
fflush(stdin);
gets(m.pass);
code(m.pass);
printf("Введите уровень доступа 1(админ) 2 (user)\n");
scanf("%d",&m.access);
return m;
}
int save(avia* m, int n){
FILE *f = fopen(AVIA,"w+");
if (f==NULL){
printf("Не открыт файл для чтения!!!\n\n");
return 0;
}
29
fseek(f,0L,SEEK_SET); // в начало
for (int i=0;i<n ; i++){ // запись
fprintf (f,"%d\n\0",(m[i].nomer));
fprintf (f,"%s\n\0",(m[i].dest));
fprintf (f,"%s\n\0",(m[i].timeOut));
fprintf (f,"%s\n\0",(m[i].timeIn));
fprintf (f,"%d\n\0",(m[i].mest));
}
printf("Успешно сохранены изменения!\n");
fclose(f); // сохраняем
return n;
}
int saveAutor(autoriz * m, int n){
FILE *f = fopen(AUTOR,"w+");
if (f==NULL){
printf("Не открыт файл для чтения!!!\n\n");
return 0;
}
fseek(f,0L,SEEK_SET); // в начало
for (int i=0;i<n ; i++){ // запись
fprintf (f,"%s\n\0",(m[i].login));
fprintf (f,"%s\n\0",(m[i].pass));
fprintf (f,"%d\n\0",(m[i].access));
}
printf("Успешно сохранены изменения!\n");
fclose(f); // сохраняем
return n;
}
FILE * add(FILE *f){ // заставим все ввести и сохраним в файл
printf("Запущено добавление в файл\n");
if (f==NULL){
printf("Не открыт файл для чтения!!!\n\n");
return 0;
}
fseek(f,0L,SEEK_END); // в конец
int n=-1;
while(n<0){
printf("Сколько добавим?(минимум 1)\n");
scanf("%d",&n);
if (n<0)
printf("Нужно число большее 0\n");
}
avia *m=mem(n);
for (int i=0;i<n;i++)
m[i]= Elem(false); // генерить true
save(m,n);
return create(AVIA); //переоткрываем
}
30
FILE * izm(FILE *f){ // изменить, вывести все, и спросить что изменить
avia *m;
int c=-1;
printf("Запущено изменение\n");
if (f==NULL){
printf("Не открыт файл для чтения!!!\n\n");
return 0;
}
int n=VuvodT(f);
while(c<0){
printf("Какую строку изменить (ее ID)?\n");
scanf("%d",&c);
if ((c<0)&&(c>n))
printf("Нужно число большее 0 и меньшее %d\n",n);
}
m=getmass(f,n); // получим весь массив
for (int i=0;i<n;i++)
if (c-1==i) // заменим нужное
m[i]= Elem(false); // генерить true
fclose(f); // закрываем текущий
save(m,n); // сохраняем
return create(AVIA); //переоткрываем текущий
}
FILE * del(FILE *f){ // изменить, вывести все, и спросить что изменить
avia *m;
printf("Запущено удаление\n");
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
int n=VuvodT(f);
int c=-1;
while(c<0){
printf("Какую строку удалить (ее ID)?\n");
scanf("%d",&c);
if ((c<0)&&(c>n))
printf("Нужно число большее 0 и меньшее %d\n",n);
}
m=getmass(f,n); // получим весь массив
avia* m2=mem(n-1); // создаем второй
int num=0;
for (int i=0;i<n;i++){
if (c-1!=i){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
}
fclose(f); // закрываем текущий
save(m2,num); // сохраняем
31
return create(AVIA); //переоткрываем текущий
}
int poiskNomer(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
int c=-1;
while(c<0){
printf("Какой номер ищем?\n");
scanf("%d",&c);
if ((c<0))
printf("Нужно число большее 0 \n");
}
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
for (int i=0;i<n;i++) // выберем что нам нужны
if (m[i].nomer==c ){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
// выведем
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
int poiskIsSetMestXY(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
// НАЛИЧИЕ СВОБОДНЫХ МЕСТ НА РЕЙС В ГОРОД Х С ВРЕМЕНЕМ
ОТПРАВЛЕНИЯ У
//(Х и У вводятся с клавиатуры)
char c[100]="";
printf("Укажите город\n");
scanf("%s",&c);
char time[100]="";
printf("Укажите время отправления\n");
scanf("%s",&time);
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
for (int i=0;i<n;i++){ // выберем что нам нужны
if ((!strcmp(m[i].dest,c))&&(!strcmp(m[i].timeOut,time))){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
32
}
}
// выведем
if (num==0)
printf("Нет свободных мест на рейс в город %s с временем отправления
%s\n",c, time);
else{
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
}
int poiskpoKolMest(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
int c=-1;
while(c<0){
printf("От скольки мест ищем?\n");
scanf("%d",&c);
if ((c<0))
printf("Нужно число большее 0 \n");
}
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
for (int i=0;i<n;i++) // выберем что нам нужны
if (m[i].nomer>c ){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
// выведем
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
int poiskpoNaznach(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
char c[100]="";
printf("Укажите город\n");
scanf("%s",&c);
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
33
for (int i=0;i<n;i++) // выберем что нам нужны
if (!strcmp(m[i].dest,c)){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
// выведем
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
int poiskpoTimeOut(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
char c[100]="";
printf("Укажите Время вылета\n");
scanf("%s",&c);
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
for (int i=0;i<n;i++) // выберем что нам нужны
if (!strcmp(m[i].timeOut,c)){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
// выведем
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
int poiskpoTimeIn(FILE *f){
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
char c[100]="";
printf("Укажите Время прибытия\n");
scanf("%s",&c);
int n=getsizeN(f,5);
avia *m=getmass(f,n); // получим весь массив
avia* m2=mem(n); // создаем второй
int num=0;
for (int i=0;i<n;i++) // выберем что нам нужны
if (!strcmp(m[i].timeIn,c)){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
// выведем
m2=(avia*)realloc(m2,num*sizeof(avia));
VuvodMassT(m2,num);
}
34
int Poisk(FILE *f){ // изменить, вывести все, и спросить что изменить
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
int s=1;
while (s!=0){
printf("--------------ПОИСК-----------------\n");
printf("1)Поиск по номеру рейса\n");
printf("2)Поиск по пункту назначения\n");
printf("3)Поиск по времени вылету\n");
printf("4)Поиск по времени прибытия\n");
printf("5)Поиск по количеству свободных мест\n");
printf("0)Вернуться назад\n");
printf("Выберите цифру:\n");
scanf("%d", &s);
switch (s){
case 1: poiskNomer(f); break;
case 2: poiskpoNaznach(f); break;
case 3: poiskpoTimeOut(f); break;
case 4: poiskpoTimeIn(f); break;
case 5: poiskpoKolMest(f); break;
case 0: break;
default : printf("Выберете число от 0-2\n");
}
}
return 0;
}
int vuvodUser(){
FILE *f=open(AUTOR);
char text[10]="";
int n=getsizeN(f,3);
autoriz *m=getMassAutor(f,n); // получим весь массив
printf("%10s%10s%10s%10s\n","id","Логин","Пароль","Доступ");
for (int i=0;i<n;i++){ // выберем что нам нужны
decode(m[i].pass);
printf("%10d%10s%10s%10d\n",i+1,m[i].login,m[i].pass, m[i].access);
}
fclose(f);
return 0;
}
int izmUser(){
FILE *f=open(AUTOR);
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
35
vuvodUser();
int c=-1;
while(c<0){
printf("Какого изменить ID?\n");
scanf("%d",&c);
if ((c<0))
printf("Нужно число большее 0 \n");
}
int n=getsizeN(f,3);
autoriz *m=getMassAutor(f,n); // получим весь массив
printf("%10s%10s%10s%10s\n","id","Логин","Пароль","Доступ");
for (int i=0;i<n;i++) // выберем что нам нужны
if (c-1==i)
m[i]= elemAutor(); // генерить true
fclose(f); // закрываем текущий
saveAutor(m,n); // сохраняем
return 0;
}
int delUser(){
FILE *f=open(AUTOR);
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
}
vuvodUser();
int c=-1;
while(c<0){
printf("Какого удалить ID?\n");
scanf("%d",&c);
if ((c<0)) printf("Нужно число большее 0 \n");
}
int n=getsizeN(f,3);
autoriz *m=getMassAutor(f,n); // получим весь массив
autoriz * m2=(autoriz*)calloc(n-1,sizeof(autoriz));
int num=0;
for (int i=0;i<n;i++){
if (c-1!=i){ // заменим нужное
m2[num]=m[i]; // генерить true
num++;
}
}
fclose(f); // закрываем текущий
saveAutor(m2,num); // сохраняем
return 0;
}
int addUser(){
FILE *f=open(AUTOR);
if (f==NULL){
printf("Не открыт файл!!!\n\n");
return 0;
36
}
vuvodUser();
int n=getsizeN(f,3);
autoriz *m=getMassAutor(f,n); // получим весь массив
autoriz * m2=(autoriz*)calloc(n+1,sizeof(autoriz));
int num=0;
for (int i=0;i<n;i++){
m2[num]=m[i];
num++;
}
m2[num]=elemAutor(); // генерить true
num++;
fclose(f); // закрываем текущий
saveAutor(m2,num); // сохраняем
return 0;
}
int userTune(){
int s=1;
while (s!=0){
printf("--------------Управление пользователями--------------\n");
printf("1)Добавление пользователя\n");
printf("2)Изменения пользователя\n");
printf("3)Удаления пользователя\n");
printf("4)Вывод всех пользователей\n");
printf("0)Вернуться назад\n");
printf("Выберите цифру:\n");
scanf("%d", &s);
switch (s){
case 1: addUser(); break;
case 2: izmUser(); break;
case 3: delUser(); break;
case 4: vuvodUser(); break;
case 0: break;
default : printf("Выберете число от 0-2\n");
}
}
return 0;
}
void admin(){
FILE *file2=0;
int s=1;
avia *a;
int n=0;
while (s!=0){
printf("----------------ADMIN------------------\n");
printf("1)Создание/открытие файла с данными\n");
printf("2)Добавление записи\n");
printf("3)Редактирование записи\n");
printf("4)Удаление записи\n");
37
printf("5)Просмотр всех данных в табличной форме\n");
printf("6)Поиск\n");
printf("7)Управление пользователями\n");
printf("0)Вернуться в начало\n");
printf("Выберите цифру:\n");
scanf("%d", &s);
switch (s){
case 1: file2=create(AVIA); break;
case 2: add(file2); break;
case 3: izm(file2); break;
case 4: del(file2); break;
case 5: VuvodT(file2); break;
case 6: Poisk(file2); break;
case 7: userTune(); break;
case 0: break;
default : printf("Выберете число от 0-7\n");
}
}
if (file2!=0)
fclose(file2);
}
void user(){
FILE *file=0;
int s=1;
int n=3;
avia *a;
while (s!=0){
printf("-----------------USER-----------------\n");
printf("1)Открытие файла с данными\n");
printf("2)Время вылета самолетов в город\n");
printf("3)Наличие свободных мест на рейс\n");
printf("4)Просмотр всех данных в табличной форме\n");
printf("5)Поиск\n");
printf("0)Вернуться в начало\n");
printf("Выберите цифру:\n");
scanf("%d", &s);
switch (s){
case 1: file=open(AVIA); break;
case 2: poiskpoNaznach(file); break;
case 3: poiskIsSetMestXY(file); break;
case 4: VuvodT(file); break;
case 5: Poisk(file); break;
case 0: break;
default : printf("Выберете число от 0-5\n");
}
}
if (file!=0)
fclose(file);
}
38
int autorizated(int intadmin){
printf("-----------------Авторизация-----------------\n");
char login[10]="";
char pass[10]="";
char text[10]="";
printf("Введите логин\n");
scanf("%s", login);
printf("Введите пароль\n");
scanf("%s", pass);
FILE *f=open(AUTOR);
int n=getsizeN(f,3);
autoriz *m=getMassAutor(f,n); // получим весь массив
for (int i=0;i<n;i++){ // выберем что нам нужны
if (m[i].access==intadmin){
decode(m[i].pass);
if ((!strcmp(m[i].login,login))&&(!strcmp(m[i].pass,pass))){
switch (intadmin){
case 1: admin(); break;
case 2: user(); break;
}
}
}
}
fclose(f);
return 0;
}
void main(void){
//Создать файл, содержащий сведения о наличии билетов на рейсы Аэрофлота.
//Структура записи: номер рейса, пункт назначения, время вылета, время прибытия,
количество свободных мест в салоне.
//На печать вывести: ВРЕМЯ ВЫЛЕТЫ САМОЛЕТОВ В ГОРОД Х,
//НАЛИЧИЕ СВОБОДНЫХ МЕСТ НА РЕЙС В ГОРОД Х С ВРЕМЕНЕМ
ОТПРАВЛЕНИЯ У (Х и У вводятся с клавиатуры).
setlocale(LC_ALL, "rus");
int s=1;
while (s!=0){
printf("1)Вход под администратором\n");
printf("2)Вход под пользователем\n");
printf("0)Выход\n");
printf("Выберите цифру:\n");
scanf("%d", &s);
switch (s){
case 1:
autorizated(1);
break;
case 2:
autorizated(2);
break;
39
case 0: break;
default : printf("Выберете число от 0-2\n");
}
}
}
40
Download