Разработка приложения вычисления определенных интегралов по формуле левых прямоугольников

Министерство образования и науки Республики Беларусь

Белорусский национальный технический университет

Международный институт дистанционного образования



Кафедра программного обеспечения вычислительной техники и автоматизированных систем







КУРСОВАЯ РАБОТА

по дисциплине:

«Конструирование программ и языки программирования»



Разработка приложения вычисления определенных интегралов по формуле левых прямоугольников









Выполнил: 

ст. гр. 417313 Я



Принял: 

доц. Гурский Н.Н.











Минск 2005


Введение



Delphi – это современный программный продукт, позволяющий создавать широкий спектр приложений. Он объединяет в себе высокопроизводительный компилятор с языка ObjectPascal, являющийся объектноориентированным расширением структурного языка третьего поколения Pascal, средств наглядного (визуального) создания программ и масштабируемую технологию управления БД. Основное назначение Delphi – служить средством для быстрого создания широкого класса Windowsприложений, включая приложения, отвечающие технологии распределенной обработки данных, называемой технологией клиентсервер.

Для разработки Windowsприложений Delphi имеет следующие средства:

-высокопроизводительный компилятор

Имеющийся в составе Delphi компилятор с языка ObjectPascal, являющийся одним из самых производительным в мире, позволяющий компилировать приложения со скоростью до 120000 строк в минуту. Среда Delphi включает в себя встроенный компилятор. При необходимости можно воспользоваться и пакетным компилятором DCC.EXE.

-объектноориентированная модель компонентов

Основным назначением применения в Delphi модели компонентов является обеспечение возможности многократного использования компонентов и создания новых. Для создания Delphi использовались те же компоненты, что входят в состав поставки. Тем не менее, внесенные в объектную модель изменения, в первую очередь, были вызваны необходимостью поддержки технологии визуального программирования. При этом язык остался совместимым с языком Pascal, поддерживаемым компилятором BorlandPascal 7.0

-быстрая среда разработки (RAD)

Среда Delphi содержит полный набор визуальных средств для быстрой разработки приложений, поддерживающих как создание пользовательских интерфейсов, так и обработку корпоративных данных (с использованием соответствующих средств). Использование библиотеки визуальных компонентов (VCL) и визуальных объектов для работы с данными позволяет создавать приложения с минимальными затратами на непосредственное кодирование. При этом компоненты, включенные в состав Delphi, максимально инкапсулируют вызовы функций Windows API, тем самым облегчая процесс создания программ.

-расширяемость

Delphi является системой с открытой архитектурой, что позволяет дополнять ее новыми средствами и переносить на различные платформы. 

-средства для построения БД

Delphi поддерживает практически все форматы существующих реляционных таблиц. Delphi включает в себя локальный сервер InterBase, для того, чтобы можно было разрабатывать расширяемые на любые внешние SQLсерверы приложения в онлайновом режиме. 

Итак, Delphi – это новый продукт, позволяющий создавать широкий спектр приложений для Windows. Среда Delphi включает в себя полный набор визуальных средств для быстрой разработки приложений, поддерживающих как создание пользовательских интерфейсов, так и таблиц базы данных. Библиотека классов, входящих в Delphi, содержит большое количество классов, инкапсулирующих различные группы функций Windows API. Delphi является системой с открытой архитектурой, что позволяет дополнять ее новыми средствами, и переносить на различные платформы.


1. Математическая формулировка задачи



Требуется составить программу вычисления определенного интеграла по формуле левых прямоугольников.







Начальные данные:







Формула левых прямоугольников имеет вид:







Вычислить значение интеграла. Подынтегральную функцию представить в графическом виде, показать геометрическое значение интеграла в виде заштрихованной площади.



2. Описание программы



Программа включает 4 формы: 

1. Главную, на которой располагаются элементы управления:

2. Форму, отображающую заставку: 

3. Форму для About:

4. Форму для COM-сервера.


Структурная схема программы.



Выбор функции вычисления

Метод 

COM-сервера



Обращение к методу вычисления значения функции из COM-сервера

Выбор операции



Вычисление значения интеграла

Вывод графика функции



Обращение к процедуре вывода графика



Выбор операции



Выход из программы



Завершение приложения



Другая операция



Выбор операции



Вычисление значения интеграла

Показать табличный вид интеграла



Вывод графика функции



Выход из программы



Завершение приложения



Обращение к процедуре вывода табличного вида интеграла







В программе используется конвертация данных расчета в приложение Microsoft Office Excel. Создана справочная система программы.



4. Руководство пользователя



Для запуска программы необходимо запустить файл “Pintegral.exe”.

Внешний вид главной формы представлен в ч.3.

1. Ввод данных.

Для правильной работы программы необходимо загрузить в неё данные посредством ввода их в поля TЕdit:







2. Вычисление значения интеграла.

Для вычисления значения интеграла есть возможность воспользоваться пунктом Данные->Применитьла из главного меню







или кнопкой Применить, расположенной на форме:







После вычисления результат отобразится на форме, будет построен график подинтегральной функции и создана таблица результатов расчета.

3. Конвертация данных расчета в приложение Microsoft Office Excel. 

Данную операцию можно совершить либо выбрав в главном меню Файл->Экспорт в Excel либо нажав на кнопку  на главной форме.

5. Вызов справки.

Для вывода справочной информации ?->Справка либо нажав на кнопку  на главной форме.

Внешний вид окна справки:







6. Вызов About.

Для вывода информации о программе ?->About либо нажав на кнопку  на главной форме.

Внешний вид окна представлен в ч.3.

7 Завершение приложения.

Для выхода из программы необходимо выполнить одно из следующих действий:

Выбрать в главном меню Файл->Выход

Нажать на кнопку  на главной форме.

Либо щёлкнуть на крестике в правом верхнем углу формы 


5. Методика испытаний



Целью проведения испытаний являлась проверка работоспособности программы при различных исходных данных.

1. Исходные данные:

значение левого предела интегрирования: 1,6;

значение правого предела интегрирования: 2,7;

точность вычисления: 95;

После нажатия кнопки Применить был получен результат вычислений, построен график функции и составлена таблица с результатами расчета. Программа успешно экспортировала данные в приложение Microsoft Office, показала информацию о программе и файл помощи.


Заключение



В ходе тестирования не было выявлено ошибок и сбоев в работе приложения: процессы вычисления значений интегралов, вывода графиков функций и геометрических смыслов интегралов происходили по мере запросов без ошибок. 

Доступ к методам класса, а также методам COM-сервера и динамической библиотеки “ pServer.dll” осуществлялся без ошибок.

Возможно использования приложения как вспомогательного средства при изучении интегрального исчисления.


Список использованных источников



Фаронов В.В. Delphi. Программирование на языке высокого уровня. - СПб: Издательство «Питер», 2000.- 639 с.

Марко Кэнту. Delphi 5 для профессионалов.-СПб.: Питер. 2001. – 944 с.

А.Я.Архангельский. Delphi 7. Учебное пособие. - СПб: Издательство «Питер», 2004.- 1087 с.

Электронные учебники


Приложение 1. Листинг программы



Сервер:

unit pServer_TLB;

// ****************************************************** //

// WARNING 

// ------- 

// The types declared in this file were generated from data read from a 

// Type Library. If this type library is explicitly or indirectly (via 

// another type library referring to this type library) re-imported, or the 

// 'Refresh' command of the Type Library Editor activated while editing the 

// Type Library, the contents of this file will be regenerated and all 

// manual modifications will be lost. 

// ********************************************************** //

// PASTLWTR : 1.2

// File generated on 15.11.2005 22:46:27 from Type Library described below.

// ************************************************* //

// Type Lib: C:\Documents and Settings\Sergh\Рабочий стол\Разработка приложения вычисления определенных интегралов по формуле левых прямоугольников (Delphi)\Source\Server\pServer.tlb (1)

// LIBID: {73AF5EFB-ABD6-4565-91C3-0E7C137DA989}

// LCID: 0

// Helpfile: 

// HelpString: pServer Library

// DepndLst: 

// (1) v2.0 stdole, (C:\WINDOWS\system32\stdole2.tlb)

// ********************************************************* //

{$TYPEDADDRESS OFF} // Unit must be compiled without type-checked pointers. 

{$WARN SYMBOL_PLATFORM OFF}

{$WRITEABLECONST ON}

{$VARPROPSETTER ON}

interface

uses Windows, ActiveX, Classes, Graphics, StdVCL, Variants;

// ****************************************************//

// GUIDS declared in the TypeLibrary. Following prefixes are used: 

// Type Libraries : LIBID_xxxx 

// CoClasses : CLASS_xxxx 

// DISPInterfaces : DIID_xxxx 

// Non-DISP interfaces: IID_xxxx 

// ********************************************************//

const

// TypeLibrary Major and minor versions

pServerMajorVersion = 1;

pServerMinorVersion = 0;

LIBID_pServer: TGUID = '{73AF5EFB-ABD6-4565-91C3-0E7C137DA989}';

IID_IIntegral: TGUID = '{2877719B-94E7-45FB-82BE-7F9CD8A6017C}';

