|
#include <stdio.h> |
|
|
#include <conio.h> |
|
|
#include <alloc.h> |
|
|
#include <string.h> |
|
|
struct item |
//Создание структуры |
|
{ |
|
|
char name[20]; |
//переменная наименования товара |
|
int prc; |
//переменная цены товара |
|
int col; |
//переменная кол-во товара |
|
struct item *prev; |
//указатель на пред.структуру |
|
struct item *next; |
//указатель на след.структуру |
|
}; |
|
|
void build(void); |
//прототип функции создания списка |
|
void view(struct item*); |
//прототип функции просмотра |
|
void add(item*); |
//прототип функции добавления |
|
void erase(void); |
//прототип функции удаления |
|
void save(struct item*); |
//прототип функции сохранения |
|
void load(void); |
//прототип функции загрузки |
|
struct item *head, *tail; |
//структура хранения |
|
main() |
|
|
{ |
|
|
int c; |
//переменная выбора |
|
while (1) |
|
|
{ |
|
|
clrscr(); |
//вывод главного меню |
|
puts("\n НАШ СКЛАД\n журнал учета товаров"); |
|
|
puts("\n ===========Выберите действие============"); |
|
|
puts(" |\t\t\t\t\t|"); |
|
|
puts(" | 1 - Создание нового списка\t\t|"); |
|
|
puts(" | 2 - Просмотр списка\t\t\t|"); |
|
|
puts(" | 3 - Добавление новой записи\t\t|"); |
|
|
puts(" | 4 - Удаление записи из списка\t|"); |
|
|
puts(" | 5 - Сохранение в файл\t\t|"); |
|
|
puts(" | 6 - Загрузка из файла\t\t|"); |
|
|
puts(" | 0 - Выход\t\t\t\t|\n ----------------------------------------"); |
|
|
c = getch(); |
//ожидание нажатия на клавишу |
|
switch (c) |
//переход к выполнению действий |
|
{ |
|
|
case '1': build(); break; |
//переход к функции создания списка |
|
case '2': view(head); break; |
//переход к функции просмотра списка |
|
case '3': add(tail); break; |
//переход к функции добавления списка |
|
case '4': erase(); break; |
//переход к функции удаление из списка |
|
|
//переход к функции сохранения списка |
|
case '6': load(); break; |
//переход к функции загрузки списка |
|
case '0': return 0; |
//завершение работы программы |
|
default: |
|
|
puts("\n\nОшибка ввода"); |
|
|
} |
|
|
} |
|
|
} |
|
|
void build(void) |
//Функция создания нового списка |
|
{ |
|
|
item *p, *pr; |
//Инициализация указателей |
|
pr = NULL; |
|
|
do |
//Операция заполнения списка |
|
{ |
|
|
p = (item*)malloc(sizeof(item)); |
//выделение памяти для новой записи |
|
clrscr(); |
|
|
printf("\nСоздание нового списка\n---------------------------------------------\n"); |
//Вывод названия операции |
|
printf("Наименование товара : "); |
//заполнение элементов новой записи |
|
scanf("%s", &p->name); |
//считывание наименования товара |
|
printf("\nЦена за ед. : "); |
|
|
scanf("%d", &p->prc); |
//считывание цены товара |
|
printf("\nКоличество: "); |
|
|
scanf("%d", &p->col); |
//считывание количества товара |
|
p->prev = pr; |
//связывание с соседними записями |
|
if (pr != NULL) |
|
|
pr->next = p; |
|
|
else |
|
|
head = p; |
|
|
pr = p; |
|
|
printf("\n---------------------------------------------\n\nЗакончить ввод <esc>"); |
//запрос на завершение операции ввода |
|
} |
|
|
while (getch() != 27); |
//выполнение цикла до нажатия клавиши <Esc> |
|
tail = p; |
|
|
tail->next = NULL; |
|
|
} |
|
|
void view(item *p) |
//Функция просмотра списка |
|
{ |
|
|
int i = 1; |
//переменная для подсчета выведенных строк |
|
if (tail == NULL) |
//проверка на наличие активаного списка |
|
{ |
|
|
printf("\n Список товаров отсутствует нажмите <1>\n чтобы создать новый список,\n либо загрузите список из файла"); |
//Вывод сообщение об отсутсвии списка |
|
getch(); |
//ожидание нажатия на любую клавигу |
|
} |
|
|
else |
//переход к выполнению операции просмотра |
|
{ |
|
|
|
|
|
printf("Просмотр списка\n\n"); |
//вывод названия операции |
|
printf(" № | Наименование\t| Цена\t| Кол-во"); |
//вывод заголовков таблицы |
|
if (p == head) |
|
|
while (p != NULL) |
//выполнение операции до достижения конца списка |
|
{ |
|
|
printf("\n-------------------------------------------\n| %-2d | %-15s\t|%3d\t|%3d", i, p->name, p->prc, p->col); |
//вывод записей в виде таблицы |
|
i++; |
//подсчет выведенных записей |
|
p = p->next; |
//перемещение указателя на следующий элемент |
|
} |
|
|
printf("\n-------------------------------------------\n\nВсего товаров:%2d",i-1); |
//вывод информации о количестве записей |
|
getch(); |
|
|
} |
|
|
} |
|
|
void add(item*) |
//Функция добавления записей в список |
|
{ |
// |
|
item *p; |
//инициализация указателей |
|
if (tail == NULL) |
//проверка на наличие активного списка |
|
{ |
|
|
printf("\n Список товаров отсутствует нажмите <1>\n чтобы создать новый список,\n либо загрузите список из файла"); |
//Вывод сообщение об отсутсвии списка |
|
getch(); |
|
|
} |
|
|
else |
//переход к выполнению операции добавления |
|
{ |
|
|
do |
|
|
{ |
|
|
clrscr(); |
|
|
printf("\nДобавление товара в список\n---------------------------------------------\n"); |
//вывод названия операции |
|
p = (item*)malloc(sizeof(item)); |
//выделение памяти под новую запись |
|
printf("Наименование товара : "); |
|
|
scanf("%s", p->name); |
//считывание наименования товара |
|
printf("\nЦена за ед. : "); |
|
|
scanf("%d", &p->prc); |
//считывание цены товара |
|
printf("\nКоличество: "); |
|
|
scanf("%d", &p->col); |
//считывание количества товара |
|
tail->next = p; |
//связывание с соседними записями |
|
p->prev = tail; |
|
|
p->next = NULL; |
|
|
tail = p; |
|
|
printf("\n---------------------------------------------\n\nЗакончить ввод <esc>"); |
//запрос на завершение операции добавления |
|
|
|
|
while (getch() != 27); |
//выполнение цикла до нажатия клавиши <Esc> |
|
} |
|
|
} |
|
|
void save(item *p) |
//Функция сохранения списка в файл |
|
{ |
|
|
FILE *in; |
//инициализация переменных |
|
if (tail == NULL) |
//проверка на наличие активного списка |
|
{ |
|
|
printf("\n Список товаров отсутствует нажмите <1>\n чтобы создать новый список,\n либо загрузите список из файла"); |
//Вывод сообщение об отсутсвии списка |
|
getch(); |
|
|
} |
|
|
else |
//переход к выполнению операции добавления |
|
{ |
|
|
in = fopen("data.txt", "wb"); |
//создание файла для сохранения |
|
if (in != NULL) |
|
|
{ |
|
|
while (p != NULL) |
//запись структуры в файл |
|
{ |
|
|
if (!fwrite(p, sizeof(item), 1, in)) |
//детекция возможных ошибок |
|
{ |
|
|
perror("Error"); |
|
|
getchar(); |
|
|
fclose(in); |
//закрытие файла |
|
return ; |
|
|
} |
|
|
p = p->next; |
//перемещение указателя дальше |
|
} |
|
|
fclose(in); |
//закрытие файла |
|
printf("\n Список успешно сохранен в файл!"); |
//вывод сообщения о завершении операции |
|
getch(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
printf("Ошибка! Не удалось создать файл\n"); |
//вывод сообщения о ошибке создания файла |
|
printf("Нажмите любую клавишу...\n"); |
|
|
getchar(); |
|
|
return ; |
|
|
} |
|
|
} |
|
|
} |
|
|
void load(void) |
//Функция загрузки списка из файла |
|
{ |
|
|
item *p, *pr; |
//инициализация указателей и переменных |
|
FILE *in; |
|
|
|
|
|
p = head; |
|
|
while (p != NULL) |
//процедура очистка памяти |
|
{ |
// |
|
item *pTemp; |
|
|
pTemp = p->next; |
|
|
free(p); |
|
|
p = pTemp; |
|
|
} |
|
|
in = fopen("data.txt", "rb"); |
//открытие файла для чтения данных |
|
do |
|
|
{ |
|
|
p = (item*)malloc(sizeof(item)); |
//выделение памяти под считанную структуру |
|
fread(p, sizeof(item), 1, in); |
//чтение из файла 1 структуры |
|
p->prev = NULL; |
//обнуление невалидных указателей |
|
p->next = NULL; |
|
|
p->prev = pr; |
//связывание с соседними структурами |
|
if (pr != NULL) |
|
|
pr->next = p; |
|
|
else |
|
|
head = p; |
|
|
pr = p; |
|
|
} |
|
|
while (!feof(in)); |
//повторение процедуры до нажатия клавиши <Esc> |
|
tail = p->prev; |
|
|
tail->next = NULL; |
|
|
p = tail; |
|
|
printf("\n Список успешно загружен из файла!"); |
//вывод сообщение о завершении операции |
|
getch(); |
|
|
} |
|
|
void erase(void) |
//Функция удаления заданной записи |
|
{ |
|
|
item *p, *temp; |
//инициализация переменных |
|
char mas[20]; |
//временный массив структур |
|
if (tail == NULL) |
//проверка на наличие активного списка |
|
{ |
|
|
printf("\n Список товаров отсутствует нажмите <1>\n чтобы создать новый список,\n либо загрузите список из файла"); |
//Вывод сообщение об отсутсвии списка |
|
getch(); |
|
|
} |
|
|
else |
//переход к выполнению операции добавления |
|
{ |
|
|
clrscr(); |
|
|
printf("\nУдаление товара из списка\n---------------------------------------------\n"); |
//вывод названия операции |
|
printf("\nВведите наименовение товара : "); |
//запрос на ввод удаляемого товара |
|
gets(mas); |
|
|
|
|
|
while (p != NULL) |
|
|
{ |
|
|
if (strcmp((p->name), mas) == 0) |
//поиск заданного товара в списке |
|
{ |
|
|
if (p == head) |
//удаление записи из начала списка |
|
{ |
|
|
head = p->next; |
|
|
head->prev = NULL; |
|
|
free(p); |
|
|
p = head; |
|
|
} |
|
|
else if (p == tail) |
//удаление записи из конца списка |
|
{ |
|
|
tail = p->prev; |
|
|
tail->next = NULL; |
|
|
free(p); |
|
|
p = tail; |
|
|
} |
|
|
else |
|
|
{ |
|
|
p->next->prev=p->prev; |
//удаление из любой другой позиции |
|
p->prev->next=p->next; |
|
|
temp = p; |
|
|
p = p->next; |
|
|
free(temp); |
|
|
} |
|
|
} |
|
|
else |
|
|
p = p->next; |
//передвижение по списку |
|
} |
|
|
} |
|
|
} |
![]() |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.