Анимация кривошипно-шатунного механизма с присоединенной кулисой
Разработка программы, выводящей на экран механизм с возможностью изменения масштаба, скорости вращения звена, сохранения и считывания входных данных из файла в среде разработки MS Visual C#. Блок-схема ее работы. Принцип работы движущихся элементов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 27.06.2013 |
Размер файла | 860,6 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное агентство по образованию
МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ МАШИНОСТРОИТЕЛЬНЫЙ УНИВЕРСИТЕТ
Факультет: машиностроительный
Кафедра: САПР
КУРСОВАЯ РАБОТА
ДИСЦИПЛИНА: “Лингвистическое и программное обеспечение
САПР”
ТЕМА РАБОТЫ: “Анимация кривошипно-шатунного механизма с
присоединенной кулисой”
Вариант №3-9
Выполнил:
Студент
группы М27-4к
Копылов О.В.
Москва - 2013
Содержание
Задание к курсовой работе
Содержание
Введение
1. Этапы выполнения курсовой работы
2. Этапы разработки программы
2.1 Блок-схема работы программы
2.2 Создание проекта «Kopylov_Mechanics» в MS Visual C#
2.3 Создаем меню
2.4 Описание использованных в программе функций
2.5 Принцип работы Движущихся элементов
2.6 Void Picture
Заключение
Листинг программы
Main.cs
Options.cs
Задание к курсовой работе
по дисциплине «Программное обеспечение САПР»
ДАНО
1. Кинематическая схема плоского рычажного механизма согласно номеру задания.
2. Ведущее звено АВ совершает полный оборот относительно начала системы координат XY (кинематическая пара А на схеме механизма).
3. Некоторые размеры рычажного механизма согласно варианту задания.
ЗАДАНИЕ
Разработать многооконное программное обеспечение. Главное окно должно иметь стандартную панель падающих меню, панель инструментов и клиентскую область.
Программное обеспечение должно обеспечивать:
1. Ввод незаданных исходных данных, выполненный в виде отдельного диалогового окна:
1.1 скорости вращения ведущего звена в зависимости от времени;
1.2 размеров и длин звеньев механизма в мм;
1.3 координат размещения кинематических пар, связанных с неподвижным основанием, в мм;
1.4 число положений механизма;
1.5 масштаб отображения кинематической схемы механизма.
2. Вывод в клиентской области исходных данных механизма.
3. Проверку условий проворачиваемости механизма.
4. Графическое построение в клиентской области минимум 12 положений механизма в зависимости от угла поворота ведущего звена АВ, выполненных в мм согласно выбранному масштабу.
5. Анимацию движения механизма, построенному в мм согласно выбранному масштабу, в зависимости от величины угловой скорости ведущего звена АВ.
6. Сохранение и восстановление заданных исходных данных в пункте 1.
7. Сохранение и восстановление графического отображения механизма и заданных исходных данных в клиентской области.
Длина звена АВ = 150 мм
Т. D-Lx = -270
Т. D-Ly = -40
Т.D-Le = 150
Введение
Данная курсовая работа посвящена разработке программы, которая выводит на экран заданный механизм. Механизм анимирован, пользователь может изменять длины звеньев, не нарушая при этом целостность механизма, так же в программе предусмотрена возможность изменения скорости вращения входного звена. Есть возможность изменения масштаба.
Предусмотрена возможность сохранения и считывания входных данных из файла.
1. Этапы выполнения курсовой работы
* Анализ задания
* Проверка механизма
* Аналитический расчет механизма
* Создание программы на языке C#
2. Этапы разработки программы
2.1 Блок-схема работы программы
2.2 Создание проекта «Kopylov_Mechanics» в MS Visual C#
1. Запускаем Visual С#. Нажимаем Файл -> Создать -> Проект
2. Выбираем Visual C#?В окне по середине выбираем Приложение Windows Forms
В графе имя вводим название проекта, в графе Расположение выбираем путь где будет хранится исходные файлы программы.
3. Нажимаем ОК чтобы создать проект
2.3 Создаем меню
Для меню нам понадобятся:
Открываем «Панель инструментов» на форме размещаем 5(Старт, Стоп, Параметры, Save, Load) кнопок , 1 NumericUpDown (для контроливания скорости вращения) и PictureBox
Далее расположим все элементы на форме должным образом
2.4 Описание использованных в программе функций
Main.cs:
1.1 Создание точек на экране вывода (шарниры)
void Hinge
1.2 Создание «треугоников» для шарниров
void Pillar
1.3 Маштабирование:
void NewSizes
1.4 Создание Прямоугольников:
void Plunger
1.5 Создание плоскости, которая ограничивает движение «точки» E :
void Base
1.6 Расчет и построение точек и дальнейшее построение по ним необходимым линий для окна вывода:
void Picture()
1.7 Действия происходящие после нажатия на кнопку «Старт»:
private void pysk_Click
1.8 Таймер для контролирования выполнений операций за опр. Кол-во времени(скорость движения)(осуществляется после того как мы изменили данные в NumericUpDown с Name DgUD) :
private void DgUD_ValueChanged
1.9 Вызов второго окна для изменения данных:
private void btPrm_Click
Options.cs:
1.10 Выполняется при первом отображении формы:
private void PrmForm_Shown
1.11 Выполняется при закрытии формы:
private void PrmForm_FormClosing
1.12 Выполняется при изменении TextBox с name “mash”:
private void mash_TextChanged
1.13 Выполняется по нажатию кнопки ОК:
private void ok_Click
1.14 Выполняется по нажатию кнопки cancel
private void cancel_Click
Для создания второй формы необходимо:
Кликнуть правой клавишей мыши на наименование проекта в «обозревателе решений». Далее кнопка «добавить», а после «Форма Windows…». И у нас создастся новая форма с именем «FormN.cs» где N порядковый номер формы (если не менять её название)
2.5 Принцип работы движущихся элементов
Для осуществления передвижения всех необходимых элементов используем следующие формулы:
1.1 точка B
Находим угол:
Ang = Math.Acos(CyA / AB) + Math.PI / 2;
Находим точку B по 2 осям x и y:
Bx = Ax + AB * Scl * (float)Math.Cos(Ang);
By = Ay - AB * Scl * (float)Math.Sin(Ang);
1.2 точка D
Находим угол:
a = Math.Atan2(Cy - By, Bx - Cx)
Находим точку D по 2 осям x и y:
Dx = Cx + CD * (float)Math.Cos(a) * Scl;
Dy = Cy - CD * (float)Math.Sin(a) * Scl;
1.3 Точка E
Находим угол:
a = Math.Asin((Dx - Ex) / DE / Scl);
Находим точку E по 2 осям x и y:
Ey = Dy + DE * (float)Math.Cos(a) * Scl;
Ex - нам дана по условию
2.6 Viod Picture именно в нем происходят расчеты тотрисовка всех элементов на pirtureBox
void Picture()
{
using (Graphics Gr = Graphics.FromImage(PB.Image))
{
Gr.SmoothingMode = SmoothingMode.HighQuality;
Gr.Clear(Color.White);
Font Fn = new Font("Bodoni MT", 10, FontStyle.Bold);
Gr.DrawString("AB = " + AB.ToString() + " mm", Fn, Brushes.Black, 0, 0);
Gr.DrawString("CD = " + CD.ToString() + " mm", Fn, Brushes.Black, 0, 20);
Gr.DrawString("DE = " + DE.ToString() + " mm", Fn, Brushes.Black, 0, 40);
Gr.DrawString("CyA = " + CyA.ToString() + " mm", Fn, Brushes.Black, 0, 60);
Gr.DrawString("Масштаб = " + Scl.ToString() + " pix/mm", Fn, Brushes.Black, 0, 80);
Pillar(Gr, Ax, Ay, "A");
Base(Gr);
Bx = Ax + AB * Scl * (float)Math.Cos(Ang);
By = Ay - AB * Scl * (float)Math.Sin(Ang);
Gr.DrawLine(Pens.Black, Bx, By, Ax, Ay);
double a = Math.Atan2(Cy - By, Bx - Cx);
Dx = Cx + CD * (float)Math.Cos(a) * Scl ;
Dy = Cy - CD * (float)Math.Sin(a) * Scl;
Gr.DrawLine(Pens.Black, Dx, Dy, Cx, Cy);
Hinge(Gr, Ax, Ay, "A");
Pillar(Gr, Cx, Cy, "C");
Plunger(Gr, Bx, By, a, "B");
a = Math.Asin((Dx - Ex) / DE / Scl);
Ey = Dy + DE * (float)Math.Cos(a) * Scl;
Gr.DrawLine(Pens.Black, Dx, Dy, Ex, Ey);
Hinge(Gr, Dx, Dy, "D");
Plunger(Gr, Ex, Ey, Math.PI / 2, "E");
PB.Refresh();
}
}
механизм программа visual файл
Заключение
В ходе выполнения данной курсовой работы были освоены основные приемы создания приложений и распространенные функции для работы с графикой в среде разработки MS Visual C#.
Листинг программы
Main.cs:
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.IO;
using System.Windows.Forms;
namespace Kopylov_Mechanics
{
public partial class MyForm : Form
{
float Ax = 400;
float Ay = 200;
public float AB = 80;
public float CD = 450 + 40; // Cx ->
public float DE = 200;
public float DxEx = -130; //d
public float CyA = 0;
public float CyB = 130;
float AxD;
float CAx;
double Ang, dAng;
float Bx, By, Cx, Cy, Dx, Dy, Ex, Ey;
public float Scl = 1;
public int Clockwise = -1;
public bool PrmClose;
bool bExit, bStop;
long lPause;
public MyForm()
{
InitializeComponent();
NewSizes(false);
}
private void MyForm_Resize(object sender, EventArgs e)
{
if (PB.Width > 0 && PB.Height > 0)
{
if (PB.Image != null) PB.Image.Dispose();
PB.Image = new Bitmap(PB.Width, PB.Height);
Picture();
}
}
void Hinge(Graphics Gr, float x,float y,string ch)
{
Gr.FillEllipse(Brushes.Gray, x - 5, y - 5, 10, 10);
Gr.DrawEllipse(Pens.Black, x - 5, y - 5, 10, 10);
Gr.DrawString(ch, new Font("Bodoni MT", 10, FontStyle.Bold), Brushes.Black, x + 5, y - 20);
}
void Pillar(Graphics Gr,float x, float y,string ch)
{
PointF[] Tr = { new PointF(0, 0), new PointF(10, 20), new PointF(-10, 20 ) };
for (int i = 0; i < 3; i++)
{
Tr[i].X += x;
Tr[i].Y += y;
}
Gr.DrawPolygon(Pens.Black, Tr);
Hinge(Gr, x, y,ch);
PointF Pnt1=PointF.Add(Tr[2], new SizeF(-7, 0));
PointF Pnt2=PointF.Add(Tr[1], new SizeF( 7, 0));
Gr.FillRectangle(new HatchBrush(HatchStyle.BackwardDiagonal, Color.Black, Color.White),
new RectangleF(Pnt1, new SizeF(Pnt2.X - Pnt1.X, 10)));
Gr.DrawLine(Pens.Black, Pnt1, Pnt2);
}
void NewSizes(bool bNewPrm)
{
do
{
AxD = (CD - 130) / 2;
CAx = CD - AxD ;
if (!bStop && !bNewPrm) Ang = Math.Acos(CyA / AB) + Math.PI / 2;
Cx = 50* Scl ; // Cx
float AC = (float)Math.Sqrt((Ax - Cx) * (Ax - Cx) + CyA * Scl * CyA * Scl);
if (Cx >= 30)
{
Cy = Ay - CyA * Scl ;
Ex = 670 * Scl ;
DgUD_ValueChanged(DgUD, new EventArgs());
}
else Ax += 31 - Cx;
if (Cy < 130) Ay += 131 - Cy;
double a = Math.Asin(AB * Scl / AC);
a -= Math.Asin(CyA * Scl / AC);
Dy = Ay - CyA * Scl - CD * Scl * (float)Math.Sin(a);
if (Dy < 30) Ay += 31 - Dy;
} while (Cx < 30 || Cy < 130 || Dy < 30);
}
void Plunger(Graphics Gr, float x, float y, double a,string ch)
{
float HalfW = 15;
float HalfH = 8;
double an = Math.Atan(HalfH / HalfW);
float HalfD = HalfW / (float)Math.Cos(an);
PointF[] Rc = new PointF[4];
Rc[0] = new PointF(x + HalfD * (float)Math.Cos(a + an), y - HalfD * (float)Math.Sin(a + an));
Rc[1] = new PointF(x + HalfD * (float)Math.Cos(a - an), y - HalfD * (float)Math.Sin(a - an));
double aa = a + Math.PI + an;
Rc[2] = new PointF(x + HalfD * (float)Math.Cos(aa), y - HalfD * (float)Math.Sin(aa));
aa = a + Math.PI - an;
Rc[3] = new PointF(x + HalfD * (float)Math.Cos(aa), y - HalfD * (float)Math.Sin(aa));
Gr.FillPolygon(Brushes.White, Rc);
Gr.DrawPolygon(Pens.Black, Rc);
Hinge(Gr, x, y, ch);
}
void Base(Graphics Gr)
{
Gr.FillRectangle(new HatchBrush(HatchStyle.BackwardDiagonal, Color.Black, Color.White),
Ex - 20, Ay, 10, DE * 2 * Scl);
Gr.DrawLine(Pens.Black, Ex - 10, Ay, Ex - 10, Ay + DE * 2 * Scl);
}
void Way()
{
using (Graphics Gr = Graphics.FromImage(PB.Image))
{
System.Drawing.Drawing2D.GraphicsPath path = new System.Drawing.Drawing2D.GraphicsPath();
}
}
void Picture()
{
using (Graphics Gr = Graphics.FromImage(PB.Image))
{
Gr.SmoothingMode = SmoothingMode.HighQuality;
Gr.Clear(Color.White);
Font Fn = new Font("Bodoni MT", 10, FontStyle.Bold);
Gr.DrawString("AB = " + AB.ToString() + " mm", Fn, Brushes.Black, 0, 0);
Gr.DrawString("CD = " + CD.ToString() + " mm", Fn, Brushes.Black, 0, 20);
Gr.DrawString("DE = " + DE.ToString() + " mm", Fn, Brushes.Black, 0, 40);
Gr.DrawString("CyA = " + CyA.ToString() + " mm", Fn, Brushes.Black, 0, 60);
Gr.DrawString("Масштаб = " + Scl.ToString() + " pix/mm", Fn, Brushes.Black, 0, 80);
Pillar(Gr, Ax, Ay, "A");
Base(Gr);
Bx = Ax + AB * Scl * (float)Math.Cos(Ang);
By = Ay - AB * Scl * (float)Math.Sin(Ang);
Gr.DrawLine(Pens.Black, Bx, By, Ax, Ay);
double a = Math.Atan2(Cy - By, Bx - Cx);
Dx = Cx + CD * (float)Math.Cos(a) * Scl ;
Dy = Cy - CD * (float)Math.Sin(a) * Scl;
Gr.DrawLine(Pens.Black, Dx, Dy, Cx, Cy);
Hinge(Gr, Ax, Ay, "A");
Pillar(Gr, Cx, Cy, "C");
Plunger(Gr, Bx, By, a, "B");
a = Math.Asin((Dx - Ex) / DE / Scl);
Ey = Dy + DE * (float)Math.Cos(a) * Scl;
Gr.DrawLine(Pens.Black, Dx, Dy, Ex, Ey);
Hinge(Gr, Dx, Dy, "D");
Plunger(Gr, Ex, Ey, Math.PI / 2, "E");
PB.Refresh();
}
}
private void pysk_Click(object sender, EventArgs e)
{
NewSizes(true);
double Pi2 = Math.PI * 2;
bExit = false;
bStop = false;
long lOldTicks;
this.Focus();
do
{
lOldTicks = DateTime.Now.Ticks;
Picture();
Way();
if (!bStop)
{
Ang += dAng;
if (Ang >= Pi2) Ang -= Pi2;
else if (Ang <= -Pi2) Ang += Pi2;
}
do
{
Application.DoEvents();
} while (DateTime.Now.Ticks - lOldTicks < lPause);
} while (!bExit);
}
private void DgUD_ValueChanged(object sender, EventArgs e)
{
lPause = 625000; //1/16
dAng = (double)DgUD.Value / 180 * Math.PI * Clockwise / (10000000 / lPause);
this.Focus();
}
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
bExit = true;
}
private void btStop_Click(object sender, EventArgs e)
{
bStop = true;
}
private void btPrm_Click(object sender, EventArgs e)
{
Options Prm = new Options(this);
Prm.ShowDialog();
NewSizes(true);
Picture();
}
private void btSave_Click(object sender, EventArgs e)
{
}
bool fRead(StreamReader SR, out float fres)
{
string str = SR.ReadLine().Replace(".", ",");
string[] arr = str.Split('=');
return float.TryParse(arr[1], out fres);
}
bool iRead(StreamReader SR, out int ires)
{
string str = SR.ReadLine();
string[] arr = str.Split('=');
return int.TryParse(arr[1], out ires);
}
private void btLoad_Click(object sender, EventArgs e)
{
}
private void btSave_Click_1(object sender, EventArgs e)
{
SD.InitialDirectory = Application.StartupPath;
if (SD.ShowDialog() == DialogResult.OK)
{
StreamWriter SW = new StreamWriter(SD.FileName);
for (int i = 0; i < 8; i++)
{
switch (i)
{
case 0: SW.WriteLine("AB=" + AB.ToString()); break;
case 1: SW.WriteLine("CD=" + CD.ToString()); break;
case 2: SW.WriteLine("DE=" + DE.ToString()); break;
case 3: SW.WriteLine("CyA=" + CyA.ToString()); break;
case 4: SW.WriteLine("Масштаб=" + Scl.ToString()); break;
case 5: SW.WriteLine("Угол=" + Ang.ToString()); break;
case 6: SW.WriteLine("Clockwise=" + Clockwise.ToString()); break;
default: SW.WriteLine("w=" + DgUD.Value.ToString()); break;
}
}
SW.Close();
}
}
private void btLoad_Click_1(object sender, EventArgs e)
{
OD.InitialDirectory = Application.StartupPath;
if (OD.ShowDialog() == DialogResult.OK)
{
int ires;
float fres;
StreamReader SR = new StreamReader(OD.FileName);
for (int i = 0; SR.Peek() >= 0; i++)
{
switch (i)
{
case 0: if (fRead(SR, out fres)) AB = fres; break;
case 1: if (fRead(SR, out fres)) CD = fres; break;
case 2: if (fRead(SR, out fres)) DE = fres; break;
case 3: if (fRead(SR, out fres)) CyA = fres; break;
case 4: if (fRead(SR, out fres)) Scl = fres; break;
case 5: if (fRead(SR, out fres)) Ang = fres; break;
case 6: if (iRead(SR, out ires)) Clockwise = ires; break;
default: if (iRead(SR, out ires)) DgUD.Value = ires; break; ;
}
}
SR.Close();
PrmClose = true;
btPrm_Click(param, new EventArgs());
PrmClose = false;
}
}
private void CBChange_CheckedChanged(object sender, EventArgs e)
{
}
}
}
Options.cs:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Kopylov_Mechanics
{
public partial class Options : Form
{
MyForm MF;
float Scl;
bool bSave;
public Options(MyForm Owner)
{
InitializeComponent();
MF = Owner;
}
private void PrmForm_Shown(object sender, EventArgs e)
{
AB.Value = (decimal)MF.AB;
CD.Value = (decimal)MF.CD;
DE.Value = (decimal)MF.DE;
CyA.Value = (decimal)MF.CyA;
Scl = MF.Scl;
Mash.Text = Scl.ToString();
if (MF.Clockwise == -1) RB1.Checked = true;
else RB2.Checked = true;
if (MF.PrmClose) ok_Click(ok, new EventArgs());
}
private void PrmForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (bSave)
{
MF.AB = (float)AB.Value;
MF.CD = (float)CD.Value;
MF.DE = (float)DE.Value;
MF.CyA = (float)CyA.Value;
MF.Scl = Scl;
MF.Clockwise = RB1.Checked ? -1 : 1;
}
}
private void mash_TextChanged(object sender, EventArgs e)
{
float res;
Mash.Text = Mash.Text.Replace(".", ",");
if (float.TryParse(Mash.Text, out res)) Scl = res;
else Mash.Text = Scl.ToString();
}
private void ok_Click(object sender, EventArgs e)
{
if (AB.Value < CyA.Value) MessageBox.Show("Звено AB меньше расстояния CyA!");
else
{
float AxD = ((float)CD.Value - 150) / 2;
float CAx = (float)CD.Value - AxD;
float CA = (float)Math.Sqrt(CAx * CAx + (float)CyA.Value * (float)CyA.Value);
if ((float)AB.Value > CA) MessageBox.Show("Звено AB больше расстояния CA !");
else
{
float AD = (float)CD.Value - CA;
if (AD < (float)AB.Value) MessageBox.Show("Расстояние AD может быть меньше звена AB !");
else
{
float CE = (float)CD.Value - MF.DxEx;
float cos = CE / (float)(CD.Value - DE.Value);
if (cos < 1) MessageBox.Show("Звена DE может быть не достаточно для достижения опорной поверхности !");
else bSave = true;
}
}
}
if(bSave) Close();
}
private void cancel_Click(object sender, EventArgs e)
{
Close();
}
}
}
Размещено на Allbest.ru
Подобные документы
Проект оболочки моделирования кривошипно-шатунного механизма в среде MS Visual Studio. Разработка его математической модели. Исследование кинематики точек В, С, М. Алгоритм и код программы. Анимация движения механизма и график движения основных точек.
курсовая работа [422,2 K], добавлен 13.03.2016Основы проверки и расчета входных данных и вывода выходных данных программы, их блок-схемы. Реализация функции считывания числовых данных из файла, управление (создание, уничтожение и редактирование) визуальными компонентами во время выполнения программы.
контрольная работа [1,3 M], добавлен 12.06.2009Описание работы элементов программы в виде блок-схем. Анализ структурной схемы модели домофона. Блок-схема работы открытия двери ключом. Моделирование в Proteus: принцип динамического опроса и индикации, внешний вид жидкокристаллического дисплея.
курсовая работа [1,4 M], добавлен 12.04.2019Алгоритм и код программы для создания исходного двоичного файла чисел с произвольным количеством элементов, чтения из файла действительных восьмибайтных элементов и подсчёта общего количества элементов файла. Вывод результата работы программы на экран.
контрольная работа [1,0 M], добавлен 23.11.2014Процедура ввода исходных данных в программу, вывод результатов работы программы на экран. Принцип организации хранения логически связанных наборов информации в виде файлов. Параметры характеристики файла, способы обращения к нему, соглашения по типу.
реферат [14,5 K], добавлен 06.12.2011Характеристика программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит результаты на экран. Описание переменных в программе, ее блок-схема и алгоритм работы. Листинг программы. Описание входных данных и результат вычислений.
курсовая работа [721,4 K], добавлен 10.11.2010Разработка программы на языке VBA, которая вводит исходные данные, выполняет расчеты и выводит на экран заданную информацию. Типы блок-схем и их использование при написании программы. Описание входных данных и результат вычислений, листинг программы.
курсовая работа [680,3 K], добавлен 03.08.2009Создание типизированного файла, содержащего информацию о тестировании студентов по учебным дисциплинам. Описание необходимых входных данных. Используемые компоненты при разработке программы. Процедура Output, служащая для вывода базы данных на экран.
курсовая работа [907,1 K], добавлен 10.01.2015Сущность основных понятий объектно-ориентированного программирования: объект, класс, полиморфизм. Блок-схема алгоритма и текст программы для вычисления площади круга, прямоугольника и трапеции. Принцип работы и результаты тестирования приложения.
курсовая работа [588,7 K], добавлен 17.07.2012Создание приложения Windows Forms в среде Microsoft Visual Studio 2008. Разработка программы "Курсовой" для организации работы по учёту курсовых работ в учебных заведениях с возможностью добавления, удаления, редактирования и поиска информации.
курсовая работа [2,2 M], добавлен 28.06.2011