Загрузка данных
/* По своему проекту Винни уровня 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);
}
}