Скачиваний:
11
Добавлен:
11.07.2021
Размер:
14.06 Кб
Скачать
#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;
}

Соседние файлы в папке курсовая программирование на яву 1 курс