CLASS_Integral: TGUID = '{3AD7BD31-8C15-49ED-A0B5-436060913721}';

type

// ***************************************************//

// Forward declaration of types defined in TypeLibrary 

// *******************************************************//

IIntegral = interface;

// *******************************************************//

// Declaration of CoClasses defined in Type Library 

// (NOTE: Here we map each CoClass to its Default Interface) 

// *********************************************************//

Integral = IIntegral;

// *******************************************************//

// Interface: IIntegral

// Flags: (0)

// GUID: {2877719B-94E7-45FB-82BE-7F9CD8A6017C}

// *****************************************************//

IIntegral = interface(IUnknown)

['{2877719B-94E7-45FB-82BE-7F9CD8A6017C}']

function Func(x: Double): Double; stdcall;

end;

// **********************************************************//

// The Class CoIntegral provides a Create and CreateRemote method to 

// create instances of the default interface IIntegral exposed by 

// the CoClass Integral. The functions are intended to be used by 

// clients wishing to automate the CoClass objects exposed by the 

// server of this typelibrary. 

// ***********************************************************//

CoIntegral = class

class function Create: IIntegral;

class function CreateRemote(const MachineName: string): IIntegral;

end;

implementation

uses ComObj;

class function CoIntegral.Create: IIntegral;

begin

Result := CreateComObject(CLASS_Integral) as IIntegral;

end;

class function CoIntegral.CreateRemote(const MachineName: string): IIntegral;

begin

Result := CreateRemoteComObject(MachineName, CLASS_Integral) as IIntegral;

end;

end.

unit uFunc;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses

Windows, ActiveX, Classes, ComObj, pServer_TLB, StdVcl;

type

TIntegral = class(TTypedComObject, IIntegral)

protected

function Func(x: Double): Double; stdcall;

end;

implementation

uses ComServ;

// Вычисление значения уравнения

function TIntegral.Func(x: Double): Double;

begin

Result := (x + 0.8) / sqrt (x * x + 1.2);

end;

initialization

TTypedComObjectFactory.Create(ComServer, TIntegral, Class_Integral,

ciMultiInstance, tmApartment);

end.



Клиент:

unit uMain;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Buttons, ExtCtrls, TeEngine, Series, TeeProcs, Chart,

Grids, Menus, ToolWin, ComCtrls, ImgList;

type

TfrmMain = class(TForm)

GroupBox1: TGroupBox;

edtA: TEdit;

Label1: TLabel;

edtB: TEdit;

Label2: TLabel;

edtN: TEdit;

Label3: TLabel;

btnApply: TBitBtn;

pnlRes: TPanel;

Chart1: TChart;

Series1: TAreaSeries;

grdAll: TStringGrid;

MainMenu1: TMainMenu;

N1: TMenuItem;

Excel: TMenuItem;

N2: TMenuItem;

nExit: TMenuItem;

N3: TMenuItem;

NApply: TMenuItem;

N5: TMenuItem;

NSave: TMenuItem;

NLoad: TMenuItem;

OpenDialog: TOpenDialog;

SaveDialog: TSaveDialog;

ToolBar1: TToolBar;

ToolButton1: TToolButton;

ToolButton2: TToolButton;

ToolButton3: TToolButton;

ToolButton4: TToolButton;

ToolButton5: TToolButton;

ToolButton6: TToolButton;

ToolButton7: TToolButton;

ToolButton8: TToolButton;

ToolButton9: TToolButton;

N4: TMenuItem;

nAbout: TMenuItem;

ToolButton10: TToolButton;

NHelp: TMenuItem;

N6: TMenuItem;

ImageList1: TImageList;

