ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ГОРОДА МОСКВЫ
Государственное бюджетное образовательное учреждение
среднего профессионального образования города Москвы
«МОСКОВСКИЙ ТЕХНИКУМ ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ
ТЕХНИКИ»
КУРСОВАЯ РАБОТА (ПРОЕКТ)
по дисциплине:
Тема:
Студент ________
И.О.Ф.
Руководитель ________
И.О.Ф.
Специальность ____________________
Группа __________________________
Оценка ________________
Дата «___»_______________201_ г.
Москва
201_
ДЕПАРТАМЕНТ ОБРАЗОВАНИЯ ГОРОДА МОСКВЫ
Государственное бюджетное образовательное учреждение
среднего профессионального образования города Москвы
«МОСКОВСКИЙ ТЕХНИКУМ ИНФОРМАТИКИ И ВЫЧИСЛИТЕЛЬНОЙ
ТЕХНИКИ»
УТВЕРЖДАЮ
Заместитель директора по УР
_____________ / И.Г. Фризен
____________ И.Г. Фризен
«____» ___________ 201__ г.
З А Д А Н И Е
к курсовому проекту (курсовой работе)
студенту дневного отделения, группы _____
специальности _______________________________________________________________
Фамилия, имя, отчество
Тема курсового проекта (курсовой работы) ______
1. Постановка задачи:
2. Исходные данные:
¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬¬_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
_____________________________________________________________________________
3. Перечень вопросов, подлежащих разработке в курсовом проекте (курсовой работе):
Задание принял к исполнению « » 201 г.
Студент И.О. Фамилия, подпись
Срок сдачи « » 201 г.
Руководитель курсового проекта И.О. Фамилия, подпись
Задание рассмотрено на заседании цикловой комиссии « » 201 г.
Председатель комиссии /
подпись И.О. Фамилия,
СОДЕРЖАНИЕ
Введение 5
1.Постановка задачи 6
2.Создание списков 6
3. Интерфейс программы 8
4. Дополнительные формы 10
5.Защита от сбоев 11
Заключение 13
Приложения 15
Приложенее 1. Листинг файла ingr.cpp 15
Приложенее 2. Листинг файла Add_dish.h 28
Приложенее 3. Листинг файла Edit_dish.h 30
Приложенее 4. Листинг файла Add_ingr.h 32
Приложенее 5. Листинг файла Edit_ingr.h 34
Приложенее 6. Листинг файла Form1.h 36
ВВЕДЕНИЕ
В современном мире информационные технологии с каждым днем начинают использоваться все в большем количестве областей. Обычная программа в наше время может заменить целый штат сотрудников или огромный бумажный архив. Именно поэтому тема ”Справочник шеф-повара” как нельзя актуальна, ведь рассматривая на примере даже казалось бы простую базу данных, можно получить представление о работе более крупных и сложных программ, повседневно использующихся в нашей жизни.
Объектом исследования является ресторан, в котором шеф-повар осуществляет постоянный контроль над технологией приготовления пищи, соблюдением работниками санитарных требований и правил личной гигиены, а так же назначает расстановку поваров и составляет график выхода поваров на работу.
Предметом исследования является повседневная работа шеф-повара по составлению блюд и слежкой за количеством продуктов на складе.
Основная цель работы – создание приложения, способного содержать в себе сведенья о количестве продуктов на складе, а так же позволяющего управлять списком блюд, подаваемых в ресторане.
Разобьем цель работы на задачи:
• Организация чтения/записи данных из файла
• Грамотное управление данными в памяти программы
• Создание удобного пользовательского интерфейса
• Защита программы от сбоев
Для управления данными нам идеально подойдет такая структура данных как списки, так как она позволит нам легко совершать такие действия как удаление, добавление и изменение данных в базе без страха нарушить целостность данных.
Хранение данных будет производиться в двоичных файлах поскольку это позволит легко производить чтение и запись из файла в списки в памяти программы.
1.ПОСТАНОВКА ЗАДАЧИ
Создать список для хранения информации об ингридиентах, а так же ортогональный список для хранения динформации о блюдах. Вышеупомянутые списки реализовать через классы. Создать пользовательский интерфейс программы, используя компонет dataGridView. Реализовать в классах возможность обновления интерфейса программы по данным списков. Защитить программу от сбоев.
2.СОЗДАНИЕ СПИСКОВ
При создании списков мы будем использовать классы, что позволит нам значительно снизить возможность ошибки при работе с данными и облегчит реализацию обновления интерфейса.
В заголовочном файле ingr.h, содержатся прототипы всех использующихся методов классов. Так как листинг файла ingr.cpp слишком велик, он будет указан в приложениях (см)
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <msclrmarshal_cppstd.h>
using namespace msclr::interop;
using namespace std;
using namespace System::Windows::Forms;
using namespace System::Runtime::InteropServices;
namespace povar_intr {
class ingr
{
private:
struct node
{
string ingrName;
double price;
int kolvo,id;
node* next;
node* prev;
}*head,*tail;
public:
ingr();
~ingr();
void clear ();
int add(string nm, double pr, int kv);
int find_name(string nm);
int del_num(int num);
int edit_num (int num,string nm, double pr, int kv);
int save_to_file(System::String^ path);
int open_from_file(System::String^ path);
int new_id();
void zapoln(System::Windows::Forms::DataGridView^ dGV, System::Windows::Forms::ComboBox^ CB);
};
class dishes
{
private:
struct nodeI
{
int kv, ingrName;
nodeI *next;
}*headVis;
struct nodeD
{
string dishName,recipe;
double price;
int id;
nodeD* next;
nodeI* vis;
}*head,*tail;
public:
dishes();
~dishes();
int find_d_name(string n);
int find_ingr(int dish,int n);
int add(string nm, string rc, double pr);
int add_vis(int dish,int nm, int kv );
int count_vis(int dish);
int del_vis (int dish);
int del_dish (int dish);
int edit_dish (int dish, string nm, string rc, double pr);
int count_all_ingr(int ingr_id);
void clear();
int find_name(string nm);
int save_to_file(System::String^ path);
int open_from_file(System::String^ path);
int new_id();
int del_ingr(int dish, int num);
void zapoln(System::Windows::Forms::DataGridView^ dGV);
int zapoln_vis(int num, System::Windows::Forms::DataGridView^ dGV,System::Windows::Forms::ComboBox^ CB);
System::String^ show_rec(int dish);
};
}
Из кода выше видно, что у нас имеются методы для записи списка в файл (save_to_file) и считывания из файла (open_from_file) для обоих классов. Ниже на примере класса ingr схематично показано как используются файлы для хранения списков.
Рисунок 1 Схема связи списков и двоичных файлов.
3.ИНТЕРФЕЙС ПРОГРАММЫ
Следующим шагом был подготовлен интерфейс программы, включающий в себя несколько таблиц содержащих данные, формы для добавления и редактирования данных и меню для работы с программой.
Рисунок 2 Программа в режиме просмотра ингридиентов
Рисунок 3 Программа в режиме просмотра блюд
Обновление таблиц происходит с помощью методов обновления интерфейса (zapoln, zapoln_vis), в которые как аргумент передаются необходимые для обновления таблицы. Заполнение данными происходит непосредственно в самом методе класса, что позволяет избежать какой-либо работы с данными в разделе предназначеном для кода интерфейса программы.
Дополнительной особенностью интерфейса программы является мультиязычность: пользователь может выбирать язык интерфейса в меню настроек. Все надписи считываются из текстовых файлов, что позволяет очень легко добавить в программу поддержку определенного языка без значительных изменений в коле.
4.ДОПОЛНИТЕЛЬНЫЕ ФОРМЫ
Для того чтобы пользователю было удобнее работать с данными, при добавлении/удалении вызываются специальные формы для ввода, листинг которых будет указан в приложениях.
Возможность вызывать дополнительные формы из главной и при этом передовать данные между ними реализована таким образом: для тех обработчиков событий, которые должны вызывать дополнительные формы в файле Form1.h оставлены только прототипы, а сам код вынесен в файл Form1.cpp, который имеет связь как и с главной формой, так и с подчиненными формами. Такой прием позволяет избежать перекрестных ссылок, когда первая форма ссылается на вторую, которая в свою очередь ссылаетя на первую и так до бесконечности.
Листинг файла Form1.h:
#include "StdAfx.h"
#include "Form1.h"
#include "Add_ingr.h"
#include "Edit_ingr.h"
#include "Add_dish.h"
#include "Edit_dish.h"
namespace povar_intr {
System::Void Form1::button1_Click(System::Object^ sender, System::EventArgs^ e) {
isSaved=false;
Add_ingr^ f2 = gcnew Add_ingr(this);
f2->Show();
this->Enabled=false;
}
System::Void Form1::b_edit_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView1->Rows->Count)
return;
isSaved=false;
Edit_ingr^ f3 = gcnew Edit_ingr(this);
f3->Show();
this->Enabled=false;
}
System::Void Form1::b_add_dish_Click(System::Object^ sender, System::EventArgs^ e)
{
isSaved=false;
Add_dish^ f4 = gcnew Add_dish(this);
f4->Show();
this->Enabled=false;
}
System::Void Form1::b_edit_dish_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView2->Rows->Count)
return;
label4->Text=b.show_rec(dataGridView2->CurrentRow->Index);
isSaved=false;
Edit_dish^ f5 = gcnew Edit_dish(this);
f5->Show();
this->Enabled=false;
}
}
5.ЗАЩИТА ОТ СБОЕВ
В результате продолжительного тестирования было исправлено множество ошибок и добавлено огромное количество “заглушек”, не позволяющих пользователю нарушить целостность базы данных. Например программа не позволит удалить ингридиент из списка продуктов на складе если он используется в одном из блюд или добавить два одинаковых блюда или ингридиента. Так же в програме производится проверка всех значений на допустимость, отчистка строк от лишних пробелов и контролируется целостность двоичных файлов.
Рисунок 4 Попытка удалить задействованый ингридиент.
ЗАКЛЮЧЕНИЕ
Мы создали полностью рабочее приложение, представляющее из себя базу данных. При разработке приложения была подробно рассмотрена структура данных «списки» , а так же выявлены главные достоинства использования бинарных файлов вместо текстоывых. При разработке интерфейса был задействован нетипичный способ подключения дополнительных форм, что открыло новые возможности для представления данных. Так же был написан алгоритм, позволяющий сделать приложение мультиязычным засчет подгружения текста из дополнительных файлов. Был проведена обшираная работа по защите приложения от ошибок и сбоев, а так же обеспечена целостность данных в БД. Подытожив вышенаписаное, можно сказать что разработка приложения не только прошла успешно, но и позволила охватить процесс создания любого програмного продукта в целом.
ПРИЛОЖЕНИЯ
Приложенее 1. Листинг файла ingr.cpp
#include "StdAfx.h"
#include "ingr.h"
namespace povar_intr {
ingr::ingr()
{
head=NULL;
tail=NULL;
}
void ingr::clear ()
{
node *t1,*t=head;
while (t)
{
t1=(*t).next;
delete t;
t=t1;
}
head=tail=NULL;
}
int ingr::add(string nm, double pr, int kv)
{
if (find_name(nm))
return -7;
node *t;
if (!head)
{
head=new(node);
t=head;
(*t).perv=NULL;
(*t).next=NULL;
}
else
{
t=tail;
(*t).next=new(node);
(*(*t).next).perv=t;
t=(*t).next;
(*t).next=NULL;
}
///
(*t).kolvo=kv;
(*t).ingrName=nm;
(*t).price=pr;
//
tail=t;
new_id();
return 0;
}
int ingr::find_name(string nm)
{
int i=1;
node *t=head;
while (t)
{
if (!(*t).ingrName.compare(nm))
return i;
t=(*t).next;
i++;
}
return 0;
}
int ingr::del_num(int num)
{
num++;
if (num<1)
return -1;
node *t=head;
for (int i=0;i<(num-1);i++)
{
if (!(*t).next)
return -1;
t=(*t).next;
}
if ((*t).perv) //если таковой существует
(*(*t).perv).next=(*t).next;
else
head=(*t).next;
if ((*t).next) //если таковой существует
(*(*t).next).perv=(*t).perv;
else
tail=(*t).perv;
delete t;
new_id();
return 0;
}
int ingr::edit_num(int num,string nm, double pr, int kv)
{
node *t=head;
for (int i=0;i<num;i++)
t=(*t).next;
(*t).ingrName=nm;
(*t).price=pr;
(*t).kolvo=kv;
return 0;
}
int ingr::save_to_file(System::String^ path)
{
path=path+".ingr";
char* ch_path=(char*)(void*)Marshal::StringToHGlobalAnsi(path);
ofstream io(ch_path,ios::binary|ios::trunc);
if(!io)
return -2;
int strln;
node *t=head;
while (t)
{
io.write("!",sizeof(char)); //обозначение начала записи блока
io.write((char*)(&(*t).id),sizeof(int));
strln=(*t).ingrName.length();
io.write((char*)(&strln),sizeof(int));
io.write((*t).ingrName.c_str(),strln);
io.write((char*)(&(*t).kolvo),sizeof(int));
io.write((char*)(&(*t).price),sizeof(double));
t=(*t).next;
}
io.write("#",sizeof(char)); //конец записи
io.close();
return 0;
}
int ingr::open_from_file(System::String^ path)
{
char* ch_path=(char*)(void*)Marshal::StringToHGlobalAnsi(path);
fstream out(ch_path,ios::binary| ios::in | ios::out);
if(!out)
return -2;
int strln,kv,id;
double pr;
char *nm,ch;
string str;
clear();
while (!out.eof())
{
out.read((char*)(&ch),sizeof(char));
if (ch!=!)
{
out.close();
return 0;
}
out.read((char*)(&id),sizeof(int));
out.read((char*)(&strln),sizeof(int));
nm=new char[strln];
out.read(nm,strln);
str=nm;
str=str.substr(0,strln);
out.read((char*)(&kv),sizeof(int));
out.read((char*)(&pr),sizeof(double));
add(str,pr,kv);
}
out.close();
return 0;
}
int ingr::new_id()
{
node *t=head;
int i=0;
while (t)
{
(*t).id=i;
i++;
t=(*t).next;
}
return i;
}
void ingr::zapoln(System::Windows::Forms::DataGridView^ dGV, System::Windows::Forms::ComboBox^ CB)
{
node *t=head;
dGV->Rows->Clear();
CB->Items->Clear();
while (t)
{
CB->Items->Add(marshal_as<System::String^>((*t).ingrName));
dGV->Rows->Add(System::Convert::ToString((*t).id),marshal_as<System::String^>((*t).ingrName),System::Convert::ToString((*t).kolvo),System::Convert::ToString((*t).price));
t=(*t).next;
}
}
dishes::dishes()
{
head=NULL;
}
int dishes::add(string nm, string rc, double pr)
{
if(find_d_name(nm))
return -8;
nodeD *t;
if (!head)
{
head=new(nodeD);
t=head;
(*t).next=NULL;
}
else
{
t=tail;
(*t).next=new(nodeD);
t=(*t).next;
(*t).next=NULL;
}
///
(*t).dishName=nm;
(*t).recipe=rc;
(*t).price=pr;
(*t).vis=NULL;
//
tail=t;
new_id();
return 0;
}
int dishes::del_dish (int dish)
{
del_vis(dish);
nodeD *t,*t1;
t=head;
if (dish==0)
{
head=(*t).next;
delete t;
new_id();
return 0;
}
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1; //если блюдо не найдено
t1=t;
t=(*t).next;
}
(*t1).next=(*t).next;
delete t;
new_id();
return 0;
}
int dishes::find_d_name(string n)
{
int i=1;
nodeD *t=head;
while (t)
{
if (!(*t).dishName.compare(n))
return i;
t=(*t).next;
i++;
}
return 0;
}
int dishes::count_all_ingr(int ingr_id)
{
int ingr_count=0;
nodeD *t;
nodeI *k;
t=head;
while (t)
{
k=(*t).vis;
while (k)
{
if ((*k).ingrName==ingr_id)
ingr_count++;
k=(*k).next;
}
t=(*t).next;
}
return ingr_count;
}
int dishes::edit_dish (int dish, string nm, string rc, double pr)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1; //если блюдо не найдено
t=(*t).next;
}
(*t).dishName=nm;
(*t).recipe=rc;
(*t).price=pr;
return 0;
}
int dishes::del_vis(int dish)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1; //если блюдо не найдено
t=(*t).next;
}
nodeI *k,*k1;
if(!(*t).vis)
return 0;
k=(*t).vis;
while (k)
{
k1=(*k).next;
delete k;
k=k1;
}
(*t).vis=NULL;
}
int dishes::find_ingr(int dish,int n)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1;
t=(*t).next;
}
nodeI *k;
k=(*t).vis;
int i =1;
while (k)
{
if ((*k).ingrName==n)
return i;
k=(*k).next;
i++;
}
return 0;
}
int dishes::add_vis(int dish,int nm, int kv )
{
if (find_ingr(dish,nm))
return -9;
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1;
t=(*t).next;
}
nodeI *k;
if(!(*t).vis)
{
(*t).vis=new(nodeI);
k=(*t).vis;
}
else
{
k=(*t).vis;
while((*k).next)
k=(*k).next;
(*k).next=new(nodeI);
k=(*k).next;
}
(*k).ingrName=nm;
(*k).kv=kv;
(*k).next=NULL;
}
int dishes::count_vis(int dish)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1;
t=(*t).next;
}
nodeI *k=(*t).vis;
int l=0;
while (k)
{
l++;
k=(*k).next;
}
return l;
}
void dishes::zapoln(System::Windows::Forms::DataGridView^ dGV)
{
nodeD *t=head;
dGV->Rows->Clear();
while (t)
{
dGV->Rows->Add(System::Convert::ToString((*t).id),marshal_as<System::String^>((*t).dishName),System::Convert::ToString((*t).price),count_vis((*t).id));
t=(*t).next;
}
}
int dishes::zapoln_vis(int num, System::Windows::Forms::DataGridView^ dGV,System::Windows::Forms::ComboBox^ CB)
{
nodeD *t=head;
for (int i=0;i<num;i++)
{
if (!(*t).next)
return -1;
t=(*t).next;
}
dGV->Rows->Clear();
nodeI *k=(*t).vis;
while (k)
{
dGV->Rows->Add(System::Convert::ToString((*k).ingrName),CB->Items[(*k).ingrName],System::Convert::ToString((*k).kv));
k=(*k).next;
}
return 0;
}
System::String^ dishes::show_rec(int dish)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return "-1"; //если блюдо не найдено
t=(*t).next;
}
return marshal_as<System::String^>((*t).recipe);
}
int dishes::new_id()
{
nodeD *t=head;
int i=0;
while (t)
{
(*t).id=i;
i++;
t=(*t).next;
}
return i;
}
int dishes::save_to_file(System::String^ path)
{
path=path+".dish";
char* ch_path=(char*)(void*)Marshal::StringToHGlobalAnsi(path);
ofstream io(ch_path,ios::binary|ios::trunc);
if(!io)
return -2;
int strln1,strln2,kv_ingr;
nodeD *t=head;
while (t)
{
io.write("!",sizeof(char)); //обозначение начала записи блока
io.write((char*)(&(*t).id),sizeof(int));
strln1=(*t).dishName.length();
io.write((char*)(&strln1),sizeof(int));
io.write((*t).dishName.c_str(),strln1);
strln2=(*t).recipe.length();
io.write((char*)(&strln2),sizeof(int));
io.write((*t).recipe.c_str(),strln2);
io.write((char*)(&(*t).price),sizeof(double));
kv_ingr=count_vis((*t).id);
io.write((char*)(&kv_ingr),sizeof(int));
nodeI *k=(*t).vis;
while (k)
{
io.write((char*)(&(*k).kv),sizeof(int));
io.write((char*)(&(*k).ingrName),sizeof(int));
k=(*k).next;
}
t=(*t).next;
}
io.write("#",sizeof(char)); //конец записи
io.close();
return 0;
}
int dishes::open_from_file(System::String^ path)
{
char* ch_path=(char*)(void*)Marshal::StringToHGlobalAnsi(path);
fstream out(ch_path,ios::binary| ios::in | ios::out);
if(!out)
return -2;
int strln1,strln2,id,kv_ingr;
double pr;
char *nm,*rc,ch;
string str1,str2;
clear(); ///!!!!!
while (!out.eof())
{
out.read((char*)(&ch),sizeof(char));
if (ch!=!)
{
out.close();
return 0;
}
out.read((char*)(&id),sizeof(int));
out.read((char*)(&strln1),sizeof(int));
nm=new char[strln1];
out.read(nm,strln1);
str1=nm;
str1=str1.substr(0,strln1);
out.read((char*)(&strln2),sizeof(int));
rc=new char[strln2];
out.read(rc,strln2);
str2=rc;
str2=str2.substr(0,strln2);
out.read((char*)(&pr),sizeof(double));
out.read((char*)(&kv_ingr),sizeof(int));
add(str1, str2, pr);
for (int i=0; i<kv_ingr; i++)
{
int i_kv,i_nm;
out.read((char*)(&i_kv),sizeof(int));
out.read((char*)(&i_nm),sizeof(int));
add_vis(id,i_nm, i_kv);
}
}
out.close();
return 0;
}
void dishes::clear ()
{
nodeD *t1,*t=head;
while (t)
{
t1=(*t).next;
nodeI *k1,*k=(*t).vis;
while (k)
{
k1=(*k).next;
delete k;
k=k1;
}
delete t;
t=t1;
}
head=NULL;
}
int dishes::del_ingr(int dish, int num)
{
nodeD *t;
t=head;
for (int i=0;i<dish;i++)
{
if (!(*t).next)
return -1; //если блюдо не найдено
t=(*t).next;
}
nodeI *k,*k1;
if(!(*t).vis)
return -1;
k=(*t).vis;
if (num==0)
{
(*t).vis=(*k).next;
delete k;
return 0;
}
for (int i =0; i<num;i++)
{
if (!(*k).next)
return -1; //если ингридиент в блюде не найден
k1=k;
k=(*k).next;
}
(*k1).next=(*k).next;
delete k;
return 0;
}
}
Приложенее 2. Листинг файла Add_dish.h
#pragma once
#include"Form1.h"
namespace povar_intr {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Add_dish
/// </summary>
public ref class Add_dish : public System::Windows::Forms::Form
{
public:
Add_dish(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
Add_dish(Form1^ parent)
{
InitializeComponent();
parentForm = parent;
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Add_dish()
{
if (components)
{
delete components;
}
}
private: Form1^ parentForm;
/*Определение компонентов*/
#pragma endregion
private: System::Void Cancel_Click(System::Object^ sender, System::EventArgs^ e)
{
this->Close();
}
private: System::Void Add_dish_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e)
{
parentForm->Set_active();
}
private: System::Void b_add_Click(System::Object^ sender, System::EventArgs^ e)
{
tb_Name->Text=tb_Name->Text->Trim();
tb_Rec->Text=tb_Rec->Text->Trim();
tb_Price->Text=tb_Price->Text->Trim();
int err=parentForm->CheckDouble(tb_Price, label5);
int err3=parentForm->CheckString(tb_Name, label6);
if (!(err||err3))
{
parentForm->Set_active();
parentForm->Add_d(tb_Name->Text,tb_Rec->Text,tb_Price->Text);
this->Close();
}
}
private: System::Void Add_dish_Load(System::Object^ sender, System::EventArgs^ e)
{
this->Text=parentForm->strings[55];
label3->Text = parentForm->strings[26];
label2->Text = parentForm->strings[25];
label1->Text = parentForm->strings[24];
b_add->Text = parentForm->strings[13];
Cancel->Text = parentForm->strings[23];
}
};
}
Приложенее 3. Листинг файла Edit_dish.h
#pragma once
#include "Form1.h"
namespace povar_intr {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Edit_dish
/// </summary>
public ref class Edit_dish : public System::Windows::Forms::Form
{
public:
Edit_dish(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
Edit_dish(Form1^ parent)
{
InitializeComponent();
parentForm = parent;
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Edit_dish()
{
if (components)
{
delete components;
}
}
private: Form1^ parentForm;
/*Определение компонентов*/
#pragma endregion
private: System::Void Cancel_Click(System::Object^ sender, System::EventArgs^ e)
{
this->Close();
}
private: System::Void Edit_dish_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e) {
parentForm->Set_active();
}
private: System::Void b_edit_Click(System::Object^ sender, System::EventArgs^ e)
{
tb_Name->Text=tb_Name->Text->Trim();
tb_Rec->Text=tb_Rec->Text->Trim();
tb_Price->Text=tb_Price->Text->Trim();
int err=parentForm->CheckDouble(tb_Price, label5);
int err3=parentForm->CheckString(tb_Name, label6);
if (!(err||err3))
{
parentForm->Set_active();
parentForm->Edit_d(tb_Name->Text,tb_Rec->Text,tb_Price->Text);
this->Close();
}
}
private: System::Void Edit_dish_Load(System::Object^ sender, System::EventArgs^ e)
{
this->Text=parentForm->strings[54];
label3->Text = parentForm->strings[26];
label2->Text = parentForm->strings[25];
label1->Text = parentForm->strings[24];
b_edit->Text = parentForm->strings[14];
Cancel->Text = parentForm->strings[23];
int rw=parentForm->dataGridView2->CurrentRow->Index;
tb_Name->Text=parentForm->dataGridView2[1,rw]->Value->ToString();
tb_Rec->Text=parentForm->label4->Text;
tb_Price->Text=parentForm->dataGridView2[2,rw]->Value->ToString();
}
};
}
Приложенее 4. Листинг файла Add_ingr.h
#pragma once
#include"Form1.h"
namespace povar_intr {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Add_ingr
/// </summary>
public ref class Add_ingr : public System::Windows::Forms::Form
{
public:
Add_ingr(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
Add_ingr(Form1^ parent)
{
InitializeComponent();
parentForm = parent;
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Add_ingr()
{
if (components)
{
delete components;
}
}
private: Form1^ parentForm;
/*Определение компонентов*/
#pragma endregion
private: System::Void Cancel_Click(System::Object^ sender, System::EventArgs^ e)
{
this->Close();
}
private: System::Void Add_ingr_Load(System::Object^ sender, System::EventArgs^ e)
{
this->Text=parentForm->strings[53];
label3->Text = parentForm->strings[26];
label2->Text = parentForm->strings[28];
label1->Text = parentForm->strings[27];
b_add->Text = parentForm->strings[13];
Cancel->Text = parentForm->strings[23];
}
private: System::Void b_add_Click(System::Object^ sender, System::EventArgs^ e)
{
tb_Name->Text=tb_Name->Text->Trim();
tb_Price->Text=tb_Price->Text->Trim();
tb_Kolvo->Text=tb_Kolvo->Text->Trim();
int err=parentForm->CheckInt(tb_Kolvo, label4);
int err2=parentForm->CheckDouble(tb_Price, label5);
int err3=parentForm->CheckString(tb_Name, label6);
if (!(err||err2||err3))
{
parentForm->Set_active();
parentForm->Add_i(tb_Name->Text,tb_Price->Text,tb_Kolvo->Text);
this->Close();
}
}
private: System::Void Add_ingr_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e)
{
parentForm->Set_active();
}
};
}
Приложенее 5. Листинг файла Edit_ingr.h
#pragma once
#include"Form1.h"
namespace povar_intr {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Edit_ingr
/// </summary>
public ref class Edit_ingr : public System::Windows::Forms::Form
{
public:
Edit_ingr(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
}
Edit_ingr(Form1^ parent)
{
InitializeComponent();
parentForm = parent;
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Edit_ingr()
{
if (components)
{
delete components;
}
}
protected: private: Form1^ parentForm;
private: System::Void Edit_ingr_Load(System::Object^ sender, System::EventArgs^ e)
{
this->Text=parentForm->strings[52];
label3->Text = parentForm->strings[26];
label2->Text = parentForm->strings[28];
label1->Text = parentForm->strings[27];
b_edit->Text = parentForm->strings[14];
Cancel->Text = parentForm->strings[23];
int rw=parentForm->dataGridView1->CurrentRow->Index;
tb_Name->Text=parentForm->dataGridView1[1,rw]->Value->ToString();
tb_Kolvo->Text=parentForm->dataGridView1[2,rw]->Value->ToString();
tb_Price->Text=parentForm->dataGridView1[3,rw]->Value->ToString();
}
private: System::Void Cancel_Click(System::Object^ sender, System::EventArgs^ e)
{
this->Close();
}
private: System::Void b_edit_Click(System::Object^ sender, System::EventArgs^ e)
{
tb_Name->Text=tb_Name->Text->Trim();
tb_Price->Text=tb_Price->Text->Trim();
tb_Kolvo->Text=tb_Kolvo->Text->Trim();
int err=parentForm->CheckInt(tb_Kolvo, label4);
int err2=parentForm->CheckDouble(tb_Price, label5);
int err3=parentForm->CheckString(tb_Name, label6);
if (!(err||err2||err3))
{
parentForm->Set_active();
parentForm->Edit_i(tb_Name->Text,tb_Price->Text,tb_Kolvo->Text);
this->Close();
}
}
private: System::Void Edit_ingr_FormClosed(System::Object^ sender, System::Windows::Forms::FormClosedEventArgs^ e)
{
parentForm->Set_active();
}
};
}
Приложенее 6. Листинг файла Form1.h
#pragma once
#define ARRAY_SIZE 60
#include "ingr.h"
#include <msclrmarshal_cppstd.h>
#include <iostream>
#include <fstream>
using namespace std;
using namespace msclr::interop;
namespace povar_intr {
ingr a;
dishes b;
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
/// <summary>
/// Summary for Form1
/// </summary>
public ref class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}
protected:
/// <summary>
/// Clean up any resources being used.
/// </summary>
~Form1()
{
if (components)
{
delete components;
}
}
/*Определение всех компонентов*/
#pragma endregion
System::Void ChangeLang(string path)
{
strings = gcnew array< String^ >(ARRAY_SIZE);
int i=0;
string str;
fstream file;
file.open(path);
while(file)
{
getline(file, str);
strings[i]=marshal_as<System::String^>(str);
i++;
}
file.close();
label2->Text=strings[50];
label3->Text=strings[30];
groupBox1->Text=strings[49];
b_add->Text=strings[13];
b_edit->Text=strings[14];
b_del->Text=strings[15];
b_add_dish->Text=strings[17];
b_dish_del->Text=strings[19];
b_edit_dish->Text=strings[20];
button1->Text=strings[21];
b_del_ingr->Text=strings[22];
файлToolStripMenuItem->Text=strings[0];
создToolStripMenuItem->Text=strings[1];
открToolStripMenuItem->Text=strings[2];
сохрToolStripMenuItem->Text =strings[3];
выходToolStripMenuItem1->Text=strings[4];
просмотрToolStripMenuItem->Text=strings[5];
ингридиентыToolStripMenuItem->Text=strings[6];
блюдаToolStripMenuItem->Text =strings[7];
параметрыToolStripMenuItem->Text=strings[8];
языкToolStripMenuItem->Text =strings[9];
помощьToolStripMenuItem->Text =strings[12];
b_rec_show->Text=strings[45];
dataGridView1->Columns[1]->HeaderText =strings[27];
dataGridView1->Columns[2]->HeaderText = strings[28];
dataGridView1->Columns[3]->HeaderText = strings[26];
dataGridView2->Columns[1]->HeaderText = strings[24];
dataGridView2->Columns[2]->HeaderText = strings[26];
dataGridView2->Columns[3]->HeaderText = strings[29];
dataGridView3->Columns[1]->HeaderText = strings[27];
dataGridView3->Columns[2]->HeaderText = strings[30];
}
private: System::Void engToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
ChangeLang("eng.txt");
}
System::Void ShowError(int e)
{
if (!e)
return;
String ^str;
switch(e)
{ case -1:str=strings[31];break;
case -2:str=strings[32];break;
case -3:str=strings[32];break;
case -7:str=strings[33];break;
case -8:str=strings[34];break;
case -9:str=strings[35];break;
default: str=strings[36];break;
}
MessageBox::Show(str);
}
public:
System::Void Add_d(String ^s1, String ^s2, String ^s3)
{
string str=marshal_as<std::string>(s1);
string str2=marshal_as<std::string>(s2);
int err=b.add(str,str2,System::Convert::ToDouble(s3));
ShowError(err);
b.zapoln(dataGridView2);
}
public:
int CheckString(TextBox ^s1, Label ^l)
{
if (String::IsNullOrEmpty(s1->Text) || !String::Compare(s1->Text,""))
{
//l->Text="Поле не должно быть пустым!";
l->Text=strings[37];
return -6;
}
l->Text="";
return 0;
}
public:
int CheckInt(TextBox ^s1, Label ^l)
{
int temp=-1;
try
{
temp=System::Convert::ToInt32(s1->Text);
}
catch (...)
{
/*l->Text="Введите целое положительное число!";*/
l->Text=strings[38];
return -4;
}
if(temp<0)
{
/*l->Text="Число не может быть меньше нуля!";*/
l->Text=strings[39];
return -5;
}
l->Text="";
return 0;
}
public:
int CheckDouble (TextBox ^s1, Label ^l)
{
double temp=-1;
try
{
temp=System::Convert::ToDouble(s1->Text);
}
catch (...)
{
/*l->Text="Введите дробное положительное число!";*/
l->Text=strings[40];
return -4;
}
if(temp<0)
{
/*l->Text="Число не может быть меньше нуля!";*/
l->Text=strings[41];
return -5;
}
l->Text="";
return 0;
}
public:
System::Void Set_active()
{
this->Enabled=true;
}
public:
System::Void Add_i(String ^s1, String ^s2, String ^s3)
{
string str=marshal_as<std::string>(s1);
int err=a.add(str,System::Convert::ToDouble(s2),System::Convert::ToInt32(s3));
ShowError(err);
a.zapoln(dataGridView1,comboBox1);
}
public:
System::Void Edit_i( String ^s1, String ^s2, String ^s3)
{
string str=marshal_as<std::string>(s1);
int rw=dataGridView1->CurrentRow->Index;
int err=a.edit_num(System::Convert::ToInt32(dataGridView1[0,rw]->Value),str,System::Convert::ToDouble(s2),System::Convert::ToInt32(s3));
ShowError(err);
a.zapoln(dataGridView1,comboBox1);
}
public:
System::Void Edit_d (String ^s1, String ^s2, String ^s3)
{
int rw=dataGridView2->CurrentRow->Index;
string str=marshal_as<std::string>(s1);
string str2=marshal_as<std::string>(s2);
int err=b.edit_dish (rw, str, str2, System::Convert::ToDouble(s3));
ShowError(err);
b.zapoln(dataGridView2);
}
private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e);
private: System::Void button3_Click(System::Object^ sender, System::EventArgs^ e)
{
a.zapoln(dataGridView1,comboBox1);
}
private: System::Void b_edit_Click(System::Object^ sender, System::EventArgs^ e);
private: System::Void b_del_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView1->Rows->Count)
return;
int rw=dataGridView1->CurrentRow->Index;
int temp=b.count_all_ingr(rw);
if (!temp)
{
a.del_num(System::Convert::ToInt32(dataGridView1[0,rw]->Value));
a.zapoln(dataGridView1,comboBox1);
isSaved=false;
}
else
// MessageBox::Show("Ошибка! Этот ингридиент используется в "+System::Convert::ToString(temp)+" блюдах!");
MessageBox::Show(strings[42]+System::Convert::ToString(temp)+strings[43]);
}
private: System::Void b_add_dish_Click(System::Object^ sender, System::EventArgs^ e);
private: System::Void dataGridView2_SelectionChanged(System::Object^ sender, System::EventArgs^ e)
{
int rw=dataGridView2->CurrentRow->Index;
b.zapoln_vis(rw,dataGridView3,comboBox1);
}
private: System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e)
{
if (comboBox1->Text->Equals(String::Empty))
return;
int err2=CheckInt(textBox7, label1);
if (label1->Text== nullptr || label1->Text->Equals(String::Empty))
{
isSaved=false;
int rw=dataGridView2->CurrentRow->Index;
int err=b.add_vis(rw,comboBox1->SelectedIndex,System::Convert::ToInt32(textBox7->Text));
ShowError(err);
b.zapoln_vis(rw,dataGridView3,comboBox1);
}
else
MessageBox::Show(label1->Text,strings[48]);
}
private: System::Void b_del_ingr_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView3->Rows->Count)
return;
isSaved=false;
int rw=dataGridView2->CurrentRow->Index;
int rw2=dataGridView3->CurrentRow->Index;
b.del_ingr(rw,rw2);
b.zapoln_vis(rw,dataGridView3,comboBox1);
}
private: System::Void b_dish_del_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView2->Rows->Count)
return;
isSaved=false;
int rw=dataGridView2->CurrentRow->Index;
b.del_dish(rw);
b.zapoln(dataGridView2);
}
private: System::Void b_edit_dish_Click(System::Object^ sender, System::EventArgs^ e);
private: System::Void выходToolStripMenuItem1_Click(System::Object^ sender, System::EventArgs^ e)
{
Application::Exit();
}
private: System::Void ингридиентыToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
panel2->Visible=true;
panel1->Visible=false;
this->Text=strings[6];
}
private: System::Void блюдаToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
panel1->Visible=true;
panel2->Visible=false;
this->Text=strings[7];
}
private: System::Void Form1_SizeChanged(System::Object^ sender, System::EventArgs^ e)
{
panel2->Width=this->Width-20;
panel2->Height=this->Height-70;
dataGridView1->Width=panel2->Width-10;
dataGridView1->Height=panel2->Height-50;
dataGridView1->Columns[0]->Width = dataGridView1->Width/12*1;
dataGridView1->Columns[1]->Width =dataGridView1->Width/12*5;
dataGridView1->Columns[2]->Width = dataGridView1->Width/12*3;
dataGridView1->Columns[3]->Width = dataGridView1->Width/12*4;
dataGridView2->Columns[0]->Width = dataGridView2->Width/12*1;
dataGridView2->Columns[1]->Width =dataGridView2->Width/12*4;
dataGridView2->Columns[2]->Width = dataGridView2->Width/12*3;
dataGridView2->Columns[3]->Width = dataGridView2->Width/12*4;
dataGridView3->Columns[0]->Width = dataGridView3->Width/10*1;
dataGridView3->Columns[1]->Width =dataGridView3->Width/10*4;
dataGridView3->Columns[2]->Width = dataGridView3->Width/10*4;
}
private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e)
{
isSaved=true;
ChangeLang("rus.txt");
//a.open_from_file();
// b.open_from_file();
a.zapoln(dataGridView1,comboBox1);
b.zapoln(dataGridView2);
Form1_SizeChanged(sender,e);
}
private: System::Void panel2_Paint(System::Object^ sender, System::Windows::Forms::PaintEventArgs^ e) {
}
private: System::Void rusToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
ChangeLang("rus.txt");
}
private: System::Void uaToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e) {
ChangeLang("ua.txt");
}
private: System::Void button3_Click_1(System::Object^ sender, System::EventArgs^ e) {
}
private: System::Void b_rec_show_Click(System::Object^ sender, System::EventArgs^ e)
{
if(!dataGridView2->Rows->Count)
return;
int rw=dataGridView2->CurrentRow->Index;
String ^ str;
str=b.show_rec(rw);
if (str == nullptr || str->Equals(String::Empty))
str=strings[47];
MessageBox::Show(str,strings[46]+" ""+dataGridView2[1,rw]->Value->ToString()+""",MessageBoxButtons::OK,MessageBoxIcon::Information);
}
private: System::Void сохрToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
if ( saveFileDialog1->ShowDialog() == Windows::Forms::DialogResult::OK)
{
b.save_to_file(saveFileDialog1->FileName);
a.save_to_file(saveFileDialog1->FileName);
MessageBox::Show(strings[44]);//успешно сохранено!
isSaved=true;
}
}
private: System::Void comboBox1_KeyDown(System::Object^ sender, System::Windows::Forms::KeyEventArgs^ e)
{
nonNumberEntered = false;
if(e->KeyCode!=Keys::Down && e->KeyCode!=Keys::Up)
nonNumberEntered = true;
}
private: System::Void comboBox1_KeyPress_1(System::Object^ sender, System::Windows::Forms::KeyPressEventArgs^ e)
{
if (nonNumberEntered)
e->Handled = true;
}
private: System::Void помощьToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
MessageBox::Show(strings[51],strings[12],MessageBoxButtons::OK,MessageBoxIcon::Information);
}
private: System::Void открToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
if ( openFileDialog1->ShowDialog() == Windows::Forms::DialogResult::OK)
{
String^ path=openFileDialog1->FileName->Remove(openFileDialog1->FileName->Length-5)+".dish";
if (!(IO::File::Exists(path)))
{
MessageBox::Show(strings[56]);//не найден файл!
return;
}
b.open_from_file(path);
a.open_from_file(openFileDialog1->FileName);
a.zapoln(dataGridView1,comboBox1);
b.zapoln(dataGridView2);
isSaved=true;
}
}
private: System::Void создToolStripMenuItem_Click(System::Object^ sender, System::EventArgs^ e)
{
if (!isSaved)
if(MessageBox::Show(strings[57],strings[58],MessageBoxButtons::YesNo)== Windows::Forms::DialogResult::Yes)
сохрToolStripMenuItem_Click(sender, e);
a.clear();
b.clear();
a.zapoln(dataGridView1,comboBox1);
b.zapoln(dataGridView2);
}
};
}
Создание приложения, способного содержать в себе сведенья о количестве продуктов на складе
Курсовая работа по предмету «Программирование»