Delphi tilida


Type  TPStudent = ^TStudent



Yüklə 3,41 Mb.
səhifə76/133
tarix07.01.2024
ölçüsü3,41 Mb.
#210126
1   ...   72   73   74   75   76   77   78   79   ...   133
sodapdf-converted (1)

Type 
TPStudent = ^TStudent; 
TStudent = record 
sumame: string[20]; 
name: string[20]; 
group: integer; 
address: string[60]; 
next: TPStudent; 
end; 
var 
head: TPStudent; 

159 

Rasmda ro‘yxatga yangi element qo‘shish jarayoni ko‘rsatilgan. 
Ikkinchi element qo‘shilgandan so‘ng head shu elementni ko‘rsatadi. 

head 

NtL 

nead 

hejd 

Sultonov 



NIL 

Ro‘yxatdan elementni o‘chirish 

Ro‘yxatdan elementni o‘chirish uchun oldingi element ko‘rsatgichi 


qiymatini o‘zgartirish lozim: 
Teaa 

160 


Element dinamik o'zgaruvchi bo'lgani uchun ro'yxatdan 
o‘chirilgandan so‘ng unga ajratilgan xotira ozod qilinishi lozim. 
Quyida dinamik o‘zgaruvchi yaratilib, yo‘qotilishi ko‘rsatilgan:
Var 
r: 'integer; 
begin 
new(p); 



Dinamik ro‘yxat 

.r 

Pyvw»» 


F*miliya 

Km 
Pi>'yldl 



Cchnnh 

Quyidagi dastur talaba 


familiyasini ro‘yxat boshiga 
qo‘shib. talabalar ro‘yxatini 
hosil qiladi. Ma’lumotlar 
tahrirlash komponentasiga 
kiritilib, Qo‘shish (buttonl) 
tugmasini bosib, ro‘yxatga 
kiritiladi. Kiritilgan ele- 
mentlar ro'yxati Ro‘yxat 
(button 2) tugmasini bosib, 
alohida oynaga chiqariladi. 
Elementni ro'yxatdan 
o‘chirish uchun, Ro‘yxat 
(button 3) o‘chirish tugmasi 
bosiladi. 



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

161 

public 
{ Public declarations } 
end; 



implementation 
{$R *.DFM} 
Type 
TPStudent=ATStudent; 
TStudent = record 
f_name:string[20]; 
l_name: string[20]; 
next: TPStudent; 
end; 
Var 
head: TPStudent; // Hanajio (rojioBa) cnncKa 
procedure TForml.ButtonlClick(Sender: TObject); 
var 
curr: TPStudent; 
begin 
new(curr); 
currA.f_name := Editl.Text; 
currA.l_name := Edit2.Text; 
currA.next := head; head := curr; 
Editl.text:=”; Edit2.text:= "; 
end; 
Procedure TForml.Button2Click(Sender: TObject); 
var 
curr: TPStudent; 
n:Integer; 
st:string; 
begin n := 0; st := "; 

162 


