Автор работы: Пользователь скрыл имя, 19 Мая 2015 в 21:37, курсовая работа
Данный курсовой проект посвящен программному моделированию реакции одномассовой системы на прямоугольный импульс. В результате импульса, в том числе и прямоугольного, система начинает колебаться. Различного рода колебания – одно из самых распространенных физических явлений. Ничто в окружающей нас среде не остается в стороне от колебаний, будь то математический маятник или лист дерева на ветру. На основе колебаний работает огромное количество приборов и механизмов, широко используемых человеком.
Рисунок 3.1 – Заставка программы
После заставки появится главное окно программы (см. рисунок 3.2).
Рисунок 3.2 – Главное окно программы
Как видно, данное окно состоит из следующих частей:
Пункты главного меню показаны на рисунке 3.3.
Рисунок 3.3 – Главное меню программы
В свою очередь пункты главного меню содержит ряд подпунктов, приведенных на рисунке 3.4.
Рисунок 3.4 - Пункт меню «Файл»
При выборе пункта «Выход» происходит завершение работы приложения.
Пункт меню «Сохранить» сохраняет полином в файл, а пункт меню «Сохранить как» сохраняет полином в файл с указанием адреса:
Рисунок 3.5 – Выбор адреса
Подпункты пункта меню «Вид» «Отключить заставку» и «Сменить скин» отключают заставку и меняют «скин» по желанию пользователя соответсвенно(см. рисунок 3.6).
Рисунок 3.7 - Пункт меню «Вид»
На рисунке 3.8 приведены команды, вызываемые пунктом главного меню «Справка».
Рисунок 3.8 – Пункт меню «Справка»
Выбор пункта главного меню «Справка» позволяет получить на экране краткие сведения о программе в виде, показанном на рисунке 3.9, а также отправить короткое сообщеник разработчику (см. рисунок 3.10).
Рисунок 3.9 – Форма «О программе»
Рисунок 3.10 – Форма «Письмо разработчику»
Также имеется качель изменения степени многочлена, переключатель рода многочлена.
Кнопка «Вывести многочлен» выводит многочлен по заданным ранее кретериям (рисунок 3.11).
Рисунок 3.11 – Выведенный многочлен
Для отображения таблицы коэффициентов и графика необходимо нажать кнопку «Показать таблицу и график» (см. рисунок 3.12).
Рисунок 3.11 – Таблица коэффициентов и график
Для возвращения к предыдущему состоянию необходимо нажать кнопку «Показать полином в общем виде»
Целью проведения испытаний является проверка работоспособности (надежности) программы при различных условиях ее функционирования.
Программа должна обеспечивать корректность ввода исходных данных (путем осуществления соответствующих проверок и информирования пользователя о возникших неточностях в работе), а также получение непротиворечивого результата.
Для демонстрации работоспособности программы необходимо провести ряд испытаний с различными начальными условиями. Для обеспечения нормальной работы программы требуется наличие соответствующих DLL.
Тестовые примеры выполнялись в среде операционной системы Windows XP Profesional при использовании процессора Intel Pentium 4 2.4 GHz и разрешении экрана 1024*768. Для работы с программой необходимо также наличие клавиатуры и манипулятора типа «мышь».
Испытание проведем с произвольными данными.
Произврольные данные: при степени равной 31 и первому роду.
Результаты этого вычислительного эксперимента приведены на рисунке 4.1.
Рисунок 4.1 – Тест №1
Произведем также испытание при других значениях исходных данных, при степени равной 31 и второму роду
Полученные результаты на рисунке 4.2.
Рисунок 4.2 – Тест №2
Так же можно провести тест экспорта данных в MS Excel и MSWord, полученные результаты на рисунке 4.3 и рисунке 4.4 соответственно.
Рисунок 4.3 – Тест №3
Рисунок 4.4 – Тест №4
Таким образом, проведенное тестирование программы не выявило сбойных ситуаций и некорректностей в ее работе. Следует считать, что в целом программа протестирована, отвечает поставленным требованиям и вполне работоспособна.
В ходе выполнения курсовой работы:
Программа имеет достаточно ясный и понятый дружелюбный пользовательский интерфейс, обеспечивающий удобство в работе и обеспечивающий получение необходимой пользователю информации с наименьшими затратами времени.
Таким образом, разработанное в ходе выполнения курсовой работы приложение является законченным программным продуктом.
program Polynomials;
uses
Forms,
UnitMain in 'UnitMain.pas' {FormMain},
PUnit1 in 'PUnit1.pas' {Form1},
PUnit2 in 'PUnit2.pas' {Form2},
UPoly in 'UPoly.pas';
{$R *.res}
begin
Application.Initialize;
Application.CreateForm(
Application.CreateForm(TForm1, Form1);
Application.CreateForm(TForm2, Form2);
Application.Run;
end.
unit UnitMain;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ComCtrls, Buttons, Menus, Vcl.Grids,
VCLTee.TeEngine, VCLTee.TeeProcs, VCLTee.Chart, Math, VCLTee.Series, ComObj;
type
TFormMain = class(TForm)
GroupBox1: TGroupBox;
GroupBox2: TGroupBox;
RadioGroup1: TRadioGroup;
Button1: TButton;
GroupBox6: TGroupBox;
RichEdit1: TRichEdit;
UpDown1: TUpDown;
Label1: TLabel;
Image2: TImage;
MainMenu1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N11: TMenuItem;
N12: TMenuItem;
X1: TMenuItem;
OpenDialog1: TOpenDialog;
GroupBox3: TGroupBox;
Label2: TLabel;
SaveDialog1: TSaveDialog;
N13: TMenuItem;
SpeedButton1: TSpeedButton;
SpeedButton2: TSpeedButton;
Button2: TButton;
StringGrid1: TStringGrid;
Chart1: TChart;
Label3: TLabel;
Series1: TLineSeries;
procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure N12Click(Sender: TObject);
procedure X1Click(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N13Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
n :integer;
end;
var
FormMain: TFormMain;
function ShowFormModal:integer;stdcall;
external 'DllFormpr.dll' name 'ShowDllFormModal';
implementation
uses PUnit1, IniFiles, PUnit2, UWord, UPoly, Unit2;
{$R *.dfm}
const maxn=333; // константа, ограничение степени полиномов
var ch: integer;
procedure TFormMain.FormCreate(Sender: TObject);
var
Ini: Tinifile;
m: integer; //временная переменная
begin
Ini:=TiniFile.Create(
RadioGroup1.ItemIndex := Ini.ReadInteger('Pol','Rod',
n := Ini.ReadInteger('Pol','Step',
m := Ini.ReadInteger('Show', 'Start', 100);
if m = 1
then
N5.Checked:=false
else
N5.Checked:=true;
Ini.Free; //чтение из ini
ch:=0;
UpDown1.Max:=maxn; //установка ограничения
UpDown1.Position:=n; //это же значение в счетчик
Label1.Caption:=IntToStr(n); //это же значение на экран
FormMain.Top := Screen.Height div 2 - FormMain.Height div 2; //центрирование под экран
FormMain.Left := Screen.Width div 2 - FormMain.Width div 2;
end;
procedure TFormMain.UpDown1Click(Sender: TObject; Button: TUDBtnType);
begin
if Button=btNext
then
inc(n)
else
dec(n); //если правая кнопка увеличиваем n, иначе уменьшаем
Label1.Caption:=IntToStr(n); //значение n на экран
end;
procedure TFormMain.Button1Click(Sender: TObject); //Чебышева
Var objp: TCPoly;
rod: integer;
obj_com: IMyClass;
begin
rod := RadioGroup1.ItemIndex;
FormMain.RichEdit1.Clear;
FormMain.RichEdit1.Lines.Add('
//Использование com сервера
obj_com := CreateComObject(Class_MyClass) as IMyClass;
obj_com.PolyCheb(n, rod);
obj_com.whithout_zero;
FormMain.RichEdit1.Lines.Add(
obj_com.Get_Table(StringGrid1)
obj_com.Get_Chart(Chart1);
end;
procedure TFormMain.Button2Click(Sender: TObject);
begin
if ch = 0
then
begin
RichEdit1.Visible := false;
ch := 1;
Label3.visible := true;
Chart1.visible := true;
StringGrid1.visible := true;
Button2.Caption := 'Показать полином в общем виде'
end
else
begin
RichEdit1.Visible := true;
ch := 0;
Label3.visible := false;
Chart1.visible := false;
StringGrid1.visible := false;
Button2.Caption := 'Показать таблицу и график';
end;
end;
procedure TFormMain.FormShow(Sender: TObject);
var
Ini: Tinifile;
tumb: integer;
begin
Ini := TiniFile.Create(
tumb := Ini.ReadInteger('Show', 'Start', 100);
Ini.Free;
Label3.visible := false;
Chart1.visible := false;
StringGrid1.visible := false;
if tumb = 1
then
Form1.ShowModal;
end;
procedure TFormMain.BitBtn1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TFormMain.BitBtn2Click(Sender: TObject);
begin
Application.Minimize;
end;
procedure TFormMain.FormDestroy(Sender: TObject);
var
Ini: Tinifile; //ini объект
begin
Ini:=TiniFile.Create(
Ini.WriteInteger('Pol', 'Rod', RadioGroup1.ItemIndex);
Ini.WriteInteger('Pol', 'Step', n);
Ini.Free; //запись в ini
end;
procedure TFormMain.N12Click(Sender: TObject);
begin
Application.Minimize;
end;
procedure TFormMain.X1Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TFormMain.N5Click(Sender: TObject);
var
Ini: Tinifile;
begin
Ini:=TiniFile.Create(
if N5.Checked = true
then
begin
Ini.WriteInteger('Show', 'Start', 1);
N5.Checked := false;
end
else
begin
Ini.WriteInteger('Show', 'Start', 0);
N5.Checked := true;
end;
Ini.Free;
end;
procedure TFormMain.N3Click(Sender: TObject);
begin
Application.Terminate;
end;
procedure TFormMain.N6Click(Sender: TObject);
begin
if OpenDialog1.Execute
then
Image2.Picture.LoadFromFile(
end;
procedure TFormMain.N2Click(Sender: TObject);
begin
If SaveDialog1.Execute
then
RichEdit1.Lines.SaveToFile(
end;
procedure TFormMain.N13Click(Sender: TObject);
begin
RichEdit1.Lines.SaveToFile(
end;
procedure TFormMain.N11Click(Sender: TObject);
begin
Form2.ShowModal();
end;
procedure TFormMain.N8Click(Sender: TObject);
begin
ShowFormModal;
end;
//Excel
procedure TFormMain.SpeedButton1Click(
Var objx: TCPoly;
rod: integer;
begin
rod := RadioGroup1.ItemIndex;
objx := TCPoly.Create;
objx.PolyCheb(n, rod);
objx.whithout_zero;
objx.Get_Chart(Chart1);
objx.Import_To_Excel(rod, n);
objx.Free;
end;
procedure TFormMain.SpeedButton2Click(
Var objw: TCPoly;
rod: integer;
begin
rod := RadioGroup1.ItemIndex;
objw := TCPoly.Create;
objw.PolyCheb(n, rod);
objw.whithout_zero;
objw.Get_Chart(Chart1);
objw.Import_To_Word(rod, n);
objw.Free;
end;
end.
unit UPoly;
interface
uses VCLTee.TeeProcs, VCLTee.Chart, VCLTee.Series, Math, Grids, SysUtils, Types, Graphics, IniFiles,
Messages, Dialogs, StdCtrls, Variants, Classes, Controls, Forms,
ExtCtrls, Buttons, Menus, comobj, Excel_TLB, Word_TLB;
type
TCPoly = class(TObject)
private
n: integer;
rod: integer;
v_str: string;
matr: array of Extended;
matr_for_table: array of Extended;
count: integer;
public
procedure PolyCheb(_n, _rod: integer);
function idx(i,j:integer):integer;
procedure ClearMatr;
function st(gr:integer):string;
function xst(gr:integer):string;
function koef(gr:integer):string;
function get_str(): string;
function get_count(): integer;
procedure ShowPolynomial;
function get_el_array(i_row:integer): Extended;
procedure whithout_zero();
procedure Get_Table(SG : TStringGrid);
procedure Get_Chart(Ch : TChart);
function stepX(X: Extended; stepen: integer): Extended;
procedure Import_To_Excel(rod, por:integer);
procedure Import_To_Word(rod, por:integer);
end;
var
i,j: integer;
implementation
procedure TCPoly.whithout_zero();
var
buf: array of Extended;
el: integer;
_count: integer;
begin
_count := 0;
for i := 0 to (n+1)*(n+1)-1 do
if matr_for_table[i] = 0
then
inc(_count);
_count:=(n+1)*(n+1)-_count;
SetLength(buf, _count);
el:=0;
for i := 0 to (n+1)*(n+1)-1 do
if matr_for_table[i] <> 0
then
begin
buf[el] := matr_for_table[i];
inc(el);
end;
matr_for_table := nil;
SetLength(matr_for_table, _count);
for i := 0 to _count-1 do
matr_for_table[i] := buf[i];
count := _count;
end;
function TCPoly.get_count(): integer;
begin
Result:=count;
end;
function TCPoly.get_el_array(i_row:
begin
Result:=matr_for_table[i_row];
end;
function TCPoly.get_str(): string;
begin
Result:=v_str;
end;
function TCPoly.idx(i,j:integer):
begin
Result:=i*(n+1)+j;
end;
procedure TCPoly.ClearMatr;
var i:integer;
begin
//установка размера и очистка матрицы
SetLength(matr,(n+1)*(n+1));
for i:=0 to (n+1)*(n+1)-1 do matr[i]:=0;
SetLength(matr_for_table,(n+1)
for i:=0 to (n+1)*(n+1)-1 do matr_for_table[i]:=0;
end;
//----------------------------
procedure TCPoly.PolyCheb(_n, _rod: integer); //Чебышева
var i,j:integer; //счетчики для циклов (i номер строки, j номер столбца)
begin
n:=_n; rod := _rod;
ClearMatr; // создание чистой матрицы нужного размера
matr[idx(0,0)]:=1; //коэф при нулевой степени х