5.3.1 Qism dasturga misol
2 ta a va b sonlar berilgan ularni o‘rnini almashtirish dasturini S dasturlash
tilida ko‘rib chiqamiz.
void swap1 (a,b: integer)
temp: integer;
begin
temp:=a;
a:=b;
b:=temp;
end;
swap1 funksiyasini quyidagi ko‘rinishda chaqirish mumkin:
swap1(&c, &d);
swap1 funksiyasining amalini quyidagi psevdokod orqali tavsiflash mumkin:
a=&c
- birinchi parametr qiymatini jo‘natish
Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr
229
b=&d
- ikkinchi parametr qiymatini jo‘natish
temp=*a
*a=*b
*b=temp
O‘rnatish funksiyasini S tilida shunday modifikatsiyalaymizki, u ko‘rsatkichlar
bilan parametrlar kabi ishlasin. Bu esa ssыlka bo‘yicha parametrlarni yuborish
effektiga erishishga imkon beradi.
void swap2 (int*a, int*b)
{
Int temp =*a;
*a=*b;
*b=temp;
}
swap2 funksiyasini quyidagi ko‘rinishda chaqirish mumkin:
Swap2(&c, &d);
swap2 funksiyasining amalini quyidagi psevdokod orqali tavsiflash mumkin:
a=&c - birinchi parametr manzilini jo‘natish
b=&d - ikkinchi parametr manzilini jo‘natish
temp=*a
*a=*b
*b=temp
Bu holda, to‘xtatish amali samarali bo‘ladi: c va d o‘zgaruvchilarning qiymatlari
rostdan ham o‘zaro joy almashadi.
swap2 funksiyasini S++ tilida quyida ko‘rsatilganidek ssыlkalarni parametrlar
kabi qo‘llab yozish mumkin:
Void swap2 (int &a,int&b)
{int temp=a;
a=b;
b=temp;
}
Ushbu oddiy to‘xtatish amali Java tilida mumkin emas, chunki u yerda na
ko‘rsatkichlar va na S++ tilidagi ssыlkalarga muvofiq bo‘lgan ssыlkalar mavjud. Java
tilida ssыlka skalyar kattalikka emas, balki faqat ob’ektgagina yo‘naltirilishi mumkin.
Pascal tilida swap2 funksiyasini quyidagicha yozish mumkin:
Procedure swap2 (var a, b:integer)
Temp : integer;
Begin
Temp:=a;
Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr
230
a:=b;
b:=temp;
end;
Aytaylik, swap2 amali Pascal tilida quyidagicha chaqirilsin:
swap2 (1, list[1]);
Bu holda, uning amallarini quyidagicha yozish mumkin:
a=&i - birinchi parametr manzilini jo‘natish
b=&list[i] - ikkinchi parametr manzilini jo‘natish
temp=*a
*a=*b
*b=temp
Nomi o‘zgartirilgan *a (i o‘zgaruvchisi qiymatiga teng) ssыlkasining qiymati
nomi o‘zgartirilgan *b (list[i] qiymatiga teng) ssыlkasining qiymati o‘zgargunigacha
o‘zgarib bo‘lganiga qaramay, bu to‘xtatishning to‘g‘riligiga hech qanday ta’sir
ko‘rsatmaydi, chunki list[i] o‘zgaruvchisi qiymati chaqirish paytida hisoblanadi va
bundan keyin i o‘zgaruvchisiga nima bo‘lmasin, o‘zgarmas bo‘lib qoladi.
Parametrlarni qiymat bo‘yicha yuborish semantikasi ssыlka bo‘yicha yuborish
semantikasi bilan ismlar aralashmasi yuz bermagan holdagina bir xildir. Eslatib
o‘taylik, Ada tilida kiritishchiqarish rejimida qiymatlar va natijalar bo‘yicha yuborish
skalyar parametrlarni yuborishda qo‘llaniladi. Parametrlarni qiymatlar va natijalar
bo‘yicha yuborishni o‘rganib chiqish uchun, keyingi swap3 funksiyasini ko‘rib
chiqamiz, bunda ushbu metod qo‘llaniladi. U Ada tiliga yaqin bo‘lgan sintaksis
yordamida yozilgan.
procedure swap3 (a: in out integer, b : in out integer) is
temp : integer;
begin
temp := a;
a:= b;
b:= temp;
end swap3;
Aytaylik, swap3 protsedurasi quyidagicha chaqirilsin:
swap3(c,d);
Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr
231
swap3 funksiyasi amallarini ushbu chaqiruvda quyidagicha yozish mumkin:
addr_c = &c - birinchi parametr manzilini jo‘natish
addr_d = &d
- ikkinchi parametr manzilini jo‘natish
a = *addr_c - birinchi parametr qiymatini jo‘natish
c = *addr_d - ikkinchi parametr qiymatini jo‘natish
temp = a
a = b
c = temp
*addr_c = a - birinchi parametr qiymatini qaytraish
*addr_d = b - ikkinchi parametr manzilini jo‘natish
Shunday qilib, ushbu to‘xtatish quyi dasturi to‘g‘ri ishlayapti. Endi quyidagi
chaqiruvni ko‘rib chiqamiz:
swap3(i, list[i]);
Bu holda swap3 protsedurasi amallarini quyidagi ko‘rinishda yozish mumkin:
addr_i = &i birinchi parametr manzilini jo‘natish
addr_listi = &list[i] - ikkinchi parametr manzilini jo‘natish
a = *addr_i - birinchi parametr qiymatini jo‘natish
b = *addr_listi
- ikkinchi parametr qiymatini jo‘natish
temp = a
a = b
b = temp
*addr_i = a - birinchi parametr qiymatini qaytarish
*addr_listi = b - ikkinchi parametr qiymatini qaytarish
Bu holda quyi dastur yana to‘g‘ri ishlayapti, chunki parametrlarning
qaytariluvchi qiymatlari yoziluvchi katakcha manzillari quyi tizimdan qaytarish
vaqtida emas, balki chaqirish vaqtida hisoblanadi. Agar faktli parametrlar manzillari
quyi tizimdan qaytarilish vaqtida hisoblanganida edi, natijalar noto‘g‘ri bo‘lgan bo‘lar
edi.
Ismlarni aralashtirib yuborishda nima yuz berishini ko‘rib chiqaylik. Bunda
parametrlar qiymatlar va natijalar orqali jo‘natiladi. S tiliga yaqin bo‘lgan sintaksis
yordamida yozilgan skelet dasturn ko‘rib chiqamiz:
int i =3; /* i- dunyoviy o‘zgaruvchi */
void fun (int a, int b) {
Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr
232
i=b;
}
void main() {
int list[10];
list[i]=5;
fun (i, list[i]);
}
fun funksiyasida ssыlka bo‘ylab parametrlarni jo‘natish amalga oshiriladi,
bunda i va a o‘zgaruvchilari alternativ nomlar bo‘ladi. Agar parametrlar qiymat va
natijalar bo‘ylab yuborilsa, i va a o‘zgaruvchilari alternativ nomlar bo‘lmaydi. Bu
holda fun funksiya amallari quyidagicha:
addr_i = &i - birinchi parametr manzilini jo‘natish
addr_listi = &list[i] - ikkinchi parametr manzilini jo‘natish
a = *addr_i
- birinchi parametr qiymatini jo‘natish
b = *addr_listi
- ikkinchi parametr qiymatini jo‘natish
i = b
- i ni 5 ga tenglash
*addr_i = a
- birinchi parametr qiymatini qaytarib olish
*addt_listi = b
- ikkinchi parametr qiymatini qaytarib olish
Bu holda, fun quyi dasturida i global o‘zgaruvchisini qabul qilish natijasida
uning qiymati 2dan 3ga o‘zgaradi, orqaga esa 3 qiymatni saqlovchi birinchi rasmiy
parametr nusxasi qaytariladi. Bu yerda ssыlka bo‘ylab xabar jo‘natish amalga
oshirilsa, nusxa qaytarish parametrlarni jo‘natish semantikasi bo‘limi bo‘lmasligini
yodda tutish lozim. Shuning uchun i o‘zgaruvchisi 5 ga tengiligicha qoladi. Ikkinchi
parametr manzili fun funksiyasi bajarilishidan oldin hisoblangani uchun, global i
o‘zgaruvchisidagi o‘zgarishlar uning manziliga ta’sir ko‘rsatmaydi. Ushbu manzil list[i]
o‘zgaruvchisining qiymati qaytarilganida chiqishda qo‘llaniladi.
|