if n <> 0 
then ShowMessage(«CnHcoK:» —Po‘yxat + #13 + st) 
else ShowMessage(«B cnncKe HeT 3jieMeHTOB.»);— Ro‘yxatda 
elementlar yo‘q. 
end; 
Procedure TForml.Button3Click(Sender: TObject); 
var 
curr: TPStudent; 
begin 
ifheadONIL then 
if headA.next=NIL then 
begin 
Dispose(head); 
head:=NIL; 
end 
else 
begin 
new(curr); 
curr:=head; 
head:=currA.next; 
Dispose(curr); 
end; 
end; 

Elementlarni ro‘yxatga qo‘shishni TForm l.B uttonlC lick 


protsedurasi bajaradi. Bu protsedura dinamik o‘zgaruvchi ro‘yxat
yaratib, maydonlariga qiymat beradi va head ko‘rsatgichi qiymatini 
to‘g‘rilaydi. 

163 

Ro‘yxatni TForml.Button2Click protsedurasi chiqaradi. Ro‘yxat
elementlariga murojaat qilish uchun curr ko‘rsatkichidan foydalaniladi. 
Oldin uning qiymati birinchi element adresiga teng boladi. Keyin 
unga next maydoni qiymati beriladi. Jarayon to next maydonning 
qiymati NIL bolmaguncha davom etadi. 
Elementni ro‘yxatdan o‘chirish TForml.Button3Clickprotsedurasi 
tomonidan amalga oshiriladi. 



Tartiblangan ro‘yxat 

Odatda ro'yxatlar tartiblangan bo'ladi. Misol uchun talabalar 


ro‘yxati familiya bo‘yicha tartiblangan boladi. 
Elementni tartiblangan ro'yxatga qo'shish uchun awal shu 
elementdan oldin turishi kerak bolgan element topiladi. Shundan 
so‘ng ko‘rsatkichlar qiymatlari o‘zgartiriladi. 

hHd 

Alimov r Shokirov 



Quyidagi dastur Familiya maydoni bo‘yicha tartiblangan ro‘yxat


hosil qiladi. Dastur formasining ishlash jarayoni rasmda ko‘rsatilgan. 

i * J"4-M 
-131 “ll 

Fwnftya 



L H 1-!.. 
>£j 

^rn 


Akmo»Zefc>t 
Koml P » n h in 

Qo'*br»h |


Ry*xl 

O th rish | 
ShCkH 


164 


end; 
Var 
Forml: TForml; 
implementation 
{$R *.DFM} 
Type 
TPStudent=ATStudent; 
TStudent = record 
f_name:strino[20]; 
l_name: strino[20]; 
next: TPStudent; 
end; 
Var 
head: TPStudent; 
procedure TForml.ButtonlClick(Sender: TObject); 
var 
node: TPStudent; 

165 

curr: TPStudent; 
pre: TPStudent; 
Begin 
new(node); 
nodeA.f_name:=Editl.Text; 
nodeA.l_name:=Edit2.Text; 
curr:=head; 
pre:=NIL; 
while (currONIL) and (node.f_name > currA.f_name) do 
begin 
pre:= curr; 
curr:=currA.next; 
end; 
if pre = NIL then 
begin 
nodeA.next:=head; head:=node; 
end 
else 
begin 
node^.next:=preA.next; 
preA.next:=node; 
end; 
Editl.text:=”; 
Edit2.text:=”; 
Editl.SetFocus; 
end; 
Procedure TForml.Button2Click(Sender: TObject); 
var 
curr: TPStudent; 
n:Integer; 
st:string; 
begin n := 0; st := "; 
curr := head; 
while curr <> NIL do begin 
n := n + 1; 
st := st + currA.f_name + " + currA.l_name+#13; 
curr := currA.next; 

166 


end; 
Procedure TForml.Button3Click(Sender: TObject); 
Var 
curr: TPStudent; 
begin 
if headONIL then 
if headA.next=NIL then 
begin 
Dispose(head); 
head:=NIL; 
end 
else 
begin 
new(curr); 
curr:=head; 
head:=currA.next; 
Dispose(curr); 
end; 
end; 
Procedure TForml.FormActiyate(Sender: TObject); 
Begin 
head:=NIL; 
end; 
end. 



6.3.Rekursiya 
Rekursiya tushunchasi 

Rekursiv funksiya deb, o‘z-o‘ziga murojaat qiluvchi funksiyaga 
aytiladi. Rekursiv funksiyaga misol quyidagi faktorial hisoblash 
funksiyasini misol qilish mumkun. 
function factorial(n: Integer): integer; 
begin 
if n <> 1 
then factorials n * factorial(n-l) 
else factorial := 1; 
end; 
Shunga e’tibor berish kerakki, agar parametr qiymati 1 ga teng 
bo‘lsa. funksiya o‘ziga murojaat qilmaydi, balki qiymat qaytaradi va 
rekursiv jarayon tugaydi. 

167 

1 i f $dK«cJt*.IQ | x j 

fiiBikfisv.-! y o ird riim iilj f


HliI hisoEilaslb 







Quyida rekursiya asosida faktorial hisoblash loyihasi formasi 
keltirilgan: 
Loyiha dasturining matni: 
Unit Unitl; 
interface 
uses 
Windows, Messages, SysUtils, Variants, Classes, Graphics, 
Controls, Forms, 



TForml = class(TForm) 



Private 
{ Private declarations } 
public 
{ Public declarations } 
end; 



Var 

168 

Forml: TForml; 
implementation 
{$R *.dfm} 
function factorial(n: integer): integer; 
begin 
if n > 1 
then factorial := n * factorial(n-l) 
else factorial:= 1; 
end; 
Procedure TForml.ButtonlClick(Sender: TObject); 
var 
k:integer; 
f:integer; 
begin 
k := StrToInt(Editl.Text); 
f := factorial(k); 
label2.caption:=Editl.Text + ' soni faktoriali' + 
IntToStr(f)+’ ga teng’; 
end; 
end. 

Quyidagi ikki rasmda hisoblash natijalari keltirilgan. Ikkinchi natija 


kutilgandan farq qiladi. 

_________________ 

Flehiiruiv Tinikstyn yoMlnmMii T-iktariiiF ht&oliliish



10 

10 

3628800


169 

*r ^AKTOp*Kdn 

R «kltih/ fnnkbiy,i ^nl.nnid.i ljHoii.il hKobhnli 

1 « 


44 tonl fiikloiliili 0 tji teinj 



Nkobl**!) 



