AMALIY MASHG’ULOT. DASTURLASH TILIDA PROTSEDURA VA FUNKSIYALAR.

Ayrim masalalarni yechish jarayonida turli ifodalarning qiymatlarini hisoblash uchun qandaydir funksiyalarning qiymatlaridan foydalanishga to’g’ri keladi. Biz kundalik hayotimizga chuqur kirib borgan standart yoki elementar deb ataydigan shunday funksiyalar borki, ko’pchilik bu funksiyalarni taniymiz, ammo ularning ma’nosiga e’tibor bermaymiz. Masalan: y=cosx ifodaning qiymatini hisoblaganda, cosx o’rnida boshqa ifoda, ya’ni "to’g’ri burchakli uchburchakdagi x burchak qarshisidagi katetning gipotenuzaga nisbati" yotganligini odatda his qilmaymiz.

Agar masala shartida standart bo’lmagan funksiyalar, yoki uzundan-uzun ifodalarni parametrlarining turli qiymatlari uchun yozishga to’g’ri kelib qolsa, dasturchi Delphi da o’z ishini shu murakkab ifodalarning qiymatlari hisoblash jarayonini ham xuddi standart funksiyalardan foydalanishga o’xshash yengillashtirishi uchun imkon yaratilgan.

  Bunday hollarda dasturchining ishini bir muncha soddalashtirish uchun Delphi da funksiyalar yoki foydalanuvchi funksiyasini tuzish tavsiya qilinadi.

  Prosedura-funksiyalar odatda murakkab ifodalarni, uzun arifmetik ifodalarni yoki biror ifoda qiymatini argumentlarning (parametrlarning) turli qiymatlari uchun hisoblashga to’g’ri kelgan hollarda tashkil qilinishi mumkin.

Funksiya — bu o’zining nomiga ega bo’lgan qism dastur, ya’ni buyruqlar ketma-ketligidir.

  Funksiya umumiy holda quyidagicha e’lon qilinadi:

 function Nom (parametr1 : tip1, ..., parametrK : tipK) : Tip;

 var

¤¤ bu yerda orlaliq parametrlar e’lon qilinadi

begin

¤¤ funksiyaning buyruqlari ketma-ketligi

   Nom := ifoda;

end;

Bu yerda function — Delphi ning funksiya yaratilayotganligini bildiruvchi xizmatchi so’zi; Nom — funksiyaning nomi, funksiyaga murojaat qilishda foydalaniladi; parametr — funksiyaning qiymatini hisoblash uchun zarur bo’lgan formal o’zgaruvchi bo’lib, u U o’ziga qiymatni asosiy dasturdan shu funksiyaga murojaat qilinayoganda oladi; tip — asosiy dasturning funksiyadan oladigan ma’lumotining tipi.

Shunga alohida e’tibor berish kerakki, funksiyaning buyruqlari funksiyaning nomi bilan atalgan o’zgaruvchiga qiymat beradigan buyruq bilan tugaydi. Funksiyaning qiymatini aniqlaydigan ifodaning tipi e’londa ko’rsatilgan funksiyaning tipi bilan bir hil bo’lishi lozim.

Yuqori keltirilgan nuqtaning uchburchak ichida yotishi haqidagi masala uchun funksiya yozamiz.

Function Yuza(a1, a2, a3, b1, b2, b3: real):real;

 Var ab, ac,bc,p : real; ¤¤ Oraliq o’zgaruvchilar

begin    

ab := sqrt(sqr(a2-a1) + sqr(b2-b1);

ac := sqrt(sqr(a3-a1) + sqr(b3-b1);

bs := sqrt(sqr(a3-a2) + sqr(b3-b2);

p := (ab + ac + bc) ¤ 2; ¤¤ yarim perimetr

¤¤ Geron formulasi qo’llanmoqda

Yuza := sqrt(p*(p-ab)*(p-ac)*(p-bc);

end;

Funksiyaning buyruqlariga o’tish funksiyaga murojaat qilish yoki uni chaqirish deb ataladi. Funksiya buyruqlaridan shu funksiyani chaqirgan buyruqqa o’tish esa funksiyadan qaytish deb ataladi.

Funksiyaga murojaat qilish umumiy ko’rinishda quyidagicha yoziladi.

o’zgaruvchi := Funksiya (joriy parametrlar) ;

bu yerda o’zgaruvchi – qiymat olayotgan o’zgaruvchi; Funksiya - qiymati o’zgaruvchi ga beriladigan funksiyaning nomi; joriy parametrlar -

funksiyaning qiymatini hisoblash uchun foydalaniladigan joriy o’zgaruvchilar ro’yxati. Bu parametrlar sifatida konstantalar yoki o’zgaruvchilardan foydalanish mumkin.

Shuni yodda tutish kerakki, birinchidan, har bir funksiya ma’lum bir tipdagi ma’lumotni olib keladi, shuning uchun bu qiymatni oladigan o’zgaruvchining tipi ham funksiya tipiga mos bo’lishi lozim; ikkinchidan formal va joriy o’zgaruvchilar ro’yxati xar bir funksiya uchun qat’iy aniqlangan bo’lishi lozim.

Funksiyadan foydalanish. Dasturda funksiyadan foydalanish uchun odatda uning matnini eng sodda holda shu funksiyadan foydalanadigan qism dasturdan oldin ko’rsatish qabul qilingan.

1-listingda nuqta uchburchak ichida yotadimi? masalasining dasturi matni keltirilgan. Bu dasturning dialog oynasi 2-rasmda berilgan.

1-listing. Nuqta uchburchak ichida yotadimi? dasturi matni

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

 TForm1 = class(TForm)

 Label1: TLabel;

 Label2: TLabel;

 Label3: TLabel;

 Label4: TLabel;

 Label5: TLabel;

 Label6: TLabel;

 Label7: TLabel;

 Edit1: TEdit;

 Edit2: TEdit;

 Edit3: TEdit;

 Edit4: TEdit;

 Edit5: TEdit;

 Edit6: TEdit;

 Label8: TLabel;

 Label9: TLabel;

 Label10: TLabel;

 Edit7: TEdit;

 Edit8: TEdit;

 Button1: TButton;

 Label11: TLabel;

 procedure Button1Click(Sender: TObject);

 private

 { Private declarations }

 public

 { Public declarations }

 end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

 var x,x1,x2,x3,y,y1,y2,y3 : real; ¤¤ koordinatalar

 S: real; ¤¤ AVS uchburchakning yuzi

 s1,s2, s3: real; ¤¤ kichik uchburchaklarning yuzalari

 d:string;

 Function Yuza(a1, a2, a3, b1, b2, b3: real):real;

 Var ab, ac,bc,p : real; ¤¤ Oraliq o’zgaruvchilar

 begin

 ab := sqrt(sqr(a2-a1)+sqr(b2-b1));

 ac := sqrt(sqr(a3-a1)+sqr(b3-b1));

 bc := sqrt(sqr(a3-a2)+sqr(b3-b2));

 p := (ab + ac + bc) ¤ 2; ¤¤ yarim perimetr

 ¤¤ Geron formulasini qo’llanmoqda

 Yuza := sqrt(p * (p - ab) * (p - ac) * (p - bc));

 end;

begin

 ¤¤ Uchburchakning koordinatalari

 x1 := strtofloat(edit1.Text);

 x2 := strtofloat(edit2.Text);

 x3 := strtofloat(edit3.Text);

 y1 := strtofloat(edit4.Text);

 y2 := strtofloat(edit5.Text);

 y3 := strtofloat(edit6.Text);

 ¤¤ berilgan nuqtaning koordinatalari

 x := strtofloat(edit7.Text);

 y := strtofloat(edit8.Text);

 ¤¤ Katta uchburchakning yuzi

 s := yuza(x1,x2,x3,y1,y2,y3);

 ¤¤ Kichik uchburchaklarning yuzalari hisoblanmoqda

 S1 := yuza(x1,x2,x,y1,y2,y);

 s2 := yuza(x1,x,x3,y1,y,y3);

 s3 := yuza(x,x2,x3,y,y2,y3);

 d := floattostr(s)+ ' ' + floattostr(s1) + ' ' +floattostr(s2)

 +' ' + floattostr(s3) + ' ' +floattostr(s1 + s2 + s3) + #13;

 if abs(s-(s1 + s2 + s3))<=0.00000001 then

 label11.Caption := d+'Berilgan nuqta uchburchakning ichida yotadi'

 else

 label11.Caption := d+' Berilgan nuqta uchburchakning ichida yotmaydi'

 end;

end.

Dastur matnidagi abs(s-(s1+s2+s3))<=0.00000001 shartiga e’tibor bering. Biz masalani yechish g’oyasiga ko’ra, S=S1+S2+S3 yoki S-(S1+S2+S3)=0 shartini tekshirishimiz kerak edi. Ammo, bu formulalardagi parametrlarning haqiqiy son ekanligi, Delphi muhitida aniqlikning juda katta ekanligi, yoki Delphi muhiti 0.999999999999999 yoki 1.00000000000001 sonlarini haqiqiy 1 soni deb qabul qilishi mumkinligini nazarda tutsak, bu shart tabiiy hisoblanadi.






2-rasm. Dastur dialog oynasining qo’rinishlari

Quyidagi dastur (uning matni 2-listingda berilgan) dala hovliga borib kelish qiymatini hisoblaydi. Uning dialog oynasi 3-rasmda keltirilgan. Bu masala uchun boshlang’ich ma’lumot sifatida masofa, bir litr benzin narxi, 100 km ga sarflanadigan benzin miqdori olinadi. Bu ma’lumotlarni kiritish uchun Edit1, Edit2 va Edit3 maydonlaridan foydalanamiz. OnKeyPress xodisalarni qayta ishlash funksiyasi IsFloat funksiyasidan foydalanadi. Bu funksiya kiritilayotgan belgilarni nazorat qilish uchun mo’ljallangan. Bu funksiya maydonlarga faqat ruxsat berilgan belgilar, ya’ni, raqamlar, <Enter>, <Backspace> tugmalarini bosilganligini e’tiborga oladi halos, qolgan tugmalarga e’tibor bermaydi.

3-rasm. Dala hovliga borib kelish qiymati dasturining dialog oynasi

2-listing. Funksiyadan foydalanishga namuna

unit dala1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

 TForm1 = class(TForm)

 Label1: TLabel;

 Edit1: TEdit;

 Label2: TLabel;

 Edit2: TEdit;

 Label3: TLabel;

 Edit3: TEdit;

 CheckBox1: TCheckBox;

 Label4: TLabel;

 Button1: TButton;

 procedure EditlKeyPress(Sender: TObject;var Key: Char);

 procedure Edit2KeyPress(Sender: TObject; var Key: Char);

 procedure Edit3KeyPress(Sender: TObject; var Key: Char);

 procedure Button1Click(Sender: TObject);

 private

 { Private declarations }

 public

 { Public declarations }

 end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

¤¤ Kasr son uchun kiritilgan belgining to’g’riligini aniqlaydi

function IsFloat(ch : char; st: string) : Boolean;

begin

if (ch >= '0') and (ch <= '9') ¤¤ raqamlar

or (ch = #13) ¤¤ <Enter> tugmasi

or (ch = #8) ¤¤ <Backspace> tugmasi

then

begin

IsFloat := True; ¤¤ belgi to’g’ri yozilgan

Exit; ¤¤ funksiyadan chiqish

end;

case ch of

'-': if Length(st) = 0 then IsFloat := True;

',': if (Pos(',',st) = 0)

 and (st[Length(st)] >= '0') and (st[Length(st)] <= '9')

 then ¤¤ ajratuvchi belgi raqamdan keyin yozilishi kerak

 IsFloat := True else ¤¤ qolgan belgilar ta’qiqlangan

 IsFloat := False;

end;

end;

¤¤ Tugmani MASOFA oynasida bosish

procedure TForm1.EditlKeyPress(Sender: TObject; var Key: Char);

begin

if Key = Char(VK_RETURN)

then Edit2.SetFocus ¤¤ Kursorni NARX oynasiga o’tkazish

else

If not IsFloat(Key,Edit2.Text) then Key := Chr(0);

end;

¤¤ NARX maydonida tugmani bosish

procedure TForm1.Edit2KeyPress(Sender:TObject; var Key: Char);

begin

if Key = Char(VK_RETURN)

then Edit3.SetFocus ¤¤ kursorni harajat maydoniga o’tkazish

else If not IsFloat(Key,Edit2.Text)

then Key := Chr (0);

end;

 ¤¤ tugmani HARAJAT maydonida bosish

procedure TForm1.Edit3KeyPress(Sender:TObject; var Key: Char);

begin

if Key = Char(VK_RETURN)

then Button1.SetFocus ¤¤ HISOBLASh tugmasini faollashtirilmoqda

else If not IsFloat(Key,Edit2.Text) then Key := Chr (0);

end;

¤¤ HISOBLASh tugmasi chertilganda

procedure TForm1.Button1Click(Sender: TObject);

var

masofa : real; ¤¤ masofa

narx : real; ¤¤ narx

sarf : real; ¤¤ 100 km ga sarf

summ : real; ¤¤ summa

mes: string;

begin

masofa := StrToFloat(Edit1.Text);

narx := StrToFloat(Edit2.Text);

sarf := StrToFloat(Edit3.Text);

summ := masofa ¤ 100 * sarf * narx;

if CheckBox1.Checked then summ := summ * 2;

mes := 'Dala hovliga borish';

if CheckBox1.Checked then mes := mes + ' va qaytib kelish'+#13;

mes := mes + FloatToStrF(summ,ffGeneral,10,2) + ' so’mga tushadi';

Label4.Caption := mes;

end;

end.

Prosedura

Prosedura — bu qism dasturning ko’rinishlaridan biri hisoblanadi. Odatda qism dasturlar prosedura shaklida ikki holdan birida rasmiylashtiriladi:

  • qism dastur asosiy dasturga ma’lumotlarni qaytarishi shart bo’lmagan hollarda. Masalan, dialog oynasida grafiklarni chizish talab qilinganda.
  • qism dastur uni chaqirgan dasturga bittadan ortiq qiymatni qaytarishiga to’g’ri kelganda. Masalan, kvadrat tenglamani yechayotgan qism dastur ikkita ildizni hisoblashi va ularni asosiy dasturga olib chiqishi kerak.

Prosedurani e’lon qilish. Bu masala umumiy ko’rinishda quyidagicha hal qilinadi:

 procedure Nom (var parametr1: tip1; ... var parametrK: tipK);

var

 ¤¤ Bu yerda lokal, ya’ni oraliq o’zgaruvchilar e’lon qilinadi

 begin

 ¤¤ bu yerda proseduraning buyruqlari yoziladi

 end;

Bu yerda procedure — Delphi tilida proseduraning boshlanishini anglatuvchi xizmatchi so’z; Nom — proseduraga murojaat qilishda foydalaniladigan proseduraning nomi; parametr — formal parametr, u prosedura buyruqlarida ishtirok etadi; var so’zi parametrdan avval yozilishi shart emas. Ammo, u yozilgan bo’lsa, bu holat prosedurani chaqirish buyrug’ida albatta joriy o’zgaruvchi sifatida o’zgaruvchi kelishi shartligini bildiradi. Bu parametrlar ma’lumotlarni murojaat qiluvchi dasturdan proseduraga hamda proseduradan unga murojaat qilgan dasturga olib o’tish uchun xizmat qiladi.

5-listing. Uchburchak yasash prosedurasi

procedure uchburchak(a, b, c : real);

{ a, b, c – berilgan uchta son, s- uchburchakning yuzi,

z- ma’lumotlarni ekranga chiqarishga tayyorgarlik}

var

 ok : boolean; ¤¤ ok=True-uchburchak mavjud, ok=False – mavjud emas

p : real; ¤¤ yarim perimetr

begin

yuza := 0;

z := '';

if (a + b >= c) and (a + b >= c) and (b + c >= a)

then begin

 ok := true;

 p := (a + b + c) ¤ 2;

 yuza := sqrt(p * (p - a) * (p - b) * (p - c));

 end

 else ok := false;

 z := floattostr(a)+ ' ' + floattostr(b) + ' ' + floattostr(c);

 if ok then

 z := z + ' ' + 'uchburchak mavjud Uning yuzi =' + floattostr(yuza)

 else z := z + ' ' +'uchburchak mavjud emas';

 s2 := s2 + z + #13;

 um_yuza := um_yuza + yuza;

end;

Proseduralardan foydalanish. Tayyorlangan prosedurani implementation bo’limida undan foydalanadigan qism dasturdan avval ko’rsatilishi lozim.

Proseduraga murojaat qilish buyrug’i quyidagicha yoziladi:

Nom (Parametrlar ro’yxati);

bu yerda Nom – chaqirilayotgan proseduraning nomi; (Parametrlar ro’yxati)–bir-biridan vergul bilan ajratilgan joriy o’zgaruvchilar ro’yxati.

  Proseduraga murojaat qilinganda joriy o’zgaruvchi sifatida proseduraning e’lonida ko’rsatilishiga mos ravishda tiplari o’zaro to’g’ri keladigan o’zgaruvchi, konstanta yoki ifoda kelishi mumkin. Masalan, kvadrat tenglamaga murojaat qilinganda

uchburchak(StrToFloat(Edit1.Text), StrToFloat(Edit2.Text),

StrToFloat(Edit3.Text), k1, k2, nat);

yoki

uchburchak (a, b, c);

yoki

uchburchak (2.5, b, 3.45);

ko’rinishidagi yozuvlardan foydalanish mumkin.

  Bizga quyidagi masala qo’yilgan bo’lsin. To’rtta p, q, r, t haqiqiy sonlar berilgan bo’lsin. Ulardan hosil qilingan uchliklar ichidan uchburchak yasash mumkinlarini toping. Agar uchburchak yasash mumkin bo’lsa, shu uchburchaklarning umumiy yuzini toping.

  Berilgan to’rtliklardan (p,q,r), (p,q,t), (q,r,t) va (p,r,t) uchliklarni hosil qilish mumkin. Ixtiyoriy uchlikdan uchburchak yasash mumkinligini yuqoridagi prosedura yordamida tekshirishni tashkil qilamiz.

6-listing. Uchburchak yasash mumkinligi haqida dastur matni

unit uch4;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type

 TForm1 = class(TForm)

 Label1: TLabel;

 Label2: TLabel;

 Label3: TLabel;

 Label4: TLabel;

 Label5: TLabel;

 Edit1: TEdit;

 Edit2: TEdit;

 Edit3: TEdit;

 Edit4: TEdit;

 Button1: TButton;

 Label6: TLabel;

 procedure Button1Click(Sender: TObject);

 procedure FormCreate(Sender: TObject);

 private { Private declarations }

 public { Public declarations }

 end;

var

 Form1: TForm1;

implementation

{$R *.dfm}

 var z, s2:string;

 yuza, um_yuza : real;

 procedure TForm1.Button1Click(Sender: TObject);

 var um_yuza, p,q,r,t:real;

 s1,s2 : string;

procedure uchburchak(a, b, c : real);

{ a, b, c – berilgan uchta son, s- uchburchakning yuzi,

z- ma’lumotlarni ekranga chiqarishga tayyorgarlik}

var

 ok : boolean; ¤¤ ok=True-uchburchak mavjud, ok=False – mavjud emas

p : real; ¤¤ yarim perimetr

begin

yuza := 0; z := '';

if (a + b >= c) and (a + b >= c) and (b + c >= a)

then begin

 ok := true;

 p := (a + b + c) ¤ 2;

 yuza := sqrt(p * (p - a) * (p - b) * (p - c));

 end

 else ok := false;

 z := floattostr(a)+ ' ' + floattostr(b) + ' ' + floattostr(c);

 if ok then

 z := z + ' ' + 'uchburchak mavjud. Uning yuzi =' + floattostr(yuza)

 else z := z + ' ' +'uchburchak mavjud emas';

 s := s + z + #13;

 um_yuza := um_yuza + yuza;

end;

begin

 s2 := '';

 p := strtofloat(edit1.text);

 q := strtofloat(edit2.text);

 r := strtofloat(edit3.text);

 t := strtofloat(edit4.text);

 uchburchak(p,q,r);

 uchburchak(p,q,t);

 uchburchak(p,r,t);

 uchburchak(q,r,t);

 s := s + #13 +'Umumiy yuza= ' + floattostr(um_yuza);

 label6.caption := s;

end;

procedure TForm1.FormCreate(Sender: TObject);

begin

um_yuza := 0;

s2 := '';

end;

end.

E’tibor bergan bo’lsangiz, asosiy dasturdan proseduraga tushadigan formal o’zgaruvchilar prosedura sarlavhasida e’lon qilingan. Ammo, proseduradan asosiy dasturga qaytishi kerak bo’lgan o’zgaruvchilar ko’rsatilmagan.

Ular dastur matnida, Button1Click xodisalarni qayta ishlash prosedurasi matnida avval ko’rsatilgan. Bu o’zgarurvchilar yuza, um_yuza, s2 o’zgaruvchilari asosiy dastur uchun ham, prosedura uchun ham bir hil qilib tanlangan. Bunday hollarda o’zgaruvchilarni misoldagi kabi e’lon qilish va foydalanish mumkin. um_yuza va s2 o’zgaruvchilari boshlang’ich qiymatlarini forma faollashtirilganda, ya’ni FormCreate xodisalarni qayta ishlash prosedurasidan oladi.



4-rasm. Uchburchak yasash haqidagi masalaning dialog oynasi

Комментарии

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