Учебная работа. Курсовая работа: Программа вычисления значения определённого интеграла
КАФЕДРА
КОМПЬЮТЕРНЫХ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
«Системное программирование»
2006
Инструкция
Курсовая работа по дисциплине «Системное программирование» на тему: «Программирование Windows – приложений» содержит ___ страничек машинописного (рукописного) текста, __ рисунков, __ таблиц, ___страниц приложения.
В программке рассмотрена программка вычисления значения определённого интеграла.
Вступление
Сначала я желал бы побеседовать о ОС, а конкретно о Windows 2000.
Windows 2000 – операционная система (ОС) компании Microsoft, основанная на технологии WindowsNT 5.0. NT либо NewTechnology была сотворена группой разрабов под управлением Дейва Катлера, ранее работавшего в DEC над проектом VMS. Дейв Катлер пришел в Microsoftв 1988 году специально для работы над проектом NT. NT, в отличии других ОС Microsoft.
Windows 2000 – вполне 32-разрядная ОС с приоритетной многозадачностью и усовершенствованной реализацией работы с памятью. В базе проекта W2kлежат те же принципы, которые когда-то обеспечили фуррор NT:
· Сопоставимость. Система имеет обычный интерфейс ОС семейства Windows, поддержку файловых систем NTFS5,NTFS4,FAT16,FAT32. Большая часть приложений написанных под MS-DOS, NT4, также некие программки под OS/2 запускаются и работают без заморочек. При проектировании NT учитывалась возможность работы системы в разных сетевых средах, потому в поставку входят средства для работы в UNIX- и NOVELL –сетях.
· Переносимость. Система работает на разных микропроцессорах семейства х86 производства INTEL и AMD. Реализация поддержки микропроцессоров остальных архитектур вероятна, но востребует неких усилий.
· Масштабируемость. В W2k реализована поддержка технологий SMP и COW. количество микропроцессоров при использовании SMP может достигать 32.
· Система сохранности вполне удовлетворяет спецификации С2 по терминологии АНБ США
· Распределенная обработка. W2k имеет интегрированные в систему сетевые способности, что обеспечивает возможность связи с разными типами компьютеров-хостов благодаря наличию различных транспортных протоколов и технологий «клиент-сервер».
· Надежность и отказоустойчивость. Архитектура OC защищает приложения от повреждения друг с другом и самой операционной системой. При всем этом употребляется отказоустойчивая структурированная обработка особенных ситуаций на всех строительных уровнях, которая включает восстанавливаемую файловую систему NTFS и обеспечивает защиту при помощи интегрированной системы сохранности и улучшенных способов управления памятью.
· локализация. Система предоставляет способности для работы в почти всех странах мира на государственных языках, что достигается применении эталона ISOUnicode.
1.ТЕОРИТИЧЕСКИЕ АСПЕКТЫ ПРОГРАММЫ
1.1 Короткие теоретические сведения
В задании нужно вычислить определенный интеграл 1) по формуле трапеций с 3-мя десятичными знаками и вычислить определенный интеграл 2) по формуле Симпсона при n=50.
Криволинейной трапецией именуют часть плоскости, ограниченную снизу Ох, а сверху дугой ab (некой линией, уравнением которой является y=f(x)), слева и справа прямыми x=a и x=b.
Пусть нам дана криволинейная трапеция. Требуется вычислить площадь криволинейной трапеции.
Участок b-a разбиваем на n отрезков. Простая площадь Si=f(Si)*(b-a)/n.
Площадью криволинейной трапеции S именуют предел:
когда n стремится к бесконечности так, что больший из участков разбиения стремится к нулю.
Разглядим функцию f(x), определенную и непрерывную на данном отрезке ab.
Построим для данной функции сумму вида:
Эту сумму будем именовать n-й интегральной суммой, построенной для функции f(x) на отрезке ab.
Если существует предел n-й интегральной суммы обозначенного вида при n стремящемся к бесконечности, так что больший из участков разбиения стремится к нулю, то то этот предел называют определенным интегралом функции f(x), на отрезке ab и обозначают:
а,b — нижний и верхний пределы интегрирования.
Главные характеристики определенного интеграла
1) Интеграл от суммы равен сумме интегралов (конечное число слагаемых)
2)Неизменный множитель можно выносить за символ неизменного интеграла:
3)Если поменять местами пределы интегрирования, символ интеграла поменяться на обратный:
4)Какие бы ни были числа a,b,c:
5)Свойство о оценке определенного интеграла:
Если м и М соответственно меньшее и наибольшее значения функции f(x) на ab, то справедлива последующая оценка:
Вычисление способом трапеций
Для того, чтоб вычислить интеграл 1) по способу трапеций, нужно найти число n – частей, на которые нужно разбить криволинейную трапецию, чтоб достигнуть требуемой точности (три знака опосля запятой).
Представим, есть некоторая криволинейная трапеция. Разбиваем криволинейную трапецию поначалу на случайное число частей n, другими словами получаем n1- обычных трапеций. Рассчитываем суммарную площадь трапеций (S1). Дальше разбиваем криволинейную трапецию на n2>n1 частей и также рассчитываем суммарную площадь трапеций (S2). Последующий шаг – вычисление разности S2-S1. Eсли |
S2-S1|<=0.001, то вычисления можно оборвать и взять за разыскиваемую площадь (
2. Если |S2-S1|>0.001, то S1:=S2, N1:=N2,N2:=N2*2, до того времени, пока не будет достигнута требуемая точность.
Расчетная формула способа трапеций:
где
Y-функция интеграла;
A-нижний предел интеграла;
B- верхний предел интеграла;
H-точность ;
N-количество итераций;
Расчетная формула способа Симпсона:
S=(h/3)*(y0+4*(y1+y3+…+yn-1)+2*(y2+y4+…+yn-2)+yn)
S-результат вычисления;
h-точность ;
y0-начальное
yn-редела;
1.2 Среда программирования
При выбирании программного средства разработки собственной программки я тормознул на DELHI. Почему?
Для начала истории.
Delphi — это греческий город, где жил дельфийский оракул. И сиим именованием был назван новейший программный продукт с феноменальными чертами. 6 месяцев вспять компания Borland представила на Трибунал программистской общественности новейший программный продукт, о котором к моменту его выхода ходило огромное количество слухов. 1-ая версия продукта явилась результатом разработки, которая велась компанией в обстановке строжайшей секретности в течение 2-ух с половиной лет. Компилятор, интегрированный в Delphi, обеспечивает высшую производительность, нужную для построения приложений в архитектуре «клиент-сервер». Этот компилятор в истинное время является самым резвым в мире, его скорость компиляции составляет выше 120 тыщ строк за минуту на компе 486DX33. Он дает легкость разработки и резвое время проверки готового программного блока, соответствующего для языков 4-ого поколения (4GL) и в то же время обеспечивает свойство кода, соответствующего для компилятора 3GL. Не считая того, Delphi обеспечивает резвую разработку без необходимости писать вставки на Си либо ручного написания кода (хотя это может быть).
В процессе построения приложения разраб выбирает из палитры компонент готовые составляющие как живописец, делающий большие мазки кистью. Еще до компиляции он лицезреет результаты собственной работы — опосля подключения к источнику данных их можно созидать отображенными на форме, можно передвигаться по данным, представлять их в том либо ином виде. В этом смысле проектирование в Delphi не много чем различается от проектирования в интерпретирующей среде, но опосля выполнения компиляции мы получаем код, который исполняется в 10-20 раз резвее, чем то же самое, изготовленное с помощью интерпретатора. Не считая того, компилятор компилятору рознь, в Delphi компиляция делается конкретно в родной машинный код, в то время как есть компиляторы, превращающие программку в так именуемый p-код, который потом интерпретируется виртуальной p-машиной. Это не может не сказаться на фактическом быстродействии готового приложения.
Объектно-ориентированная модель программных компонент
Главный упор данной модели в Delphi делается на наивысшем реиспользовании кода. Это дозволяет разрабам строить приложения очень стремительно из заблаговременно приготовленных объектов, также дает им возможность создавать свои собственные объекты для среды Delphi. Никаких ограничений по типам объектов, которые могут создавать создатели, не существует. Вправду, все в Delphi написано на нем же, потому создатели имеют доступ к этим же объектам и инструментам, которые использовались для сотворения среды разработки. В итоге нет никакой различия меж объектами, поставляемыми Borland либо третьими фирмами, и объектами, которые вы сможете сделать.
В обычную поставку Delphi входят главные объекты, которые образуют успешно подобранную иерархию из 270 базисных классов. Для начала — хорошо. Но если возникнет необходимость в решении некий специфичной препядствия на Delphi, рекомендуем, до этого чем попробовать начинать решать делему «с нуля», просмотреть перечень свободно распространяемых либо коммерческих компонент, разработанных третьими фирмами, количество этих компаний в истинное время превосходит число 250, хотя, может быть, я не обо всех понимаю. Скептики, может быть, не поверят мне, когда я скажу, что на Delphi можно идиентично отлично писать как приложения к корпоративным базам данных, так и, например, игровые программки. Тем не наименее, это так. Почти во всем это разъясняется тем, что обычно в среде Windows было довольно трудно реализовывать пользовательский интерфейс. Событийная модель в Windows постоянно была сложна для осознания и отладки. Но конкретно разработка интерфейса в Delphi является самой обычной задачей для программера.
систематизация версий
DELPHI
1-ая версия Delphi владела набором способностей, которые немедля завлекли мое пристальное внимание. Покорившими меня чертами Delphi были ее Идеология форм объектно – направленный подход, необыкновенно резвый компилятор, красивые инструменты для работы с базами данных, тесноватая интеграция с программированием в среде Windows и разработка компонент. Но важнейшей частью был язык OBJECTPASCAL, на фундаменте которого строилось все другое.
версия Delphi 2 была еще лучше! Посреди ее более принципиальных дополнений были последующие: компонент TBDCtrlGrid для работы с несколькими записями сразу, усовершенствованная сетка баз данных,поддержка автоматизации OLE и тип данных вариант, тесноватая интеграция с Windows 95, тип данных longstring и наследование форм. В Delphi 3 к этому добавились разработка Codeinsight (система подсказок для написания кода ), возможность отладки DLL, шаблоны компонент, TeeChart (библиотека компонент для работы с графиками), Decision Сube(метакуб –многомерная модель данных),разработка WebBroker (составляющие для программирования в интрасетях ), пакеты компонент, ActiveForms (формы для разработки частей activeX ) и восхитительная интеграция с COM основанная на применении интерфейсов.
В Delphi 4 возник редактор AppBrowser, поддержка новейших способностей Windows 98, усовершенствованная поддержка OLE и COM, расширенные составляющие баз данных и огромное количество добавлений к базисным классам VCL, включая поддержку фиксации ограничений и привязки частей управления. В Delphi 5 к общей картине добавилось огромное количество остальных улучшений IDE, расширенная поддержка баз данных, усовершенствованная версия MIDAS с поддержкой Веба, инструмент управления версиями TeamSource, способности лингвистического перевода, теория фреймов, огромное количество новейших компонент.
Delphi 6 добавляет ко всем уже имеющимся в Delphi способностям поддержку так именуемой кросс-платформенной разработки приложений (либо, говоря по другому, возможность разработки приложений для платформы Х ), которая базируется на использовании новейшей библиотеки компонент, расширенную библиотеку времени выполнения, новейший базисный принцип работы с базами данных dbExpress, поддержку Web –служб и XML, сильную инфраструктуру разработки приложений для Web, новейшие улучшения IDE, также большущее количество новейших компонент и классов.
Delphi – красивый инструмент разработки, но в то же время и непростая программная среда, состоящая из почти всех частей.
2. ПРАКТИЧЕСКИЕ АСПЕКТЫ ПРОГРАММЫ
2.1 Функционально-структурная схема
Рис. 1- Функционально-структурная схема
2.2
Иерархия форм
Рис.2 — Основная форма
Рис. 3– API –функции
Рис.4 – Основная форма (прорисовка графиков)
Рис.5 -Приятный способ решения
Рис.6 — Опции
Рис 7 – Основная форма для вычисления интеграла
Работа с программкой начинается с данной формы.
На данной форме вы сможете высчитать интеграл:
1. Избрать интеграл
2. Избрать способ (трапеций, Симпсона)
3. Ввести верхний предел интеграла
4. Ввести нижний предел интеграла
5. Ввести число разбиений
6. Нажав кнопку «Вперед» вычислить
Рис 8 – Форма для прорисовки графиков
На данной форме можно получить значения интегралов зависимо от значений нижней границы при фиксированных значениях верхней границы определенного интеграла и выстроить графики
1. Избрать интеграл
2. Надавить кнопку «График» и получить график избранного вами интеграла
Рис 9 — Таблицы
На данной форме показан наиболее детально способ нахождения интегралов.
Форма для внедрения функции
Windows
API
SetForegroundWindow
(
HWND
:
hwnd
);
Рис 10 – API –функции
На данной форме можно применить функцию SetForegroundWindow
(
HWND
:
hwnd
)
методом нажатия клавиши«Применить».
Форма для внедрения функции
Windows
API
SetCurrentDirectory
(
IpPathName
:
PChar
):
bool
;
Рис.11 – API-функции
На данной форме можно применить функцию SetCurrentDirectory
(
IpPathName
:
PChar
):
bool
;
методом нажатия клавиши«Применить».
Форма опций главной формы
Рис.12 — Опции
На данной форме размещены опции при помощи которых настраивается цвет и шрифты главной формы.
2.3 Элементы главной формы
Элемент формы
Предназначение
Событие
Bitgraf
Клавиша для пуска процедуры прорисовки графиков
BitgrafClick
Buclear
Клавиша для чистки поля для вывода значений интегралов
BuclearClick
Burun
Клавиша для пуска процедуры вычисления интегралов
BurunClick
Cbint
Переключатель для выбора интеграла
CbintChange
CBmet
Переключатель для выбора способа решения
ColorDialog
Гамма для выбора цвета
DateTimePicker
Календарь (денек,месяц,год)
Edzn1
Поле для ввода нижнего предела интеграла
Edzn2
Поле для ввода верхнего предела интеграла
Gauge
Компонент для зрительного отображения степени завершенности некой долговременной орерации либо процесса
Imgraf
Поле для вывода графически результатов вычисления
Imint
Поле для вывода графического изображения интеграла
Kurs
Основная форма
MainMenu
FormCreate
LbCbint
Метка которая показывает на переключатель Cbint
LbCbmet
Метка которая показывает на переключатель Cb
met
LbEdzn1
Метка которая показывает
поле Edzn1
LbEdzn2
Метка которая показывает
поле Edzn2
LbintGraf
Метка которая показывает
поле Imgraf
MMoutput
Поле для вывода значений припостроении графика
LbznGr
Метка которая показывает
поле MMoutput
N22
S
etCurrentDirectory
Пункт меню для применении функции S
etCurrentDirectory
N22GetCurrentDirectory1Click
N52SetForegroundWindow1Click
Пункт меню для применении функции SetForegroundWindow
N52SetForegroundWindow1Click
RBint1
Переключатель для построения графика на 1-ый интеграл
RBint1Click
RBint2
Переключатель для построения графика на 2-ой интеграл
RBint2Click
StatusBar
Строчка для вывода подсказок
2.4
Функции
Windows API
SetForeGroundWindow function SetForegroundWindow(hWnd: HWND): BOOL;
Функция SetForegroundWindow(HWND:hwnd) создана для перевода окна, которое идентифицируемо пораметром hwnd,в» верхний слой » и перевода на него фокус, независимо от того, какой поток сделал это окно.
SetForegroundWindow( HWNDhWnd // Маркер(дескриптор) окна, чтоб перенести к фронтальному плану)
Характеристики
hWnd
—
дискриптор окна который идентифицирует окно, которое обязано быть активизировано и перенесено к фронтальному плану.
Применение:
procedure TForm2.Timer1Timer(Sender: TObject);
begin
SetForegroundWindow(kurs.Handle);
Timer1.Enabled:=false;
end;
Обработчиком действия является таймер (Timer1Timer) который и запускает функцию
SetCurrentDirectory
function SetCurrentDirectory(lpPathName: PChar): BOOL;
ФункцияSetCurrentDirectory
(‘lpPathName: PChar
‘) изменяет (устанавливает) текущийкаталог. Возвращаемое каталог был удачно изменен(заменен), либо False, если ошибка произошла.
SetCurrentDirectory(
lpPathName// адресок наименования(имени) новейшего текущего каталога );
Характеристики
lpPathName
Укажите на строчку с нулевым эмблемой в
конце, которая описывает путь к новенькому текущему каталогу.
Применение:
procedure TForm3.Button1Click(Sender: TObject);
begin
SetCurrentDirectory(‘c:’);
end;
Обработчиком действия является клавиша (Button1Click) который и запускает функцию.
2.5 Главные процедуры
Расчет интегралов
procedureTKurs.CbintChange(Sender: TObject);
begin
if CBint.Text=’Интеграл №1′ then
Imint.Picture.LoadFromFile(‘int.bmp’) else
Imint.Picture.LoadFromFile(‘int1.bmp’);
end;
procedure TKurs.BurunClick(Sender: TObject);
begin
try
try
a:=strtoint(Edzn1.text);
b:=strtoint(Edzn2.text);
n:=strtoint(Edit3.Text);
If (Cbint.Text=’Интеграл №1′) then
int:=f1;
if (CBmet.Text=’МетодомСимпсона’) then
int1(a,b,n,ss);
if (CBint.Text=’Интеграл №1′) then
int:=f1;
if (CBmet.Text=’Методомтрапеций’) then
int2(a,b,n,ss);
if (Cbint.Text=’Интеграл №2′) then
int:=f2;
if (CBmet.Text=’МетодомСимпсона’)then
int1(a,b,n,ss);
if (CBint.Text=’Интеграл №2′) then
int:=f2;
if (CBmet.Text=’Методомтрапеций’)then
int2(a,b,n,ss);
Memo1.Lines.Add(‘ ‘+CBint.Text);
Memo1.Lines.Add((CBmet.TextactiveXFloatToStrF(ss,ffNumber,9,3)));
except
on EConvertError do
begin
raiseException.Create(‘внимание!Ошибка в записи числа!’);
end;
end;
finally
if (a)>(b)
then
ShowMessage(‘Вверхняя граница обязана быть больше нижней’);
end;
end;
procedure TKurs.FormCreate(Sender: TObject);
begin
han:=loadlibrary(‘mydll.dll’);
if han=0 then showmessage(‘+Билиотеканенайдена!’)
else
begin
@f1:=getprocaddress(han,’f1′);
@f2:=getprocaddress(han,’f2′);
end;
end;
procedure TKurs.int1(a,b:real;n:integer;var ss:real);
var i1,i2,i:integer;h,s,s1,x1,s2,x2,yn,x:real;
begin
i:=1;
s1:=0;
y0:=INT(a);
h:=(b-a)/n;
repeat
x1:=a+i*h;
s1:=s1+INT(x1);
i:=i+2;
until i>n-1;
i1:=2;
s2:=0;
yn:=INT(b);
repeat
x2:=a+i1*h;
s2:=s2+INT(x2);
i1:=i1+2;
until i1>n-2;
yn:=a-n*h;
s:=(h/3)*(y0+4*s1+2*s2+yn);
ss:=s;
end;
procedure TKurs.int2(a,b:real;n:integer;var ss:real);
var i,j:integer;k:real;
begin
Form5.StringGrid1.Cells[0,0]:=’I’;
Form5.StringGrid1.Cells[1,0]:=’Xi’;
form5.StringGrid1.Cells[2,0]:=’SQR(Xi)’;
Form5.StringGrid1.Cells[3,0]:='(0.5*sqr(Xi)+1.5))’;
Form5.StringGrid1.Cells[4,0]:=’y0..yn’;
Form5.StringGrid1.Cells[5,0]:=’y1..yn’;
s:=0;
h:=(b-a)/n;
Form5.Label2.Caption:=floattostr(h);
Form5.StringGrid1.RowCount:=n+3;
for i:=0 to n do begin
s:=s+iNT(a+i*h);
j:=0;
Form5.StringGrid1.Cells[j,i+1]:=intToStr(i);
j:=1;
Form5.StringGrid1.Cells[j,i+1]:=FloatToStrF((a+i*h),ffNumber,4,4);
j:=2;
Form5.StringGrid1.Cells[j,i+1]:=FloatToStrF(sqr(a+i*h),ffNumber,4,4);
j:=3;
form5.StringGrid1.Cells[j,i+1]:=FloatToStrF(0.5*sqr(a+i*h)+1.5,ffNumber,4,4);
j:=5;
Form5.StringGrid1.Cells[j,i+2]:=FloatToStrF(int(a+(i+1)*h),ffNumber,4,4);
end;
Form5.Show;
Form5.StringGrid1.Cells[0,n+2]:=’Сумма’;
Form5.StringGrid1.Cells[5,n+2]:=FloatToStrF(s-(int(a+(n)*h)+int(a+0*h)),ffNumber,4,4);
Form5.StringGrid1.Cells[4,1]:=FloatToStrF(int(a+0*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+1]:=FloatToStrF(int(a+(n)*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+2]:=FloatToStrF(int(a+(n)*h)+int(a+0*h),ffNumber,4,4);
s:=((INT(a)+INT(b))/2+s)*h;
ss:=s;
end;
2.6 методика визуализации
Визуализация приобретенных значений при решении интеграла зависимо от значений нижней границы при фиксированных значениях верхней границы определенного интеграла была получена при помощи обычного компонента визуализации графических данных, также при помощи класса TCanvas его параметров и способов которые описаны ниже.
Свойство
Описание
Font
Описывает шрифт, чтоб применять его при записи текста на изображении
Brush
Описывает цвет и эталон использования холста для наполнения графических форм и фонов
Pen
Описывает вид пера для использования для рисования строк и структурирования форм
Pixels
Описывает цвет области пикселов в границах потока ClipRect.
способ
Описание
Draw
Делает графический объект обозначенным параметром Graphic на холсте в местоположении, данном координатами (X, Y).
FillRect
Заполняет обозначенный прямоугольник на холсте, используя текущую кисть.
LineTo
Тянет(отрисовывают) строчку на холсте от PenPos, к координатам обозначенных X и Y, и устанавливает перьевую позицию в (X, Y).
MoveTo
Изменяет позицию текущего рисунка к координатам (X, Y).
procedure TKurs.BitgrafClick(Sender: TObject);
var
x,ymin,ymax,hx1,hx,hy,xn,xk,mx,sx,my,sy,yy,xx:real;i,X1,Y1,Y2,x3,xa,ya,xb,yb:integer;
begin
if Timer1.Enabled=false then
Timer1.Enabled:=true;
Kurs.Imgraf.Canvas.FillRect(rect(0,0,620,370));
xn:=strtofloat(Edzn1.text);
xk:=StrTofloat(Edzn2.Text);
n:=strtoint(Edit3.Text);
x:=xn;ymax:=-1e30;ymin:=1e30;
while x<=xk do
begin
if RadioButton1.Checked then
int:=f1;
if RadioButton2.Checked then
int:=f2;
int1(x,xk,n,ss);
if ss>ymax then ymax:=ss;
if ss<ymin then ymin:=ss;
x:=x+0.01;
end;
x:=xn;
int1(x,xk,n,ss);
x1:=round(mx*x+sx);
y1:=round(my*x+sy);
repeat
int1(x,xk,n,ss);
x2:=ROUND(mx*x+sx);
y2:=round(-my*ss+sy);
kurs.Imgraf.Canvas.Pen.Color:=ColorDialog2.color;
kurs.Imgraf.Canvas.Brush.Color:=clwhite;
kurs.Imgraf.Canvas.MoveTo(x1,y1);
kurs.Imgraf.Canvas.LineTo(x2,y2);
x1:=x2;y1:=y2;
k:=true;
kurs.Imgraf.Canvas.Pen.Color:=clred;
kurs.Imgraf.Canvas.Pen.Width:=2;
hx1:=1;
hx:=(xk-xn)/10;
xa:=0;ya:=0;xb:=450;yb:=310;
mx:=(xb-xa)/(xk-xn);
my:=(yb-ya)/(ymax-ymin);
sy:=ya+my*ymax;sx:=xa-mx*xn;
kurs.Imgraf.Canvas.MoveTo(xb,yb);
kurs.Imgraf.Canvas.LineTo(xa,yb);
x:=x+0.01;
until x>xk;
i:=3;
xx:=xn;
//вертикальные состовляющие
repeat
kurs.Imgraf.Canvas.MoveTo(i,ya);
kurs.Imgraf.Canvas.LineTo(i,yb);
kurs.Imgraf.Canvas.TextOut(i,yb+5,FloatToStr(xx));
inc(i,Round((Imgraf.Width)/10));
xx:=xx+hx;
until i>Imgraf.Width;
//горизонтальные состовляющие
i:=Imgraf.Height-50;
repeat
yy:=(sy-i)/my;
kurs.Imgraf.Canvas.MoveTo(0,i);
kurs.Imgraf.Canvas.LineTo(Imgraf.Width,i);
kurs.Imgraf.Canvas.TextOut(0,i-5,FloatToStrF(yy,ffNumber,4,2));
i:=i-round(hy);
dec(i,Round((Imgraf.Height)/8));
until i<0 ;
2.6
Подключение
DLL-
библиотеки
Существует два типа исполняемых файлов Windows: программки и библиотеки динамической компоновки (DynamicLinkLibraries,Dll). Когда мы разрабатываем приложение Delphi, мы, обычно создаем исполняемый файл программки, который владеет расширением EXE. Но приложения Delphi в процессе собственной работы нередко обращаются к функциям, содержащимся в библиотеках DLL. к примеру, всякий раз, когда мы впрямую обращаемся к WindowsAPI, по сути мы обращаемся к DLL.
Что такое динамическая сборка ?
При использовании
компоновки, которая производится в случае, если разрабатываемый нами код обращается к функции, содержащейся в библиотеки DLL, компоновщик получает нужную информацию о функции из ее обьявления
Эта информация употребляется для наполнения неких таблиц снутри исполняемого файла. Когда операционная система Windows загружает исполняемый файл в память, сначала она производит загрузку всех нужных для функционирования программки библиотек, и лишь опосля этого программки начинает работу. В процессе загрузки библиотек DLL операционная система заполняет таблицы внутренние таблицы программки адресами функций из загруженных в память библиотек DLL.
Подключение Dll –подключение методом динамической Dll-загрузки.
procedure TKurs.FormCreate(Sender: TObject);
begin
han:=loadlibrary(‘mydll.dll’);
if han=0 then showmessage(‘+Библиотеканенайдена!’)
else
begin
@f1:=getprocaddress(han,’f1′);
@f2:=getprocaddress(han,’f2′);
end;
Листинг
Dll-
библиотеки
library mydll;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library’s USES clause AND your project’s (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL—even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
SysUtils,
Classes;
{$R *.res}
function f1(x:real):real;
begin
f1:=1/sqrt(0.5*sqr(x)+1.5);
end;
function f2(x:real):real;
begin
f2:=(x+1)*cos(sqr(x));
end;
exports
f1 index 1 name ‘f1’,f2 index 2 name ‘f2’;
begin
end.
2.7
Составляющие
личного
задания
DateTimePicker1: TDateTimePicker;
TDateTimePicker — зрительный компонент, разработанный (предназначенный) точно для ввода дат либо времен. В DateTimePicker датируют режим, это походит на перечень либо поле со перечнем, кроме того, что раскрывающийся перечень заменен календарной иллюстрацией; юзеры могут выбирать дату от календаря. Даты либо времена могут также быть выбраны, листая со Стрелками «ввысь» и «вниз».
Gauge употребляется для зрительного отображения юзеру степень завершенности некой долговременной орерации либо процесса
Свойство
Предназначение
Backcolor
Изменение цвета фона заднего плана
Forecolor
Изменение цвета индикатора движения
Kind
gkVerticalBar
gkHorizontalBar
gkNeedle
gkPie
gkText
Изменение главный формы индикатора движения
вертикальный вид индикатора движения
горизонтальный вид индикатора движения
индикатора движения в виде полукруга
индикатора движения в виде сектора
текстовое отображение индикатора движения
MaxValue
Наибольшее
3.
РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ
3.1 Системные требования
Pentium 133 Mhz, RAM 32 Mb, HDD 10Mb, Windows 98
3.2
Помощь
Для справки нажмите F1, и покажется окно
Рис.8- Справка
3.3 установка программки
Для установки программки нужно скопировать папку EXE
содержимое папки:
Project1.exe
Mydll.dll
Helpkurs
Выводы
Таковым образом,данная работа дозволила мне:
1. закрепить на опыте познания, приобретенные при исследовании дисциплины “Системное программирование”.
2. научился разрабатывать программные продукты под операционную среду Windows
3. закрепил последующие познания:
— Программирование в Delphi
— Программирование программ использующие код, написанный на остальных языках программирования (внедрение DLL )
— Динамическая сборка с DLL
— Численные способы для вычисления определенных интегралов
— Написание Help в стиле Windows.
Перечень применяемой литературы
1. Delphi 6. Для экспертов. Разработка COM: Пер.с англ.:-464c. 2005
2. Разработка приложений в среде Delphi: пер.с англ.:Уч.пос-М.:Издательский дом «Вильямс»,2006.-464с.
Листинг
программки
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls, Menus, ExtDlgs, ExtCtrls, ToolWin, Gauges,
AppEvnts, TeEngine, Series, TeeProcs, Chart, TeeFunci, Buttons, ShellAPI,
ScktComp, ImgList;
type
TKurs = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
TabSheet2: TTabSheet;
Edzn1: TEdit;
Edzn2: TEdit;
Edit3: TEdit;
MainMenu1: TMainMenu;
file1: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
SavePictureDialog1: TSavePictureDialog;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
StatusBar1: TStatusBar;
Imint: TImage;
Cbint: TComboBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
CBmet: TComboBox;
Memo1: TMemo;
Label5: TLabel;
Burun: TButton;
N7: TMenuItem;
N22GetCurrentDirectory1: TMenuItem;
N52SetForegroundWindow1: TMenuItem;
DateTimePicker1: TDateTimePicker;
Imgraf: TImage;
Label6: TLabel;
Buclear: TButton;
Bitgraf: TBitBtn;
GroupBox1: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
ApplicationEvents1: TApplicationEvents;
N8: TMenuItem;
N9: TMenuItem;
ImageList1: TImageList;
Timer1: TTimer;
Gauge1: TGauge;
N10: TMenuItem;
N11: TMenuItem;
ColorDialog1: TColorDialog;
ColorDialog2: TColorDialog;
N12: TMenuItem;
procedure N1Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure CbintChange(Sender: TObject);
procedure BurunClick(Sender: TObject);
procedure int1(a,b:real;n:integer;var ss:real);
procedure int2(a,b:real;n:integer;var ss:real);
procedure FormCreate(Sender: TObject);
procedure N22GetCurrentDirectory1Click(Sender: TObject);
procedure N52SetForegroundWindow1Click(Sender: TObject);
procedure ApplicationEvents1Hint(Sender: TObject);
procedure BuclearClick(Sender: TObject);
procedure BitgrafClick(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N12Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
tfun=function(x:real):real;
var
Kurs: TKurs;
INT,F1,f2:tfun;
han:thandle;
k:boolean;
a,b,s,h,ss,y0,yn,s2,x2,xx1,xx2,xk:real;
n,n1,i1:integer;
mplementation
uses Unit2, Unit3, Unit4, Unit5 ;
{$R *.dfm}
procedure TKurs.N1Click(Sender: TObject);
begin
Imgraf.Picture.SaveToFile(SavePictureDialog1.FileName+’.bmp’);
end;
procedure TKurs.N4Click(Sender: TObject);
begin
if k=true then begin
N1.Enabled:=true;
if SavePictureDialog1.Execute then
Imgraf.Picture.SaveToFile(SavePictureDialog1.FileName+’.bmp’);
end
else
ShowMessage(‘Ãðàôèê íå îòðèñîâàí’);
end;
procedure TKurs.N6Click(Sender: TObject);
begin
Application.HelpCommand(HELP_FINDER,0);
end;
procedure TKurs.CbintChange(Sender: TObject);
begin
if CBint.Text=’Èíòåãðàë ¹1′ then
Imint.Picture.LoadFromFile(‘int.bmp’) else
Imint.Picture.LoadFromFile(‘int1.bmp’);
end;
procedure TKurs.BurunClick(Sender: TObject);
begin
a:=strtofloat(Edzn1.text);
b:=strtofloat(Edzn2.text);
n:=strtoint(Edit3.Text);
if (edzn1.Text<>») and (Edzn2.Text<>») and
(Cbint.ItemIndex<>-1)and (CBmet.ItemIndex<>-1) then
begin
try
If (Cbint.Text=’Èíòåãðàë ¹1′) then
int:=f1;
if (CBmet.Text=’Ìåòîäîì Ñèìïñîíà’) then
int1(a,b,n,ss);
if (CBint.Text=’Èíòåãðàë ¹1′) then
int:=f1;
if (CBmet.Text=’Ìåòîäîì òðàïåöèé’) then
int2(a,b,n,ss);
if (Cbint.Text=’Èíòåãðàë ¹2′) then
int:=f2;
if (CBmet.Text=’Ìåòîäîì Ñèìïñîíà’)then
int1(a,b,n,ss);
if (CBint.Text=’Èíòåãðàë ¹2′) then
int:=f2;
if (CBmet.Text=’Ìåòîäîì òðàïåöèé’)then
int2(a,b,n,ss);
Memo1.Lines.Add(‘ ‘+CBint.Text);
Memo1.Lines.Add((CBmet.TextactiveXFloatToStrF(ss,ffNumber,9,3)));
finally
if (a)>(b)
then
ShowMessage(‘Ââåðõíÿÿ ãðàíèöà äîëæíà áûòü áîëüøå íèæíåé’);
end;
end
else
if (Edzn1.Text=’ ‘) then ShowMessage(‘Íå ââåäåíà ââåðõíÿÿ ãðàíèöà!’);
if (Edzn2.Text=’ ‘) then ShowMessage(‘Íå ââåäåíà íèæíÿÿ ãðàíèöà!’);
if (Cbint.ItemIndex=-1) then ShowMessage(‘Âíèìàíèå!Íå âûáðàí èíòåãðàë!’);
if (CBmet.ItemIndex=-1) then ShowMessage(‘Íå âûáðàí ìåòîä ðåøåíèÿ!’);
end;
procedure TKurs.FormCreate(Sender: TObject);
begin
han:=loadlibrary(‘mydll.dll’);
if han=0 then showmessage(‘+Áèëèîòåêà íå íàéäåíà!’)
else
begin
@f1:=getprocaddress(han,’f1′);
@f2:=getprocaddress(han,’f2′);
end;
end;
procedure TKurs.int1(a,b:real;n:integer;var ss:real);
ar i1,i2,i:integer;h,s,s1,x1,s2,x2,yn,x:real;
begin
i:=1;
s1:=0;
y0:=INT(a);
h:=(b-a)/n;
repeat
x1:=a+i*h;
s1:=s1+INT(x1);
i:=i+2;
until i>n-1;
i1:=2;
s2:=0;
yn:=INT(b);
repeat
x2:=a+i1*h;
s2:=s2+INT(x2);
i1:=i1+2;
until i1>n-2;
yn:=a-n*h;
s:=(h/3)*(y0+4*s1+2*s2+yn);
ss:=s;
end;
procedure TKurs.int2(a,b:real;n:integer;var ss:real);
var i,j:integer;k:real;
begin
Form5.StringGrid1.Cells[0,0]:=’I’;
Form5.StringGrid1.Cells[1,0]:=’Xi’;
form5.StringGrid1.Cells[2,0]:=’SQR(Xi)’;
Form5.StringGrid1.Cells[3,0]:='(0.5*sqr(Xi)+1.5))’;
Form5.StringGrid1.Cells[4,0]:=’y0..yn’;
Form5.StringGrid1.Cells[5,0]:=’y1..yn’;
s:=0;
h:=(b-a)/n;
Form5.Label2.Caption:=floattostr(h);
Form5.StringGrid1.RowCount:=n+3;
for i:=0 to n do begin
s:=s+iNT(a+i*h);
j:=0;
Form5.StringGrid1.Cells[j,i+1]:=intToStr(i);
j:=1;
Form5.StringGrid1.Cells[j,i+1]:=FloatToStrF((a+i*h),ffNumber,4,4);
j:=2;
orm5.StringGrid1.Cells[j,i+1]:=FloatToStrF(sqr(a+i*h),ffNumber,4,4);
j:=3;
form5.StringGrid1.Cells[j,i+1]:=FloatToStrF(0.5*sqr(a+i*h)+1.5,ffNumber,4,4);
j:=5;
Form5.StringGrid1.Cells[j,i+2]:=FloatToStrF(int(a+(i+1)*h),ffNumber,4,4);
end;
Form5.Show;
Form5.StringGrid1.Cells[0,n+2]:=’Ñóììà’;
Form5.StringGrid1.Cells[5,n+2]:=FloatToStrF(s-(int(a+(n)*h)+int(a+0*h)),ffNumber,4,4);
Form5.StringGrid1.Cells[4,1]:=FloatToStrF(int(a+0*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+1]:=FloatToStrF(int(a+(n)*h),ffNumber,4,4);
Form5.StringGrid1.Cells[4,n+2]:=FloatToStrF(int(a+(n)*h)+int(a+0*h),ffNumber,4,4);
s:=((INT(a)+INT(b))/2+s)*h;
ss:=s;
end;
procedure TKurs.N22GetCurrentDirectory1Click(Sender: TObject);
begin
form2.Show;
end;
procedure TKurs.N52SetForegroundWindow1Click(Sender: TObject);
begin
form3.Show;
end;
procedure TKurs.ApplicationEvents1Hint(Sender: TObject);
begin
StatusBar1.Panels[0].Text:=Application.Hint;
end;
procedure TKurs.BuclearClick(Sender: TObject);
begin
Memo1.Lines.Clear;
end;
procedure TKurs.BitgrafClick(Sender: TObject);
var
x,ymin,ymax,hx1,hx,hy,xn,xk,mx,sx,my,sy,yy,xx:real;i,X1,Y1,Y2,x3,xa,ya,xb,yb:integer;
begin
if Timer1.Enabled=false then
Timer1.Enabled:=true;
Kurs.Imgraf.Canvas.FillRect(rect(0,0,620,370));
xn:=strtofloat(Edzn1.text);
xk:=StrTofloat(Edzn2.Text);
n:=strtoint(Edit3.Text);
x:=xn;ymax:=-1e30;ymin:=1e30;
while x<=xk do
begin
if RadioButton1.Checked then
int:=f1;
if RadioButton2.Checked then
int:=f2;
int1(x,xk,n,ss);
if ss>ymax then ymax:=ss;
if ss<ymin then ymin:=ss;
x:=x+0.01;
end;
x:=xn;
int1(x,xk,n,ss);
x1:=round(mx*x+sx);
y1:=round(my*x+sy);
repeat
int1(x,xk,n,ss);
x3:=ROUND(mx*x+sx);y2:=round(-my*ss+sy);
kurs.Imgraf.Canvas.Pen.Color:=ColorDialog2.color;
kurs.Imgraf.Canvas.Brush.Color:=clwhite;
kurs.Imgraf.Canvas.MoveTo(x1,y1);
kurs.Imgraf.Canvas.LineTo(x3,y2);
x1:=x3;y1:=y2;
k:=true;
kurs.Imgraf.Canvas.Pen.Color:=clred;
kurs.Imgraf.Canvas.Pen.Width:=2;
hx1:=1;
hx:=(xk-xn)/10;
xa:=0;ya:=0;xb:=450;yb:=310;
mx:=(xb-xa)/(xk-xn);my:=(yb-ya)/(ymax-ymin);
sy:=ya+my*ymax;sx:=xa-mx*xn;
kurs.Imgraf.Canvas.MoveTo(xb,yb);
kurs.Imgraf.Canvas.LineTo(xa,yb);
x:=x+0.01;
until x>xk;
i:=3;
xx:=xn;
//âåðòèêàëüíûå ñîñòîâëÿþùèå
repeat
kurs.Imgraf.Canvas.MoveTo(i,ya);
kurs.Imgraf.Canvas.LineTo(i,yb);
kurs.Imgraf.Canvas.TextOut(i,yb+5,FloatToStr(xx));
inc(i,Round((Imgraf.Width-50)/10));
xx:=xx+hx;
until i>Imgraf.Width;
//ãîðèçîíòàëüíûå ñîñòàâëÿþùèå
i:=Imgraf.Height-50;
repeat
yy:=(sy-i)/my;
kurs.Imgraf.Canvas.MoveTo(0,i);
kurs.Imgraf.Canvas.LineTo(Imgraf.Width,i);
kurs.Imgraf.Canvas.TextOut(0,i-5,FloatToStrF(yy,ffNumber,4,2));
i:=i-round(hy);
dec(i,Round((Imgraf.Height-50)/10));
until i<0 ;
end;
rocedure TKurs.RadioButton1Click(Sender: TObject);
begin
Bitgraf.Enabled:=true;
end;
procedure TKurs.RadioButton2Click(Sender: TObject);
begin
Bitgraf.Enabled:=true;
end;
procedure TKurs.Button3Click(Sender: TObject);
begin
SetForegroundWindow(HWND_TOP );
end;
procedure TKurs.N9Click(Sender: TObject);
begin
Form4.Show;
end;
procedure TKurs.Timer1Timer(Sender: TObject);
begin
Gauge1.Progress:=Gauge1.Progress+10;
if Gauge1.Progress=100 then begin
Timer1.Enabled:=false;
Gauge1.Progress:=0;
end;
end;
procedure TKurs.N10Click(Sender: TObject);
begin
if ColorDialog2.Execute then
kurs.Imgraf.Canvas.Pen.Color:=ColorDialog1.Color;
end;
procedure TKurs.N11Click(Sender: TObject);
begin
if ColorDialog1.Execute then
kurs.Imgraf.Canvas.Pen.Color:=ColorDialog1.Color;
end;
procedure TKurs.N12Click(Sender: TObject);
begin
Kurs.Close;
end;
end.
]]>