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
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 := ";
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.
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
P
L H 1-!..
>£j
^rn
1
Akmo»Zefc>t
Koml P » n h in
Qo'*br»h |
Ry*xl
O th rish |
ShCkH
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;
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.
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
f
1
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
169
*r ^AKTOp*Kdn
R «kltih/ fnnkbiy,i ^nl.nnid.i ljHoii.il hKobhnli
44 tonl fiikloiliili 0 tji teinj
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
r
;y i.1,
ic^idv
I"
Mu h q m
17 Huoej»mgi
V ■l.'.,*>imip:
r
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 nwrsHilnl Kh Ittiig
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;
Dostları ilə paylaş: |