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


/* По своему проекту Винни уровня 3 или 4:
Меню:
0. Выход
1. Загрузить данные из входного файла в массив структур
2. Добавить строчку в массив
3. Удалить строчку по ключу
4. Заменить строчку
5. Сортировка вставкой
6. Сортировка выбором
7. Сортировка обменом (пузырек)
8. Сохранить данные в файл
9. Отпечатать файл или массив с разбивкой по страницам и шапкой с номером страницы
Джумаева, Решетина и Гюльмамедзаде */
#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();
void delete_row();
void replace_row();
void paste_sort();
void choice_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();
		}
		else if (choice == 3) {
			delete_row();
		}
		else if (choice == 4) {
			replace_row();
		}
		else if (choice == 5) {
			paste_sort();
		}
		else if (choice == 6) {
			choice_sort();
		}
		else if (choice == 7) {
			bubble_sort();
		}
		else {
			printf("ERROR\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");
}
//решетина
void load_from_file() {
	FILE *f_in = fopen("in.txt", "r");
	if (f_in == NULL) {
		printf("файл не найден\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 = count + 1;
	}
	
	fclose(f_in);
	printf(" %d записей из файла in.txt\n", count);
	print_array();
}
// джумаева
void add() {
	if (count >= AR_LEN) {
		printf("ERROR\n");
		return;
	}
	
	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 = count + 1;
	printf("Добавлена зaпись, всего - %d\n", count);
	print_array();
}
//решетина
int get_key_index(char *key) {
	int i;
	for (i = 0; i < count; i = i + 1) {
		if (strcmp(ar[i].orderer, key) == 0) {
			return i;
		}
	}
	return -1;
}
// джумаева
void delete_row() {
	char key[50];
	printf("Введите кого хотите удалить: ");
	fgets(key, 50, stdin);
	key[strcspn(key, "\n")] = 0;
	
	int index = get_key_index(key);
	if (index == -1) {
		printf("Запись не найдена\n", key);
		return;
	}
	
	int i;
	for (i = index; i < count - 1; i = i + 1) {
		ar[i] = ar[i + 1];
	}
	count = count - 1;
	printf("Записи нет, осталось - %d\n", count);
	print_array();
}
//решетина
void replace_row() {
	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 paste_sort() {
	if (count == 0) {
		printf("ERROR\n");
		return;
	}
	
	int i, j;
	for (i = 1; i < count; i = i + 1) {
		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("Done\n");
	print_array();
}

void choice_sort() {
	if (count == 0) {
		printf("ERROR\n");
		return;
	}
	
	int i, j;
	for (i = 0; i < count - 1; i = i + 1) {
		int min_idx = i;
		for (j = i + 1; j < count; j = j + 1) {
			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("Done\n");
	print_array();
}
// нурана
void bubble_sort() {
	if (count == 0) {
		printf("ERROR\n");
		return;
	}
	
	int i, j;
	for (i = 0; i < count - 1; i = i + 1) {
		for (j = 0; j < count - i - 1; j = j + 1) {
			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("Done\n");
	print_array();
}

void print_array() {
	int i;
	printf("\nТекущий массив записей:\n");
	printf("%-20s %-20s %-15s %-12s\n", "Заказчик", "Название", "Производитель", "Дата\n");
	for (i = 0; i < count; i = i + 1) {
		printf("%-20s %-20s %-15s %-12s\n", 
			ar[i].orderer, 
			ar[i].name, 
			ar[i].creator, 
			ar[i].data);
	}
}