Міністерство освіти і науки Республіки Білорусь
Білоруський національний технічний університет
Міжнародний інститут дистанційної освіти
Кафедра програмного забезпечення обчислювальної техніки і автоматизованих систем
Курсова робота
з дисципліни:
«Конструювання програм і мови програмування»
Розробка програми обчислення визначених інтегралів за формулою лівих прямокутників
Виконав:
ст. гр. 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" здійснювався без помилок.
Можливо використання програми як допоміжний засіб при вивченні інтегрального числення.
Список використаних джерел
Фаронов В. В. Delphi. Програмування на мові високого рівня. - СПб: Видавництво «Пітер», 2000 .- 6 39 с.
Марко кент. 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.