Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr




Download 6,33 Mb.
Pdf ko'rish
bet120/194
Sana20.02.2024
Hajmi6,33 Mb.
#159185
1   ...   116   117   118   119   120   121   122   123   ...   194
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. 

Download 6,33 Mb.
1   ...   116   117   118   119   120   121   122   123   ...   194




Download 6,33 Mb.
Pdf ko'rish

Bosh sahifa
Aloqalar

    Bosh sahifa



Dasturlash tillari va axborot-kommunikatsiya texnologiyalari 1-semestr

Download 6,33 Mb.
Pdf ko'rish