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
Комментарии
Отправить комментарий