Добавил:
arrr
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <conio.h>
struct train { //объявление структуры
char arrivial[15];
int number;
char type [12];
int time_departure_hour;
int time_departure_minute;
int time_travel_hour;
int time_travel_minute;
} name;
void addIng(char*);
void ticketOut(struct train);
void show(char*);
void searchDeparture(char*);
void searchTravel(char*);
void searchNum(char*);
void del(char*);
void edit(char*);
void printFile(void);
int menu(char*);
FILE* f;
void addInf(char* file) { // функция добавления информации в файл
int i, n;
system("cLs");
if ((f = fopen(file, "ab")) == NULL) { //проверка правильности открытия файла
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
printf("\nВведите количество рейсов.\n");
scanf("%d", &n);
for (i = 0; i < n; i++) { //добавление информации в файл
printf("Введите пункт прибытия:\n");
scanf("%15s", name.arrivial);
printf("\nВведите номер поезда:\n");
scanf("%3d", &name.number);
printf("\nВведите тип поезда:\n");
scanf("%12s", name.type);
printf("\nВведите время отправления (часы и минуты через пробел):\n ");
scanf("%d %d", &name.time_departure_hour, &name.time_departure_minute);
printf("\nВведите время пути (часы и минуты через пробел):\n ");
scanf("%d %d", &name.time_travel_hour, &name.time_travel_minute);
fwrite(&name, sizeof(struct train), 1, f);
}
printf("\nСпасибо! Информация была успешно добавлена.\n\n");
system("pause");
fclose(f);
}
void ticketOut(struct train name) { // функция вывода информации из бинарного файла через структуры
if (name.time_departure_minute < 10 && name.time_travel_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:0%d | %2d:0%d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else if (name.time_travel_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:%2d | %2d:0%d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else if (name.time_departure_minute < 10)
printf("\n| %5d | %15s | %12s | %2d:0%d | %2d:%2d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
else
printf("\n| %5d | %15s | %12s | %2d:%2d | %2d:%2d |", name.number, name.arrivial, name.type, name.time_departure_hour, name.time_departure_minute, name.time_travel_hour, name.time_travel_minute); //оформление вывода с учетом количества выводимых символов для корректного отображения на экране
}
void show(char* file) { // вывод на экран содержимого файла в графленом виде
system("cLs");
if ((f = fopen(file, "rb")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
printf("__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________");
while (fread(&name, sizeof(struct train), 1, f) == 1) //цикл для вывода на экран
ticketOut(name);
printf("\n__________________________________________________________________________\n\n");
system("pause");
fclose(f);
}
void searchDeparture(char* file) { // функция нахождения поездов отправляющихся в определенный временной промежуток
int time_first_hour, time_first_min, time_second_hour, time_second_min, time_first, time_second, n = 0, nal = 1;
char station[15];
system("cLs"); //очистка экрана
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("Введите пункт назначения:\n");
scanf("%15s", station);
puts("\nОт какого времени искать? (часы и минуты через пробел)\n");
scanf("%d %d", &time_first_hour, &time_first_min);
time_first = time_first_hour * 60 + time_first_min;
puts("\nДо какого времени искать? (часы и минуты через пробел)\n");
scanf("%d %d", &time_second_hour, &time_second_min);
time_second = time_second_hour * 60 + time_second_min;
while (fread(&name, sizeof(struct train), 1, f)) {
n++;
if (strcmp (name.arrivial, station) == 0)
if (time_first <= name.time_departure_hour * 60 + name.time_departure_minute && time_second >= name.time_departure_hour * 60 + name.time_departure_minute) {
if (nal == 1){
printf("\n__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________\n");
}
nal = 0;
fseek(f, (n - 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись
fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП
ticketOut(name);//Вывод ее на экран
}
}
if (nal == 1)
printf("\nПодходящих рейсов не найдено, выберите другое время\n");
else
printf("\n__________________________________________________________________________\n");
system("pause");
fclose(f);
}
void searchNum(char* file) { // функция поиска рейса с номером, введённым пользователем
int num, tmp = 1;
system("cLs");
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("\nПожалуйста, введите номер рейса.\n");
scanf("%d", &num);
while (fread(&name, sizeof(struct train), 1, f))
if (name.number == num) {
tmp = 0;
printf("__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("\n__________________________________________________________________________\n");
ticketOut(name);
printf("\n__________________________________________________________________________\n");
break;
}
if (tmp == 1)
printf("\nРейс с данным номером не был найден.\n");
system("pause");
fclose(f);
}
void searchTravel(char* file){ // поиск самого быстрого поезда определенного типа
int time_min = 100000000, n = 0, pos= -1;
char station[15], type_info[12];
system("cLs");
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("\nВведите пункт назначения:\n");
scanf("%15s", station);
puts("\nВведите тип поезда:\n");
scanf("%12s", type_info);
while (fread(&name, sizeof(struct train), 1, f)) {
n++;
if (strcmp (name.arrivial, station) == 0)
if (strcmp (name.type, type_info) == 0)
if (time_min >= name.time_travel_hour * 60 + name.time_travel_minute) {
pos = n;
time_min = name.time_travel_hour * 60 + name.time_travel_minute;
}
}
if (pos == -1)
printf("\nПодходящих рейсов нет.\n");
else{
printf("\n__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________\n");
fseek(f, (pos - 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись
fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП
ticketOut(name);
printf("\n__________________________________________________________________________\n");
}
system("pause");
fclose(f);
}
void del(char* file1){ // функция удаления записи
FILE* f1, * f2;
int num;
char file2[] = "tmp";
system("cls");
if ((f1 = fopen(file1, "rb")) == NULL)
{
perror("\nОшибка открытия файла.");
puts("\nДля продолжения нажмите любую кнопку...\n");
system("pause");
return;
}
if ((f2 = fopen(file2, "wb")) == NULL)
{
perror("\nОшибка открытия файла.");
puts("\nДля продолжения нажмите любую кнопку...\n");
system("pause");
return;
}
printf("Введите номер рейса, сведения о которой хотите удалить.\n");
fflush(stdin);
scanf("%d", &num);
printf("\n");
while (fread(&name, sizeof(struct train), 1, f1))
if (num != name.number) // Сравнение номеров
fwrite(&name, sizeof(struct train), 1, f2); // Запись во временный файл
puts("\n Запись успешно удалена.\n");
system("pause");
fclose(f1);
fclose(f2);
remove(file1);
rename(file2, file1);
}
void printFile() { // вывод текстового файла с заданием на экран
char ch = 0;
FILE* file = fopen("zad.txt", "r");
system("cLs");
while (!feof(file) && !ferror(file)) {
ch = getc(file);
if (ch != EOF)
{
putchar(ch);
}
}
fclose(file);
system("pause");
}
void edit(char* file) { // Редактирование записи
int n = 0, num, point, tmp = 1;
system("cLs");
if ((f = fopen(file, "rb+")) == NULL) { //открытие файла и проверка на правильность открыя
perror("\nОшибка открытия файла.");
puts("\nНажмите любую клавишу для выхода в меню...\n");
system("pause");
return;
}
puts("Введите номер рейса для редактирования.\n");
scanf("%d", &num);
while (fread(&name, sizeof(struct train), 1, f)) {
n++;
if (name.number == num) {
tmp = 0;
fseek(f, (n - 1) * sizeof(struct train), SEEK_SET);// Установка указателя на запись
fread(&name, sizeof(struct train), 1, f);//Считывание записи из файла в ОП
printf("__________________________________________________________________________\n");
printf("| Номер | Назначение | Тип поезда | Время отправления | Время пути |\n");
printf("__________________________________________________________________________\n");
ticketOut(name);//Вывод ее на экран
printf("\n__________________________________________________________________________\n");
puts("\n\tВыберите поле для редактирования:\n");
puts("\t1. Номер поезда.\n");
puts("\t2. Пункт назначения.\n");
puts("\t3. Тип поезда.\n");
puts("\t4. Время отправления.\n");
puts("\t5. Время пути.\n");
puts("\t6. Изменить запись полностью.\n\n");
scanf("%d", &point);
system("cLs");
if (point == 1 || point ==6){
puts("\tНомер поезда.\n");
scanf("%d", &name.number);
}
if (point == 2 || point ==6){
puts("\tПункт назначения.\n");
scanf("%15s", name.arrivial);
}
if (point == 3 || point ==6){
puts("\tТип поезда.\n");
scanf("%12s", name.type);
}
if (point == 4 || point ==6){
puts("\tВремя отправления. (часы и минуты через пробел)\n");
scanf("%2d %2d", &name.time_departure_hour, &name.time_departure_minute);
}
if (point == 5 || point ==6){
puts("\tВремя пути. (часы и минуты через пробел)\n");
scanf("%2d %2d", &name.time_travel_hour, &name.time_travel_minute);
}
// Установка указателя на эту запись
fseek(f, (n - 1) * sizeof(struct train), SEEK_SET);
//Запись измененной записи из ОП в файл
fwrite(&name, sizeof(struct train), 1, f);
break;
}
}
if (tmp) printf("Нет записи о рейсе с введённым номером.\n");
system("pause");
fclose(f);
}
int menu(char* file_name) { // меню
int item;
while (1)
{
system("cLs");
puts(" \t\tМ Е Н Ю");
puts(" \n\t 1. Просмотр задания.");
puts(" \n\t 2. Создать и добавить.");
puts(" \n\t 3. Поиск рейса по временному промежутку.");
puts(" \n\t 4. Поиск рейса по номеру.");
puts(" \n\t 5. Поиск самого быстрого рейса.");
puts(" \n\t 6. Просмотр информации о рейсах.");
puts(" \n\t 7. Удаление.");
puts(" \n\t 8. Редактирование.");
puts(" \n\t 9. Выход.");
puts(" \nВведите номер пункта меню: ");
scanf("%d", &item);
switch (item) {
case 1:
printFile();
break;
case 2:
addInf(file_name);
break;
case 3:
searchDeparture(file_name);
break;
case 4:
searchNum(file_name);
break;
case 5:
searchTravel(file_name);
break;
case 6:
show(file_name);
break;
case 7:
del(file_name);
break;
case 8:
edit(file_name);
break;
case 9:
system("cLs");
printf("\n\nРабота программы закончена. Спасибо.\n\n\n");
system("pause");
return 0;
default: {
system("cLs");
printf("\n\nПункт меню отсутствует.\n\n\n");
system("pause");
return 2;
}
}
}
}
int main() {
char file_name[25];
setlocale(LC_ALL, "Rus");
puts("Пожалуйста, введите имя файла:\n");
gets(file_name);
menu(file_name);
return 0;
}