Будь умным!


У вас вопросы?
У нас ответы:) SamZan.net

Составить программу магазин с одним продавцом Компьютер вместо кассового аппарата База наличия товаров

Работа добавлена на сайт samzan.net:


Оглавление

[1] Оглавление

[2]
Постановка задачи

[3]
2.    Теоретическая часть

[3.1] 2.1 Динамические структуры данных. Классификация.

[3.2]
2.2 Линейные односвязные списки

[4]
3.    Описание программы

[5]
4.    Текст программы

[6]
5.    Результаты работы

[7]
6.    Список литературы

  1.  
    Постановка задачи

Составить программу – магазин с одним продавцом. Компьютер вместо кассового аппарата. База наличия товаров.

  1.  Наименование товара
  2.  Единица измерения
  3.  Цена единицы
  4.  Количество
  5.  Дата завоза

  •  Регистрация поступления товаров
  •  Оформление покупки: выписка чека, корректировка базы.
  •  Проблема уценки и описания
  •  Инвентаризация остатков товара с вычислением суммарной стоимости

Программа должна обеспечивать:

  •  Диалог с помощью меню
  •  Контроль ошибок при вводе данных


2.    Теоретическая часть

2.1 Динамические структуры данных. Классификация.

Для того чтобы в процессе выполнения программы произвольно добавлять и удалять данные, необходимо организовать данные не в массив, а во что-то другое. Если к элементу данных добавить ещё и указатель, в котором будет храниться адрес какого-то другого элемента, то это и будет кардинальным решением проблемы. Такая организация представления и хранения данных называется динамической структурой данных.

Каждый элемент динамических структур данных состоит из собственно данных и одного или нескольких указателей, ссылающихся на аналогичные элементы. Это позволяет добавлять в динамическую структуру новые данные или удалять какие-то из имеющихся, не затрагивая при этом другие элементы структуры.

Кроме того, динамические структуры позволяют нам организовать данные так, чтобы их представление в программе было максимально приближено к тому, как эти данные выглядят в реальности. Так, для моделирования обслуживания очереди к врачу лучше всего подойдет динамическая структура данных под названием «очередь», а не массив, а для представления сети автомобильных дорог нужна «сеть».

Динамические структуры данных бывают линейные и нелинейные. В линейной динамической структуре данные связываются в цепочку. К линейным структурам относятся списки (односвязные, двухсвязные, кольцевые), стеки, очереди (односторонние, двухсторонние, очереди с приоритетами). Организация нелинейных структур более сложная. Нелинейные структуры представляются, как правило, в виде дерева (каждый элемент имеет некоторое количество связей, например, так бинарном дереве каждый элемент (узел) имеет ссылку на левый и правый элемент).

Динамические структуры данных также применяются и для более эффективной работы с данными, размер которых известен. К таким случаям относится решение задач сортировки и поиска элементов. При сортировке упорядочивание динамических структур не требует перестановки элементов, а сводится к изменению указателей на эти элементы. Это особенно эффективно, если сортируемые элементы большого размера. При решении задачи поиска элемента в тех случаях, когда важна скорость, данные лучше всего представлять в виде бинарного дерева.

Элемент любой динамической структуры данных представляет собой структуру (struct), содержащую, по крайней мере, два поля - для хранения данных и для указателя. В общем случае полей данных и указателей может быть несколько. Поля данных могут быть любого типа: стандартного (основного), составного или типа указатель.


Двухсвязные линейные списки

В двусвязном списке каждый элемент имеет поля с данными и два указателя, где один указатель хранит адрес предшествующего элемента списка, а второй указатель хранит адрес предыдущего элемента. Таким образом, для работы с двухсвязным списком используется два указателя, которые хранят адреса начала и конца списка.

Графическое представление двухсвязного списка

Кольцевой список

В кольцевом списке последний элемент связан с первым. Для кольцевого списка возможно выполнять те же самые операции, что и для обычного списка, однако проверка достижения конца цикла выполняется иначе, поскольку список замкнут.

Стеки

Стек – частный случай однонаправленного линейного списка, для которого определены только две операции: добавление и удаление данных. Доступ к элементам в стеке представлен по принципу «последним пришёл — первым вышел». Можно привести хороший пример стека, это стопка тарелок, что бы взять вторую сверху тарелку нужно сначала поднять первую.

Очереди

Очередь — это линейная динамическая структура данных, для которой выполняется правило: добавление данных возможно только в конец структуры, а удаление  только с начала. Доступ к элементам в очереди представлен по принципу «первым пришёл — первым вышел». Примером  в реальной жизни может служить очередь к врачу.

Двусторонняя очередь

Разновидностью очередей является двусторонняя очередь или дек, отличающаяся от обычной очереди тем, что добавление или удаление данных допустимо с обоих концов очереди. Для реализации алгоритмов работы с двусторонней очередью можно использовать те же структуры данных, что и для обычной очереди.

 Очередь с приоритетом

Разновидность очереди, в которой добавление новых данных производится в конец очереди, а выборка данных в зависимости от каких либо условий или правил. Аналогичным примером из жизни служит очередь к врачу, где ветераны или инвалиды обслуживаются без очереди, т.е. им предоставляется приоритет.

Деревья

Деревья — это нелинейная динамическая структура данных, представленная в виде иерархии элементов, называемых узлами.

