AMALIY MASHG’ULOT.  MODULLAR VA ULARDAN FOYDALANISH.

Delphida juda ko’p maxsus tayyor prosedura va funksiyalar mavjudki ular har qaysi o’z vazifasiga ega bo’lib unga biblioteka modullari deyiladi. Har bir biblioteka funksiya va proseduralardan tashkil topgan bo’lib ma’lum bir turdagi masalani yechishga muljallangan.

Modul deb prosedura va funksiyaning alohida kompilyasiya qilinib maxsus .tpu kengaytmali fayl shaklidagi ifodalangan dastursiga aytiladi. Moduldan ixtiyoriy dastur ichida foydalanish mumkin. Moduldan foydalanish ya’ni uni aktivlashtirish uchun dasturning bosh qismida quyidagilarni keltirish zarur.

 Uses <Modul1 nomi, modul2 nomi, . . . ,moduln nomi>;

Misol:

   Program SS;

              Uses Crt,Graph;

Turbo-Paskal sistemasida har bir foydalanuvchi o’z modulini yaratishi uchun yaratiladigan modul strukturasini quyidagicha tashkil kilish zarur.

 Uses <modul nomi>;

  Interface

              . . . . .

              {Interfeys qism- ochiq (yozuvlar) qismi}

              . . . . .

 Implementation

              . . . . .

              {Yopiq (yozuvlar) qismi}

              . . . . .

 Begin

              . . . . .

              {Modulning asosiy qismi}

              . . . . .

 End.

Bu yerda

  Unit - modulning sarlavhasi;

 Interface - modulning interfeysi, ya’ni dastur va boshqa modullar uchun ochiq (ko’rinarli) qismining boshlanishini bildiradi. Bu qismda o’zgarmaslar, kattaliklar tiplari, prosedura va funksiyalar aniklanib kursatilgan bo’ladi, lekin ularning butun ko’rinishi keyingi yopiq qismda beriladi.

 Implementation - modulning dastur va modullar uchun yopiq, ya’ni ko’rinmaydigan qismining boshlani-shini bildiradi. Bu yerda interfeys qismda aniqlangan prosedura va funksiyalar yana bir marta ko’rsatilishi shart (ularning sarlavhalari bir xil bo’lishi kerak).

Inisializasiya qismi Begin yozuvidan keyin boshlanadi, agar bu qism mavjud bo’lmasa Begin ham bo’lmaydi. Bu qismda boshqaruvni asosiy programaga o’tkizishgacha qadar bajarilishi kerak bulgan operatorlar ruyxati joylashadi.

MISOL: Ikki sonning eng katta va eng kichigini topish modulini yaratish dastursini qaraymiz. Quyidagi dastur Min(x,y) va Max(x,y) funksyalarini o’z ichiga olgan.

Unit Study;

 Interface {Interfeys kism}

  Function Min(x,y:Integer):Integer;

  Function Max(x,y:Integer):Integer;

 Implementation {Yopik kism}

 Function Min(x,y:Integer):Integer;

 Begin

              If x<=y Then Min:=x Else Min:=y;

 End;

  Function Max(x,y:Integer):Integer;

 Begin

              If x>=y Then Max:=x Else Max:=y;

 End;

 {Inisializasiya qismi mavjud emas}

End.

 

Bu modul kompilyasiya qilinib Stadu.tpu fayl nomga ega bo’lishi kerak. Undan dasturda foydalanish uchun dastur bosh kismida Uses Study qatorini yozish kerak bo’ladi.

Turbo Paskal sistemasida quyidagi biblioteka modullari majud:

System - standart prosedura va funksiyalarni o’z ichiga olgan bo’lib, bu modul avtomatik ravishda aktivlashtirilgan bo’ladi.

Dos - Ms Dos operasion sistema imkoniyatlaridan foydalanuvchi prosedura va funksiyalarni o’z ichiga olgan.

Crt - monitor ekrani va klaviatura bilan ishlash imkoniyatini yaratuvchi proseduralar to’plamini o’z ichiga olgan.

Graph - har xil monitor videoadapterlarini qullagan holda kompyuter grafik imkoniyatlaridan foydalanuvchi ko’plab proseduralar tuplamini o’z ichiga oladi.

Printer - printer bilan ishlovchi kichik modul.

2)      

Dinamik bog’lanuvchi bibliotekalar (DLL)

Ta’rifi

Dinamik boglanuvchi bibliotekalar dasturda boshka tillarda yaratilgan prosedura va funksiyalardan foydalanishga imkon beradi. Dinamik bibliotekalar bilan oddiy modullar orasida juda ko’p o’xshashliklar mavjud ,lekin ikki jixatdan farq qiladi.

Birinchidan dinamik bibliotekada e’lon qilingan o’zgaruvchilar va konstantalardan asosiy dasturda foydalanib bo’lmaydi.

