#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 '5': save(head); 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 |
//переход к выполнению операции просмотра |
{ |
|
clrscr(); |
|
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; |
|
pr = NULL; |
|
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); |
|
p = head; |
|
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).
Ссылка на скачивание - внизу страницы.