Natija kutilganga mos kelmaydi. 44 soni faktoriali nolga teng! Bu 


natijaning sababi 44 faktoriali katta son bolib. integer turi uchun 
maksimal qiymatdan kattadir. 
Delphi bajarilayotgan dasturga o‘zgaruvchi diapazonini kontrol 
qilish instruksiyasini qo‘shishga imkon beradi. Buning uchun Project 
Options dialog oynasi Compiler bo'limida Runtime errors (O ih h 6 k h 
BpeMeHH B tinojiH eH H a) guruhidagi Overflow checking (K o h tpo jib 
nepenojiH eH H a) bayroqchasini o‘rnatish lozim. 

h « |« t QptBMH 

DndBiXkiln^ I 
C o ilrg m ilw 
P Op*rm*on. 
Vmmnkie 
I- Etijrtfwlrj
fwjgs: 

17 Sinc* i* t* ii^ 


[7 ^r£(*inc<*Jo 




;y i.1, 
ic^idv 


I" 
Mu h q m 



17 Huoej»mgi 

V ■l.'.,*>imip: 







170 


Rekursiyadan foydalanishga misollar 
Fayllarni izlash 

2.Agar katalogda ostki katalog mavjud bo‘lsa. u ham shunday 
ko‘rib chiqilsin. 
Fayl (Editl) maydoni fayl nomini kiritish uchun moljallangan. 
Katalog nomi Papka maydoniga kiritiladi yoki 063op nanoK, dialog 
oynasi yordamida tanlanadi. Bu dialog oynasi SelectDirectory standart 
funksiyasi yordamida chiqariladi. Oddiy satrni WideChar turiga 
aylantirish uchun StringToWhideChar funksiyasidan foydalanilgan. 

Fiijrt nom t y o h t nwrsHilnl Kh Ittiig 

F.ijyl 


|.v 


Pj|A.i  
UUsli 

Asosiy vazifani Find rekursiv funksiyasi bajaradi. Find funksiyasida 
bitta parametr searchRec tuzilmasi ishlatiladi. Birinchi va keyingi 
fayllarni izlash uchun FindFirst va FindNext funksiyalaridan 
foydalaniladi. 

171 

procedure ButtonlClick(Sender: TObject); 
procedure Button2Click(Sender: TObject); 
private 
{ Private declarations } 
public 
{ Public declarations } 
end; 
Var 
Forml: TForml; 
implementation 
{$R *.dfm} 
Var 
FileName: string; 
cDir: string; 

Yüklə 3,41 Mb.

Dostları ilə paylaş:
1   ...   72   73   74   75   76   77   78   79   ...   133




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2025
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin