Курсовая работа по C++ — Динамические структуры данных. Списки

Здравствуйте читатели блога. Курсовая работа по динамическим структурам данных — спискам. Может кому пригодиться =)
Будут вопросы задавайте в комментариях. Исходники и оформление курсовой в конце поста.

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

Скачать исходники курсовой
Скачать оформление курсовой

Гиламов Данис

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

Вам также может понравиться ...

  • Лилия

    Здравствуйте. При компиляции этой работы появляется вот такая ошибка: error C2664: CharToOemW: невозможно преобразовать параметр 1 из «char *» в «LPCWSTR».
    Подскажите, с чем это может быть связано.

    • Danis92

      Здраствуйте ,так не разберешься сразу ,какой компилятор используете? В CodeBlocks все работает.

      • Алексей

        visual studio 2012

  • Алексей

    убрал функцию «перекодирование» и добавил
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    теперь все на русском и без премудростей

  • Danis92

    да можно итак ), надеюсь пригодилось?

    • Алексей

      да пригодилось, надо было срочно написать бд, а времени самому писать не было)осталось только сортировку списка товаров сделать