Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- typedef struct
- {
- char type_train[100];
- float time;
- int number_train;
- char type_wagon[100];
- int number_free_place;
- int number_wagon;
- int num;
- } train;
- /*функция выводит на экран в табличном виде базу данных*/
- void printf_base(train tr[], int* number)
- {
- char s1[11] = "type_train", s2[5] = "time", s3[9] = " class";
- char s4[19] = " number_free_place", s5[14] = "number_wagon";
- char s6[7] = "number", s7[14] = "number_train";
- int i;
- /*название*/
- printf("%7s%11s%5s%9s%19s%14s%14s", s6, s1, s2, s3, s4, s5, s7);
- for (i = 0; i < *number; i++)
- {
- /*сами элементы*/
- printf("\n");
- printf("%6d%10s", tr[i].num, tr[i].type_train);
- printf("%7.2f", tr[i].time);
- printf("%9s%17d", tr[i].type_wagon, tr[i].number_free_place);
- printf("%14d%14d\n", tr[i].number_wagon, tr[i].number_train);
- }
- printf("\n");
- }
- /*функция заполняющая базу данных*/
- int full_base(train tr[], int* number)
- {
- int j, ret, w = 0;
- float *q;
- char s1[] = "SV", s2[] = "comp", s3[] = "res_seat", d1[] = "pass";
- char d2[] = "fast", d[14], s[14], f1[30];
- printf("How many train do you want to enter?\n");
- ret = scanf("%d", number);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- getchar();
- for (j = 0; j < *number; j++)
- {
- printf("Input type train - pass, fast: ");
- scanf("%s", d);
- /*проверка на то, что верно введены типы поездов*/
- if((strcmp(d, d1) == 0) || (strcmp(d, d2) == 0))
- {
- strcpy(tr[j].type_train, d);
- }
- else
- {
- printf("Error\n");
- exit(1);
- }
- printf("Enter departure time(hours.minutes): ");
- ret = scanf("%f", &tr[j].time);
- while(w != 1)
- {
- if((tr[j].time) >= 24.00 || tr[j].time < 0.00)
- {
- printf("Your enter incorrectly time. Input again: ");
- ret = scanf("%f", &tr[j].time);
- }
- else
- {
- w = 1;
- }
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- printf("Enter type wagon - SV, comp, res_seat: ");
- scanf("%s", s);
- /*проверка на то, что верно введены типы вагонов*/
- if ((strcmp(s, s1) == 0) || (strcmp(s, s2) == 0) || (strcmp(s, s3) == 0))
- {
- strcpy(tr[j].type_wagon, s);
- }
- else
- {
- printf("Error\n");
- exit(1);
- }
- printf("Enter your number free place: ");
- ret = scanf("%d", &tr[j].number_free_place);
- if(tr[j].number_free_place < 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- printf("Enter your number wagon: ");
- ret = scanf("%d", &tr[j].number_wagon);
- if(tr[j].number_wagon <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- if(tr[j].number_wagon > 15)
- {
- printf("Error\n");
- exit(1);
- }
- printf("Enter your number train: ");
- ret = scanf("%d", &tr[j].number_train);
- if(tr[j].number_train <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- getchar();
- /*запись в номер вводимого поезда*/
- tr[j].num = j + 1;
- }
- return 0;
- }
- /*сохранение базы данных(запись её в файл). Происходит, когда завершаем*/ /*работу с ней*/
- void save_base(train tr[], int* number)
- {
- FILE* f;
- int j;
- if ((f = fopen("train.bin", "wb+")) == NULL)
- {
- printf("File could not be opened\n");
- }
- else
- {
- fwrite(&number, sizeof(int), 1, f);
- for (j = 0; j < *number; j++)
- {
- fwrite(&tr[j].type_train, sizeof(char), 1, f);
- fwrite(&tr[j].time, sizeof(float), 1, f);
- fwrite(&tr[j].type_wagon, sizeof(char), 1, f);
- fwrite(&tr[j].number_free_place, sizeof(int), 1, f);
- fwrite(&tr[j].number_wagon, sizeof(int), 1, f);
- fwrite(&tr[j].number_train, sizeof(int), 1, f);
- }
- }
- fclose(f);
- }
- /*Добавление в базу данных нового поезда*/
- int add_train(train tr[], int* j)
- {
- int w = 0;
- char s1[] = "SV", s2[] = "comp", s3[] = "res_seat", d1[] = "pass";
- char d2[] = "fast", d[14], s[14], f1[30], f2[30], f3[30];
- int ret;
- printf("Specify the train you want to make to the database\n");
- getchar();
- printf("Input type_train - pass, fast: ");
- scanf("%s", d);
- /*проверка на корректный ввод типа поезда*/
- if ((strcmp(d, d1) == 0) || (strcmp(d, d2) == 0))
- {
- strcpy(tr[*j].type_train, d);
- }
- else
- {
- printf("Error\n");
- exit(1);
- }
- printf("Enter the time(hours.minutes): ");
- ret = scanf("%f", &tr[*j].time);
- while(w != 1)
- {
- if((tr[*j].time) >= 24.00 || tr[*j].time < 0.00)
- {
- printf("Your enter incorrectly time. Input again: ");
- ret = scanf("%f", &tr[*j].time);
- }
- else
- {
- w = 1;
- }
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- printf("Enter type wagon - SV, comp, res_seat: ");
- scanf("%s", s);
- /*проверка на корректный ввод типа вагона*/
- if ((strcmp(s, s1) == 0) || (strcmp(s, s2) == 0) || (strcmp(s, s3) == 0))
- {
- strcpy(tr[*j].type_wagon, s);
- }
- else
- {
- printf("Error:bad input\n");
- exit(1);
- }
- printf("Enter your number free place: ");
- ret = scanf("%d", &tr[*j].number_free_place);
- if(tr[*j].number_free_place < 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- printf("Enter your number wagon: ");
- ret = scanf("%d", &tr[*j].number_wagon);
- if(tr[*j].number_wagon <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- if(tr[*j].number_wagon > 15)
- {
- printf("Error\n");
- exit(1);
- }
- printf("Enter your number train: ");
- ret = scanf("%d", &tr[*j].number_train);
- if(tr[*j].number_train <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- tr[*j].num = *j + 1;
- (*j)++;
- return 0;
- }
- /*функция вывода поезда для функции поиска*/
- void vivod(int i, train tr[])
- {
- printf("%6d%10s", tr[i].num, tr[i].type_train);
- printf("%7.2f", tr[i].time);
- printf("%9s%17d", tr[i].type_wagon, tr[i].number_free_place);
- printf("%14d%14d\n", tr[i].number_wagon, tr[i].number_train);
- }
- /*функция поиска поезда по его описанию*/
- int find_train(train tr[], int* number)
- {
- char s[100];
- int b, i, a, k = 0, c, d, ret;
- int w = 0;
- /*по какой характеристике искать?*/
- printf("Search mode\n");
- printf("1 - Search by type train\n");
- printf("2 - Search by time\n");
- printf("3 - Search by type wagon\n");
- printf("4 - Search by number free place\n");
- printf("5 - Search by number wagon\n");
- printf("6 - Search by number train\n");
- scanf("%d", &b);
- getchar();
- switch (b)
- {
- case 1:
- printf("Input type train: ");
- gets(s);
- for (i = 0; i < *number; i++)
- /*просто используем функцию сравнения строк*/
- if (strcmp(s, tr[i].type_train) == 0)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- return -1;
- else
- return 0;
- break;
- case 2:
- printf("Enter the time(hours.minutes): ");
- ret = scanf("%f", &a);
- while(w != 1)
- {
- if((a) >= 24.00 || a < 0.00)
- {
- printf("Your enter incorrectly time. Input again: ");
- ret = scanf("%f", &a);
- }
- else
- {
- w = 1;
- }
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- for (i = 0; i < *number; i++)
- /*сравниваем время поезда и время которое ввели*/
- if (a == tr[i].time)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- return -1;
- else
- return 0;
- break;
- case 3:
- printf("Enter the type wagon: ");
- gets(s);
- for (i = 0; i < *number; i++)
- /*так же просто используем функцию strcmp для сравнения*/
- if (strcmp(s, tr[i].type_wagon) == 0)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- {
- return -1;
- }
- else
- {
- return 0;
- }
- break;
- case 4:
- printf("Enter your number free place: ");
- ret = scanf("%d", &d);
- if(d < 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- for (i = 0; i < *number; i++)
- /*сравниваем количество свободных мест которое ввели и в поездах*/
- if (d == tr[i].number_free_place)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- {
- return -1;
- }
- else
- {
- return 0;
- }
- break;
- case 5:
- printf("Enter your number wagon: ");
- ret = scanf("%d", &b);
- if(b <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- /*ищем и сравниваем что ввели*/
- for (i = 0; i < *number; i++)
- if (b == tr[i].number_wagon)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- {
- return -1;
- }
- else
- {
- return 0;
- }
- break;
- case 6:
- printf("Enter your number train: ");
- ret = scanf("%d", &c);
- if(ret != 1 || c <= 0)
- {
- printf("Error");
- exit(1);
- }
- for (i = 0; i < *number; i++)
- /*ищем и сравниваем что ввели*/
- if (c == tr[i].number_train)
- {
- k = 1;
- vivod(i, tr);
- }
- if (k == 0)
- {
- return -1;
- }
- else
- {
- return 0;
- }
- break;
- /*в случае неудачного ввода:*/
- default:
- printf("Error\n");
- exit(1);
- }
- }
- /*функция редактирования поезда по характеристике*/
- int edit_train(train tr[], int j)
- {
- int i, ret;
- int w = 0;
- char s1[] = "SV", s2[] = "comp", s3[] = "res_seat", d1[] = "pass";
- char d2[] = "fast", s[14], f1[30], f2[30], d[14];
- printf("Edit mode\n");
- /*по какому хочешь редактировать?*/
- printf("1 - edit the type train\n");
- printf("2 - edit the time\n");
- printf("3 - editing the type wagon\n");
- printf("4 - editing the number free place\n");
- printf("5 - editing a number wagon\n");
- printf("6 - editing a number train\n");
- ret = scanf("%d", &i);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- getchar();
- switch (i)
- {
- case 1:
- printf("Input type train - pass, fast: ");
- gets(d);
- /*смотрим правильно ли ввели тип поезда*/
- if ((strcmp(d, d1) == 0) || (strcmp(d, d2) == 0))
- {/*если да, то просто копируем что ввели в нужное место*/
- strcpy(tr[j].type_train, d);
- }
- else
- {
- printf("Error\n");
- exit(1);
- }
- break;
- case 2:
- /*просто вводим новое время, сохраняя сразу его в нужное место*/
- printf("Enter the time(hours.minutes): ");
- ret = scanf("%f", &tr[j].time);
- while(w != 1)
- {
- if((tr[j].time) >= 24.00 || tr[j].time < 0.00)
- {
- printf("Your enter incorrectly time. Input again: ");
- ret = scanf("%f", &tr[j].time);
- }
- else
- {
- w = 1;
- }
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- break;
- case 3:
- printf("Enter type wagon - SV, comp, res_seat: ");
- gets(s);
- /*проверка на корректность ввода*/
- if ((strcmp(s, s1) == 0) || (strcmp(s, s2) == 0) || (strcmp(s, s3) == 0))
- {
- /*если всё ок, то копируем что ввели в нужное место описания поезда*/
- strcpy(tr[j].type_wagon, s);
- }
- else
- {
- printf("Error\n");
- exit(1);
- }
- break;
- case 4:
- /*то же что и со временем*/
- printf("Enter your number free place: ");
- ret = scanf("%d", &tr[j].number_free_place);
- if(tr[j].number_free_place < 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- break;
- case 5:
- /*сначала скопируем, а потом только проверим)*/
- printf("Enter your number wagon: ");
- ret = scanf("%d", &tr[j].number_wagon);
- if(tr[j].number_wagon <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- if(tr[j].number_wagon > 15)
- {
- printf("Error\n");
- exit(1);
- }
- break;
- case 6:
- /*то же что и в предыдущих случаях, когда вводимое значение - число*/
- printf("Enter your number train: ");
- ret = scanf("%d", &tr[j].number_train);
- if(tr[j].number_train <= 0)
- {
- printf("Error");
- exit(1);
- }
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- break;
- }
- return 0;
- }
- /*внутренность сортировки пузырьком*/
- void sorty(int j, train tr[])
- {
- int c;
- train buff;
- buff = tr[j];
- tr[j] = tr[j + 1];
- tr[j + 1] = buff;
- c = tr[j].num;
- tr[j].num = tr[j + 1].num;
- tr[j + 1].num = c;
- }
- /*функция сортировки пузырьком чего надо*/
- void sort_train(train tr[], int* number)
- {
- int i, j, k, b, ret;
- train buff;
- int c;
- printf("Sort mode\n");
- /*определяем по какому сортировать, возрастание, убывание*/
- printf("Sort by:\n1 - increase\n2 - decrease\n");
- ret = scanf("%d", &k);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- switch(k)
- {
- case 1:
- /*по какой характеристике сортировать?*/
- printf("1 - sort by type train\n");
- printf("2 - sort by time\n");
- printf("3 - sorting by type wagon\n");
- printf("4 - sorting by number free_place\n");
- printf("5 - sort by number wagon\n");
- printf("6 - sort by number train\n");
- ret = scanf("%d", &b);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- getchar();
- /*здесь везде представлена сортировка пузырьком, она сортирует по*/
- /*характеристике и после этого также сортирует номера поездов(по num)*/
- switch (b)
- {
- case 1:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (strcmp(tr[j].type_train, tr[j + 1].type_train) > 0)
- {
- sorty(j, tr);
- }
- break;
- case 2:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].time > tr[j + 1].time)
- {
- sorty(j, tr);
- }
- break;
- case 3:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (strcmp(tr[j].type_wagon, tr[j + 1].type_wagon) > 0)
- {
- sorty(j, tr);
- }
- break;
- case 4:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_free_place > tr[j + 1].number_free_place)
- {
- sorty(j, tr);
- }
- break;
- case 5:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_wagon > tr[j + 1].number_wagon)
- {
- sorty(j, tr);
- }
- break;
- case 6:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_train > tr[j + 1].number_train)
- {
- sorty(j, tr);
- }
- break;
- }
- break;
- case 2:
- printf("1 - sort by type train\n");
- printf("2 - sort by time\n");
- printf("3 - sorting by type wagon\n");
- printf("4 - sorting by number free place\n");
- printf("5 - sort by number wagon\n");
- printf("6 - sort by number train\n");
- ret = scanf("%d", &b);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- getchar();
- switch (b)
- {
- case 1:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (strcmp(tr[j].type_train, tr[j + 1].type_train) < 0)
- {
- sorty(j, tr);
- }
- break;
- case 2:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].time < tr[j + 1].time)
- {
- sorty(j, tr);
- }
- break;
- case 3:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (strcmp(tr[j].type_wagon, tr[j + 1].type_wagon) < 0)
- {
- sorty(j, tr);
- }
- break;
- case 4:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_free_place < tr[j + 1].number_free_place)
- {
- sorty(j, tr);
- }
- break;
- case 5:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_wagon < tr[j + 1].number_wagon)
- {
- sorty(j, tr);
- }
- break;
- case 6:
- for (i = 0; i < *number; i++)
- for (j = 0; j < (*number) - i - 1; j++)
- if (tr[j].number_train < tr[j + 1].number_train)
- {
- sorty(j, tr);
- }
- break;
- default:
- printf("Error\n");
- break;
- break;
- }
- }
- }
- /*функция удаления поезда. Сдвигает нужный номер поезда в конец поездов*/
- /*Затем просто уменьшает на один их количество(тем самым все функции*/ /*обрабатывают уменьшенное их количество*/
- void del_train(train tr[], int* number, int j)
- {
- for (j; j < (*number) - 1; j++)
- {
- tr[j] = tr[j + 1];
- tr[j].num = j + 1;
- }
- (*number)--;
- }
- void menu()
- {
- printf("1 - Adding a record to the database\n");
- printf("2 - Deleting a specified record from the database\n");
- printf("3 - Search for a record by a specified field\n");
- printf("4 - Editing a given record in the database\n");
- printf("5 - Sorting in the database by a specified field\n");
- printf("6 - Output to the screen\n");
- printf("0 - Exit\n");
- }
- /*главная функция программы, в ней представлена меню и вызовы функций*/
- int main()
- {
- int c, i, count = 0, ret;
- int* number = &count;
- train tr[100];
- printf("The database is empty.\nYou must complete the database\n");
- full_base(tr, number);
- /*пока мы не нажмём «0» или не цифру от «1» до «6» включительно будет*/
- /*работать*/
- menu();
- while (1)
- {
- /*Вводим какой пункт мы хотим проделать*/
- printf("Selected action:\n");
- ret = scanf("%d", &c);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- switch(c)
- {
- case 1:
- add_train(tr, number);
- save_base(tr, number);
- menu();
- break;
- case 2:
- printf("Specify the number of the train you want to delete\n");
- ret = scanf("%d", &i);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- if (i > *number)
- {
- printf("The train was not found\n");
- }
- else
- {
- del_train(tr, number, i - 1);
- save_base(tr, number);
- }
- menu();
- break;
- case 3:
- i = find_train(tr, number);
- if (i == -1)
- {
- printf("The train was not found\n");
- }
- menu();
- break;
- case 4:
- printf("Specify the number of the train which you want to edit\n");
- ret = scanf("%d", &i);
- if(ret != 1)
- {
- printf("Error");
- exit(1);
- }
- if (i > *number)
- {
- printf("The train was not found\n");
- }
- else
- {
- edit_train(tr, i - 1);
- save_base(tr, number);
- }
- menu();
- break;
- case 5:
- sort_train(tr, number);
- save_base(tr, number);
- menu();
- break;
- case 6:
- printf_base(tr, number);
- save_base(tr, number);
- menu();
- break;
- case 0:
- printf("That is end\n");
- return 0;
- break;
- default:
- printf("Error\n");
- break;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement