Загрузка данных


/*
По своему проекту Винни уровня 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();
        
        if (choice == 0) {
            printf("Выход из программы.\n");
        }
        else if (choice == 1) {
            load_from_file();
        }
        else if (choice == 2) {
            add_record();
        }
        else if (choice == 3) {
            delete_record();
        }
        else if (choice == 4) {
            replace_record();
        }
        else if (choice == 5) {
            insertion_sort();
        }
        else if (choice == 6) {
            selection_sort();
        }
        else if (choice == 7) {
            bubble_sort();
        }
        else {
            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");
}