Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
[1] Оглавление
[2]
[3] [3.1] 2.1 Динамические структуры данных. Классификация.
[3.2]
[4]
[5]
[6]
[7] |
Составить программу магазин с одним продавцом. Компьютер вместо кассового аппарата. База наличия товаров.
Программа должна обеспечивать:
Для того чтобы в процессе выполнения программы произвольно добавлять и удалять данные, необходимо организовать данные не в массив, а во что-то другое. Если к элементу данных добавить ещё и указатель, в котором будет храниться адрес какого-то другого элемента, то это и будет кардинальным решением проблемы. Такая организация представления и хранения данных называется динамической структурой данных.
Каждый элемент динамических структур данных состоит из собственно данных и одного или нескольких указателей, ссылающихся на аналогичные элементы. Это позволяет добавлять в динамическую структуру новые данные или удалять какие-то из имеющихся, не затрагивая при этом другие элементы структуры.
Кроме того, динамические структуры позволяют нам организовать данные так, чтобы их представление в программе было максимально приближено к тому, как эти данные выглядят в реальности. Так, для моделирования обслуживания очереди к врачу лучше всего подойдет динамическая структура данных под названием «очередь», а не массив, а для представления сети автомобильных дорог нужна «сеть».
Динамические структуры данных бывают линейные и нелинейные. В линейной динамической структуре данные связываются в цепочку. К линейным структурам относятся списки (односвязные, двухсвязные, кольцевые), стеки, очереди (односторонние, двухсторонние, очереди с приоритетами). Организация нелинейных структур более сложная. Нелинейные структуры представляются, как правило, в виде дерева (каждый элемент имеет некоторое количество связей, например, так бинарном дереве каждый элемент (узел) имеет ссылку на левый и правый элемент).
Динамические структуры данных также применяются и для более эффективной работы с данными, размер которых известен. К таким случаям относится решение задач сортировки и поиска элементов. При сортировке упорядочивание динамических структур не требует перестановки элементов, а сводится к изменению указателей на эти элементы. Это особенно эффективно, если сортируемые элементы большого размера. При решении задачи поиска элемента в тех случаях, когда важна скорость, данные лучше всего представлять в виде бинарного дерева.
Элемент любой динамической структуры данных представляет собой структуру (struct), содержащую, по крайней мере, два поля - для хранения данных и для указателя. В общем случае полей данных и указателей может быть несколько. Поля данных могут быть любого типа: стандартного (основного), составного или типа указатель.
Двухсвязные линейные списки
В двусвязном списке каждый элемент имеет поля с данными и два указателя, где один указатель хранит адрес предшествующего элемента списка, а второй указатель хранит адрес предыдущего элемента. Таким образом, для работы с двухсвязным списком используется два указателя, которые хранят адреса начала и конца списка.
Графическое представление двухсвязного списка
Кольцевой список
В кольцевом списке последний элемент связан с первым. Для кольцевого списка возможно выполнять те же самые операции, что и для обычного списка, однако проверка достижения конца цикла выполняется иначе, поскольку список замкнут.
Стеки
Стек частный случай однонаправленного линейного списка, для которого определены только две операции: добавление и удаление данных. Доступ к элементам в стеке представлен по принципу «последним пришёл первым вышел». Можно привести хороший пример стека, это стопка тарелок, что бы взять вторую сверху тарелку нужно сначала поднять первую.
Очереди
Очередь это линейная динамическая структура данных, для которой выполняется правило: добавление данных возможно только в конец структуры, а удаление только с начала. Доступ к элементам в очереди представлен по принципу «первым пришёл первым вышел». Примером в реальной жизни может служить очередь к врачу.
Двусторонняя очередь
Разновидностью очередей является двусторонняя очередь или дек, отличающаяся от обычной очереди тем, что добавление или удаление данных допустимо с обоих концов очереди. Для реализации алгоритмов работы с двусторонней очередью можно использовать те же структуры данных, что и для обычной очереди.
Очередь с приоритетом
Разновидность очереди, в которой добавление новых данных производится в конец очереди, а выборка данных в зависимости от каких либо условий или правил. Аналогичным примером из жизни служит очередь к врачу, где ветераны или инвалиды обслуживаются без очереди, т.е. им предоставляется приоритет.
Деревья
Деревья это нелинейная динамическая структура данных, представленная в виде иерархии элементов, называемых узлами.
На самом верхнем уровне иерархии всегда имеется только один узел, называемый корнем узла. Каждый узел, кроме корневого, связан только с одним узлом более высокого уровня, называемым узлом-предком. Элементы дерева связываются с помощью ветвей (ребер) с одним или несколькими узлами более низкого уровня - дочерними узлами или потомками. Элементы, расположенные в конце ветвей и не имеющие дочерних узлов, называют листьями. От корня до любого узла существует только один путь. Максимальная длина пути от корня до листьев называется высотой дерева. Любой узел дерева с его потомками также образует дерево, называемое поддеревом. Число поддеревьев для данного узла образует степень узла. Максимальное значение среди степеней всех узлов определяет степень дерева.
Наиболее простыми с точки зрения сложности реализации алгоритмов работы с деревьями являются бинарные деревья.
Как правило, в дереве всегда задают какой-либо принцип упорядоченности, например, по возрастанию какого-то параметра (ключа). Таки образом, для каждого узла ключи наследников располагаются слева направо по возрастанию. То есть, в бинарном дереве для каждого узла значение ключа левого наследника будет меньше значения ключа узла, а значение ключа в узле меньше значения ключа в правом наследнике.
Если дерево ограничено так, что для каждого узла все ключи левого поддерева меньше ключа этого узла, а все ключи его правого поддерева больше, то оно называется деревом поиска. В дереве поиска можно найти элемент по ключу.
Линейный список это динамическая структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. Эта структура данных предназначена для быстрой вставки элементов в определенное место.
Каждый элемент списка содержит поле данных (Data) (оно может иметь простую или сложную структуру) и поле ссылки на следующий элемент (next). Поле ссылки последнего элемента должно содержать пустой указатель (NULL).
Самый простой способ связать между собой множество элементов сделать так, чтобы каждый элемент содержал ссылку на следующий. Такой список называется однонаправленным (односвязным).
При работе с линейным односвязым списком можно рекомендовать следующий алгоритм:
struct Data // структура, содержащая поля данных, необходимых для работы
struct List // структура, содержащая поле типа Data и поле с адресом последующего элемента next
Графически линейный список можно представить следующим образом:
List *u=NULL; // список пуст, указатель задан равным константе NULL
Создание первого элемента:
u = new List; // выделение памяти под элемент
u->d.a=3; // заполнение поля с данными
u->next=NULL; // указатель на следующий элемент пуст
Создание последующих элементов списка (добавление новых элементов в конец):
List*x; // вспомогательный указатель с адресом последнего элемента
x=u; // последний элемент списка совпадает с началом
x->next=new List; // выделение памяти для след. элементов, перенаправление указателя х на выделенную область памяти
x=x->next;
x->d.a=5; // определение значения элемента списка
x->next=NULL;
Действия со списками
С готовыми списками можно выполнять различные действия:
В программе были использованы следующие структуры:
struct Product {
// Идентификатор
int id;
// Наименование
char name[64];
// Единица измерения - Рубли / Доллары и т.д
char value[32];
// Цена единицы
double price;
// Количество товара
int number;
// Дата последнего завоза - Формат - День / Месяц / Год
char last_date[32];
};
struct Products {
Product P;
Products *next;
};
В программе использованы основные методы:
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <fstream>
#include <conio.h>
using namespace std;
int zena;
struct Product {
// Идентификатор
int id;
// Наименование
char name[64];
// Единица измерения - Рубли / Доллары и т.д
char value[32];
// Цена единицы
double price;
// Количество товара
int number;
// Дата последнего завоза - Формат - День / Месяц / Год
char last_date[32];
};
struct Products {
Product P;
Products *next;
};
char*rus (char*);
void read_database (Products**);
void input_product (Product &);
void print_products (Products*);
void print_product (Product);
void search_product (Products*);
void delete_product (Products**,int);
void save_struct (Products*,int);
void add_element_struct (Products**,Product&);
void insert_element_struct (Products**,Product&);
void clear_struct (Products**);
void add_element_buy_struct (Products**,Product&);
void print_buy_product (Product);
void buy_product (Products*,Products**);
void print_buy_products (Products*);
void save_buy_struct (Products*);
void read_buy_database (Products**);
void delete_buy_product (Products**,int);
void see_factura_product (Products**);
void clear_buy_struct (Products**);
int main()
{
/**
* Магазин с одним продавцом.
* Компьютер вместо кассового аппарата.
* База наличия товаров: наименование, единица измерения, цена единицы, количество, дата последнего завоза.
* Регистрация поступления товара (как старых, так и новых наименований).
* Оформление покупки: выписка чека, корректировка базы.
* Проблема уценки и описания.
* Инвентаризация остатков товара с вычислением суммарной стоимости.
*
* Программа должна обеспечивать диалог с помощью меню и контроль ошибок при вводе
*/
Product D;
Products*Ps=NULL;
Products*BPs=NULL;
zena=0;
int menu;
do {
cout<<rus("\t Меню: *")<<endl;
cout<<rus("\t 1.Просмотр списка товаров")<<endl;
cout<<rus("\t 2.Добавление товара в конец списка")<<endl;
cout<<rus("\t 3.Добавление товара в произв.место списка")<<endl;
cout<<rus("\t 4.Сохранение товаров в файл (Продолжение записи)")<<endl;
cout<<rus("\t 5.Сохранение товаров в файл (Новая запись)")<<endl;
cout<<rus("\t 6.Чтение базы товаров с файла")<<endl;
cout<<rus("\t 7.Поиск товара")<<endl;
cout<<rus("\t 8.Удаление товара по номеру")<<endl;
cout<<rus("\t 9.Очистка списка")<<endl;
cout<<rus("\t ------------------------")<<endl;
cout<<rus("\t 10.Покупка товаров")<<endl;
cout<<rus("\t 11.Просмотр корзины")<<endl;
cout<<rus("\t 12.Сохранение купленных товаров в файл")<<endl;
cout<<rus("\t 13.Чтение корзины с файла")<<endl;
cout<<rus("\t 14.Выписка счета")<<endl;
cout<<rus("\t 15.Удаление товара из корзины")<<endl;
cout<<rus("\t 16.Очистка корзины")<<endl;
cout<<rus("\t 17.Касса")<<endl;
cout<<"-----------------------------"<<endl;
cout<<rus("0.Выход")<<endl;
cout<<rus("* Введите номер пункта")<<endl;
cin>>menu;
switch(menu) {
// Просмотр списка товаров
case 1:
print_products(Ps);
break;
// Добавление товара в список
case 2:
input_product(D);
add_element_struct(&Ps,D);
break;
// Вставка в произвол.место
case 3:
input_product(D);
insert_element_struct(&Ps,D);
break;
// Сохранение в файл списка
case 4:
save_struct(Ps,1);
cout<<"-------------------------------"<<endl;
cout<<rus("Список товаров сохранен")<<endl;
cout<<"-------------------------------"<<endl;
break;
// Сохранение в файл (перезапись)
case 5:
save_struct(Ps,0);
cout<<"-------------------------------"<<endl;
cout<<rus("Список товаров сохранен")<<endl;
cout<<"-------------------------------"<<endl;
break;
// Чтение с файла
case 6:
clear_struct(&Ps);
read_database(&Ps);
break;
// Поиск товара
case 7:
search_product(Ps);
break;
// Удаление товара по номеру
case 8:
delete_product(&Ps,0);
break;
// Очистка
case 9:
clear_struct(&Ps);
cout<<"-------------------------------"<<endl;
cout<<rus("Список очищен")<<endl;
cout<<"-------------------------------"<<endl;
break;
//--------------------------------------------------//
// Покупка товара
case 10:
buy_product(Ps,&BPs);
break;
// Просмотр корзины
case 11:
print_buy_products(BPs);
break;
// Сохранение в файл купленных товаров
case 12:
save_buy_struct(BPs);
cout<<"-------------------------------"<<endl;
cout<<rus("Список купленных товаров сохранен")<<endl;
cout<<"-------------------------------"<<endl;
break;
// Сохранение в файл купленных товаров
case 13:
clear_buy_struct(&BPs);
read_buy_database(&BPs);
break;
// Выписка счета
case 14:
see_factura_product(&BPs);
break;
// Удаление товара из корзины
case 15:
delete_buy_product(&BPs,0);
break;
// Очистка корзины
case 16:
clear_buy_struct(&BPs);
cout<<"-------------------------------"<<endl;
cout<<rus("Список купленных товаров очищен")<<endl;
cout<<"-------------------------------"<<endl;
break;
case 17:
cout<<"-------------------------------"<<endl;
cout<<rus("Денег в кассе: ")<<zena<<endl;
cout<<"-------------------------------"<<endl;
break;
//--------------------------------------------------//
// Выход
case 0:
clear_struct(&Ps);
clear_buy_struct(&BPs);
break;
default: cout<<rus("Выбран не существующий пункт меню")<<endl;
}
} while (menu!=0);
}
/**
* Функция перекодировки
*/
char bufer [255];
char*rus (char*s) {
CharToOem (s,bufer);
return bufer;
}
/**
* Функция печати списка базы товаров
*/
void print_products (Products*Ps) {
Products*S=Ps;
if (!S) {
cout<<rus("Список пуст")<<endl;
return;
}
cout<<rus("************ База товаров **************")<<endl;
while(S)
{
cout<<rus("--------- Товар (ID) ")<<S->P.id<<" ----------"<<endl;
print_product(S->P);
cout<<"-------------------------------"<<endl;
S=S->next;
}
cout<<"****************************************"<<endl;
}
/**
* Функция печати параметров продукта
*/
void print_product (Product P) {
cout<<rus("ID: ")<<P.id<<endl;
cout<<rus("Название товара: ")<<P.name<<endl;
cout<<rus("Единица измерения(Валюта): ")<<P.value<<endl;
cout<<rus("Цена товара: ")<<P.price<<endl;
cout<<rus("Количество товара на базе: ")<<P.number<<endl;
cout<<rus("Дата последнего завоза товара: ")<<P.last_date<<endl;
}
/**
* Сохранение структуры с файла (продолжение записи)
*/
void save_struct (Products*Ps,int act) {
fstream file;
if(!act) {
remove("database.txt");
}
file.open("database.txt",ios::out|ios::app);
if (!file) {
cout<<rus("База данных не доступна");
return;
}
while (Ps) {
file.write((char *) &Ps->P, sizeof(Product));
Ps=Ps->next;
}
file.close();
}
/**
* Добавление элемента в структуру
*/
void add_element_struct (Products**Ps,Product &D) {
Products*Inc=new Products;
Inc->P.id=D.id;
strcpy(Inc->P.name, D.name);
strcpy(Inc->P.value, D.value);
Inc->P.price=D.price;
Inc->P.number=D.number;
strcpy(Inc->P.last_date, D.last_date);
Inc->next=*Ps;
*Ps=Inc;
}
/**
* Вставка элемента в структуру
*/
void insert_element_struct (Products**Ps,Product&D) {
Products*Inc=new Products;
Inc->P.id=D.id;
strcpy(Inc->P.name, D.name);
strcpy(Inc->P.value, D.value);
Inc->P.price=D.price;
Inc->P.number=D.number;
strcpy(Inc->P.last_date, D.last_date);
if(*Ps==NULL) {
Inc->next=NULL;
*Ps=Inc;
return;
}
Products*S=*Ps;
if (S->P.id>=Inc->P.id) {
Inc->next=S;
*Ps=Inc;
return;
}
Products*S1=S->next;
while (S1) {
if(S->P.id<Inc->P.id && S->P.id<=S1->P.id) {
S->next=Inc;
Inc->next=S1;
return;
}
S=S->next;
S1=S1->next;
}
S->next=Inc;
Inc->next=NULL;
}
/**
* Чтение из файла ,создание списка
*/
void read_database (Products**Ps) {
ifstream file;
Products*Inc=new Products;
Product S;
file.open("database.txt",ios::in);
if (!file) {
cout<<rus("База данных не доступна");
return;
}
long file_size;
file.seekg(0, ios::end);
file_size = file.tellg();
if (!file_size) {
cout<<rus("База данных пуста");
return;
}
file.close();
file.open("database.txt",ios::in);
file.read((char *) &S, sizeof(Product));
Inc->P.id=S.id;
strcpy(Inc->P.name, S.name);
strcpy(Inc->P.value, S.value);
Inc->P.price=S.price;
Inc->P.number=S.number;
strcpy(Inc->P.last_date, S.last_date);
Inc->next=NULL;
*Ps=Inc;
while(!file.eof()) {
if(file.read((char *) &S, sizeof(Product))==NULL)break;
Inc->next=new Products;
Inc=Inc->next;
Inc->P.id=S.id;
strcpy(Inc->P.name, S.name);
strcpy(Inc->P.value, S.value);
Inc->P.price=S.price;
Inc->P.number=S.number;
strcpy(Inc->P.last_date, S.last_date);
Inc->next=NULL;
}
file.close();
cout<<"-------------------------------"<<endl;
cout<<rus("Список товаров получен из файла")<<endl;
cout<<"-------------------------------"<<endl;
}
/**
* Ввод данных
*/
void input_product(Product &D) {
char val[64];
bool valid=false;
do {
cout<<rus("Введите ID продукта")<<endl;
cin>>val;
for (int i=0;i<strlen(val);i++) {
if (val[i]<'0' || val[i]>'9') {
valid=false;
break;
}
valid=true;
}
if (valid) {
sscanf(val,"%d",&D.id);
} else {
cout<<rus("\t Неверный тип (только целые числа)")<<endl;
}
} while (!valid);
cout<<rus("Введите название продукта")<<endl;
cin>>D.name;
cout<<rus("Введите единицу измерения(Валюту)")<<endl;
cin>>D.value;
char val2[64];
bool valid2=false;
do {
cout<<rus("Введите цену на товара")<<endl;
cin>>val2;
for (int i=0;i<strlen(val2);i++) {
if (val2[i]=='.') {
continue;
}
else if (val2[i]<'0' || val2[i]>'9') {
valid2=false;
break;
} else {
valid2=true;
}
}
if (valid2) {
sscanf(val2,"%lf",&D.price);
} else {
cout<<rus("\t Неверный тип (только double числа)")<<endl;
}
} while (!valid2);
char val3[64];
bool valid3=false;
do {
cout<<rus("Введите количество товара на базе")<<endl;
cin>>val3;
for (int i=0;i<strlen(val3);i++) {
if (val3[i]<'0' || val3[i]>'9') {
valid3=false;
break;
}
valid3=true;
}
if (valid3) {
sscanf(val3,"%d",&D.number);
} else {
cout<<rus("\t Неверный тип (только int числа)")<<endl;
}
} while (!valid3);
cout<<rus("Введите дату последнего завоза товара")<<endl;
cin>>D.last_date;
}
/**
* Поиск товара
*/
void search_product (Products*Ps) {
if(!Ps) {
cout<<rus("Список пуст")<<endl;
return;
}
char name[64];
cout<<rus("Введите имя продукта")<<endl;
cin>>name;
Products*S=Ps;
while(S) {
if (!strcmp(S->P.name,name)) {
cout<<rus("\t По запросу найден")<<endl;
print_product(S->P);
return;
}
S=S->next;
}
cout<<rus("\t Данного товара нет")<<endl;
}
/**
* Удаление продукта
*/
void delete_product (Products**Ps,int delete_id) {
if(!*Ps) {
cout<<rus("Список пуст")<<endl;
return;
}
int id;
if (!delete_id) {
char val[64];
bool valid=false;
do {
cout<<rus("Введите ID удаляемого продукта")<<endl;
cin>>val;
for (int i=0;i<strlen(val);i++) {
if (val[i]<'0' || val[i]>'9') {
valid=false;
break;
}
valid=true;
}
if (valid) {
sscanf(val,"%d",&id);
} else {
cout<<rus("\t Неверный тип (только целые числа)")<<endl;
}
} while (!valid);
} else {
id=delete_id;
}
Products*T=*Ps;
if(T->P.id==id) {
*Ps=T->next;
delete T;
cout<<"-------------------------------"<<endl;
cout<<rus("Товар удален")<<endl;
cout<<"-------------------------------"<<endl;
return;
}
Products*T1=T->next;
while(T1) {
if(T1->P.id>=id && id>=T1->P.id) {
T->next=T1->next;
delete T1;
if (!delete_id) {
cout<<"-------------------------------"<<endl;
cout<<rus("Товар удален")<<endl;
cout<<"-------------------------------"<<endl;
}
return;
}
T=T1;
T1=T1->next;
}
}
/**
* Очистка списка
*/
void clear_struct (Products**Ps) {
if(!*Ps) {
cout<<rus("Список пуст")<<endl;
return;
}
Products*S=*Ps;
Products*D;
while(S)
{
D=S;
S=S->next;
delete D;
}
*Ps=NULL;
}
/**
* Добавление элемента в структуру
*/
void add_element_buy_struct (Products**BPs,Product &D) {
Products*BInc=new Products;
BInc->P.id=D.id;
strcpy(BInc->P.name, D.name);
strcpy(BInc->P.value, D.value);
BInc->P.price=D.price;
BInc->P.number=D.number;
strcpy(BInc->P.last_date, D.last_date);
BInc->next=*BPs;
*BPs=BInc;
}
/**
* Функция печати параметров купленного продукта
*/
void print_buy_product (Product P) {
cout<<rus("ID: ")<<P.id<<endl;
cout<<rus("Название товара: ")<<P.name<<endl;
cout<<rus("Единица измерения(Валюта): ")<<P.value<<endl;
cout<<rus("Цена товара: ")<<P.price<<endl;
cout<<rus("Количество купленного товара: ")<<P.number<<endl;
cout<<rus("Дата покупки: ")<<P.last_date<<endl;
}
/**
* Покупка товара ,добавление в корзину
*/
void buy_product (Products*Ps,Products**BPs) {
if(!Ps) {
cout<<rus("Список пуст")<<endl;
return;
}
Product D;
char val[64];
bool valid=false;
do {
cout<<rus("Введите ID продукта")<<endl;
cin>>val;
for (int i=0;i<strlen(val);i++) {
if (val[i]<'0' || val[i]>'9') {
valid=false;
break;
}
valid=true;
}
if (valid) {
sscanf(val,"%d",&D.id);
} else {
cout<<rus("\t Неверный тип (только целые числа)")<<endl;
}
} while (!valid);
Products*S=Ps;
bool result;
while(S) {
if (S->P.id==D.id) {
result=true;
cout<<rus("\t По запросу найден")<<endl;
print_product(S->P);
cout<<rus("\n Введите количество покупаемого товара")<<endl;
cin>>D.number;
if (S->P.number<D.number) {
cout<<rus("Нет такого количества товара")<<endl;
cout<<rus("Сейчас в ассортименте(штук): ")<<D.number<<endl;
D.number=D.number-(D.number-S->P.number);
cout<<rus("Купить: ")<<D.number<<endl;
cout<<rus("штук товара?")<<endl;
}
int act;
cout<<rus("\n Продолжить покупку (1 - да,0 - нет")<<endl;
cin>>act;
if (act) {
cout<<"-------------------------------"<<endl;
cout<<rus("Товар добавлен в корзину")<<endl;
cout<<"-------------------------------"<<endl;
strcpy(D.name, S->P.name);
strcpy(D.value, S->P.value);
D.price=S->P.price;
strcpy(D.last_date, S->P.last_date);
add_element_buy_struct (BPs,D);
S->P.number=S->P.number-D.number;
if (!S->P.number) {
delete_product (&Ps,D.id);
}
save_struct(Ps,0);
}
return;
}
S=S->next;
}
if (!result) {
cout<<rus("Товар с данным ID не найден")<<endl;
}
}
/**
* Функция печати корзины
*/
void print_buy_products (Products*BPs) {
Products*BS=BPs;
if (!BS) {
cout<<rus("Список пуст")<<endl;
return;
}
cout<<rus("************ Корзина (купленные товары) **************")<<endl;
while(BS)
{
cout<<rus("--------- Товар (ID) ")<<BS->P.id<<" ----------"<<endl;
print_buy_product(BS->P);
cout<<"-------------------------------"<<endl;
BS=BS->next;
}
cout<<"****************************************"<<endl;
}
/**
* Сохранение купленных товаров
*/
void save_buy_struct (Products*BPs) {
fstream file;
remove("buy_database.txt");
file.open("buy_database.txt",ios::out|ios::app);
if (!file) {
cout<<rus("База данных не доступна");
return;
}
while (BPs) {
file.write((char *) &BPs->P, sizeof(Product));
BPs=BPs->next;
}
file.close();
}
/**
* Чтение купленных товаров
*/
void read_buy_database (Products**BPs) {
ifstream file;
Products*Inc=new Products;
Product S;
file.open("buy_database.txt",ios::in);
if (!file) {
cout<<rus("База данных не доступна");
return;
}
long file_size;
file.seekg(0, ios::end);
file_size = file.tellg();
if (!file_size) {
cout<<rus("База данных пуста")<<endl;
return;
}
file.close();
file.open("buy_database.txt",ios::in);
file.read((char *) &S, sizeof(Product));
Inc->P.id=S.id;
strcpy(Inc->P.name, S.name);
strcpy(Inc->P.value, S.value);
Inc->P.price=S.price;
Inc->P.number=S.number;
strcpy(Inc->P.last_date, S.last_date);
Inc->next=NULL;
*BPs=Inc;
while(!file.eof()) {
if(file.read((char *) &S, sizeof(Product))==NULL)break;
Inc->next=new Products;
Inc=Inc->next;
Inc->P.id=S.id;
strcpy(Inc->P.name, S.name);
strcpy(Inc->P.value, S.value);
Inc->P.price=S.price;
Inc->P.number=S.number;
strcpy(Inc->P.last_date, S.last_date);
Inc->next=NULL;
}
file.close();
cout<<"-------------------------------"<<endl;
cout<<rus("Список купленных товаров получен из файла")<<endl;
cout<<"-------------------------------"<<endl;
}
/**
* Выписка счета
*/
void see_factura_product (Products**BPs) {
Products*BS=*BPs;
if (!BS) {
cout<<rus("Список пуст")<<endl;
return;
}
int price=0;
cout<<rus("************ Счет - фактура **************")<<endl;
while(BS)
{
cout<<rus("--------- Товар (ID) ")<<BS->P.id<<" ----------"<<endl;
print_buy_product(BS->P);
cout<<"-------------------------------"<<endl;
price+=BS->P.price*BS->P.number;
BS=BS->next;
}
cout<<"****************************************"<<endl;
cout<<rus("Итого: ")<<price<<endl;
zena+=price;
int act;
cout<<rus("\n Оплатить (1 - да,0 - нет")<<endl;
cin>>act;
if (act) {
remove("buy_database.txt");
clear_buy_struct(BPs);
cout<<"-------------------------------"<<endl;
cout<<rus("Товары куплены.Ждите курьера =)")<<endl;
cout<<"-------------------------------"<<endl;
}
}
/**
* Удаление продукта из корзины
*/
void delete_buy_product (Products**BPs,int delete_id) {
if(!*BPs) {
cout<<rus("Список пуст")<<endl;
return;
}
int id;
if (!delete_id) {
char val[64];
bool valid=false;
do {
cout<<rus("Введите ID удаляемого продукта")<<endl;
cin>>val;
for (int i=0;i<strlen(val);i++) {
if (val[i]<'0' || val[i]>'9') {
valid=false;
break;
}
valid=true;
}
if (valid) {
sscanf(val,"%d",&id);
} else {
cout<<rus("\t Неверный тип (только целые числа)")<<endl;
}
} while (!valid);
} else {
id=delete_id;
}
Products*T=*BPs;
if(T->P.id==id) {
*BPs=T->next;
delete T;
cout<<"-------------------------------"<<endl;
cout<<rus("Товар удален")<<endl;
cout<<"-------------------------------"<<endl;
return;
}
Products*T1=T->next;
while(T1) {
if(T1->P.id>=id && id>=T1->P.id) {
T->next=T1->next;
delete T1;
if (!delete_id) {
cout<<"-------------------------------"<<endl;
cout<<rus("Товар удален")<<endl;
cout<<"-------------------------------"<<endl;
}
return;
}
T=T1;
T1=T1->next;
}
}
/**
* Очистка списка купленных товаров
*/
void clear_buy_struct (Products**BPs) {
if(!*BPs) {
cout<<rus("Список пуст")<<endl;
return;
}
Products*S=*BPs;
Products*D;
while(S)
{
D=S;
S=S->next;
delete D;
}
*BPs=NULL;
}
30