Составление программы – магазин с одним продавцом

Динамические структуры данных, их классификация и разновидности, назначение и функциональные особенности. Линейные односвязные списки, их внутренняя организация и значение. Порядок и принципы составления программы, главные требования, предъявляемые к ней.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 11.05.2014
Размер файла 137,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

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

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

1. Наименование товара

2. Единица измерения

3. Цена единицы

4. Количество

5. Дата завоза

· Регистрация поступления товаров

· Оформление покупки: выписка чека, корректировка базы.

· Проблема уценки и описания

· Инвентаризация остатков товара с вычислением суммарной стоимости

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

· Диалог с помощью меню

· Контроль ошибок при вводе данных

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

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

линейный односвязный список программа

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

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

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

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

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

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

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

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

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

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

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

2.4 Стеки

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

2.5 Очереди

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

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

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

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

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

2.8 Деревья

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3) Выполнить заполнение списка:

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

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;

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

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

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. Добавление товара

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

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

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

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

линейный односвязный список программа

1. В.Г. Давыдов Программирование и основы алгоритмизации. 2-е изд., стер.-М.: Высш.шк., 2005. - 447 с.: ил. ISDN 5-06-004432-7.

2. И.Ш. Хабибуллин Программирование C++: Пер. с англ. - 3-е изд. - СПб.: БХВ-Петербург, 2006. - 512 с.

3. Сайт: www.victor192007.narod.ru

4. Конспект лекций по дисциплине «Программирование на языках высокого уровня».

Размещено на Allbest.ru


Подобные документы

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

    контрольная работа [290,6 K], добавлен 17.07.2012

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

    курсовая работа [451,1 K], добавлен 19.10.2013

  • Средства создания динамических структур данных. Формат описания ссылочного типа. Структура памяти во время выполнения программы. Линейные списки, стек, очередь. Организация списков в динамической памяти. Пример создания списка в обратном порядке.

    лабораторная работа [788,2 K], добавлен 14.06.2009

  • Средства выделения и освобождения памяти. Динамические структуры данных. Связные линейные списки и их машинное представление. Структура одно- и двухсвязного списка. Реализация операций над связными линейными списками. Разработка программы на языке С++.

    курсовая работа [944,7 K], добавлен 14.03.2015

  • Структура и компоненты Delphi 7, их функциональные особенности и назначение. Системная информация утилиты настройки BDE. Свойства полей базы данных и ее главные объекты. Разработка и содержание руководства пользователя. Требования к надежности программы.

    курсовая работа [1,6 M], добавлен 10.05.2016

  • Понятие и внутренняя структура операционных систем, их классификация и разновидности, предъявляемые требования, этапы становления и развития, функциональные особенности. Описание и назначение базовых компьютерных систем: DOS, Windows, Linux, Mac.

    курсовая работа [44,9 K], добавлен 14.12.2013

  • Основания для разработки программы: назначение и сферы практического использования, главные предъявляемые требования. Характеристика логической структуры и используемые технические средства. Программа и методика испытаний. Эксплуатационные документы.

    курсовая работа [2,4 M], добавлен 16.12.2013

  • Назначение и требования, предъявляемые к прикладной программе, порядок контроля и приемки. Этапы создания и жизненный цикл программы. Реализация базы данных в MS Excel. Порядок работы с проектируемым программным продуктом, его структура и элементы.

    курсовая работа [1,8 M], добавлен 24.05.2014

  • Архитектура персональных компьютеров, классификация сетей (глобальные, региональные, локальные), методы доступа к передаче данных и протоколы. Динамические структуры данных; списки, их основные виды и способы реализации; технологии программирования.

    шпаргалка [584,9 K], добавлен 09.03.2010

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

    дипломная работа [1,8 M], добавлен 02.11.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.