#include #include #include #include #include #define mas 100 typedef struct toy { char name[mas]; int cost; int kol; int age_min; int age_max; }DataType; typedef struct List { DataType data; struct List* next; }*list; DataType input_toy(void); list read_file(char* filename); list add(list, DataType); int write_file(char* filename, list); void delete_list(list); void show(list); void expensive(list); void search(list); list del(list); list add_proiz(list, DataType); int main(int argc, char* argv[]) { setlocale(LC_ALL, "Russian"); system("chcp 1251"); char* file, file1[mas]; char menu; list toys = NULL; if (argc < 2) { puts("Введите имя файла"); scanf("%s", file1); file = file1; toys = read_file(file); } else file = argv[1]; toys = read_file(file); do { system("CLS"); puts("1. Добавить запись в произвольное место"); puts("2. Вывод записей"); puts("3. Поиск оптимальной игрушки"); puts("4. Получить сведения о самом дорогом типе игрушки"); puts("5. Удалить произвольную запись"); puts("6. Выйти"); printf("\n"); puts("Введите нужную цифру:"); menu = getchar(); //getchar(); switch (menu) { case '1': toys = add_proiz(toys, input_toy()); break; case '2': show(toys); break; case '3': search(toys); break; case '4': expensive(toys); break; case '5': toys = del(toys); } } while (menu != '6'); if (write_file(file, toys)) puts("Файл сохранен"); else puts("Ошибка сохранения файла"); delete_list(toys); return 0; } DataType input_toy(void) { system("CLS"); DataType toy; int c; while ((c = getchar()) != '\n' && c != EOF); // Это взято отсюда: https://qarus.ru/2907062-fgets-instruktsii-propuskaetsya-pochemu/ puts("Название игрушки"); gets_s(toy.name, mas); printf("\n"); puts("Цена"); scanf("%d", &toy.cost); printf("\n"); puts("Количество"); scanf("%d", &toy.kol); printf("\n"); puts("Возраст:"); printf("От "); scanf("%d", &toy.age_min); printf("До "); scanf("%d", &toy.age_max); getchar(); return toy; } list add(list begin, DataType toy) { list temp = (list)malloc(sizeof(struct List)); temp->data = toy; temp->next = begin; return temp; } list add_proiz(list begin, DataType toy) { system("CLS"); int n, k = 2; list temp, temp1, temp2; puts("На какое место добавить запись?"); scanf("%d", &n); if (n < 1) { puts("Ошибка"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return begin; } if (n == 1) { temp = (list)malloc(sizeof(struct List)); temp->data = toy; temp->next = begin; return temp; } if (begin == NULL && n > 1) { puts("Ошибка"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return begin; } temp = begin; temp1 = temp->next; while (temp1 && k < n) { temp = temp1; temp1 = temp->next; k++; } if (k < n) { puts("Ошибка"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return begin; } temp2 = (list)malloc(sizeof(struct List)); if (++k == n) { temp2->data = toy; temp2->next = NULL; temp->next = temp2; return begin; } else { temp2->data = toy; temp->next = temp2; temp2->next = temp1; return begin; } } list read_file(char* filename) { FILE* f; DataType toy; list begin = NULL, cur; if ((f = fopen(filename, "a+b")) == NULL) { perror("Ошибка открытия файла"); getchar(); return begin; } if (fread(&toy, sizeof(toy), 1, f)) begin = add(begin, toy); else return NULL; cur = begin; while (fread(&toy, sizeof(toy), 1, f)) { cur->next = add(cur->next, toy); cur = cur->next; } fclose(f); return begin; } void delete_list(list begin) { list temp = begin; while (temp) { begin = temp->next; free(temp); temp = begin; } } int write_file(char* filename, list begin) { FILE* f; if ((f = fopen(filename, "wb")) == NULL) { perror("Ошибка создания файла"); getchar(); return 0; } while (begin) { if (fwrite(&begin->data, sizeof(DataType), 1, f)) begin = begin->next; else return 0; } return 1; } void print_data(struct toy toy) { printf("Название игрушки: %s\nЦена : %d\nКоличество : %d\nВозраст от %d до %d\n", toy.name, toy.cost, toy.kol, toy.age_min, toy.age_max); } void show(list cur) { int k = 0; system("CLS"); if (cur == NULL) { puts("Список пуст"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return; } puts("| N | Название игрушки | Цена | Количество | Возраст |"); puts("----------------------------------------------------------------------------------------"); while (cur) { printf("|%3d | %-29s |%11d |%15d | от %2d до %2d |\n", ++k, cur->data.name, cur->data.cost, cur->data.kol, cur->data.age_min, cur->data.age_max); cur = cur->next; } puts("----------------------------------------------------------------------------------------"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); } void expensive(list cur) { DataType toy; int max_cost, c, i = 0; char name[mas], toys[mas]; system("CLS"); if (cur == NULL) { puts("Список пуст"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return; } while ((c = getchar()) != '\n' && c != EOF); // Это взято отсюда: https://qarus.ru/2907062-fgets-instruktsii-propuskaetsya-pochemu/ puts("Введите тип игрушки"); gets_s(name, mas); max_cost = -1; while (cur) { while (cur->data.name[i] != ' ' && cur->data.name[i] != '\0') { toys[i] = cur->data.name[i]; i++; } toys[i] = '\0'; if (strcmp(toys, name) == 0 && cur->data.cost > max_cost) { max_cost = cur->data.cost; toy = cur->data; } i = 0; cur = cur->next; } if (max_cost < 0) { puts("Не найдено"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); return; } printf("\n"); puts("Самая дорогая игрушка этого типа:"); print_data(toy); printf("\n"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); } void search(list cur) { int age, money; int k = 0, i; DataType toy; system("CLS"); if (cur == NULL) { puts("Список пуст"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); return; } puts("Введите возраст ребенка:"); scanf("%d", &age); puts("Введите цену игрушки:"); scanf("%d", &money); getchar(); while (cur) { if (cur->data.age_max >= age && cur->data.age_min <= age && cur->data.cost <= money) { k++; toy = cur->data; printf("\n"); print_data(toy); } cur = cur->next; } if (k == 0) puts("Не найдено"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); } list del(list begin) { int n, k = 1; char yes; list temp, temp1; system("CLS"); if (begin == NULL) { puts("Список пуст"); puts("Чтобы выйти из раздела - нажмите Enter"); getchar(); getchar(); return NULL; } puts("Номер записи для удаления?"); scanf("%d", &n); getchar(); if (n < 1) { puts("Ошибка"); getchar(); getchar(); return begin; } if (n == 1) { print_data(begin->data); puts("Удалить? (д/н)"); do { yes = getchar(); getchar(); } while (yes != 'д' && yes != 'Д' && yes != 'н' && yes != 'Н'); if (yes == 'д' || yes == 'Д') { temp = begin->next; free(begin); return temp; } else return begin; } if (begin->next == NULL && n > 1) { puts("Ошибка"); getchar(); getchar(); return begin; } temp = begin; temp1 = temp->next; while (temp1->next && k < n - 1) { temp = temp1; temp1 = temp->next; k++; } if (k < n - 1) { puts("Ошибка"); getchar(); getchar(); return begin; } print_data(temp1->data); puts("Удалить? (д/н)"); do { yes = getchar(); getchar(); } while (yes != 'д' && yes != 'Д' && yes != 'н' && yes != 'Н'); if (yes == 'д' || yes == 'Д') { temp->next = temp1->next; free(temp1); } return begin; }