#define _CRT_SECURE_NO_WARNINGS
#define _USE_MATH_DEFINES
#include <math.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
#include <ctype.h>
#include <windows.h>
typedef struct
{
int number;
char strana[20];
char gorod[20];
char nazvanie[30];
int klass;
int za_den;
int proezd;
} Hotel;
void menu()
{
fflush(stdin);
puts(" \\ | / \n \\ | / \n \\ | / \n_____\\|/_____\t\tДОБРО ПОЖАЛОВАТЬ В ТРИВАГО НА МИНИМАЛКАХ\t\n /|\\ \n / | \\ \n / | \\ \n");
puts("1. Создание файла");
puts("2. Открыть готовый");
puts("3. Показать данные");
puts("4. Редактирование");
puts("5. Cведения об отелях определенного класса, где стоимость проживания за неделю наименьшая");
puts("6. Cтоимость тура на неделю в определенный класс отеля, включая стоимость проживания и стоимость проезда.");
puts("7. Вiход");
}
void open(char* adres1, int* razm)
{
fflush(stdin);
system("cls");
printf("\tОткртие файла\n Введите путь файла\n");
gets(adres1);
FILE* file = fopen(adres1, "rb+");
while (file == NULL)
{
printf("Ошибка открытия файла\n");
gets(adres1);
file = fopen(adres1, "rb+");
}
fseek(file, 0, SEEK_END);
*razm = ftell(file) / sizeof(Hotel);
fclose(file);
}
void sozdanie(char* adres1, int* razm)
{
fflush(stdin);
system("cls");
char adres[250];
printf("\t\tСоздание файла\n\n");
printf("место создания?\n");
fflush(stdin);
gets(adres);
strcpy(adres1, adres);
Hotel* Stalin228;
FILE* file = fopen(adres, "wb+");
printf("Cколько отелей вы хотите проанализировать?\n");
int kolvo;
scanf("%d", &kolvo);
Stalin228 = calloc(kolvo, sizeof(Hotel));
printf("введите данные по отелю: страна, город, название, класс, цену за день и проезд в обе стороны\n");
for (int i = 0; i < kolvo; i++)
{
scanf("%s%s%s%d%d%d", &Stalin228[i].strana, &Stalin228[i].gorod, &Stalin228[i].nazvanie, &Stalin228[i].klass, &Stalin228[i].za_den, &Stalin228[i].proezd);
Stalin228[i].number = i + 1;
}
fwrite(Stalin228, sizeof(Hotel), kolvo, file);
fclose(file);
free(Stalin228);
*(razm) = kolvo;
}
void shapka2()
{
printf(" | № | Страна | Город | Название отеля | Класс | Стоимость за неделю | Проезд в обе стороны |\n");
}
void shapka()
{
printf(" | № | Страна | Город | Название отеля | Класс | Стоимость за день | Проезд в обе стороны |\n");
}
void sirtaki()
{
printf("______________________________________________________________________________________________________________________________________\n");
}
void vivod(Hotel* Stalin228, int i)
{
printf(" |%3d |%17s |%17s |%29s | %d |%21d |%21d |\n", Stalin228[i].number, Stalin228[i].strana, Stalin228[i].gorod, Stalin228[i].nazvanie, Stalin228[i].klass, Stalin228[i].za_den, Stalin228[i].proezd);
}
void vid(char* adres1, int razm)
{
fflush(stdin);
system("cls");
Hotel* Stalin228;
Stalin228 = calloc(razm, sizeof(Hotel));
FILE* file = fopen(adres1, "rb+");
fread(Stalin228, sizeof(Hotel), razm, file);
sirtaki();
shapka();
sirtaki();
for (int i = 0; i < razm; i++)
{
vivod(Stalin228, i);
sirtaki();
}
getch();
}
void perenos(Hotel* Stalin228, Hotel* Ruzveld69, int i, int k)
{
strcpy(Ruzveld69[k].strana, Stalin228[i].strana);
strcpy(Ruzveld69[k].gorod, Stalin228[i].gorod);
strcpy(Ruzveld69[k].nazvanie, Stalin228[i].nazvanie);
Ruzveld69[k].klass = Stalin228[i].klass;
Ruzveld69[k].za_den = Stalin228[i].za_den;
Ruzveld69[k].proezd = Stalin228[i].proezd;
}
void klass(char* adres1, int razm)
{
fflush(stdin);
system("cls");
Hotel* Stalin228;
Stalin228 = calloc(razm, sizeof(Hotel));
FILE* file = fopen(adres1, "rb+");
fread(Stalin228, sizeof(Hotel), razm, file);
char a[20], b[20];
int k;
int norm_mass = 0;
Hotel* Ruzveld69;
Ruzveld69 = calloc(0, sizeof(Hotel));
printf("\tКуда едем?\n\tВведите название страны и города и класс:\n Форма ввода: Страна Город Класс(1-5)\n");
scanf("%s%s%d", &a, &b, &k);
for (int i = 0; i < razm; i++)
{
strcoll(Stalin228[i].strana, a);
if ((strcoll(Stalin228[i].strana, a) != -1) && (strcoll(Stalin228[i].gorod, b) != -1) && (Stalin228[i].klass==k))
{
norm_mass++;
Ruzveld69 = realloc(Ruzveld69, norm_mass * sizeof(Hotel));
perenos(Stalin228, Ruzveld69, i, norm_mass - 1);
}
}
if(norm_mass==0)
printf("Совпадение не найдено");
else
{
for (int i = 0; i < norm_mass; i++)
{
for (int j = norm_mass - 1; j > 0; j--)
if (Ruzveld69[j - 1].za_den > Ruzveld69[j].za_den)
{
Hotel tmp = Ruzveld69[j];
Ruzveld69[j] = Ruzveld69[j - 1];
Ruzveld69[j - 1] = tmp;
}
}
for (int i = 0; i < norm_mass; i++)
{
Ruzveld69[i].number = i+1;
Ruzveld69[i].za_den *= 7;
}
sirtaki();
shapka2();
sirtaki();
for (int i = 0; i < norm_mass; i++)
{
vivod(Ruzveld69, i);
sirtaki();
}
}
fclose(file);
free(Stalin228);
free(Ruzveld69);
getch();
}
void price(char* adres,int razm)
{
fflush(stdin);
system("cls");
Hotel* Stalin228;
Stalin228 = calloc(razm, sizeof(Hotel));
FILE* file = fopen(adres, "rb+");
fread(Stalin228, sizeof(Hotel), razm, file);
int a;
printf("Выберете класс отеля\n");
scanf("%d", &a);
double sum=0;
int kolvo=0;
for (int i = 0; i < razm; i++)
{
(Stalin228[i].klass == a);
if (Stalin228[i].klass == a)
{
sum += Stalin228[i].za_den * 7 + Stalin228[i].proezd;
kolvo++;
}
}
double sred=0;
sred = sum / kolvo;
printf("\nСредняя цена тура на неделю (проживание + трансфер) для класса %d составляет %lf", a, sred);
getch();
}
void DN_menu()
{
fflush(stdin);
puts("\t Вывести общие данные на экран?");
puts("1.Да");
puts("2.Нет");
}
void dobavit(char* adres1, int* razm)
{
fflush(stdin);
system("cls");
printf("\t\tДобавление записи\n");
char status;
DN_menu();
status = getch();
switch (status)
{
case '1':
vid(adres1, *razm); break;
case '2':
break;
}
FILE* file = fopen(adres1, "ab+");
Hotel Stalin228;
printf("Запись:\n");
scanf("%s%s%s%d%d%d", &Stalin228.strana, &Stalin228.gorod, &Stalin228.nazvanie, &Stalin228.klass, &Stalin228.za_den, &Stalin228.proezd);
Stalin228.number = *razm + 1;
fwrite(&Stalin228, sizeof(Hotel), 1, file);
(*razm)++;
fclose(file);
}
void udalit(char* adres1, int* razm)
{
fflush(stdin);
system("cls");
int num, k = 0;
char status;
printf("\t\tУдаление записи\n");
DN_menu();
status = getch();
switch (status)
{
case '1':
vid(adres1, *razm); break;
case '2':
break;
}
printf("Введите номер записи которую хотите удалить:\n");
scanf("%d", &num);
FILE* file = fopen(adres1, "rb+");
Hotel* Stalin228;
Stalin228 = calloc(*razm, sizeof(Hotel));
Hotel* tmp_Stalin228 = calloc((*razm) - 1, sizeof(Hotel));
fread(Stalin228, sizeof(Hotel), *razm, file);
for (int i = 0; i < *razm-1; i++)
{
tmp_Stalin228[k].number = k + 1;
strcpy(tmp_Stalin228[k].strana, Stalin228[i].strana);
strcpy(tmp_Stalin228[k].gorod, Stalin228[i].gorod);
strcpy(tmp_Stalin228[k].nazvanie, Stalin228[i].nazvanie);
tmp_Stalin228[k].klass = Stalin228[i].klass;
tmp_Stalin228[k].za_den = Stalin228[i].za_den;
tmp_Stalin228[k].proezd = Stalin228[i].proezd;
if (num - 1 == i)
{
continue;
}
k++;
}
fclose(file);
free(Stalin228);
remove(adres1);
file = fopen(adres1, "wb+");
(*razm)--;
fwrite(tmp_Stalin228, sizeof(Hotel), *razm, file);
free(tmp_Stalin228);
fclose(file);
}
void pomenet_menu()
{
fflush(stdin);
puts("1. Страна");
puts("2. Город");
puts("3. Название");
puts("4. Класс");
puts("5. Цена за день ");
puts("6. Цена за неделю");
puts("7. Всё");
puts("8. Ничего");
}
void pomenet(char* adres1, int razm)
{
fflush(stdin);
system("cls");
char test;
char status;
DN_menu();
status = getch();
switch (status)
{
case '1':
vid(adres1, razm);
break;
case '2':
break;
}
printf("\t\tИзменение записи\n");
int num, k = 0;
printf("Введите номер записи которую хотите изменить\n");
scanf("%d", &num);
test = getchar();
num--;
FILE* file = fopen(adres1, "rb+");
Hotel* Stalin228;
Stalin228 = calloc(razm, sizeof(Hotel));
fread(Stalin228, sizeof(Hotel), razm, file);
fclose(file);
shapka();
vivod(Stalin228, num);
sirtaki();
do
{
fflush(stdin);
pomenet_menu();
status = getch();
switch (status)
{
case '1':
fflush(stdin);
printf("Новая страна: ");
scanf("%s", &Stalin228[num].strana);
continue;
case '2':
fflush(stdin);
printf("Новый город: ");
scanf("%s", &Stalin228[num].gorod);
continue;
case '3':
fflush(stdin);
printf("Новое название отеля: ");
scanf("%s", &Stalin228[num].nazvanie);
continue;
case '4':
fflush(stdin);
printf("Новый класс отеля: ");
scanf("%d", &Stalin228[num].klass);
test = getchar();
continue;
case '5':
fflush(stdin);
printf("Новая ценя за день: ");
scanf("%d", &Stalin228[num].za_den);
test = getchar();
continue;
case '6':
fflush(stdin);
printf("Новая цена за проезд в обе стороны: ");
scanf("%d", &Stalin228[num].proezd);
test = getchar();
continue;
case '7':
vivod(&Stalin228, num);
continue;
case '8':
break;
}
printf("\n");
} while (status != '8');
remove(adres1);
file = fopen(adres1, "wb+");
fwrite(Stalin228, sizeof(Hotel), razm, file);
fclose(file);
free(Stalin228);
}
void redact_menu(void)
{
puts("1. Добавить запись");
puts("2. Удалить запись");
puts("3. Отпедактировать запись");
puts("4. Вiход");
}
void redact(char* adres1, int* razm)
{
char status;
fflush(stdin);
do
{
system("cls");
printf("\t\tРедактироание\n\n");
redact_menu();
status = getch();
switch (status)
{
case '1':
dobavit(adres1, razm);
continue;
case '2':
udalit(adres1, razm);
continue;
case '3':
pomenet(adres1, *razm);
continue;
case '4':
system("cls");
break;
}
} while (status != '4');
}
int main(void)
{
system("color 4E");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char status;
char adres[250];
int razm = 0;
do
{
fflush(stdin);
system("cls");
menu();
status = getch();
switch (status)
{
case '1':
sozdanie(adres, &razm);
continue;
case '2':
open(adres, &razm);
continue;
case '3':
vid(adres, razm);
continue;
case '4':
redact(adres, &razm);
continue;
case '5':
klass(adres, razm);
continue;
case '6':
price(adres, razm);
continue;
case '7':
break;
}
} while (status !='7');
return 0;
}