|
Referat axborot tizimlari va texnologiyalari Algoritmlash va dasturlash asoslari
|
bet | 2/5 | Sana | 22.11.2023 | Hajmi | 171,85 Kb. | | #103416 | Turi | Referat |
Bog'liq azizbek algaritimlashKo‘rsatkichlar. Ko‘rsatkich - xotira uyasining unikal adresini saqlaydigan o‘zgaruvchi. Ko‘rsatkich operativ xotiradagi biron-bir o‘zgaruvchi mavjud bo‘lishi mumkin bo‘lgan biron-bir joyni belgilaydi. Ko‘rsatkichlarning qiymatlarini o‘zgartirish, turli variantlarda qo‘llash mumkin, bu dasturning moslashuvchanligini oshiradi.
Ko‘rsatkich odatda tipga ega bo‘lib quyidagicha e’lon qilinadi:
*=
Misol uchun:
int *pr;
char *alfa;
Bu holda ko‘rsatkichlar noaniq qiymatga ega bo‘ladi. Ko‘rsatkichlar ta’riflanganda ularning tiplari ko‘rsatilishi shart. Ko‘rsatkichlarni initsializatsiya kilish ya’ni boshlang‘ich qiymatlarini kiritish mumkin. Ma’lum turdagi biron-bir o‘zgaruvchi adresi yoki NULL qiymat dastlabki qiymat bo‘lishi mumkin. Ko‘rsatkichlarga boshlang‘ich maxsus NULL qiymati berilsa bunday ko‘rsatkich bo‘sh ko‘rsatkich deb ataladi.
Biron-bir o‘zgaruvchi adresini olish hamda uni ko‘rsatkichga qiymat sifatida berish uchun «&» operatori qo‘llanadi.
Misol:
int I=100;
int*p=&I;
unsigned longint *ul=NULL;
Teskari operator - «*» bo‘lib, ko‘rsatkichda saqlanayotgan adres bo‘yicha uya qiymatiga murojaat qilish imkonini beradi.
Misol:
int I=100;
int*p=&I
int J=*p;
Ilova tushunchasi. Ilova (ssыlka) – ilova ta’rifirda ko‘rsatilgan ob’ekt nomining sinonimi.
Ilovani e’lon qilish shakli
tur & ism =ism_ob’ekt;
Misollar:
int x; // o‘zgaruvchining aniqlash
int& sx=x; //x o‘zgaruvchiga iqtibosni aniqlash
const char & CR='\n'; //konstantaga iqtibosni aniqlash
Ilovalar bilan ishlash qoidalari.
1) O‘zgaruvchi ilova, agar u funksiya parametri bo‘lmasa, extern sifatida tavsiflanmagan bo‘lsa yoki sinf maydoniga ilova qilmasa , o‘ziga tavsif berilayotganda ochiq-oydin nomlanishi kerak.
2) Nomlangandan so‘ng, ilovaga boshqa qiymat berilishi mumkin emas.
3) Ilovalarga ko‘rsatkichlar, ilovalar massivlari va ilovalarga ilovalar bo‘lishi mumkin emas.
4) Ilova ustida o‘tkazilgan operatsiya o‘zi ilova qilayotgan qiymatning o‘zgarishiga olib keladi
Ko‘rsatkichlar ustida o‘tkaziladigan operatsiyalar. Ko‘rsatkichlar ustida unar operatsiyalar bajarish mumkin: inkrement va dekrement ++ va -- operatsiyalarini bajarishda, ko‘rsatkich qiymati ko‘rsatkich murojaat qilgan tur uzunligiga ko‘payadi yoki kamayadi.
Misol:
int*ptr, a[10];
ptr=&a[5];
ptr++; */ = a[6]*/ elementining adresiga
ptr--; */ = a[5]*/ elementining adresiga
Qo‘shish va ayirish binar operatsiyalarida ko‘rsatkich va int turining qiymati ishtirok etishi mumkin. Bu operatsiya natijasida ko‘rsatkich qiymati dastlabkisidan ko‘rsatilgan elementlar soniga ko‘proq yoki kamroq bo‘ladi.
Misol:
int*ptr1, *ptr2, a[10];
int i=2;
ptr1=a+(i+4); /* = a[6]*/ elementining adresiga
ptr2=ptr1-i; /* = a[4]*/ elementining adresiga
Ayirish operatsiyasida bitta turga mansub bo‘lgan ikkita ko‘rsatkich ishtirok etishi mumkin. Operatsiya natijasi int turiga ega hamda kamayuvchi va ayiruvchi o‘rtasidagi dastlabki tur elementlarining soniga teng, bundan tashqari agar birinchi adres kichikroq bo‘lsa, u holda natija manfiy qiymatga ega bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
int i;
ptr1=a+4;
ptr2=a+9;
i=ptr1-ptr2; /*=5 */
i=ptr1-ptr2; /*=-5 */
Bir turga taalluqli bo‘lgan ikkita ko‘rsatkich qiymatlarini ==, !=, <, <=, >, >= amallari yordamida o‘zaro qiyoslash mumkin. Bunda ko‘rsatkichlarning qiymatlari shunchaki butun sonlar sifatida olib qaraladi, qiyoslash natijasi esa 0 (yolg‘on) yoki 1 (rost) ga teng bo‘ladi.
Misol:
int *ptr1, *ptr2, a[10];
ptr1=a+5;
ptr2=a+7;
if(ptr1>ptr2) a[3]=4;
Bu misolda ptr1 ning qiymati ptr2 ning qiymatidan kamroq, shuning uchun a[3]=4 operatori bajarilmay qoladi.
Konstanta ko‘rsatkich va konstantaga ko‘rsatkichlar. Konstanta ko‘rsatkich quyidagicha ta’riflanadi:
* const=
Misol uchun: char* const key_byte=(char*)0x0417.
Bu misolda konstanta ko‘rsatkich klaviatura xolatini ko‘rsatuvchi bayt bilan boglangandir.
Konstanta ko‘rsatkich qiymatini o‘zgartirish mumkin emas lekin * amali yordamida xotiradagi ma’lumot qiymatini o‘zgartirish mumkin. Misol uchun *key_byte=’YO’ amali 1047(0x0417) adres qiymati bilan birga klaviatura xolatini ham o‘zgartiradi.
Konstantaga ko‘rsatkich quyidagicha ta’riflanadi:
const*=.
Misol uchun const int zero=0; int const* p=&zero;
Bu ko‘rsatkichga * amalini qo‘llash mumkin emas, lekin ko‘rsatkichning qiymatini o‘zgartirish mumkin. Qiymati o‘zgarmaydigan konstantaga ko‘rsatkichlar quyidagicha kiritiladi:
const* const=.
Misol uchun
const float pi=3.141593; float const* const pp=π
Turlashtirilmagan ko‘rsatkich. Turlashtirilmagan (tipiklashtirilmagan) ko‘rsatkich void turga ega bo‘lib, ixtiyoriy turdagi o‘zgaruvchi adresi qiymat sifatida berilishi mumkin.
Maxsus void tipidagi ko‘rsatkichlar ajdodiy ko‘rsatkichlar deb atalib har xil tipdagi ob’ektlar bilan bog‘lanish uchun ishlatiladi.
Misol uchun:
int I=77;
float Euler=2.18282;
void *vp;
Vp=&I;
cout<< (*(int*)vp;
Vp=&Euler;
cout<< (*(float*)vp;
Quyidagi operatorlar ketma ketligi xatolikka olib keladi:
void *vp;int *ip; ip=vp;
Bu xatolik sababi bitta ob’ektga har xil tipdagi ko‘rsatkichlar bilan murojaat kilish mumkin emas.
Ko‘rsatkchlar funksiya parametri sifatida. Ko‘rsatkichlar yordamida parametr qiymatini o‘zgartirish mumkin.
Misol uchun turtburchak yuzi va perimetrini berilgan tomonlari bo‘yicha hisoblash funksiyasini quyidagicha tasvirlash mumkin.
void pr(float a,float b, float* s, float* p)
{
*p=2(a+b);
*s= a*b;
}
Bu funksiyaga quyidagicha murojaat kilinishi mumkin pr(a,b,&p,&s). Funksiyaga p va s o‘zgaruvchilarning adreslari uzatiladi. Funksiya tanasida shu adreslar bo‘yicha 2*(a+b) va a*b qiymatlar yoziladi.
Ko‘rsatkichlar o‘rniga ilovalardan foydalanish dasturning o‘qilishini yaxshilaydi, chunki bu o‘rinda adres bo‘yicha qiymat olish operatsiyasini qo‘llamasa ham bo‘ladi. Qiymat bo‘yicha uzatish o‘rniga ilovalardan foydalanish samaraliroq hamdir, chunki parametrlarni nusxalashni talab qilmaydi. Agar funksiya ichida parametrning o‘zgarishini taqiqlash lozim bo‘lib qolsa, bu holda const modifikatori qo‘llanadi. Bu modifikatorni funksiyada o‘zgarishi ko‘zda tutilmagan barcha parametrlar oldidan qo‘yish tafsiya qilinadi (undagi qaysi parametrlar o‘zgaradiyu, qaysilari o‘zgarmasligi sarlavhadan ko‘rinib turadi).
Ko‘rsatkich va massiv nomi. Massivlar nomi dasturda konstanta ko‘rsatkichdir. SHuning uchun ham int z[4] massiv elementiga *(z+4) shaklda murojaat kilish mumkin.
Massivlar bilan ishlanganda kavslarsiz ishlash mumkin.
Massivlarni funksiyalar parametrlari sifatida. Massivlar funksiyaga turidagi bir o‘lchamli massivlar sifatida yoki ko‘rsatkichlar sifatida uzatilishi mumkin. Masalan satrlar funksiyaga char turidagi bir o‘lchamli massivlar sifatida yoki char* turidagi ko‘rsatkichlar sifatida uzatilishi mumkin. Oddiy massivlardan farqli o‘laroq, funksiyada satr uzunligi ko‘rsatilmaydi, chunki satr oxirida satr oxiri \0 belgisi bor.
Misol: Berilgan belgini satrda qidirish funksiyasi
int find(char *s,char c)
{
for (int i=0;i
if(s[i]==c) return i;
return –1
}
Massiv funksiya qiymati sifatida. Massiv qiymat qaytaruvchi funksiya ta’rifi:
float *sum_vec(int n,float a,float b)
{
float d[n];
for(int i=0;i
return d;
}
|
| |