Моделирования маятника с подвижной точкой подвеса
Рассмотрение структурной схемы программы визуального проектирования маятника Капицы. Описание разработанного класса модели. Характеристика реализаций технологий Com. Определение динамических библиотек. Выявление возможностей созданной программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 05.02.2015 |
Размер файла | 933,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
var
Excel: Variant;
ExcelID : String;
i,j : Integer;
begin
ExcelID:='Excel.Application';
Excel:=CreateOleObject(ExcelID);
Excel.Application.DisplayAlerts:=false;
Excel.Workbooks.Add;
Excel.Range[Excel.Cells[1, 2], Excel.Cells[1, 6]].Select;
Excel.Selection.MergeCells:=True;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].Value:='Маятник';
for j:=2 to PendulumStringGrid.RowCount+2 do
for i:=2 to MainPendulumStringGrid.ColCount+2 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainPendulumStringGrid.Cells[i-2,j-2];
end;
Excel.Visible:=true;
Excel:=Unassigned;
end;
procedure TForm1.PopupMenu2ClearClick(Sender: TObject);//Очистка таблицы перевернутый маятник на главной вкладке
var
i : Integer;
begin
with MainInvertedpendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
end;
procedure TForm1.PopupMenu2SaveClick(Sender: TObject);//Сохранения таблицы перевернутый маятник
var
Excel: Variant;
ExcelID : String;
i,j : Integer;
begin
ExcelID:='Excel.Application';
Excel:=CreateOleObject(ExcelID);
Excel.Application.DisplayAlerts:=false;
Excel.Workbooks.Add;
Excel.Range[Excel.Cells[1, 2], Excel.Cells[1, 6]].Select;
Excel.Selection.MergeCells:=True;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].Value:='Обращенный маятник';
for j:=2 to MainInvertedpendulumStringGrid.RowCount+2 do
for i:=2 to MainInvertedpendulumStringGrid.ColCount+2 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainInvertedpendulumStringGrid.Cells[i-2,j-2];
end;
Excel.WorkBooks[1].SaveAs(GetCurrentDir()+'\Table\'+FormatDateTime('DDMMYYYYhhmmss', Now)+'Invertedpendulum');
Excel.Application.Quit;
Excel:=Unassigned;
end;
procedure TForm1.PopupMenu2ExcelClick(Sender: TObject);//Выводим таблицу перевернутый маятник
var
Excel: Variant;
ExcelID : String;
i,j : Integer;
begin
ExcelID:='Excel.Application';
Excel:=CreateOleObject(ExcelID);
Excel.Application.DisplayAlerts:=false;
Excel.Workbooks.Add;
Excel.Range[Excel.Cells[1, 2], Excel.Cells[1, 6]].Select;
Excel.Selection.MergeCells:=True;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].HorizontalAlignment:=3;
Excel.Workbooks[1].WorkSheets[1].Cells[1,2].Value:='Обращенный маятник';
for j:=2 to MainInvertedpendulumStringGrid.RowCount+2 do
for i:=2 to MainInvertedpendulumStringGrid.ColCount+2 do begin
Excel.Workbooks[1].WorkSheets[1].Cells[j,i].Value:=
MainInvertedpendulumStringGrid.Cells[i-2,j-2];
end;
Excel.Visible:=true;
Excel:=Unassigned;
end;
procedure TForm1.PopupMenu3ClearClick(Sender: TObject);//Очистка таблицы маятник в вкладке маятник
var
i : Integer;
begin
with PendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
end;
//Очистка таблицы перевернутый маятник в вкладке перевернутый маятник
procedure TForm1.PopupMenu4ClearClick(Sender: TObject);
var
i : Integer;
begin
with InvertedpendulumStringGrid do begin
for i:=FixedRows to RowCount-1 do
Rows[i].Clear;
RowCount:=2;
end;
end;
//PageControl//Заносим данные с перевенутого маятника в обычный маятник
procedure TForm1.MainSpeedButton1Click(Sender: TObject);
begin
if MainPanelCheckBox.Checked=false
then begin
MainPendulumEdit1.Text:=MainInvertedpendulumEdit1.Text;
MainPendulumEdit2.Text:=MainInvertedpendulumEdit2.Text;
MainPendulumEdit3.Text:=MainInvertedpendulumEdit3.Text;
MainPendulumEdit4.Text:=MainInvertedpendulumEdit4.Text;
end;
end;
//Заносим данные с обычного маятника в перевернутый маятник
procedure TForm1.MainSpeedButton2Click(Sender: TObject);
begin
if MainPanelCheckBox.Checked=false
then begin
MainInvertedpendulumEdit1.Text:=MainPendulumEdit1.Text;
MainInvertedpendulumEdit2.Text:=MainPendulumEdit2.Text;
MainInvertedpendulumEdit3.Text:=MainPendulumEdit3.Text;
MainInvertedpendulumEdit4.Text:=MainPendulumEdit4.Text;
end;
end;
//Строим обычный маятник
procedure TForm1.MainPendulumResClick(Sender: TObject);
begin
if (MainPendulumEdit1.Text='') or (MainPendulumEdit2.Text='') or (MainPendulumEdit3.Text='') or (MainPendulumEdit4.Text='') then exit;
if (OptionSeparatewindowCheckBox1.Checked=true) or (OptionMultipleinstancesCheckBox1.Checked=true)
then begin//Создаем дополнительное окно
FormPend:=TForm.Create(Application);
FormPend.BorderIcons:=[];
FormPend.Width:=700;
FormPend.Height:=700;
FormPend.AlphaBlend:=true;
FormPend.AlphaBlendValue:=200;
FormPend.Show;
end;
Pendul:=TPendulumThread.Create(true);//Создаем поток
Pendul.Resume;//Запускаем выполнения потока
MainPendulumRes.Enabled:=false;
MainPendulumStop.Enabled:=true;
MainMenuFileNew.Enabled:=false;
MainMenuFileOpen.Enabled:=false;
ToolButtonNew.Enabled:=false;
ToolButtonOpen.Enabled:=false;
ClosePend:=false;//Запрещаем выход до завершения построения маятника
Series1.Clear;//Очистка графика
if MainInvertedpendulumStop.Enabled<>true
then
MainPanelBitBtn1.Enabled:=false
else begin
MainPanelBitBtn1.Enabled:=true;
MainPanelBitBtn1.Caption:='Остановить все';
end;
StatusBar1.Panels.Items[1].Text:='Идет построение маятника.Начало:';
StatusBar1.Panels.Items[2].Text:=FormatDateTime('hh:mm:ss', Now);// Записываем дату начала построения
end;
//Останавливаем построения обычного маятника
procedure TForm1.MainPendulumStopClick(Sender: TObject);
begin
if Assigned(FormPend)//Проверям была ли использована доп. форма
then
FreeAndNil(FormPend);//Уничтожаем форму
FreeAndNil(Pendul);//Уничтожаем поток
MainPendulumRes.Enabled:=true;
MainPendulumStop.Enabled:=false;
if MainInvertedpendulumRes.Enabled=true
then begin
MainMenuFileNew.Enabled:=true;
MainMenuFileOpen.Enabled:=true;
ToolButtonNew.Enabled:=true;
ToolButtonOpen.Enabled:=true;
end;
ClosePend:=true;//Построение завершено
if MainInvertedpendulumRes.Enabled<>true
then
MainPanelBitBtn1.Enabled:=false
else begin
MainPanelBitBtn1.Enabled:=true;
MainPanelBitBtn1.Caption:='Построить все';
end;
StatusBar1.Panels.Items[1].Text:='Построение закончено.Конец:';
StatusBar1.Panels.Items[2].Text:=FormatDateTime('hh:mm:ss', Now);//Записывае дату конца построения маятника
end;
//Построения перевернутого маятника
procedure TForm1.MainInvertedpendulumResClick(Sender: TObject);
begin
if (MainInvertedpendulumEdit1.Text='') or (MainInvertedpendulumEdit2.Text='') or (MainInvertedpendulumEdit3.Text='') or (MainInvertedpendulumEdit4.Text='') then exit;
if (OptionSeparatewindowCheckBox2.Checked=true) or (OptionMultipleinstancesCheckBox2.Checked=true)
then begin//Создаем доп. форму
FormInvPend:=TForm.Create(Application);
FormInvPend.BorderIcons:=[];
FormInvPend.Width:=700;
FormInvPend.Height:=700;
FormInvPend.AlphaBlend:=true;
FormInvPend.AlphaBlendValue:=200;
FormInvPend.Show;
end;
InvPendul:=TInvertedPendulumThread.Create(true);//Создаем поток
InvPendul.Resume;//Запускаем выполнения потока
MainInvertedpendulumRes.Enabled:=false;
MainInvertedpendulumStop.Enabled:=true;
MainMenuFileNew.Enabled:=false;
MainMenuFileOpen.Enabled:=false;
ToolButtonNew.Enabled:=false;
ToolButtonOpen.Enabled:=false;
CloseInvPend:=false;//Идет построения маятника
Series2.Clear;//Очистка графика
if MainPendulumStop.Enabled<>true
then
MainPanelBitBtn1.Enabled:=false
else begin
MainPanelBitBtn1.Enabled:=true;
MainPanelBitBtn1.Caption:='Остановить все';
end;
StatusBar1.Panels.Items[4].Text:='Идет построение маятника.Начало:';
StatusBar1.Panels.Items[5].Text:=FormatDateTime('hh:mm:ss', Now);// Записываем дату начала построения
end;
//Построения перевернутого маятника
procedure TForm1.MainInvertedpendulumStopClick(Sender: TObject);
begin
if Assigned(FormInvPend)//Проверяем была ли использована доп. форма
then
FreeAndNil(FormInvPend);//Уничтожаем форму
FreeAndNil(InvPendul);//Уничтожаем поток
MainInvertedpendulumRes.Enabled:=true;
MainInvertedpendulumStop.Enabled:=false;
if MainPendulumRes.Enabled=true
then begin
MainMenuFileNew.Enabled:=true;
MainMenuFileOpen.Enabled:=true;
ToolButtonNew.Enabled:=true;
ToolButtonOpen.Enabled:=true;
end;
CloseInvPend:=true;//Построения маятника завершено
if MainPendulumRes.Enabled<>true
then
MainPanelBitBtn1.Enabled:=false
else begin
MainPanelBitBtn1.Enabled:=true;
MainPanelBitBtn1.Caption:='Построить все';
end;
StatusBar1.Panels.Items[4].Text:='Построение закончено.Конец:';
StatusBar1.Panels.Items[5].Text:=FormatDateTime('hh:mm:ss', Now); //Записывае дату конца построения маятника
end;
//Запрещаем изменения значений
procedure TForm1.MainPanelCheckBoxClick(Sender: TObject);
begin
MainPendulumEdit1.ReadOnly:=MainPanelCheckBox.Checked;
MainPendulumEdit2.ReadOnly:=MainPanelCheckBox.Checked;
MainPendulumEdit3.ReadOnly:=MainPanelCheckBox.Checked;
MainPendulumEdit4.ReadOnly:=MainPanelCheckBox.Checked;
MainInvertedpendulumEdit1.ReadOnly:=MainPanelCheckBox.Checked;
MainInvertedpendulumEdit2.ReadOnly:=MainPanelCheckBox.Checked;
MainInvertedpendulumEdit3.ReadOnly:=MainPanelCheckBox.Checked;
MainInvertedpendulumEdit4.ReadOnly:=MainPanelCheckBox.Checked;
end;
//Построить оба маятника и остановить оба маятника
procedure TForm1.MainPanelBitBtn1Click(Sender: TObject);
begin
if (MainPendulumEdit1.Text='') or (MainPendulumEdit2.Text='') or (MainPendulumEdit3.Text='') or (MainPendulumEdit4.Text='') then exit;
if (MainInvertedpendulumEdit1.Text='') or (MainInvertedpendulumEdit2.Text='') or (MainInvertedpendulumEdit3.Text='') or (MainInvertedpendulumEdit4.Text='') then exit;
if MainPanelBitBtn1.Caption='Построить все'
then begin
MainPendulumResClick(nil);
MainInvertedpendulumResClick(nil);
MainPanelBitBtn1.Caption:='Остановить все';
end
else begin
MainPendulumStopClick(nil);
MainInvertedpendulumStopClick(nil);
MainPanelBitBtn1.Caption:='Построить все';
end;
end;
procedure TForm1.MainPanelBitBtn2Click(Sender: TObject);
begin
Close;//Закрыть программу
end;
//Приблежения графика
procedure TForm1.FormMouseWheelDown(Sender: TObject; Shift: TShiftState;MousePos: TPoint; var Handled: Boolean);
begin
if PageControl.ActivePage=PageControlGraf
then
if k0>50
then begin
k0:=k0-2;
GrafChart.ZoomPercent(k0);
end;
end;
procedure TForm1.FormMouseWheelUp(Sender: TObject; Shift: TShiftState;MousePos: TPoint; var Handled: Boolean);
begin// Отдаления маятника
if PageControl.ActivePage=PageControlGraf
then
if k1<150
then begin
k1:=k1+2;
GrafChart.ZoomPercent(k1);
end;
end;
procedure TForm1.EditKeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', ',',#8]) then Key:=chr(0);//Разрешения вводить только цифры и запятуб
end;
procedure TForm1.MainPendulumEdit4Change(Sender: TObject);
begin//Проверяем на допустимость значения
if MainPendulumEdit4.Text='' then exit;
if (StrToFloat(MainPendulumEdit4.Text)>180) or (StrToFloat(MainPendulumEdit4.Text)<-180)
then begin
MessageBox(Self.Handle, PChar('Значение должно быть из промежутка: [-180;180]'), PChar('Предупреждение'), MBOK + MBICONINFORMATION + MBAPPLMODAL);
MainPendulumEdit4.Undo;
end;
end;
procedure TForm1.MainInvertedpendulumEdit4Change(Sender: TObject);
begin//Проверяем на допустимость значения
if MainInvertedpendulumEdit4.Text='' then exit;
if (StrToFloat(MainInvertedpendulumEdit4.Text)>180) or (StrToFloat(MainInvertedpendulumEdit4.Text)<-180)
then begin
MessageBox(Self.Handle, PChar('Значение должно быть из промежутка: [-180;180]'), PChar('Предупреждение'), MBOK + MBICONINFORMATION + MBAPPLMODAL);
MainInvertedpendulumEdit4.Undo;
end;
end;
//Дополнительные настройки
procedure TForm1.Separatewindow(Sender: TObject);//Настройки вывода маятников на экран
begin
if OptionSeparatewindowCheckBox1.Checked=true
then
OptionMultipleinstancesCheckBox1.Enabled:=false
else
OptionMultipleinstancesCheckBox1.Enabled:=true;
if OptionSeparatewindowCheckBox2.Checked=true
then
OptionMultipleinstancesCheckBox2.Enabled:=false
else
OptionMultipleinstancesCheckBox2.Enabled:=true;
if OptionSeparatewindowCheckBox3.Checked=true
then
OptionMultipleinstancesCheckBox3.Enabled:=false
else
OptionMultipleinstancesCheckBox3.Enabled:=true;
if (OptionSeparatewindowCheckBox1.Checked=false) and (OptionSeparatewindowCheckBox2.Checked=false)
then
OptionMultipleinstancesCheckBox3.Enabled:=true
else
OptionMultipleinstancesCheckBox3.Enabled:=false;
if (OptionSeparatewindowCheckBox1.Checked=false) or (OptionSeparatewindowCheckBox2.Checked=false)
then begin
OptionSeparatewindowCheckBox3.Checked:=false;
OptionSeparatewindowCheckBox3.BringToFront;
end
else begin
OptionSeparatewindowCheckBox4.Checked:=true;
OptionSeparatewindowCheckBox4.BringToFront;
end;
end;
procedure TForm1.OptionSeparatewindowCheckBox3Click(Sender: TObject);//Выделить все
begin
if OptionSeparatewindowCheckBox3.Checked=true
then begin
OptionSeparatewindowCheckBox1.Checked:=true;
OptionSeparatewindowCheckBox2.Checked:=true;
end;
end;
procedure TForm1.OptionSeparatewindowCheckBox4Click(Sender: TObject);//Снять выделения
begin
if OptionSeparatewindowCheckBox4.Checked=false
then begin
OptionSeparatewindowCheckBox1.Checked:=false;
OptionSeparatewindowCheckBox2.Checked:=false;
end;
end;
procedure TForm1.Multipleinstances(Sender: TObject); //Настройки вывода маятников на экран
begin
if OptionMultipleinstancesCheckBox1.Checked=true
then
OptionSeparatewindowCheckBox1.Enabled:=false
else
OptionSeparatewindowCheckBox1.Enabled:=true;
if OptionMultipleinstancesCheckBox2.Checked=true
then
OptionSeparatewindowCheckBox2.Enabled:=false
else
OptionSeparatewindowCheckBox2.Enabled:=true;
if OptionMultipleinstancesCheckBox3.Checked=true
then
OptionSeparatewindowCheckBox3.Enabled:=false
else
OptionSeparatewindowCheckBox3.Enabled:=true;
if (OptionMultipleinstancesCheckBox1.Checked=false) and (OptionMultipleinstancesCheckBox2.Checked=false)
then
OptionSeparatewindowCheckBox3.Enabled:=true
else
OptionSeparatewindowCheckBox3.Enabled:=false;
if (OptionMultipleinstancesCheckBox1.Checked=false) or (OptionMultipleinstancesCheckBox2.Checked=false)
then begin
OptionMultipleinstancesCheckBox3.Checked:=false;
OptionMultipleinstancesCheckBox3.BringToFront;
end
else begin
OptionMultipleinstancesCheckBox4.Checked:=true;
OptionMultipleinstancesCheckBox4.BringToFront;
end;
end;
procedure TForm1.OptionMultipleinstancesCheckBox3Click(Sender: TObject);//Выделить все
begin
if OptionMultipleinstancesCheckBox3.Checked=true
then begin
OptionMultipleinstancesCheckBox1.Checked:=true;
OptionMultipleinstancesCheckBox2.Checked:=true;
end;
end;
procedure TForm1.OptionMultipleinstancesCheckBox4Click(Sender: TObject);//Снять выделения
begin
if OptionMultipleinstancesCheckBox4.Checked=false
then begin
OptionMultipleinstancesCheckBox1.Checked:=false;
OptionMultipleinstancesCheckBox2.Checked:=false;
end;
end;
procedure TForm1.OptionLogCheckBox1Click(Sender: TObject);//Настройки логирования
begin
if OptionLogCheckBox1.Checked=true
then
MainMenuViewLog.Enabled:=true
else begin
MainMenuViewLog.Enabled:=false;
MainMenuViewLog.Checked:=false;
PageControlLog.TabVisible:=False;
end;
OptionLogCheckBox2.Enabled:=OptionLogCheckBox1.Checked;
OptionLogCheckBox3.Enabled:=OptionLogCheckBox1.Checked;
OptionLogCheckBox4.Enabled:=OptionLogCheckBox1.Checked;
OptionCloseCheckBox3.Enabled:=OptionLogCheckBox1.Checked;
if OptionLogCheckBox1.Checked=false
then begin
OptionLogCheckBox2.Checked:=false;
OptionLogCheckBox3.Checked:=false;
OptionLogCheckBox4.Checked:=false;
OptionCloseCheckBox3.Checked:=false;
end;
end;
procedure TForm1.Logoption(Sender: TObject);//Положения checkbox
begin
if (OptionLogCheckBox2.Checked=false) or (OptionLogCheckBox3.Checked=false)
then begin
OptionLogCheckBox4.Checked:=false;
OptionLogCheckBox4.BringToFront;
end
else begin
OptionLogCheckBox5.Checked:=true;
OptionLogCheckBox5.BringToFront;
end;
end;
procedure TForm1.OptionLogCheckBox4Click(Sender: TObject);//Выделить все
begin
if OptionLogCheckBox4.Checked=true
then begin
OptionLogCheckBox2.Checked:=true;
OptionLogCheckBox3.Checked:=true;
end;
end;
procedure TForm1.OptionLogCheckBox5Click(Sender: TObject);//Снять выделения
begin
if OptionLogCheckBox5.Checked=false
then begin
OptionLogCheckBox2.Checked:=false;
OptionLogCheckBox3.Checked:=false;
end;
end;
procedure TForm1.OptionRadioGroupClick(Sender: TObject);
begin
case OptionRadioGroup.ItemIndex of
0: StatusBar1.Panels.Items[0].Text:='Используется обычнй класс';
1: StatusBar1.Panels.Items[0].Text:='Используется Com-сервер';
end;
end;
//Настройки выхода
procedure TForm1.OptionCloseCheckBox1Click(Sender: TObject);
begin
OptionCloseCheckBox2.Enabled:=OptionCloseCheckBox1.Checked;
if OptionCloseCheckBox1.Checked=false
then
OptionCloseCheckBox2.Checked:=false;
end;
//Сбрасываем настройки
procedure TForm1.OptionBitBtn1Click(Sender: TObject);
begin
OptionSeparatewindowCheckBox1.Checked:=False;
OptionSeparatewindowCheckBox2.Checked:=False;
OptionSeparatewindowCheckBox3.Checked:=False;
OptionMultipleinstancesCheckBox1.Checked:=False;
OptionMultipleinstancesCheckBox2.Checked:=False;
OptionMultipleinstancesCheckBox3.Checked:=False;
OptionCloseCheckBox1.Checked:=False;
OptionCloseCheckBox2.Checked:=False;
OptionLogCheckBox2.Checked:=False;
OptionLogCheckBox3.Checked:=False;
OptionLogCheckBox4.Checked:=False;
end;
//Сохраняем настройки
procedure TForm1.OptionBitBtn2Click(Sender: TObject);
var
Ini: Tinifile;
begin
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');
Ini.WriteBool('Separate window','Pendulum',OptionSeparatewindowCheckBox1.Checked);
Ini.WriteBool('Separate window','Inverted pendulum',OptionSeparatewindowCheckBox2.Checked);
Ini.WriteBool('Separate window','All Selection',OptionSeparatewindowCheckBox3.Checked);
Ini.WriteBool('Multiple instances','Pendulum',OptionMultipleinstancesCheckBox1.Checked);
Ini.WriteBool('Multiple instances','Inverted pendulum',OptionMultipleinstancesCheckBox2.Checked);
Ini.WriteBool('Multiple instances','All Selection',OptionMultipleinstancesCheckBox3.Checked);
Ini.WriteBool('Log','Enable',OptionLogCheckBox1.Checked);
Ini.WriteBool('Log','Pendulum',OptionLogCheckBox2.Checked);
Ini.WriteBool('Log','Inverted pendulum',OptionLogCheckBox3.Checked);
Ini.WriteBool('Log','All Selection',OptionLogCheckBox4.Checked);
Ini.WriteInteger('Server','Selection',OptionRadioGroup.ItemIndex);
Ini.WriteBool('Close','Disable reminder',OptionCloseCheckBox1.Checked);
Ini.WriteBool('Close','Automatically save',OptionCloseCheckBox2.Checked);
Ini.Free;
end;
//Выход
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
var
SelBut: Integer;
begin
if (ClosePend=false) or (CloseInvPend=false) or (ClosePend=false) and (CloseInvPend=false)
then begin //Проверяем возможно ли выйти сейчас
CanClose:=false;
MessageBox(Self.Handle, PChar('Завершите постройку маятников'), PChar('Предупреждение'), MBOK + MBICONINFORMATION + MBAPPLMODAL);
end
else
if OptionCloseCheckBox1.Checked<>true
then begin//Вопрос о сохранения перед выходом
SelBut:=MessageBox(Self.Handle, PChar('Сохранить изменения?'), PChar('Выход'), MBYESNOCANCEL + MBICONINFORMATION + MBAPPLMODAL);
case SelBut of
IDYes: MainMenuFileSaveClick(nil);
IDCancel: CanClose:=false;
end;
end
else
if OptionCloseCheckBox2.Checked=true
then//Автоматическое сохранения перед выходом
MainMenuFileSaveClick(nil);
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
Ini: TInifile;
begin
if (OptionLogCheckBox2.Checked=true or OptionLogCheckBox3.Checked=true) and OptionCloseCheckBox3.Checked=true
then
LogMemo.Lines.SaveToFile(extractfilepath(paramstr(0))+'Log\'+FormatDateTime('DDMMYYYYhhmmss', Now)+' Log.txt');//Сохраняем лог
Ini:=TIniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');
Ini.WriteBool('View','Pendulum',MainMenuViewPendulum.Checked);
Ini.WriteBool('View','Inverted pendulum',MainMenuViewInvertedpendulum.Checked);
Ini.WriteBool('View','Chart',MainMenuViewChart.Checked);
Ini.WriteBool('View','Option',MainMenuViewOption.Checked);
Ini.Free;
end;
end.
unit FormParametr;//Форма параметры
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, XPMan, ExtCtrls, IniFiles, Math;
type
TFormParametr = class(TForm)
XPManifest1: TXPManifest;
Button1: TButton;
Button2: TButton;
Button3: TButton;
GroupBox1: TGroupBox;
PendulumEdit2: TLabeledEdit;
PendulumEdit1: TLabeledEdit;
PendulumEdit3: TLabeledEdit;
PendulumEdit4: TLabeledEdit;
GroupBox2: TGroupBox;
InvertedpendulumEdit2: TLabeledEdit;
InvertedpendulumEdit1: TLabeledEdit;
InvertedpendulumEdit3: TLabeledEdit;
InvertedpendulumEdit4: TLabeledEdit;
PendulumEdit6: TLabeledEdit;
PendulumEdit5: TLabeledEdit;
InvertedpendulumEdit5: TLabeledEdit;
InvertedpendulumEdit6: TLabeledEdit;
Button4: TButton;
procedure FormActivate(Sender: TObject);
procedure EditKeyPress(Sender: TObject; var Key: Char);
procedure PendulumEdit4Change(Sender: TObject);
procedure InvertedpendulumEdit4Change(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FormParametr: TFormParametr;
implementation
{$R *.dfm}
uses
MainForm;
procedure TFormParametr.EditKeyPress(Sender: TObject;
var Key: Char);
begin
if not (Key in ['0'..'9', ',',#8]) then Key:=chr(0);//Разрешаем вводить только цифры и запятую
end;
procedure TFormParametr.PendulumEdit4Change(Sender: TObject);
begin//Проверяем на допустимость значения
if PendulumEdit4.Text='' then exit;
if (StrToFloat(PendulumEdit4.Text)>180) or (StrToFloat(PendulumEdit4.Text)<-180)
then begin
MessageBox(Self.Handle, PChar('Значение должно быть из промежутка: [-180;180]'), PChar('Предупреждение'), MBOK + MBICONINFORMATION + MBAPPLMODAL);
PendulumEdit4.Undo;
end;
end;
procedure TFormParametr.InvertedpendulumEdit4Change(Sender: TObject);
begin//Проверяем на допустимость значения
if InvertedpendulumEdit4.Text='' then exit;
if (StrToFloat(InvertedpendulumEdit4.Text)>180) or (StrToFloat(InvertedpendulumEdit4.Text)<-180)
then begin
MessageBox(Self.Handle, PChar('Значение должно быть из промежутка: [-180;180]'), PChar('Предупреждение'), MBOK + MBICONINFORMATION + MBAPPLMODAL);
InvertedpendulumEdit4.Undo;
end;
end;
//Выводим текущие значения на форму
procedure TFormParametr.FormActivate(Sender: TObject);
begin
PendulumEdit1.Text:=Form1.MainPendulumEdit1.Text;
PendulumEdit2.Text:=Form1.MainPendulumEdit2.Text;
PendulumEdit3.Text:=Form1.MainPendulumEdit3.Text;
PendulumEdit4.Text:=Form1.MainPendulumEdit4.Text;
PendulumEdit5.Text:=Form1.MainPendulumEdit5.Text;
PendulumEdit6.Text:=Form1.MainPendulumEdit6.Text;
InvertedpendulumEdit1.Text:=Form1.MainInvertedpendulumEdit1.Text;
InvertedpendulumEdit2.Text:=Form1.MainInvertedpendulumEdit2.Text;
InvertedpendulumEdit3.Text:=Form1.MainInvertedpendulumEdit3.Text;
InvertedpendulumEdit4.Text:=Form1.MainInvertedpendulumEdit4.Text;
InvertedpendulumEdit5.Text:=Form1.MainInvertedpendulumEdit5.Text;
InvertedpendulumEdit6.Text:=Form1.MainInvertedpendulumEdit6.Text;
end;
//По умолчанию
procedure TFormParametr.Button1Click(Sender: TObject);
begin
PendulumEdit1.Text:='2';
PendulumEdit2.Text:='3';
PendulumEdit3.Text:='40';
PendulumEdit4.Text:='0,1';
PendulumEdit5.Text:='9,81';
PendulumEdit6.Text:='10';
InvertedpendulumEdit1.Text:='2';
InvertedpendulumEdit2.Text:='3';
InvertedpendulumEdit3.Text:='40';
InvertedpendulumEdit4.Text:='0,1';
InvertedpendulumEdit5.Text:='9,81';
InvertedpendulumEdit6.Text:='10';
end;
//Выводим значения на основную форму
procedure TFormParametr.Button2Click(Sender: TObject);
begin
Form1.MainPendulumEdit5.Text:=PendulumEdit5.Text;
if StrToFloat(PendulumEdit6.Text)<0.1 then PendulumEdit6.Text:='0,1';
Form1.MainPendulumEdit6.Text:=PendulumEdit6.Text;
Form1.MainInvertedpendulumEdit5.Text:=InvertedpendulumEdit5.Text;
if StrToFloat(InvertedpendulumEdit6.Text)<0.1 then InvertedpendulumEdit6.Text:='0,1';
Form1.MainInvertedpendulumEdit6.Text:=InvertedpendulumEdit6.Text;
if Form1.MainPanelCheckBox.Checked=false
then begin
Form1.MainPendulumEdit1.Text:=PendulumEdit1.Text;
Form1.MainPendulumEdit2.Text:=PendulumEdit2.Text;
Form1.MainPendulumEdit3.Text:=PendulumEdit3.Text;
Form1.MainPendulumEdit4.Text:=PendulumEdit4.Text;
Form1.MainInvertedpendulumEdit1.Text:=InvertedpendulumEdit1.Text;
Form1.MainInvertedpendulumEdit2.Text:=InvertedpendulumEdit2.Text;
Form1.MainInvertedpendulumEdit3.Text:=InvertedpendulumEdit3.Text;
Form1.MainInvertedpendulumEdit4.Text:=InvertedpendulumEdit4.Text;
end
else
ShowMessage('Изменение запрещенны');
end;
//Сохраняем значения
procedure TFormParametr.Button3Click(Sender: TObject);
var
Ini: TInifile;
begin
Ini:=TIniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');
Ini.WriteString('ParametrPendulum','Amplitude',PendulumEdit1.Text);
Ini.WriteString('ParametrPendulum','Frequency',PendulumEdit2.Text);
Ini.WriteString('ParametrPendulum','Length',PendulumEdit3.Text);
Ini.WriteString('ParametrPendulum','Angle',PendulumEdit4.Text);
Ini.WriteString('ParametrPendulum','Acceleration due to gravity',PendulumEdit5.Text);
if StrToFloat(PendulumEdit6.Text)<0.1 then PendulumEdit6.Text:='0,1';
Ini.WriteString('ParametrPendulum','Time',PendulumEdit6.Text);
Ini.WriteFloat('ParametrPendulum','Angular Velocity',1);
Ini.WriteString('ParametrInvertedPendulum','Amplitude',InvertedpendulumEdit1.Text);
Ini.WriteString('ParametrInvertedPendulum','Frequency',InvertedpendulumEdit2.Text);
Ini.WriteString('ParametrInvertedPendulum','Length',InvertedpendulumEdit3.Text);
Ini.WriteString('ParametrInvertedPendulum','Angle',InvertedpendulumEdit4.Text);
Ini.WriteString('ParametrInvertedPendulum','Acceleration due to gravity',InvertedpendulumEdit5.Text);
if StrToFloat(InvertedpendulumEdit6.Text)<0.1 then InvertedpendulumEdit6.Text:='0,1';
Ini.WriteString('ParametrInvertedPendulum','Time',InvertedpendulumEdit6.Text);
Ini.WriteFloat('ParametrInvertedPendulum','Angular Velocity',1);
Ini.free;
end;
//Используем случайные значения
procedure TFormParametr.Button4Click(Sender: TObject);
begin
PendulumEdit1.Text:=FloatToStr(RandomRange(1, 10));
PendulumEdit2.Text:=FloatToStr(RandomRange(1, 15));
PendulumEdit3.Text:=FloatToStr(RandomRange(1, 100));
PendulumEdit4.Text:=FloatToStr(RandomRange(-180, 180));
PendulumEdit5.Text:=FloatToStr(RandomRange(1, 15));
PendulumEdit6.Text:=FloatToStr(RandomRange(1, 60));
InvertedpendulumEdit1.Text:=FloatToStr(RandomRange(1, 10));
InvertedpendulumEdit2.Text:=FloatToStr(RandomRange(1, 15));
InvertedpendulumEdit3.Text:=FloatToStr(RandomRange(1, 100));
InvertedpendulumEdit4.Text:=FloatToStr(RandomRange(-180, 180));
InvertedpendulumEdit5.Text:=FloatToStr(RandomRange(1, 15));
InvertedpendulumEdit6.Text:=FloatToStr(RandomRange(1, 60));
end;
end.
unit PendulumThread;//Поток обычного маятника
interface
uses
Classes , SysUtils, Math, Pendulum, ComObj, ActiveX , UComPendulumTlb;
type
TPendulumThread = class(TThread)
private
d: TPendulum;
dCom: IPendulumCom;
protected
procedure Execute; override;
procedure Draw;
procedure DrawCom;
procedure Start;
end;
var
Ampl, Freque, Lent, PastTime, Deviation, AngVel, NewAngVel: Double;
implementation
uses
MainForm;
procedure TPendulumThread.Execute;
begin
case Form1.OptionRadioGroup.ItemIndex of
0: begin
try
Synchronize(Draw); //Создаем класс и вводим значения
Ampl:=d.AmplitInit; //Сохраняем значения чтобы использовать при сохранений
Freque:=d.Frequency;
Lent:=d.Length;
Deviation:=d.Deviation;
while not Terminated do begin
AngVel:=d.AngularVelocity;
PastTime:=d.PastTime;
Synchronize(d.StartBuilding);
sleep(100);
end;
finally
d.Free; //Уничтожаем класс
end;
end;
1: begin
try
Synchronize(DrawCom); //Создаем Com-сервер и вводим значения
Ampl:=dCom.AmplitInit; //Сохраняем значения чтобы использовать при сохранений
Freque:=dCom.Frequency;
Lent:=dCom.Length;
Deviation:=dCom.Deviation;
while not Terminated do begin
AngVel:=dCom.AngularVelocity;
PastTime:=dCom.PastTime;
Synchronize(Start);
sleep(100);
end;
finally
dCom:=nil;//Удаляем ссылку на Com-сервер
end;
end;
end;
end;
procedure TPendulumThread.Start;
begin
dCom.StartBuilding;
end;
procedure TPendulumThread.Draw();
var
A,v,L,f,g : Double;
Row : Integer;
begin
A:=StrToFloat(Form1.MainPendulumEdit1.Text);
v:=StrToFloat(Form1.MainPendulumEdit2.Text);
L:=StrToFloat(Form1.MainPendulumEdit3.Text);
f:=DegToRad(StrToFloat(Form1.MainPendulumEdit4.Text));
g:=StrToFloat(Form1.MainPendulumEdit5.Text);
if MainForm.LoadSavePend=false//Проверяем было ли загружено сохранения
then begin
f:=DegToRad(StrToFloat(Form1.MainPendulumEdit4.Text));
d:=TPendulum.Create(A,v,L,f,NewAngVel,g,0,0); //Создаем класс
end
else begin
Row:=Form1.MainPendulumStringGrid.RowCount-2;
f:=DegToRad(StrToFloat(Form1.MainPendulumStringGrid.Cells[3,Row]));
d:=TPendulum.Create(A,v,L,f,AngVel,g,PastTime,0); //Создаем класс
MainForm.LoadSavePend:=false;
end;
d.CenterXImage:=Form1.PendulumImage.Width div 2;
d.CenterYImage:=Form1.PendulumImage.Height div 2;
d.Separatewindow:=Form1.OptionSeparatewindowCheckBox1.Checked;
d.Multipleinstances:=Form1.OptionMultipleinstancesCheckBox1.Checked;
d.Log:=Form1.OptionLogCheckBox2.Checked;
d.TimeLimit:=StrToFloat(Form1.MainPendulumEdit6.Text);
d.Image:=Form1.PendulumImage;
d.MainTable:=Form1.MainPendulumStringGrid;
d.Table:=Form1.PendulumStringGrid;
d.Chart:=Form1.GrafChart;
d.Memo:=Form1.LogMemo;
if (Form1.OptionSeparatewindowCheckBox1.Checked=true) or (Form1.OptionMultipleinstancesCheckBox1.Checked=true)
then begin//Ипользуем если используется доп. форма
d.CenterXFormIm:=FormPend.ClientWidth div 2;
d.CenterYFormIm:=FormPend.ClientHeight div 2;
d.FormIm:=FormPend;
end;
end;
procedure TPendulumThread.DrawCom();
var
A,v,L,f,g : Double;
Row : Integer;
Begin
dCom:=CreateComObject(ClassPendulumCom) as IPendulumCom;//Создаем Com-сервер
A:=StrToFloat(Form1.MainPendulumEdit1.Text);
v:=StrToFloat(Form1.MainPendulumEdit2.Text);
L:=StrToFloat(Form1.MainPendulumEdit3.Text);
f:=DegToRad(StrToFloat(Form1.MainPendulumEdit4.Text));
g:=StrToFloat(Form1.MainPendulumEdit5.Text);
if MainForm.LoadSavePend=false//Проверяем было ли загружено сохранения
then begin
f:=DegToRad(StrToFloat(Form1.MainPendulumEdit4.Text));
dCom.Create(A,v,L,f,NewAngVel,g,0,0);
end
else begin
Row:=Form1.MainPendulumStringGrid.RowCount-2;
f:=DegToRad(StrToFloat(Form1.MainPendulumStringGrid.Cells[3,Row]));
dCom.Create(A,v,L,f,AngVel,g,PastTime,0);
MainForm.LoadSavePend:=false;
end;
dCom.CenterXImage:=Form1.PendulumImage.Width div 2;
dCom.CenterYImage:=Form1.PendulumImage.Height div 2;
dCom.Separatewindow:=Form1.OptionSeparatewindowCheckBox1.Checked;
dCom.Multipleinstances:=Form1.OptionMultipleinstancesCheckBox1.Checked;
dCom.Log:=Form1.OptionLogCheckBox2.Checked;
dCom.TimeLimit:=StrToFloat(Form1.MainPendulumEdit6.Text);
dCom.Image:=Form1.PendulumImage;
dCom.MainTable:=Form1.MainPendulumStringGrid;
dCom.Table:=Form1.PendulumStringGrid;
dCom.Chart:=Form1.GrafChart;
dCom.Memo:=Form1.LogMemo;
if (Form1.OptionSeparatewindowCheckBox1.Checked=true) or (Form1.OptionMultipleinstancesCheckBox1.Checked=true)
then begin//Ипользуем если используется доп. форма
dCom.CenterXFormIm:=FormPend.ClientWidth div 2;
dCom.CenterYFormIm:=FormPend.ClientHeight div 2;
dCom.FormIm:=FormPend;
end;
end;
unit InvertedPendulumThread;//Поток обращенного маятника
interface
uses
Classes, SysUtils, Math, Pendulum, ComObj, ActiveX, , UComPendulumTlb;
type
TInvertedPendulumThread = class(TThread)
private
d: TInvertedPendulum;
dCom: IPendulumCom;
protected
procedure Execute; override;
procedure Draw;
procedure DrawCom;
procedure Start;
end;
var
Ampl, Freque, Lent, PastTime, Deviation, AngVel, NewAngVel: Double;
implementation
uses
MainForm;
procedure TInvertedPendulumThread.Execute;
begin
case Form1.OptionRadioGroup.ItemIndex of
0: begin
try
Synchronize(Draw);//Создаем класс и вводим значения
Ampl:=d.AmplitInit;//Сохраняем значения чтобы использовать при сохранений
Freque:=d.Frequency;
Lent:=d.Length;
Deviation:=d.Deviation;
while not Terminated do begin
AngVel:=d.AngularVelocity;
PastTime:=d.PastTime;
Synchronize(d.StartBuilding);//Запускаем выполнения
sleep(100);
end;
finally
d.Free;//Уничтожаем класс
end;
end;
1: begin
try
Synchronize(DrawCom) //Создаем Com-сервер и вводим значения
Ampl:=dCom.AmplitInit; //Сохраняем значения чтобы использовать при сохранений
Freque:=dCom.Frequency;
Lent:=dCom.Length;
Deviation:=dCom.Deviation;
while not Terminated do begin
AngVel:=dCom.AngularVelocity;
PastTime:=dCom.PastTime;
Synchronize(Start); //Запускаем выполнения
sleep(100);
end;
finally
dCom:=nil; //Удаляем ссылку на Com-сервер
end;
end;
end;
end;
procedure TInvertedPendulumThread.Start;
begin
dCom.StartBuilding;
end;
procedure TInvertedPendulumThread.Draw();
var
A,v,L,f,g : Double;
begin
A:=StrToFloat(Form1.MainInvertedpendulumEdit1.Text);
v:=StrToFloat(Form1.MainInvertedpendulumEdit2.Text);
L:=StrToFloat(Form1.MainInvertedpendulumEdit3.Text);
f:=DegToRad(StrToFloat(Form1.MainInvertedpendulumEdit4.Text));
g:=StrToFloat(Form1.MainInvertedpendulumEdit5.Text);
if MainForm.LoadSaveInvPend=false//Проверяем было ли загружено сохранения
then begin
f:=DegToRad(StrToFloat(Form1.MainInvertedpendulumEdit4.Text));
d:=TInvertedPendulum.Create(A,v,L,f,NewAngVel,g,0,1);//Создаем класс
end
else begin
Row:=Form1.MainInvertedpendulumStringGrid.RowCount-2;
f:=DegToRad(StrToFloat(Form1.MainInvertedpendulumStringGrid.Cells[3,Row]));
d:=TInvertedPendulum.Create(A,v,L,f,AngVel,g,PastTime,1); //Создаем класс
MainForm.LoadSaveInvPend:=false;
end;
d.CenterXImage:=Form1.InvertedpendulumImage.Width div 2;
d.CenterYImage:=Form1.InvertedpendulumImage.Height div 2;
d.Separatewindow:=Form1.OptionSeparatewindowCheckBox2.Checked;
d.Multipleinstances:=Form1.OptionMultipleinstancesCheckBox2.Checked;
d.Log:=Form1.OptionLogCheckBox3.Checked;
d.TimeLimit:=StrToFloat(Form1.MainInvertedpendulumEdit6.Text);
d.Image:=Form1.InvertedpendulumImage;
d.MainTable:=Form1.MainInvertedpendulumStringGrid;
d.Table:=Form1.InvertedpendulumStringGrid;
d.Chart:=Form1.GrafChart;
d.Memo:=Form1.LogMemo;
if (Form1.OptionSeparatewindowCheckBox2.Checked=true) or (Form1.OptionMultipleinstancesCheckBox2.Checked=true)
then begin//Ипользуем если используется доп. форма
d.FormIm:=FormInvPend;
d.CenterXFormIm:=FormInvPend.ClientWidth div 2;
d.CenterYFormIm:=FormInvPend.ClientHeight div 2;
end;
end;
procedure TInvertedPendulumThread.DrawCom();
var
A,v,L,f,g : Double;
Begin
dCom:=CreateComObject(ClassInvertedPendulumCom) as IPendulumCom; //Создаем Com-сервер
A:=StrToFloat(Form1.MainInvertedpendulumEdit1.Text);
v:=StrToFloat(Form1.MainInvertedpendulumEdit2.Text);
L:=StrToFloat(Form1.MainInvertedpendulumEdit3.Text);
f:=DegToRad(StrToFloat(Form1.MainInvertedpendulumEdit4.Text));
g:=StrToFloat(Form1.MainInvertedpendulumEdit5.Text);
if MainForm.LoadSaveInvPend=false//Проверяем было ли загружено сохранения
then begin
f:=DegToRad(StrToFloat(Form1.MainInvertedpendulumEdit4.Text));
dCom.Create(A,v,L,f,NewAngVel,g,0,1);
end
else begin
Row:=Form1.MainInvertedpendulumStringGrid.RowCount-2;
f :=DegToRad(StrToFloat(Form1.MainInvertedpendulumStringGrid.Cells[3,Row]));
dCom.Create(A,v,L,f,AngVel,g,PastTime,1);
MainForm.LoadSaveInvPend:=false;
end;
dCom.CenterXImage:=Form1.InvertedpendulumImage.Width div 2;
dCom.CenterYImage:=Form1.InvertedpendulumImage.Height div 2;
dCom.Separatewindow:=Form1.OptionSeparatewindowCheckBox2.Checked;
dCom.Multipleinstances:=Form1.OptionMultipleinstancesCheckBox2.Checked;
dCom.Log:=Form1.OptionLogCheckBox3.Checked;
dCom.TimeLimit:=StrToFloat(Form1.MainInvertedpendulumEdit6.Text);
dCom.Image:=Form1.InvertedpendulumImage;
dCom.MainTable:=Form1.MainInvertedpendulumStringGrid;
dCom.Table:=Form1.InvertedpendulumStringGrid;
dCom.Chart:=Form1.GrafChart;
dCom.Memo:=Form1.LogMemo;
if (Form1.OptionSeparatewindowCheckBox2.Checked=true) or (Form1.OptionMultipleinstancesCheckBox2.Checked=true)
then begin//Ипользуем если используется доп. форма
dCom.FormIm:=FormInvPend;
dCom.CenterXFormIm:=FormInvPend.ClientWidth div 2;
dCom.CenterYFormIm:=FormInvPend.ClientHeight div 2;
end;
end;
unit Pendulum;//Класс маятник и обращенный маятник
interface
uses
Forms, Classes, Graphics, SysUtils, Grids, Math, Chart, StdCtrls, IniFiles,
Series, ExtCtrls;
type
TPendulum = class
private
FA: Double;//Амплитуда
Fv: Double;//Частота
FL: Double;//Длина
FPhi: Double;//Угол
Fw: Double;//Угловая скорость
FG: Double;//Ускорение свободного падения
FTimeLimit: Double;//Промежуток времени между обновление таблицы
FTime: Double;//Время
FNomerSeries: Integer;//Номер серий Chart
Fk: Integer;//Чередование Амлитуд
Fk0: Integer;//Время следующего изменения амлитуды
Fk1: Integer;//Следущие время обновление таблиц
FImage: TImage;//Для вывода в главном окне
FFormIm: TForm;//Для вывода в дополнительном окне
FWidthImage, FHeightImage: Integer;//Координаты центра экрана главного окна
FWidthFormIm, FHeightFormIm: Integer;//Координаты центра экрана дополнительного окна
FMainTable: TStringGrid;//Главная таблица для вывода результата
FTable: TStringGrid;//Дополнительная таблица для вывода результата
FMemo: TMemo;//Окно мемо для вывода лога
FChart: TChart;//Chart для рисование зависимоти угла от времени
FSeparatewindow: Boolean;//Вывод изображения в дополнительной форме
FMultipleinstances: Boolean;//Вывод изображения в главной и дополнительной форме
//Если оба значения стоят в false то вывод производится только в главной форме
FLog: Boolean;//Разрешения для логирования
protected
procedure SetSeparatewindow(NewSeparatewindow: Boolean);
procedure SetMultipleinstances(NewMultipleinstances: Boolean);
procedure SetLog(NewLog: Boolean);
procedure SetTimeLimit(NewTimeLimit: Double);
procedure SetImage(NewImage: TImage);
procedure SetFormIm(NewFormIm: TForm);
procedure SetMainTable(NewMainTable: TStringGrid);
procedure SetTable(NewTable: TStringGrid);
procedure SetChart(NewChart: TChart);
procedure SetMemo(NewMemo: TMemo);
procedure SetCenterXImage(NewCenterXImage: Integer);
procedure SetCenterYImage(NewCenterYImage: Integer);
procedure SetCenterXFormIm(NewCenterXFormIm: Integer);
procedure SetCenterYFormIm(NewCenterYFormIm: Integer);
procedure AddTable;//Вывод в таблицу
procedure CalcPhi;virtual;//Вычисление фи
procedure DifUrav;//Вычисление дифф. урав. методом Рунге-Кутты 4-порядка
procedure DrawNextMain;virtual;//Построение на главной форме
procedure DrawNext;virtual;//Построение на дополнительной форме
function f(t,y,z: Double): Double;//Функция вида z'=cos(3x)-4y=f(x,y,z)
function g(t,y,z: Double): Double;//Функция вида y'=z=g(x,y,z)
function GetAmplitInit: Double;
function GetFrequency: Double;
function GetLength: Double;
function GetDeviation: Double;
function GetPastTime: Double;
function GetAngularVelocity: Double;
public
constructor Create(A,v,L,f,w,g: Double;time: Double;nomer: Integer);
procedure StartBuilding;//Начинает выполнения
procedure ReadToIni;virtual;
//Вводим данные для начало построения маятника
property Separatewindow: Boolean write SetSeparatewindow;
property Multipleinstances: Boolean write SetMultipleinstances;
property Log: Boolean write SetLog;
property TimeLimit: Double write SetTimeLimit;
property Image: TImage write SetImage;
property FormIm: TForm write SetFormIm;
property MainTable: TStringGrid write SetMainTable;
property Table: TStringGrid write SetTable;
property Memo: TMemo write SetMemo;
property Chart: TChart write SetChart;
property CenterXImage: Integer write SetCenterXImage;
property CenterYImage: Integer write SetCenterYImage;
property CenterXFormIm: Integer write SetCenterXFormIm;
property CenterYFormIm: Integer write SetCenterYFormIm;
//Записываем значения для произведения сохранения в файл
property AmplitInit: Double read GetAmplitInit;
property Frequency: Double read GetFrequency;
property Length: Double read GetLength;
property PastTime: Double read GetPastTime;
property Deviation: Double read GetDeviation;
property AngularVelocity: Double read GetAngularVelocity;
end;
TInvertedPendulum=class(TPendulum)
protected
procedure CalcPhi;override;
procedure DrawNextMain;override;
procedure DrawNext;override;
public
procedure ReadToIni;override;
end;
const
ValArr: array[0..1] of Double = (-0.5, 0.5);
implementation
constructor TPendulum.Create(A,v,L,f,w,g: Double;time: Double;nomer: Integer);
begin
inherited Create;
FA:=A;
Fv:=v;
FL:=L;
FPhi:=f;
FG:=g;
Fw:=w;
FTime:=time;
FNomerSeries:=nomer;
Fk:=RandomRange(0, 2);
Fk0:=1;
Fk1:=0;
end;
procedure TPendulum.SetSeparatewindow(NewSeparatewindow: Boolean);
begin
FSeparatewindow:=NewSeparatewindow;
end;
procedure TPendulum.SetMultipleinstances(NewMultipleinstances: Boolean);
begin
FMultipleinstances:=NewMultipleinstances;
end;
procedure TPendulum.SetLog(NewLog: Boolean);
begin
FLog:=NewLog;
end;
procedure TPendulum.SetTimeLimit(NewTimeLimit: Double);
begin
FTimeLimit:=NewTimeLimit;
end;
procedure TPendulum.SetImage(NewImage: TImage);
begin
FImage:=NewImage;
end;
procedure TPendulum.SetFormIm(NewFormIm: TForm);
begin
FFormIm:=NewFormIm;
end;
procedure TPendulum.SetMainTable(NewMainTable: TStringGrid);
begin
FMainTable:=NewMainTable;
end;
procedure TPendulum.SetTable(NewTable: TStringGrid);
begin
FTable:=NewTable;
end;
procedure TPendulum.SetChart(NewChart: TChart);
begin
FChart:=NewChart;
end;
procedure TPendulum.SetMemo(NewMemo: TMemo);
begin
FMemo:=NewMemo;
end;
procedure TPendulum.SetCenterXImage(NewCenterXImage: Integer);
begin
FWidthImage:=NewCenterXImage;
end;
procedure TPendulum.SetCenterYImage(NewCenterYImage: Integer);
begin
FHeightImage:=NewCenterYImage;
end;
procedure TPendulum.SetCenterXFormIm(NewCenterXFormIm: Integer);
begin
FWidthFormIm:=NewCenterXFormIm;
end;
procedure TPendulum.SetCenterYFormIm(NewCenterYFormIm: Integer);
begin
FHeightFormIm:=NewCenterYFormIm;
end;
function TPendulum.GetAmplitInit : Double;
begin
Result:=FA;
end;
function TPendulum.GetFrequency : Double;
begin
Result:=Fv;
end;
function TPendulum.GetLength : Double;
begin
Result:=FL;
end;
function TPendulum.GetDeviation : Double;
begin
Result:=RadToDeg(FPhi);
end;
function TPendulum.GetPastTime : Double;
begin
Result:=FTime;
end;
function TPendulum.GetAngularVelocity : Double;
begin
Result:=Fw;
end;
function TPendulum.f(t,y,z: Double) : Double;
begin
Result:=-(Fg/Fl+(FA*Fv*Fv)/FL*cos(Fv*t))*y;
end;
function TPendulum.g(t,y,z: Double) : Double;
begin
Result:=z;
end;
procedure TPendulum.DifUrav;
var
l1,l2,l3,l4,q1,q2,q3,q4: Double;
begin
//Нахождение Phi
l1:= 0.1 * f(FTime, FPhi, Fw);
q1:= 0.1 * g(FTime, FPhi, Fw);
l2:= 0.1 * f(FTime + 0.1/2, FPhi + q1/2, Fw + l1/2);
q2:= 0.1 * g(FTime + 0.1/2, FPhi + q1/2, Fw + l1/2);
l3:= 0.1 * f(FTime + 0.1/2, FPhi + q2/2, Fw + l2/2);
q3:= 0.1 * g(FTime + 0.1/2, FPhi + q2/2, Fw + l2/2);
l4:= 0.1 * f(FTime + 0.1, FPhi + q3, Fw + l3);
q4:= 0.1 * g(FTime + 0.1, FPhi + q3, Fw + l3);
Fw:= Fw + (l1 + 2*l2 + 2*l3 + l4)/6;
FPhi:= FPhi + (q1 + 2*q2 + 2*q3 + q4)/6;
end;
procedure TPendulum.CalcPhi;
begin
DifUrav;
end;
procedure TInvertedPendulum.CalcPhi;
begin
if FA*Fv>sqrt(2*Fg*Fl)
then begin
if FPhi<>0
then
if (FPhi>-DegToRad(3)) and (FPhi<DegToRad(3))
then
FPhi:=0
else
if FPhi<DegToRad(3)
then
FPhi:=FPhi+DegToRad(5)
else
if FPhi>-DegToRad(3)
then
FPhi:=FPhi-DegToRad(5);
end
else
DifUrav;
end;
procedure TPendulum.StartBuilding;
begin
//Изменение амлитуды
if (FTime=Fk0*10)
then
if Fk=0
then begin
FA:=FA+ValArr[Fk];
Fk:=Fk+1;
Fk0:=Fk0+1;
end
else begin
FA:=FA+ValArr[Fk];
Fk:=Fk-1;
Fk0:=Fk0+1;
end;
//Выбор места вывода маятника
if FMultipleinstances=true
then begin
DrawNextMain;
DrawNext;
end
else
if FSeparatewindow=true
then
DrawNext
else
DrawNextMain;
//Вывод графика движения маятника
FChart.Series[FNomerSeries].AddXY(FTime,FPhi);
//Обновление таблицы
if (FTime>=RoundTo(Fk1*FTimeLimit,-2))
then
AddTable;
//Увеличение времени
FTime:=RoundTo(FTime+0.1,-2);
CalcPhi;//Вычисляем угол
//RoundTo используется чтобы вычисление производились с десятичными числами
end;
procedure TPendulum.DrawNextMain;
var
y0: Double;
x,y: Integer;
begin
//Закрепленный конец
FImage.Canvas.Brush.Color := ClWhite;
FImage.Canvas.FillRect(FImage.Canvas.ClipRect);
FImage.Canvas.Brush.Color:=clRed;
//Вычисление движеия закрепленного конца
y0:=FA*cos(Fv*FTime);
//Рисования закрепленного конца
FImage.Canvas.MoveTo(FWidthImage,FHeightImage+Round(y0));
FImage.Canvas.Ellipse(FWidthImage-6,FHeightImage+Round(y0)-6,FWidthImage+6,FHeightImage+Round(y0)+6);
//Подвижная часть
//Вычисление положения маятника
x:=FWidthImage+Round(FL*sin(FPhi));
y:=FHeightImage+Round(FL*cos(FPhi)+y0);
//Рисование подвижной части
FImage.Canvas.Brush.Color:=clBlack;
FImage.Canvas.LineTo(x,y);
FImage.Canvas.Ellipse(x-10,y-10,x+10,y+10);
//Вывод лога
if FLog=true
then
FMemo.Lines.Add(FormatDateTime('[DD\MM\YYYY hh:mm:ss]', Now)+' [PendulumMain]'+' Амплитуда='+FloatToStr(FA)+' Частота='+FloatToStr(Fv)+' Длина='+FloatToStr(FL)+' Угол='+FloatToStr(FPhi)+' Угловая скорость='+FloatToStr(Fw)+' Время='+FloatToStr(FTime)+' Середина листа=['+IntToStr(FWidthImage)+','+IntToStr(FHeightImage)+']'+' Значение Y точки подвеса='+FloatToStr(y0)+' Используемое значение для Y точки подвеса='+FloatToStr(Round(y0))+' Координаты точки подвеса=['+IntToStr(FWidthImage)+','+IntToStr(FHeightImage+Round(y0))+']'+' Координаты маятника=['+IntToStr(x)+','+FloatToStr(y)+']');
end;
procedure TPendulum.DrawNext;
var
y0: Double;
x,y: integer;
begin
//Закрепленный конец
FFormIm.Canvas.Brush.Color := ClWhite;
FFormIm.Canvas.FillRect(FFormIm.Canvas.ClipRect);
FFormIm.Canvas.Brush.Color:=clRed;
//Вычисление движеия закрепленного конца
y0:=FA*cos(Fv*FTime);
//Рисования закрепленного конца
FFormIm.Canvas.MoveTo(FWidthFormIm,FHeightFormIm+Round(y0));
FFormIm.Canvas.Ellipse(FWidthFormIm-6,FHeightFormIm+Round(y0)-6,FWidthFormIm+6,FHeightFormIm+Round(y0)+6);
//Подвижная часть
//Вычисление положения маятника
x:=FWidthFormIm+Round(FL*sin(FPhi));
y:=FHeightFormIm+Round(FL*cos(FPhi)+y0);
//Рисование подвижной части
FFormIm.Canvas.Brush.Color:=clBlack;
FFormIm.Canvas.LineTo(x,y);
FFormIm.Canvas.Ellipse(x-10,y-10,x+10,y+10);
//Вывод лога
if FLog=true
then
FMemo.Lines.Add(FormatDateTime('[DD\MM\YYYY hh:mm:ss]', Now)+' [Pendulum]'+' Амплитуда='+FloatToStr(FA)+' Частота='+FloatToStr(Fv)+' Длина='+FloatToStr(FL)+' Угол='+FloatToStr(FPhi)+' Угловая скорость='+FloatToStr(Fw)+' Время='+FloatToStr(FTime)+' Середина листа=['+IntToStr(FWidthFormIm)+','+IntToStr(FHeightFormIm)+']'+' Значение Y точки подвеса='+FloatToStr(y0)+' Используемое значение для Y точки подвеса='+FloatToStr(Round(y0))+' Координаты точки подвеса=['+IntToStr(FWidthFormIm)+','+IntToStr(FHeightFormIm+Round(y0))+']'+' Координаты маятника=['+IntToStr(x)+','+IntToStr(y)+']');
end;
procedure TPendulum.AddTable;
begin
//Выбор таблиц для вывода и вывод в них
if (FMultipleinstances=true) or (FSeparatewindow=false)
then begin
FMainTable.Cells[0,FMainTable.RowCount-1]:=FloatToStr(FA);
FMainTable.Cells[1,FMainTable.RowCount-1]:=FloatToStr(Fv);
FMainTable.Cells[2,FMainTable.RowCount-1]:=FloatToStr(FL);
FMainTable.Cells[3,FMainTable.RowCount-1]:=FloatToStr(RoundTo(RadToDeg(FPhi),-2));
FMainTable.Cells[4,FMainTable.RowCount-1]:=FloatToStr(FTime);
FMainTable.RowCount:=FMainTable.RowCount+1;
FTable.Cells[0,FTable.RowCount-1]:=FloatToStr(FA);
FTable.Cells[1,FTable.RowCount-1]:=FloatToStr(Fv);
FTable.Cells[2,FTable.RowCount-1]:=FloatToStr(FL);
FTable.Cells[3,FTable.RowCount-1]:=FloatToStr(RoundTo(RadToDeg(FPhi),-2));
FTable.Cells[4,FTable.RowCount-1]:=FloatToStr(FTime);
FTable.RowCount:=FTable.RowCount+1;
end
else begin
FMainTable.Cells[0,FMainTable.RowCount-1]:=FloatToStr(FA);
FMainTable.Cells[1,FMainTable.RowCount-1]:=FloatToStr(Fv);
FMainTable.Cells[2,FMainTable.RowCount-1]:=FloatToStr(FL);
FMainTable.Cells[3,FMainTable.RowCount-1]:=FloatToStr(RoundTo(RadToDeg(FPhi),-2));
FMainTable.Cells[4,FMainTable.RowCount-1]:=FloatToStr(FTime);
FMainTable.RowCount:=FMainTable.RowCount+1;
end;
//Увеличение времени для следующего круга
Fk1:=Fk1+1;
end;
procedure TInvertedPendulum.DrawNextMain;
var
y0: Double;
x,y: integer;
begin
//Закрепленный конец
FImage.Canvas.Brush.Color := ClWhite;
FImage.Canvas.FillRect(FImage.Canvas.ClipRect);
FImage.Canvas.Brush.Color:=clRed;
//Вычисление движеия закрепленного конца
y0:=FA*cos(Fv*FTime);
//Рисования закрепленного конца
FImage.Canvas.MoveTo(FWidthImage,FHeightImage+Round(y0));
FImage.Canvas.Ellipse(FWidthImage-6,FHeightImage+Round(y0)-6,FWidthImage+6,FHeightImage+Round(y0)+6);
//Подвижная часть
//Вычисление положения маятника
x:=FWidthImage+Round(FL*sin(FPhi));
y:=FHeightImage+Round(-FL*cos(FPhi)+y0);
//Рисование подвижной части
FImage.Canvas.Brush.Color:=clBlack;
FImage.Canvas.LineTo(x,y);
FImage.Canvas.Ellipse(x-10,y-10,x+10,y+10);
//Вывод лога
if FLog=true
then
FMemo.Lines.Add(FormatDateTime('[DD\MM\YYYY hh:mm:ss]', Now)+' [InvPendulumMain]'+' Амплитуда='+FloatToStr(FA)+' Частота='+FloatToStr(Fv)+' Длина='+FloatToStr(FL)+' Угол='+FloatToStr(FPhi)+' Угловая скорость='+FloatToStr(Fw)+' Время='+FloatToStr(FTime)+' Середина листа=['+IntToStr(FWidthImage)+','+IntToStr(FHeightImage)+']'+' Значение Y точки подвеса='+FloatToStr(y0)+' Используемое значение для Y точки подвеса='+FloatToStr(Round(y0))+' Координаты точки подвеса=['+IntToStr(FWidthImage)+','+IntToStr(FHeightImage+Round(y0))+']'+' Координаты маятника=['+IntToStr(x)+','+IntToStr(y)+']');
end;
procedure TInvertedPendulum.DrawNext;
var
y0: Double;
x,y: integer;
begin
//Закрепленный конец
FFormIm.Canvas.Brush.Color := ClWhite;
//FFormIm.Canvas.FillRect(FFormIm.Canvas.ClipRect);
FFormIm.Canvas.Brush.Color:=clRed;
//Вычисление движеия закрепленного конца
y0:=FA*cos(Fv*FTime);
//Рисования закрепленного конца
FFormIm.Canvas.MoveTo(FWidthFormIm,FHeightFormIm+Round(y0));
FFormIm.Canvas.Ellipse(FWidthFormIm-6,FHeightFormIm+Round(y0)-6,FWidthFormIm+6,FHeightFormIm+Round(y0)+6);
//Подвижная часть
//Вычисление положения маятника
x:=FWidthFormIm+Round(FL*sin(FPhi));
y:=FHeightFormIm+Round(-FL*cos(FPhi)+y0);
//Рисование подвижной части
FFormIm.Canvas.Brush.Color:=clBlack;
FFormIm.Canvas.LineTo(x,y);
FFormIm.Canvas.Ellipse(x-10,y-10,x+10,y+10);
//Вывод лога
if FLog=true
then
FMemo.Lines.Add(FormatDateTime('[DD\MM\YYYY hh:mm:ss]', Now)+' [InvPendulum]'+' Амплитуда='+FloatToStr(FA)+' Частота='+FloatToStr(Fv)+' Длина='+FloatToStr(FL)+' Угол='+FloatToStr(FPhi)+' Угловая скорость='+FloatToStr(Fw)+' Время='+FloatToStr(FTime)+' Середина листа=['+IntToStr(FWidthFormIm)+','+IntToStr(FHeightFormIm)+']'+' Значение Y точки подвеса='+FloatToStr(y0)+' Используемое значение для Y точки подвеса='+FloatToStr(Round(y0))+' Координаты точки подвеса=['+IntToStr(FWidthFormIm)+','+IntToStr(FHeightFormIm+Round(y0))+']'+' Координаты маятника=['+IntToStr(x)+','+IntToStr(y)+']');
end;
//Процедуры написанные далее не используются в программе
procedure TPendulum.ReadToIni;
var
Ini: Tinifile;
begin
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');
FA:=Ini.ReadFloat('ParametrPendulum','Amplitude',2);
Fv:=Ini.ReadFloat('ParametrPendulum','Frequency',3);
FL:=Ini.ReadFloat('ParametrPendulum','Length',40);
FPhi:=Ini.ReadFloat('ParametrPendulum','Angle',0.1);
Fw:=Ini.ReadFloat('ParametrPendulum','Acceleration due to gravity',9.81);
FTimeLimit:=Ini.ReadFloat('ParametrPendulum','Time',10);
Ini.Free;
end;
procedure TInvertedPendulum.ReadToIni;
var
Ini: Tinifile;
begin
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+'\Option.ini');
FA:=Ini.ReadFloat('ParametrPendulum','Amplitude',2);
Fv:=Ini.ReadFloat('ParametrPendulum','Frequency',3);
FL:=Ini.Rea...
Подобные документы
Анализ временных рядов. Разработка программы для среды визуального проектирования Borland Delphi 7.0. Математическая формулировка задачи. Структурная схема программы. Описание реализации технологии COM, динамических библиотек, возможностей программы.
курсовая работа [4,3 M], добавлен 14.11.2010Анализ преимуществ и недостатков различных численных методов решения дифференциальных уравнений высших порядков. Обоснование выбора метода Рунге-Кутта четвертого порядка. Разработка программы, моделирующей физическое и математическое поведение маятника.
курсовая работа [1,6 M], добавлен 11.07.2012Разработка имитационной модели для изучения движения нелинейного маятника с графическим отображением в ГИС Maple в режиме функционирования системы наблюдений без задержки времени. Гармонические и периодические колебания маятника. Теорема Гюйгенса.
курсовая работа [1,3 M], добавлен 29.05.2014Стандартная библиотека для всех 32-разрядных операционных систем - OpenGL. Структурная схема программы. Описание разработанного класса, реализации технологии Com, динамических библиотек. Средства использования сервисов, предоставляемых Microsoft Office.
курсовая работа [4,3 M], добавлен 14.11.2010Исследование характера движения математического маятника в идеальных условиях, то есть без учёта сил сопротивления, что позволяет маятнику совершать гармонические колебания неограниченное количество времени. Рассмотрение алгоритма решения задачи на ЭВМ.
курсовая работа [231,1 K], добавлен 07.03.2013Процесс моделирования работы САПР: описание моделирующей системы, разработка структурной схемы и Q-схемы, построение временной диаграммы, построение укрупненного моделирующего алгоритма. Описание математической модели, машинной программы решения задачи.
курсовая работа [291,6 K], добавлен 03.07.2011Существующие альтернативы программы. Описание формул для выкроек, используемых в разработке. Описание разрабатываемой программы, а также структура ее интерфейса. Детальное описание возможностей и спецификация, функциональные особенности программы.
курсовая работа [427,4 K], добавлен 10.10.2015Постановка нелинейной задачи. Кусочно-линейная и кусочно-постоянная аппроксимация нелинейностей. Сопровождающая кусочно-линейная задача минимальной интенсивности. Свойства оптимальной стартовой обратной связи. Стабилизация перевернутого маятника.
дипломная работа [412,8 K], добавлен 28.05.2013Применение программного обеспечения для разработки игры "Быки и коровы". Описание алгоритма и интерфейса пользователя программы. Назначение и область применения и описание возможностей программы. Рассмотрение списка сообщений об ошибках программы.
курсовая работа [799,2 K], добавлен 26.04.2021Основные типы динамических подключаемых библиотек DLL: исполняемые и библиотеки ресурсов. Способы экспорта процедур и функций: по имени и порядковому номеру. Системные требования к разработке программы для организации проведения опросов (тестов).
курсовая работа [124,3 K], добавлен 23.07.2012Описание структурной схемы операционного устройства. Построение обратной структурной таблицы автомата. Проектирование функций выходов и управление элементами памяти. Изображение пользовательского интерфейса и инструкции по инсталляции и запуску программы.
курсовая работа [642,6 K], добавлен 19.05.2014Характеристика функций имитационного моделирования. Знакомство с особенностями имитационного моделирования агрегированной системы массового обслуживания. Анализ программы GPSSWorld: рассмотрение возможностей, способы составления имитационной модели.
курсовая работа [1,6 M], добавлен 27.05.2013Характеристика состава, интерфейса и основных возможностей программы схемотехнического моделирования и проектирования семейства Micro-Cap8, которая относится к наиболее популярным системам автоматизированного проектирования (САПР) электронных устройств.
реферат [108,0 K], добавлен 12.03.2011Характеристика алгоритмов и программных реализаций поведения агентов в двумерной среде. Исследование разработки структур данных и знаний. Особенность создания интерфейса и карты лабиринта. Экспериментальное тестирование и отладка модулей программы.
дипломная работа [2,4 M], добавлен 12.08.2017Назначение и применение микроконтроллеров - интегральных микросхем, предназначенных для управления электронными схемами. Описание способа адресации. Разработка программы, описание электрической и структурной схемы разрабатываемого микроконтроллера.
курсовая работа [177,6 K], добавлен 30.06.2014Необходимость создания моделируемой системы. Описание моделируемой системы и задание моделирования. Структурная схема модели системы. Блок–диаграмма. Текст программы. Описание текста программы. Результаты моделирования. Эксперимент, его результаты.
курсовая работа [35,9 K], добавлен 19.11.2007Разработка алгоритма решения задачи численного интегрирования методом трапеции. Словесное описание и блок-схема разработанного алгоритма программы. Описание интерфейса, главного окна и основных форм программы. Проверка работоспособности программы.
курсовая работа [1,4 M], добавлен 16.03.2012Изучение методов разработки приложений в среде визуального программирования Visual Studio. Создание программы, реализующей заказ железнодорожных билетов. Язык SQL-запросов в системе управления базами данных MS Access. Тестирование созданной программы.
курсовая работа [1,0 M], добавлен 03.07.2016Определение ускорения свободного падения с помощью физического маятника. Период колебания физического маятника. Нахождение ускорения свободного падения методом наименьших квадратов. Решение задач методами Гаусса-Ньютона и квазиньютоновскими методами.
лабораторная работа [32,4 K], добавлен 29.03.2015Порядок проектирования программы, демонстрирующей принцип заполнения очереди и стека и принцип удаления элементов из очереди и стека. Определение класса и всех необходимых функций. Программа на языке С, описание возможностей, используемых для алгоритма.
курсовая работа [254,3 K], добавлен 20.05.2013