курсач3x

advertisement
Титульный лист БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Контрольная работа по курсу: «Основы конструирования программ»
Вариант № 18
Студент-заочник 1 курса
Группы № 402341
Сырников С.А
Преподаватель
Мытник Н. П.
Минск, 2014
Содержание
Задание №18
Создать файл, содержащий сведения о наличии билетов на рейсы Аэрофлота.
Структура записи: номер рейса, пункт назначения, время вылета, время
прибытия, количество свободных мест в салоне. На печать вывести: ВРЕМЯ
ВЫЛЕТЫ САМОЛЕТОВ В ГОРОД Х, НАЛИЧИЕ СВОБОДНЫХ МЕСТ НА
РЕЙС В ГОРОД Х С ВРЕМЕНЕМ ОТПРАВЛЕНИЯ У (Х и У вводятся с
клавиатуры).
Введение
Используется алгоритм шифрования по сдвигу на 5 элементов вверх по
таблице ASCII. При дешифрации используется обратный сдвиг на 5
элементов. Этот алгоритм легко поддаётся взлому, и предназначен для
поверхностного шифрования, с целью показать пользователю, что данные
шифруются и программа безопасна. Его преимущество это быстрое
шифрование и дешифрование.
Для данного приложения было использовано 2 структуры хранимых
данных. Одна называется avia, она отвечает за хранения данных
авиакомпании (Таблица 1). Структура предназначена для хранения массива
данных авиакомпании обо всех рейсах компании. Массив этой структуры
будет сохраняться в файл avia.txt расположенный в корне программы.
Таблица 1. Структура данных avia.
Тип
int
char
char
char
int
Имя
nomer
dest
timeOut
timeIn
mest
Описание
Номер рейса авиакомпании
Название пункта назначения
время вылета
время прибытия
количество свободных мест
Код структуры:
struct avia {
int nomer; // номер рейса
char dest[100]; // пункт назначения
char timeOut[100]; // время вылета
char timeIn[100]; // время прибытия
int mest; // количество свободных мест
};
Другая структура называется autoriz она отвечает за хранения
промежуточных значений при авторизации (Таблица 2). В ней храняться
логин и пароль, также и уровень доступа к приложению. Массив этой
структуры будет сохраняться в файл autor.txt расположенный в корне
программы. При чтении и записи из файла будет применяться шифрование и
дешифрование данных.
Таблица 2. Структура данных autoriz.
Тип
char
char
int
Имя
login
pass
access
Код структуры:
struct autoriz {
char login[10];
Описание
Логин при авторизации
Пароль при авторизации
Уровень доступа (1-2)
char pass[10];
int access;
};
Для создания пользовательских функций мы должны продумать
хорошо ее иерархию, я начал по восходящему проектированию. И начал
реализацию с главного меню, первой функции «main()». Она должна
вызывать выбранную функцию пользователем. С полным списком функции
используемых в приложении можно ознакомиться в Таблица 3. Функция
main() не получает параметров и не возвращает их.
Далее она вызывает функцию «autorizated()» которая выполняет
функцию авторизации пользователя, по выбранному доступу, логину и
паролю. Возвращает значение число 1 при верной авторизации и 0 при
неверной. В случае успешной авторизации он запускает соответствующую
функцию “user()” для пользователя и ‘admin()’ для администратора.
Функция пользователя ”user()” отображает доступные пользователю
функции. И в зависимости от того какой пункт в меню выберет, ту функцию
и запускает. К функциям меню пользователя относят:
1)Открытие файла с данными – функция open();
2)Время вылета самолетов в город - poiskpoNaznach( );
3)Наличие свободных мест на рейс - poiskIsSetMestXY( );
4)Просмотр всех данных в табличной форме - VuvodT( );
5)Поиск - Poisk( );
Функция администратора «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;
Функция изменения пользователя называется 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(). Она выполняет поиск по наличие свободных мест на
рейс в самолетах авиакомпании по пункту назначения и времени
отправления. Функция возвращает 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().Функция служит для вывода рейсов на экран из массива.
Функция принимает значение указателя на массив 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.
Возвра
щает
avia *
char *
char *
FILE *
FILE *
Вызов функции
Описание функции
mem(int n)
code(char* lpName)
decode(char* lpName)
open(char * path)
create(char * path)
int
для создания массива размером n
функция шифрования данных
функция дешифрования данных
функция открытия файла по пути path
функция открытия / создание файла по
пути path
функция получения размера массива
getsizeN (FILE *file, int
kol)
getMassAutor (FILE *file, функция получить массива
int n)
авторизационных данных
Getmass (FILE *file, int n) функция получить массива структур
avia из файла
VuvodT(FILE* f)
функция вывода массива структуры avia
из файла (по ключу f) в табличном виде
VuvodMassT(avia* a, int функция вывода массива структуры
n)
avia в табличном виде
Elem (bool gen)
функция для ввода структуры avia.
Параметр gen определяет нужно ли
генерировать автоматически, или
вводить вручную данные в структуру.
Возвращает структуру avia.
autoriz*
avia*
int
void
avia
функция для ввода структуры 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()
Главная функция
autorizated(int
intadmin)
int
Авторизация пользователя
Таблица 3. Пользовательские функции
схемы алгоритмов работы приложения (минимум 3 с описанием и
кодом).
autoriz
elemAutor ()
Приложение работает по такой последовательности, сначала выполняется
авторизация, и в зависимости от уровня доступа, открывается меню
администратора или меню пользователя (схема 1).
Схема 1 Авторизация
Код авторизации:
int autorizated(int intadmin){
printf("-----------------Авторизация-----------------\n");
char login[10]="";
char pass[10]="";
char text[10]="";
bool b=false;
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(); b=true; break;
case 2: user(); b=true; break;
}
}
}
}
if (!b)
printf("Неверный логин или пароль\n");
fclose(f);
printf("--------------------------------------\n");
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;
case 0: break;
default : printf("Выберете число от 0-2\n");
}
}
}
После авторизации под администратором мы увидим меню администратора
(Схема 2). Или же можем авторизоваться под пользователем и увидим меню
пользователя (Схема 3).
Схема 2 Меню администратора
Код функции меню администратора:
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");
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);
}
Схема 3 меню пользователя
Код функции меню пользователя:
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);
}
Описание программы
При запуске приложения мы видим выбор между режимом пользователя и
администратора (Рисунок 1).
Рисунок 1 Главное меню
После выбора режима входа начинается авторизация (Рисунок 2).
Рисунок 2 Авторизация
Если выбрать 0 в главном меню, то выйдет из приложения. Режим
администратора дает больше возможностей, чем пользователю. В режиме
администратора, мы можем управлять пользователями, добавлять рейсы. А
вот пользователь, может лишь выполнять поиск среди присутствующих
рейсов.
Меню Администратор
В меню администратора можно зайти при запуске приложения введя верный
логин и пароль администратора. Если войдем от имени администратора, то
увидим меню администратора (Рисунок 3).
Рисунок 3 Меню администратора
Например, нам нужно впервые создать наш файл (или открыть) для работы,
для этого выберем 1 пункт меню (Рисунок 4).
Рисунок 4 Создание / открытия файла
Видим что файл успешно создан / открыт для чтения.
Чтобы просмотреть текущие рейсы выбираем пункт 5 (Рисунок 5).
Рисунок 5 Вывод текущих рейсов в виде таблицы
Для добавления записи (рейса) используем пункт 2 и следуем инструкциям
(Рисунок 6).
Рисунок 6 Добавление записи рейса
Как видим, мы успешно добавили нашу первую строку. Для изменения
строки, выберем пункт 3 и следуем инструкциям (Рисунок 7).
Рисунок 7 Изменение записи рейса
Для удаления записи используем цифру 4 (Рисунок 8) в меню
администратора.
Рисунок 8 Удаление записи рейса
Меню Поиск
Выбрав в меню администратора (цифра 6) или пользователя (цифра 5) пункт
«Поиск» увидим меню поиска (Рисунок 9).
Рисунок 9 Меню поиска
Чтобы выполнить поиск по номеру рейса выберем цифру 1 в меню поиска
(Рисунок 10).
Рисунок 10 Поиск по номеру рейса
Для поиска по пункту назначения выберем цифру 2 в меню (Рисунок 11).
Рисунок 11 Поиск по пункту назначения
Так же можем выполнить поиск по времени вылета самолета цифра 3
(Рисунок 12):
Рисунок 12 Поиск по времени вылета самолета
Поиск по времени вылета самолета можно цифрой 4 (Рисунок 13).
Рисунок 13 Поиск по времени прибытия
Поиск рейса по нужному количеству мест выберем цифру 5 (Рисунок 14).
Рисунок 14 Поиск по количеству мест
Вернуться назад
Чтобы вернуться назад в предыдущее меню нужно выбрать 0 в любом меню
(Рисунок 15).
Рисунок 15 Вернуться назад
Управление пользователями
Для того чтобы зайти в это меню, нужно войти под именем администратора и
выбрать 7ой пункт (Рисунок 16).
Рисунок 16 Меню управления пользователями
Тут мы можем добавить пользователя, выбрав 1 (Рисунок 17).
Рисунок 17 Добавление пользователя
В этом меню можем выбрать изменение пользователя цифрой 2 (Рисунок 18).
Рисунок 18 Изменения пользователя
Чтобы выполнить удаление, выбираем цифру 3 (Рисунок 19).
Рисунок 19 Удаление пользователя
Выбрав цифру 4 в меню управления пользователями, мы увидим (Рисунок 9),
список всех пользователей и администраторов.
Рисунок 20 Меню управления пользователями
Меню пользователя
В меню пользователя можно зайти при запуске приложения введя верный
логин и пароль пользователя (Рисунок 21). Выбрав цифру 5 в меню
пользователя, мы попадем в меню Поиска (Рисунок 9).
Рисунок 21 Меню пользователя
Если выбрать 1, то будет открыт файл рейсов (Рисунок 4) как и у
администратора. Для того чтобы узнать время вылета в город выберем цифру
2 (Рисунок 11). Чтобы узнать о наличии мест на рейс по выбранному городу
и времени отправления выберем цифру 3 (Рисунок 22).
Рисунок 22 Наличие мест на рейс, по выбранному городу и времени вылета
Чтобы вывести таблицу рейсов в меню пользователя выберем цифру 4
(Рисунок 23).
Рисунок 23 Вывод Таблицы рейсов
Заключение
Приложение выполнено в соответствии с заданиями, и выполняет, все те
функции, что требовались в полной мере. Программа работает без ошибок,
интерфейс максимально упрощен. В программе проработаны все возможные
исключения. Программа прекрасно работает с файлами, код динамично и
удобно разработан с целью последующего улучшения. Приложение
позволяет пользователю, выполнять поиски по рейсам, в соответствии с его
желаниями.
список использованных источников
Приложение А Листинг программы
#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;
}
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){
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{
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;
}
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); //переоткрываем
}
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); // сохраняем
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++;
}
}
// выведем
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;
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);
}
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;
}
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;
}
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");
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);
}
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;
case 0: break;
default : printf("Выберете число от 0-2\n");
}
}
}
Download