procedure FormCreate(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure nExitClick(Sender: TObject);

procedure ExcelClick(Sender: TObject);

procedure NApplyClick(Sender: TObject);

procedure NLoadClick(Sender: TObject);

procedure NSaveClick(Sender: TObject);

procedure nAboutClick(Sender: TObject);

procedure NHelpClick(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmMain: TfrmMain;

implementation

uses uLogo, uIntegral, uAbout;

var

Integral: TIntegral;

{$R *.dfm}

// Создание формы

procedure TfrmMain.FormCreate(Sender: TObject);

var

// Объявляем объект формы логотипа

logo: TfrmLogo;

begin

// Создаем форму

logo := TfrmLogo.Create(self);

// Отображаем форму

logo.ShowModal;

// Создаем объект Integral

Integral := TIntegral.Create(1.6, 2.7, 95);

pnlRes.Caption := 'Результат = ' + FloatToStr(Integral.Calculate);

Integral.Draw(Series1);

Chart1.ZoomPercent(90);

Integral.FillTable(grdAll);

end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// Очищаем память

Integral.Destroy;

end;

procedure TfrmMain.nExitClick(Sender: TObject);

begin

Close;

end;

procedure TfrmMain.ExcelClick(Sender: TObject);

begin

Integral.ExcelExport(grdAll);

end;

procedure TfrmMain.NApplyClick(Sender: TObject);

begin

Integral.A := StrToFloat(edtA.Text);

Integral.B := StrToFloat(edtB.Text);

Integral.N := StrToInt(edtN.Text);

pnlRes.Caption := 'Результат = ' + FloatToStr(Integral.Calculate);

Integral.Draw(Series1);

Integral.FillTable(grdAll);

end;

procedure TfrmMain.NLoadClick(Sender: TObject);

begin

if (OpenDialog.Execute) then begin

Integral.LoadFromFile(OpenDialog.FileName);

edtA.Text := FloatToStr(Integral.A);

edtB.Text := FloatToStr(Integral.B);

edtN.Text := IntToStr(Integral.N);

pnlRes.Caption := 'Результат = ' + FloatToStr(Integral.Calculate);

Integral.Draw(Series1);

Integral.FillTable(grdAll);

end;

end;

procedure TfrmMain.NSaveClick(Sender: TObject);

begin

if (SaveDialog.Execute) then begin

Integral.SaveToFile(SaveDialog.FileName);

end;

end;

procedure TfrmMain.nAboutClick(Sender: TObject);

begin

frmAbout.ShowModal;

end;

procedure TfrmMain.NHelpClick(Sender: TObject);

begin

Application.HelpCommand(0,0);

end;

end.

unit uLogo;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls;

type

TfrmLogo = class(TForm)

Panel1: TPanel;

Label1: TLabel;

Label3: TLabel;

Label2: TLabel;

Image1: TImage;

Timer1: TTimer;

procedure Panel1Click(Sender: TObject);

procedure FormClose(Sender: TObject; var Action: TCloseAction);

procedure Timer1Timer(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmLogo: TfrmLogo;

implementation

{$R *.dfm}

// Нажатие мышкой где-либо

procedure TfrmLogo.Panel1Click(Sender: TObject);

begin

// Закрываем форму

Close;

end;

procedure TfrmLogo.FormClose(Sender: TObject; var Action: TCloseAction);

begin

// Очистить память

Action := caFree;

end;

// Кода таймер сработает

procedure TfrmLogo.Timer1Timer(Sender: TObject);

begin

// Закрыть форму

Close;

end;

end.

unit uIntegral;

interface

uses pServer_TLB, Series, Chart, SysUtils, grids,

ComObj, ActiveX, Windows, StdCtrls;

{Класс TIntegral}

type

TIntegral = class

private

_A, _B: real;

_N: integer;

// Методы записи для property-значений

procedure SetA(const Value: real);

procedure SetB(const Value: real);

procedure SetN(const Value: integer);

public

// Конструктор (принимает все необходимые для вычислений значения)

constructor Create(ANew, BNew: real; NNew: integer);

// Необходимые property

property A: real read _A write SetA; // начало интегрирования

property B: real read _B write SetB; // конец интенрирования

property N: integer read _N write SetN; // кол-во разбиений

// Вычисление интеграла (возвращаем интегральную сумму)

function Calculate: real;

// Загрузка данных из файла

procedure LoadFromFile(fName: string);

// Сохранение данных в файл

procedure SaveToFile(fName: string);

// Рисование графика

procedure Draw(Series: TAreaSeries);

// Процедура заполнения таблицы

procedure FillTable(Stg: TStringGrid); 

// Экспорт в Excel

procedure ExcelExport (Stg: TStringGrid);

end;

implementation

uses Dialogs;

// Вычисление интеграла (возвращаем интегральную сумму)

function TIntegral.Calculate: real;

var

i: Integer;

tmp, h, s: real;

{Объявляем объект интерфейса}

Func: IIntegral;

begin

s := 0;

{Создаем объект интерфейса}

Func := CoIntegral.Create;

h := (_B - _A)/_N; // Вычисляем шаг

for i := 0 to _N do

begin

tmp := i * h;

s := s + h * Func.Func(_A + tmp); // релизация метода

end;

Result := s; // возвращаем результат

Func._Release;

end;

// Конструктор (принимает все необходимые для вычислений значения)

constructor TIntegral.Create(ANew, BNew: real; NNew: integer);

begin

_A := ANew;

_B := BNew;

_N := NNew;

end;

// Рисование графика

procedure TIntegral.Draw(Series: TAreaSeries);

var

i: Integer;

tmp, h: real;

{Объявляем объект интерфейса}

Func: IIntegral;

begin

Series.Clear;

{Создаем объект интерфейса}

Func := CoIntegral.Create;

h := (_B - _A)/_N; // Вычисляем шаг

for i := 0 to _N do

begin

tmp := i * h;

{добавляем в график}

Series.AddXY(_A + tmp, h*Func.Func(_A + tmp));

end;

Func._Release;

end;

// Экспорт в Excel

procedure TIntegral.ExcelExport (Stg: TStringGrid);

var

j : Integer;

Unknown : IUnknown;

Result : HResult;

AppProgID : String;

App, Ch : Variant;

begin

// Указать программный идентификатор приложения-сервера

AppProgID := 'Excel.Application';

Result := GetActiveObject(ProgIDToClassID(AppProgID),nil,Unknown);

if (Result = MK_E_UNAVAILABLE) then

// Создать один экземпляр сервера

App := CreateOleObject(AppProgID)

else

// Соединиться с уже запущенной копией сервера

App := GetActiveOleObject(AppProgID);

//------------------------------------------------------

App.Workbooks.Add();

j:=App.Workbooks.Count;

App.Workbooks[j].Activate;

//Обращение к страницам

App.ActiveWorkbook.WorkSheets[1].Name := 'Результат';

//Подготовка данных для построения графика

For j:=1 to _N-1 do

begin

App.ActiveWorkbook.WorkSheets[1].Cells[j,1].Value :=StrToFloat(Stg.Cells[1,j+1]);

App.ActiveWorkbook.WorkSheets[1].Cells[j,2].Value := StrToFloat(Stg.Cells[2,j+1]);

end;

App.DisplayAlerts:=False;

// показать окно приложения на экране

App.Visible := True;

end;

procedure TIntegral.FillTable(Stg: TStringGrid);

var

i: Integer;

tmp, h: real;

{Объявляем объект интерфейса}

Func: IIntegral;

begin

{Создаем объект интерфейса}

Func := CoIntegral.Create;

Stg.RowCount := _N + 1;

Stg.Cells[0,0] := 'N';

Stg.Cells[1,0] := 'X';

Stg.Cells[2,0] := 'Y';

h := (_B - _A)/_N; // Вычисляем шаг

for i := 0 to _N-1 do

begin

tmp := i * h;

{добавляем в таблицу}

Stg.Cells[0,i+1] := IntToStr(i+1);

Stg.Cells[1,i+1] := FloatToStr(_A + tmp);

Stg.Cells[2,i+1] := FloatToStr(h*Func.Func(_A + tmp));

end;

Func._Release;

end;

// Загрузка данных из файла

procedure TIntegral.LoadFromFile(fName: string);

var

f: file of real;

fa, fb, fn: real;

res: boolean;

begin

{$I-}

{Открываем файл}

AssignFile(f, fName);

Reset(f);

{Читаем данные из файла}

Read(f, fa);

Read(f, fb);

Read(f, fn);

{Закрываем файл}

CloseFile(f);

{$I+}

{Проверяем на ошибку}

res := (IOResult = 0) and (fName <> '');

if (res = false) then

ShowMessage('Неправильное чтение из файла')

else begin {Записываем данные в класс}

_A := fa;

_B := fb;

_N := Round(fn);

end;

end;

// Сохранение данных в файл

procedure TIntegral.SaveToFile(fName: string);

var

f: file of real;

fn: real;

res: boolean;

begin

{$I-}

{Открываем файл или создаем}

AssignFile(f, fName);

Rewrite(f);

{$I+}

{Проверяем на ошибку}

res := (IOResult = 0) and (fName <> '');

if (res = false) then

ShowMessage('Неправильное чтение')

else begin {Записываем данные в файл}

{Пишем данные в файл}

Write(f, _A);

Write(f, _B);

fn := _N;

Write(f, fn);

end;

{Закрываем файл}

CloseFile(f);

end;

// Описание методов записи для property-значений

procedure TIntegral.SetA(const Value: real);

begin

_A := Value;

end;

procedure TIntegral.SetB(const Value: real);

begin

_B := Value;

end;

procedure TIntegral.SetN(const Value: integer);

begin

_N := Value;

end;

end.

unit uAbout;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TfrmAbout = class(TForm)

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

Button1: TButton;

procedure Button1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

frmAbout: TfrmAbout;

implementation

{$R *.dfm}

procedure TfrmAbout.Button1Click(Sender: TObject);

begin

Close;

end;

end.





28