Ikkinchidan modullar statik usulda, ya’ni kompilyasiyaning komponovka bosqichida bog’lanadi. Dinamik bibliotekalar dinamik ya’ni dastur bajarilish jarayonida bog’lanadi. Agarda ikki dastur oddiy modulga murojaat qilsa shu modul ishlatilayotgan qismining ikki nusxasi xotirada yaratiladi. Dinamik bibliotekaning ikki dastur murojaat qilaetgan qismi faqat bir nusxada yaratiladi.

Dinamik bibliotekaning o’zgarishi dasturni qaytadan kompilyasiya kilishga olib kelmaydi.

Yaratilishi

DLL yaratish uchun maxsus Library suzi ishlatiladi.

DLL e’lonlar bulimi Exports suzidan boshlanib, eksport kilinaetgan podprogrammalar ro’yxatini o’z ichiga oladi:

Library MyLibrary;

Function MyFunc (...):...;

begin

end;

Procedure MyProc;

begin

end;

Exports

MyFunc, MyProc;

begin

end.

Podprogramma nomidan tashqari DLL ga uning tartib nomeri joylashtiriladi: birinchi podprogramma nomeri 0, keyingisi - 1 va xokazo. Dasturchi bu indeksasiyani o’zgartirishi va 0 dan 32767 gacha nomer qo’yishi mumkin:

Expots

MyFunc index 1, MyProc index 2;

Dasturchi eksport qilinayotgan podprogramma uchun tashqi nom berishi mumkin:

Exports

MyFunc index I name 'NEWFUNC';

Chaqirayotgan dastur eksport qilinayotgan podprogramma tashqi nomi yoki indeksi bo’yicha chaqirishi mumkin.

Misol

Misol tariqasida cmplx modulini kuramiz.

Library Cmplx;

uses

SysUtils, Classes;

{$R *.RES}

type

TComplex = record Re, Im: Real;

end;

function AddC(x, y: TComplex): TComplex; stdcall;

begin

Result.Im := x.Im + y.Im;

Result.Re := x.Re + y.Re end;

function SubC(x, y: TComplex): TComplex;

stdcall;

begin

Result.Im := x.Im - y.Im;

Result.Re := x.Re - y.Re

end;

function MulC(x, u: TComplex): TComplex;

stdcall;

begin

Result.Re := x.Re * y.Re + x.Im * y.Im;

Result.Im := x.Re * y.Im - x.Im * y.Re

end;

function DivC(x, y: TComplex): TComplex;

stdcall;

var

z: Real;

begin

z := sqr(y.Re) + sqr(y.Im);

try

Result.Re := (x.Re * y.Re + x.Im * y.Im)/z;

Result.Im := (x.Re * y.Im - x.Im * y.Re)/z

except

Result.Re := le+309;

Result.Im := le+309

end

end;

Exports

AddC index 1 name 'ADDC' resident,

SubC index 2,

MulC index 3,

DivC index 4;

begin

end.

Bu yerda stdcall bu DLL ga Delphi dan boshqa tillardan murojaat qilishga imkon beradi. Agar bibliotekaga fakat Delphi tilidagi dasturdan murojaat qilinsa bu so’zning keragi yo’q.

Podprogrammalarga murojaat qilish uchun ularni kuyidagicha e’lon qilish lozim:

Procedure MyProc; External 'MyDLL';

Agar indeks bo’yicha chaqirish lozim bulsa:

Procedure MyProc; External 'MyDLL' index 2;

Bundan tashqari dasturchi tashqi nomni o’zgartirishi xam mumkin:

Procedure MyProc; External 'MyDLL' Name 'ExtName';

Foydalanish

Statik yuklash

Dasturda Smpix bibliotekasi quyidagicha e’lon qilinishi lozim.

type

TComplex = record Re, Im: Real;

end;

function ADDC(x, y: TComplex): TComplex; stdcall; External 'Cmplx' ;

function SubC(x, y: TComplex): TComplex; stdcall; External 'Cmplx' ;

function MulC(x, y: TComplex): TComplex; stdcall; External 'Cmplx' ;

function DivC(x, y: TComplex): TComplex; stdcall; External 'Cmplx';

Interfeysli modul

DLL-podprogrammalarni chaqirishda yozuv kabi murakkab turdagi ma’lumotlarni uzatishga to’g’ri kelishi mumkin. Agar biror DLL ga kup murojaat qilinsa murakkab tur e’lon kilingan interfeysli moduldan foydalanish qulaydir. Masalan:

Unit Complx;

Interface

type

TComplex = record Re, Im: Real;

end;

function AddC(x, y: TComplex): TComplex; stdcall;

External 'Cmplx' index 1;

function SubC(x, y: TComplex): TComplex; stdcall;

External 'Cmplx' index 2;

function MulC(x, y: TComplex): TComplex; stdcall;

External 'Cmplx' index 3;

function DivC(x, y: TComplex): TComplex; stdcall;

External 'Cmplx' index 4;

Implementation end.

