Загрузка данных
/*
По своему проекту Винни уровня 3 или 4.
Меню:
0. Выход
1. Загрузить данные из входного файла в массив структур
2. Добавить строчку в массив
3. Удалить строчку по ключу
4. Заменить строчку
5. Сортировка вставкой
6. Сортировка выбором
7. Сортировка обменом (пузырек)
*/
/** Задание Гусятинер Л.Б., КМТО, 2022 */
/** Джумаева Замира и Решетина Екатерина */
#include <stdio.h>
#include <string.h>
#include <locale.h>
#define AR_LEN 100
struct Repair {
char orderer[50];
char name[50];
char creator[20];
char data[20];
};
struct Repair ar[AR_LEN];
int count = 0;
// Прототипы функций
void load_from_file();
void add_record();
void delete_record();
void replace_record();
void insertion_sort();
void selection_sort();
void bubble_sort();
void print_menu();
int get_key_index(char *key);
void print_array();
int main() {
setlocale(LC_ALL, "");
int choice;
do {
print_menu();
printf("Выберите пункт меню: ");
scanf("%d", &choice);
getchar();
switch(choice) {
case 0:
printf("Выход из программы.\n");
break;
case 1:
load_from_file();
break;
case 2:
add_record();
break;
case 3:
delete_record();
break;
case 4:
replace_record();
break;
case 5:
insertion_sort();
break;
case 6:
selection_sort();
break;
case 7:
bubble_sort();
break;
default:
printf("Неверный выбор! Попробуйте снова.\n");
}
} while(choice != 0);
return 0;
}
void print_menu() {
printf("\n========== МЕНЮ ==========\n");
printf("0. Выход\n");
printf("1. Загрузить данные из входного файла в массив структур\n");
printf("2. Добавить строчку в массив\n");
printf("3. Удалить строчку по ключу\n");
printf("4. Заменить строчку\n");
printf("5. Сортировка вставкой\n");
printf("6. Сортировка выбором\n");
printf("7. Сортировка обменом (пузырек)\n");
printf("==========================\n");
}
void load_from_file() {
FILE *f_in = fopen("in.txt", "r");
if (f_in == NULL) {
printf("Ошибка: файл in.txt не найден!\n");
return;
}
count = 0;
while (fscanf(f_in, "%s %s %s %s",
ar[count].orderer,
ar[count].name,
ar[count].creator,
ar[count].data) == 4 && count < AR_LEN) {
count++;
}
fclose(f_in);
printf("Загружено %d записей из файла in.txt\n", count);
print_array();
}
void add_record() {
if (count >= AR_LEN) {
printf("Массив заполнен! Невозможно добавить новую запись.\n");
return;
}
printf("Введите данные новой записи:\n");
printf("Заказчик: ");
fgets(ar[count].orderer, 50, stdin);
ar[count].orderer[strcspn(ar[count].orderer, "\n")] = 0;
printf("Название техники: ");
fgets(ar[count].name, 50, stdin);
ar[count].name[strcspn(ar[count].name, "\n")] = 0;
printf("Производитель: ");
fgets(ar[count].creator, 20, stdin);
ar[count].creator[strcspn(ar[count].creator, "\n")] = 0;
printf("Дата (ДД.ММ.ГГГГ): ");
fgets(ar[count].data, 20, stdin);
ar[count].data[strcspn(ar[count].data, "\n")] = 0;
count++;
printf("Запись добавлена! Всего записей: %d\n", count);
print_array();
}
int get_key_index(char *key) {
int i;
for (i = 0; i < count; i++) {
if (strcmp(ar[i].orderer, key) == 0) {
return i;
}
}
return -1;
}
void delete_record() {
char key[50];
printf("Введите заказчика для удаления: ");
fgets(key, 50, stdin);
key[strcspn(key, "\n")] = 0;
int index = get_key_index(key);
if (index == -1) {
printf("Запись с заказчиком '%s' не найдена!\n", key);
return;
}
int i;
for (i = index; i < count - 1; i++) {
ar[i] = ar[i + 1];
}
count--;
printf("Запись удалена! Всего записей: %d\n", count);
print_array();
}
void replace_record() {
char key[50];
printf("Введите заказчика для замены: ");
fgets(key, 50, stdin);
key[strcspn(key, "\n")] = 0;
int index = get_key_index(key);
if (index == -1) {
printf("Запись с заказчиком '%s' не найдена!\n", key);
return;
}
printf("Введите новые данные:\n");
printf("Новый заказчик: ");
fgets(ar[index].orderer, 50, stdin);
ar[index].orderer[strcspn(ar[index].orderer, "\n")] = 0;
printf("Новое название техники: ");
fgets(ar[index].name, 50, stdin);
ar[index].name[strcspn(ar[index].name, "\n")] = 0;
printf("Новый производитель: ");
fgets(ar[index].creator, 20, stdin);
ar[index].creator[strcspn(ar[index].creator, "\n")] = 0;
printf("Новая дата (ДД.ММ.ГГГГ): ");
fgets(ar[index].data, 20, stdin);
ar[index].data[strcspn(ar[index].data, "\n")] = 0;
printf("Запись заменена!\n");
print_array();
}
void insertion_sort() {
if (count == 0) {
printf("Нет данных для сортировки!\n");
return;
}
int i, j;
for (i = 1; i < count; i++) {
struct Repair key = ar[i];
j = i - 1;
while (j >= 0 && strcmp(ar[j].orderer, key.orderer) > 0) {
ar[j + 1] = ar[j];
j = j - 1;
}
ar[j + 1] = key;
}
printf("Сортировка вставкой выполнена (по заказчику)!\n");
print_array();
}
void selection_sort() {
if (count == 0) {
printf("Нет данных для сортировки!\n");
return;
}
int i, j;
for (i = 0; i < count - 1; i++) {
int min_idx = i;
for (j = i + 1; j < count; j++) {
if (strcmp(ar[j].orderer, ar[min_idx].orderer) < 0) {
min_idx = j;
}
}
if (min_idx != i) {
struct Repair temp = ar[i];
ar[i] = ar[min_idx];
ar[min_idx] = temp;
}
}
printf("Сортировка выбором выполнена (по заказчику)!\n");
print_array();
}
void bubble_sort() {
if (count == 0) {
printf("Нет данных для сортировки!\n");
return;
}
int i, j;
for (i = 0; i < count - 1; i++) {
for (j = 0; j < count - i - 1; j++) {
if (strcmp(ar[j].orderer, ar[j + 1].orderer) > 0) {
struct Repair temp = ar[j];
ar[j] = ar[j + 1];
ar[j + 1] = temp;
}
}
}
printf("Сортировка пузырьком выполнена (по заказчику)!\n");
print_array();
}
void print_array() {
int i;
printf("\nТекущий массив записей:\n");
printf("%-20s %-20s %-15s %-12s\n", "Заказчик", "Название", "Производитель", "Дата");
printf("------------------------------------------------------------\n");
for (i = 0; i < count; i++) {
printf("%-20s %-20s %-15s %-12s\n",
ar[i].orderer,
ar[i].name,
ar[i].creator,
ar[i].data);
}
printf("------------------------------------------------------------\n");
}