Adres
  
Qiymatlar - 21-mavzu: Dasturlash tilining asosiy konstruktsiyalari, ulardan foydalanish xususiyatlari reja

|
21-mavzu: Dasturlash tilining asosiy konstruktsiyalari, ulardan foydalanish xususiyatlari reja
|
bet | 2/5 | Sana | 16.01.2024 | Hajmi | 198,97 Kb. | | #138801 |
Bog'liq 21- lectures Basic prog MassivAdres
|
Qiymatlar
|
a
|
a[0]
|
a[1]
|
a[2]
|
a[3]
|
a[4]
|
a[5]
|
|
|
|
|
|
|
26.1-jadval. Bir o’lchovli massivning xotiradagi joylashuvi.
Massivning i-elementiga a[i] yoki *(a+i) – vositali murojaat qilish mumkin. Massiv uzunligi sizeof(a) amali orqali aniqlanadi.
Massiv e’lonida uning elementlariga boshlanьich qiymatlar berish (initsializatsiyalash) mumkin va uning bir nechta variantlari mavjud.
1) O’lchami ko’rsatilgan massiv elementlarini to’liq initsializatsiyalash:
int b[5]={8,5,-11,41,39};
Bunda 5 ta elementdan iborat bo’lgan b nomli bir o’lchovli massiv e’lon qilingan va uning barcha elementlariga boshlanьich qiymatlar berilgan. Bu e’lon quyidagi e’lon bilan ekvivalent:
int b[5];
b[0]=8; b[1]=5; b[2]=-11; b[3]=41; b[4]=39;
2) O’lchami ko’rsatilgan massiv elementlarini to’liqmas initsializatsiyalash:
int b[5]={-11,5,29};
Bu erda faqat massiv boshidagi uchta elementga boshlanьich qiymatlar berilgan. Shuni aytib o’tish kerakki, massivni initsializatsiyalashda uning boshidagi ementlariga boshlanьich qiymatlar bermasdan turib, oxiridagi elementlariga boshlanьich qiymatlar berish mumkin emas. Agarda massiv elementlariga boshlanьich qiymat berilmasa, unda kelishuv bo’yicha static va extern modifikatori bilan e’lon qilingan massiv uchun elementlarning boshlanьich qiymati 0(nol) soniga teng bo’ladi. Automatik massiv elementlarining boshlanьich qiymatlari esa noma’lum hisoblanadi.
3) O’lchami ko’rsatilmagan massiv elementlarini to’liq initsializatsiyalash:
int d[]={-15,7,15,24};
Bu misolda massivning barcha elementlariga qiymatlar berilgan hisoblanadi, massiv uzunligi esa kompilyator tomonidan boshlanьich qiymatlar soniga qarab aniqlanadi.
Shuni ta’kidlash kerakki, massivning uzunligi berilmasa, unga boshlanьich qiymatlar berilishi shart.
Bir o’lchovli statik massivlarni e’lon qilish:
char s[5]={’d’,‘a’,‘b’,’c’,’e’}; //belgilar massivi
int n[5] ={1,26,34,14}; // butun sonlar massivi
char str[]=”defa”; /*satr uzunligi 5 ga teng, chunki, uning oxiriga ‘\0’ belgisi qo’shiladi.*/
char str[]={‘d’,‘e’,‘f’,’a’}; /*yuqoridagi satrning boshqacha yozilishi.*/
Statik massivlarning kamchiliklari shundaki, ularning o’lchami oldindan ma’lum bo’lishi kerak, bundan tashqari bu o’lcham berilganlarga ajratilgan xotira segmentining o’lchami bilan chegaralangan. Ikkinchi tomondan, etarlicha katta o’lchamdagi massiv e’lon qilib, masala echilishida ajratilgan xotira to’liq ishlatilmasligi mumkin. Bu kamchiliklar dinamik massivlardan foydalanish orqali bartaraf etiladi, chunki ular dastur ishlashi jarayonida kerakli o’lchamdagi massivlarni yaratish va ularga zarurat qolmaganda yo’qotish imkoniyatini beradi.
Dinamik massivlarga xotiradan joy ajratish uchun malloc(), calloc() funksiyalaridan yoki new operatoridan foydalaniladi. Dinamik massivga ajratilgan xotirani bo’shatish uchun free() funksiyasi yoki delete operatori ishlatiladi.
Yuqorida qayd qilingan funksiyalar alloc.h kutubxonasida joylashgan.
malloc() funksiyasining sintaksisi
void * malloc(size_t ulcham) ;
ko’rinishida bo’lib, u xotiraning uyum qismidan ‘ulcham’ bayt o’lchamidagi uzluksiz sohani ajratadi. Agar xotira ajratish muvaffaqiyatli bo’lsa, malloc() funksiyasi shu soha boshlanishining adresini qaytaradi. Talab qilingan xotirani ajratish muvaffaqiyatsiz bo’lsa, funksiya NULL qiymatini qaytaradi.
Sintaksisdan ko’rinib turibdiki, funksiya void turidagi qiymat qaytaradi. Amalda esa aniq bir turdagi massiv ob’ekti uchun xotiradan joy ajratish zarur bo’ladi. Shu bois void turini aniq bir turga keltirish texnologiyasidan foydalaniladi. Masalan, butun turdagi uzunligi 3 ga teng massivga joy ajratishni quyidagicha amalga oshirish mumkin:
int * d_mas=(int*)malloc(3*sizeof(int));
malloc() funksiyasidan farqli ravishda calloc() funksiyasi massiv uchun joy ajratishdan tashqari massiv elementlarini 0(nol) qiymati bilan initsializatsiyalaydi. Bu funksiya sintaksisi quyidagi:
void * calloc (size_t miqdor, size_t ulcham) ;
ko’rinishda bo’lib, ‘miqdor’ parametri ajratilgan sohada nechta element borligini, ‘ulcham’ esa element o’lchamini bildiradi.
free() dinamik xotirani bo’shatish funksiyasi bo’lib, ko’rsatilgan dinamik massiv egallab turgan xotira qismini bo’shatadi:
void free (void * blok);
free() funksiyasi parametrining void turida bo’lishi, ixtiyoriy turdagi xotira bo’lagini o’chirish imkonini beradi.
Quyidagi dasturda 10 ta elementga ega dinamik massivni yaratish, unga dastlabki 10 ta toq sonni qiymatlash va massiv elementlari qiymatini chop etish hamda shu massivni xotiradan o’chirish jarayonlari amalga oshirilgan.
#include
#include
int main()
{
int * d_mas;
if ((d_mas=(int*)malloc(10*sizeof(int)))==NULL)
{
cout<<”Xotira etarli emas!!!”;
return 1;
}
// ajratilgan xotira sohasini to’ldirish
for(int i=0; i<10; i++) * (d_mas+i)=2*i+1;
// dinamik massiv elementlarini chop etish
for(int i=0; i<10; i++) cout<<*(d_mas+i)<<”end1”;
// ajratilgan xotira qismini bo’shatish
free (d_mas);
return 0;
}
Endi new va delete operatorlari bilan tanishamiz. new operatori yordamida massivga xotiradan joy ajratish uchun massiv turidan keyin kvadrat qavs ichida massiv elementlari soni ko’rsatiladi. Masalan, butun turdagi 10 ta sondan iborat massivga joy ajratish quyidagi
d_mas=new int[10];
ko’rinishda bo’ladi. Bu usulda massivga ajratilgan xotirani bo’shatish uchun
delete [] d_mas;
buyruьini berish kerak bo’ladi.
Massivlar bilan ishlashda quyidagilarni hisobga olish zarur:
- massiv elementlariga qiymat kiritish siklllar yordamida amalga oshirilishi maqsadga muvofiq;
- statik massivlar bilan ishlashda kiritiladigan ma'lumotlar soni, massiv elementlari sonidan oshmasligi kerak;
- massiv elementlaridagi barcha ma'lumotlarni chiqarish uchun ham siklllardan foydalanish maqsadga muvofiq;
Quyida keltiriladigan masalada bu tasdiqlar o’z aksini topgan. Shuni alohida ta'kidlash lozimki, for takrorlanish operatorini algoritmda tasvirlash uchun qo’llanmada ikki xil shakldan foydalanilgan, chunki C++ tilida for operatori murakkab konstruksiyali bo’lib, uning parametrlariga tur nuqtai-nazaridan cheklovlar qoýilmaydi.
Qo’llanmaning 3-bobida takrorlanish operatorini tasvirlash uchun «romb» shaklidan foydalanilgan. Quyida keltirilgan masalaning algoritmida esa takrorlanish operatorini tasvirlash uchun «oltiburchak» shaklidan foydalanilgan. Chunki bu masalada barcha takrorlanish qadamlari 1 ga teng.
Yuqoridagilardan xulosa qiladigan bo’lsak, takrorlanishlar qadami 1 ga teng bo’lgan hol uchun algoritmlarni tasvirlashda «oltiburchak» shaklidan, qolgan hollarda esa «romb» shaklidan foydalanish maqsadga muvofiq bo’ladi.
Massiv bir xil turdagi bir nechta o’zgaruvchilarning to’plamidan tashkil topadi (ba’zi adabiyotlarda ular jadvallar deb ham nomlanadi). Nomi a bo’lgan LENGTH elementdan iborat TYPE turidagi massiv quyidagicha e’lon qilinadi:
|
| |