Boshqa tilda yozilgan DLL proseduralariga murojaat qilinganda ularning tashqi nomi Delphi qoidasiga to’g’ri kelmasligi mumkin. Masalan C++ tili identifikatorlarda “@” simvolidan foydalanishga ruxsat beradi. Bu xolda Delphi qoidasiga mos nom berib name suzidan sung asl nomini ko’rsatish kerak.

Masalan:

function MyFunction: WordBool; stdcall;

external 'MyDLL' name '_MyFunction@12'

Delphi dasturlash muhitida modul yaratish uchun fileàNewàUnit buyrug’i yordamida modul yaratish uchun oyna oching, uning ko’rinishiga e’tibor bering.

unit Unit1;

interface

implementation

end.

Nazariy materiallarga tayangan holda u=sin(ax)+cos(bx) funksiya qiymatini hisoblashda qo’llanuvchi sincos moduli yarating.

unit sincos;

interface

function sc(a,b,x:real):real;

implementation

 function sc(a,b,x:real):real;

 begin sc:=sin(a*x)+cos(a*x); end;

end.

 Modulga nom berishda file menyusidagi Save buyrug’idan foydalaning.

Bu moduldan foydalanishga yangi forma yaratib, quyidagi prosedurani joylashtiring va natijani kuzating.

procedure TForm1.Button1Click(Sender: TObject);

var a1,b1,x1,y:real;

begin

a1:=random(56);b1:=random(67);x1:=random(90); y:=sc(a1,b1,x1);

 label1.Caption:=floattostr(y);

end;

end.

 

 

 

Mustahkamlash maqsadida ikkita berilgan sondan kattasini aniqlovchi funksiyani qamrab oluvchi modul keltirilgan, foydalanib xulosa chiqaring.

unit max2;

interface

 function ff(a1,b1:real):real;

implementation

 function ff(a1,b1:real):real;

 begin

 if a1>b1 then ff:=a1 else ff:=b1;

 end;

end.

Јuyida keltirilgan proosedurada va FF –funksiyadan foydalanib, natijasini kuzating.

procedure TForm1.Button1Click(Sender: TObject);

var a1,a2:real;

begin

a1:=random(2000);a2:=random(3000);

label1.Caption:=floattostr(a1);label2.Caption:=floattostr(a2);

 label3.Caption:=floattostr(ff(a1,a2));end;end.

 

 

 

Masala. 20-elementli massivning elementlari 0..2000 oralig’ida tasodufiy xolda yaratilan natural sonlardan iborat. Massivning maksimal qiymatini FF-funksiya yordamida aniqlang.

procedure TForm1.Button1Click(Sender: TObject);

var max:real; i:byte; a: array [1..20]of real;

begin

 label1.caption:=''; randomize;

for i:=1 to 20 do

begin

a[i]:=random(2000);

label1.Caption:=label1.caption+'massivning '+inttostr(i)+' -chi elementi '+floattostr(a[i])+#13;

end;

 max:=a[1];

 for i:=1 to 20 do

 begin max:=ff(max,a[i]); end;

 label3.Caption:=floattostr(max);

end;end.


Quyida keltirilgan modul va funksiyalarni qanday maqsadda tuzilganligini aniqlang.

unit darfact;

interface

function dar(x:real;n:byte):real;

 function fact(n:byte):longint;

implementation

 function dar(x:real;n:byte):real;

 var i:byte; p:real;

 begin dar:=1; for i:=1 to n do p:= p*x; dar:=p; end;

 function fact(n:byte):longint;

 var i:byte; p:longint;

 begin fact:=1; for i:=1 to n do p:=p*i; fact:=p; end;

 end.

 

Mustaqil ish topshiriqlari:

1.        3 ta sondan kattasini topuvchi modul yarating.

2.        Ctg(x) funksiyasini hisoblovchi modul yarating.

3.        Uchburchak yuzasini hisoblovchi modul yarating.

4.        a,b,c xaqiqiy sonlar berilgan. f(t,-2s,1.17)+f(2.2t,t,s-1) ni hisoblang, bu erda f(a,b,c)=

5.        s,t xaqiqiy sonlar berilgan. g(1.2,-s)+g(t,s)-g(2s-1,st) ni hisoblang,bu erda g(a,b)=

6.        u -xaqiqiy son berilgan.  qiymatini hisoblang, bu erda f(x)=

7.        a,b,c xaqiqiy sonlar berilgan, bo’lsa hisoblang,  

8.        x,y,z berilgan. Hisoblang: max(x+y+z, xyz)+3

9.        x,y,z berilgan. Hisoblang: min()-4.

10.     butun sonlar berilgan. qiymatini hisoblang, bu erda u,v,w-rasional sonlar bo’lib, , , ga teng.

11.    Kal’kulyator dasturini tuzing.Unda “+”,”-”,”*”,”/” amallarini aloxida proseduralarda ifodalang.

12.    9.Radian qiymatli burchakni gradus qiymatga o’tkazuvchi prosedura tuzing va undan dasturda foydalaning.

13.    Hisoblang:

Комментарии

Популярные сообщения из этого блога