На самом верхнем уровне иерархии всегда имеется только один узел, называемый корнем узла. Каждый узел, кроме корневого, связан только с одним узлом более высокого уровня, называемым узлом-предком.  Элементы дерева связываются с помощью ветвей (ребер) с одним или несколькими узлами  более низкого уровня - дочерними узлами или потомками. Элементы, расположенные в конце ветвей и не имеющие дочерних узлов, называют листьями. От корня до любого узла существует только один путь. Максимальная длина пути от корня до листьев называется высотой дерева. Любой узел дерева с его потомками также образует дерево, называемое поддеревом. Число поддеревьев для данного узла образует степень узла. Максимальное значение среди степеней всех узлов определяет степень дерева.

Наиболее простыми с точки зрения сложности реализации алгоритмов работы с деревьями являются бинарные деревья.  

Как правило, в дереве всегда задают какой-либо принцип упорядоченности, например, по возрастанию какого-то параметра (ключа). Таки образом, для каждого узла ключи наследников располагаются слева направо по возрастанию. То есть, в бинарном дереве для каждого узла значение ключа левого наследника будет меньше значения ключа узла, а значение ключа в узле меньше значения ключа в правом наследнике.

Если дерево ограничено так, что для каждого узла все ключи левого поддерева меньше ключа этого узла, а все ключи его правого поддерева – больше, то оно называется деревом поиска. В дереве поиска можно найти элемент по ключу.


2.2 Линейные односвязные списки 

Линейный список — это динамическая структура данных, каждый элемент которой посредством указателя связывается со следующим элементом. Эта структура данных предназначена для быстрой вставки элементов в определенное место.

Каждый элемент списка содержит поле данных (Data) (оно может иметь простую или сложную структуру) и поле ссылки на следующий элемент (next). Поле ссылки последнего элемента должно содержать пустой указатель (NULL).

Самый простой способ связать между собой множество элементов – сделать так, чтобы каждый элемент содержал ссылку на следующий. Такой список называется однонаправленным (односвязным). 

При работе с линейным односвязым списком можно рекомендовать следующий алгоритм:

  1.  Сформировать структуры  (расположить их в начале программы, что позволит изменять структуру с данными, не затрагивая при этом основную структуру List):

struct Data //  структура, содержащая поля данных, необходимых для работы

struct List //  структура, содержащая поле типа Data и поле с адресом последующего элемента next

Графически линейный список можно представить следующим образом:

  1.  В программе определить указатель на начало будущего списка:

List *u=NULL; // список  пуст, указатель задан равным константе NULL

  1.  Выполнить заполнение списка:

Создание первого элемента:

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;

Действия со списками

С готовыми списками  можно выполнять различные действия:

  1.  Просмотр списка – выполняется последовательно  с его начала           void print (List *u)
  2.  Поиск первого вхождения в список элемента, соответствующего заданным требованиям List*Find (List*u, Data&x)
  3.  Добавление нового элемента в начало списка                                         void Add_Beg (List**u,Data&x)
  4.  Вставка элемента в произвольное место списка по какому-либо принципу void   Insert (List**u, Data&x)
  5.  Удаление элемента из списка void Delete(List**u,Data&x)
  6.  Удаление (очистка) всего списка void Clear(List **u)


3.    Описание программы 

В программе были использованы следующие структуры:

struct Product {

// Идентификатор

int id;

 // Наименование

char name[64];

// Единица измерения - Рубли / Доллары и т.д

 char value[32];

// Цена единицы

double price;

 // Количество товара

int number;

// Дата последнего завоза - Формат - День / Месяц / Год

 char last_date[32];

};

struct Products {

 Product P;

Products *next;

};

В программе использованы основные  методы:

  •  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**);


4.    Текст программы

#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;

}


5.    Результаты работы 

  1.  Добавление товара

  1.  Просмотр товаров в виде списка

  1.  Покупка товара (добавление в корзину)

  1.  Выписка счета для товаров из корзины


6.    Список литературы

  1.  В.Г. Давыдов Программирование и основы алгоритмизации.2-е изд., стер.-М.:Высш.шк.,2005.-447 с.: ил. ISDN 5-06-004432-7.
  2.  И.Ш. Хабибуллин Программирование C++: Пер. с англ. — 3-е изд. — СПб.: БХВ-Петербург, 2006. — 512 с.
  3.  Сайт: www.victor192007.narod.ru
  4.  Конспект лекций по дисциплине «Программирование на языках высокого уровня».

30




1.  Рассмотрим наиболее характерные для российской системы образования проблемы и причины возникновения разл
2.  Сущность средних величин правила их применения Средняя величина в статистике ~обобщающий показатель
3. реферат дисертації на здобуття наукового ступеня кандидата психологічних наук2
4. Методические рекомендации по выполнению контрольной работы по курсу Эконометрика Тема- Уравнение лин
5. по теме- Противогрибковые препараты
6. Вольному воля
7. задание по истории- Февральская и Октябрьская революции 1917 года- проанализируйте какая ие из них была и н
8. Эврике Уровень 1
9. перше це піднесення національновизвольного революційного руху на початку XX ст
10. Методические рекомендации для самостоятельной работы студентов по предмету Медицина Катастроф
11. Академик Г
12. Методи регулювання грошової маси країни
13. это работать всегда аккуратно
14. МОНОГРАФИЯ ЛИЧНОСТИ Ф
15. Афармленне Версальска-Вашынгтонскай сістэмы і Беларусь
16. Політологія ІІ семестр 20122013 н
17. Реферат на тему Правила придбання отримання наркотичних засобів та психотропних речовин прекурсорів с
18. Одномерная эхоэнцефалография и повышение внутричерепного давления у детей
19. то капала вода. Медленно вяло
20. і Моральні цінності і норми що мають відношення до політичного миру до її інститутів відносин політичному