Министерство образования и науки Республики Беларусь
Белорусский национальный технический университет
Международный институт дистанционного образования
Кафедра программного обеспечения вычислительной техники и автоматизированных систем
КУРСОВАЯ РАБОТА
по дисциплине:
«Конструирование программ и языки программирования»
Разработка приложения вычисления определенных интегралов по формуле левых прямоугольников
Выполнил:
ст. гр. 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-сервера.
Структурная схема программы.
В программе используется конвертация данных расчета в приложение 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” осуществлялся без ошибок.
Возможно использования приложения как вспомогательного средства при изучении интегрального исчисления.
Список использованных источников
1. Фаронов В.В. Delphi. Программирование на языке высокого уровня. - СПб: Издательство «Питер», 2000.- 639 с.
2. Марко Кэнту. Delphi 5 для профессионалов.-СПб.: Питер. 2001. – 944 с.
3. А.Я.Архангельский. Delphi 7. Учебное пособие. - СПб: Издательство «Питер», 2004.- 1087 с.
4. Электронные учебники
Приложение 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 SettingsSerghРабочий столРазработка приложения вычисления определенных интегралов по формуле левых прямоугольников (Delphi)SourceServerpServer.tlb (1)
// LIBID: {73AF5EFB-ABD6-4565-91C3-0E7C137DA989}
// LCID: 0
// Helpfile:
// HelpString: pServer Library
// DepndLst:
// (1) v2.0 stdole, (C:WINDOWSsystem32stdole2.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 = c
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.