Составление программы – магазин с одним продавцом
Динамические структуры данных, их классификация и разновидности, назначение и функциональные особенности. Линейные односвязные списки, их внутренняя организация и значение. Порядок и принципы составления программы, главные требования, предъявляемые к ней.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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