1 Bob. C++ dasturlash tilining zamonaviy dasturlash tili sifatida C++ dasturlash tilining ishchi muhiti


Download 0.81 Mb.
bet27/28
Sana21.01.2023
Hajmi0.81 Mb.
#1106185
1   ...   20   21   22   23   24   25   26   27   28
Bog'liq
C

Ekranda:
1 5
2 7
3 8
4 9
5 3
6 44
7 -33
8 0
Yuqorida faylini dasturimizga kiritdik. Bu e'lon faylida standart kirish/chiqish oqimlari bilan ishlaydigan buyruqlar berilgan. Dasturimizda qo'llanilgan setw() manipulyatori chiqish oqimiga berilayatgan ma'lumotlarning eng kichik kengligini belgilaydi, biz setw() parametrini 4 deb berdik, demak c[] massivi elementlari 4 harf kenglikda ekranga bosiladilar. Agar kenglik kamlik qilsa, u kattalashtiriladi, agar bo'sh joy qolsa, elementlar chapga yondashilib yoziladi. Biz va manipulyatorlarni keyinroq to'la ko'rib chiqamiz. Misolimizda massiv nomli konstantani qo'lladik. Uning yordamida massiv chegaralarini va for strukturasidagi chegaraviy qiymatlarni berdik. Bunday o'zgarmasni qo'llash dasturda hatoga yo'l qo'yishni kamaytiradi. Massiv chegarasi o'zgarganda, dasturning faqat bir joyiga o'zgarish kiritiladi. Massiv hajmi e'lonida faqat const sifatli o'zgaruvchilar qo'llanilishi mumkin. Massivlar bilan ishlaganda eng ko'p yo'l qoyiladigan hato bu massivga 0 dan kichkina va (n-1) dan (n: massivdagi elementlar soni) katta indeks bilan murojaat qilishdir. Bunday hato dastur mantig'i hatosiga olib keladi. Kompilyator bu turdagi hatolarni tekshirmaydi. Keyinroq o'zimiza yozgan massiv klaslarida ushbu hatoni tekshiriladigan qilishimiz mumkin. 10 ta sonning tushish ehtimilini ko'rsaturvchi dastur yozaylik.
// Ehtimollar va massivlar
# include
# include
# include
# include
int main ()
{
const int massivHajmi = 10;
int m[massivHajmi] = {0}; // hamma 10 ta element
// 0 ga tenglashtirildi
srand( time(NULL) );
for(int i = 0; i < 1000; i++) {
++m[ rand() % 10 ];
}
for(int j = 0; j < massivHajmi; j++) {
cout << j << setw(4) << m[j] << endl;
}
return (0);
}
Ekranda:
0 96
1 89
2 111
3 97
4 107
5 91
6 100
7 118
8 99
9 92
Ko'rib turganimizdek, sonlarning tushish ehtimoli nisbatan tengdir. Albatta, bu qiymatlar dasturning har yangi ishlashida o'zgaradi.
++m[ rand() % 10 ];
Yozuvi bilan biz massivning rand() % 10 indeksli elementini birga oshirmoqdamiz. Bunda rand () % 10 ifodasidan chiqadigan qiymatlar [0;9] ichida yotadi.
Satrlar, yani harflar ketma-ketligi ("Toshkent", "Yangi yilingiz bilan!"...) C/C++ da char tipidagi massivlar yordamida beriladi. Bunday satrlar bilan islovlar juda tez bajariladi. Chunki ortiqcha tekshirishlar bajarilmaydi. Bundan tashqari C++ da ancha rivojlangan String klasi mavjuddir, u oddiy char bilan berilgan satrlardan ko'ra qulayroqdir. Lekin ushbu klas ko'proq joy egallaydi va massivli satrlardan ko'ra sekinroq ishlaydi. String klasini keyingi qismlarda o'tamiz. Qolaversa, satrlar bilan ishlash uchun biz o'zimiz klas yoki struktura yozishimiz mumkin. C dan meros bo'lib qolgan satrlar ustida amallar bajarish uchun biz dasturimizga (yangi ismi ) e'lon faylini kiritishimiz kerak. Ushbu e'lon faylida berilgan funksiyalar bilan keyingi bo'limda ishlaymiz. Harflar, yani literalar, aytib o'tganimizdek, C++ da char tipi orqali beriladi. Literalar apostroflarga ('S', '*' ...) olinadi. Satrlar esa qo'shtirnoqlarga olinadi. Satrlar e'loniga misol beraylik.
char string[] = "Malibu";
char *p = "Ikkinchi!?!";
Satrlarni yuqoridagi ikkita yo'l bilan initsalizatsiya qilsa bo'ladi. Satrlar ikkinchi uslubda e'lon qilinganda, yani pointer mehanizmi qo'llanilganda, ba'zi bir kompilyatorlar satrlarni hotiraning konstantalar saqlanadigan qismiga qo'yadi. Yani ushbu satrlarga o'zgartirish kiritilishi ta'qiqlanadi. Shu sababli satrlarni hardoim o'zgartirish imkoni bo'lishi uchun ularni char tipidagi massivlar ko'rinishida e'lon qilish afzaldir. Satrlar massiv yordamida berilganda, ularning uzunligi noma'lumdir. Shu sababli satrning tugaganligini bildirish uchun satr ohiriga mahsus belgi nol literasi qo'yiladi. Uning dastursa belgilanishi '\0' ko'rinishga ega. Demak, yuqorida berilgan "Malibu" satriga ohiriga '\0' belgisi qo'shiladi, yani massivning umumiy uzunligi "Malibu":6 + '\0':1 = 7 ta char tipidagi elementga teng bo'ladi. Satrlarni massiv initsalizatsiya ro'yhati ko'rinishida ham bersak bo'ladi:
char c[6] = {'A', 'B', 'C', 'D', 'E' , '\0'};
...
cout << c;
...
Ekranda:
ABCDE 
Biz cout bilan c ning qiymati ekranga bosib chiqardik. Aynan shunday klaviaturadan ham o'qib olishimiz mumkin:
char string[80];
cin >> string;
Eng muhimi satr bilan '\0' belgisi uchun yetarli joy bo'lishi kerak. Satrlar massiv yordamida berilganligi uchun, alohida elementlarga indeks orqali yetishish mumkin, masalan:
char k[] = "Bahor keldi, gullar ochildi.";
for (int i = 0; k[i] != '\0'; i++)
if ( (i mod 2) == 0 ) // juft sonlar uchun haqiqat bo'ladi
cout << k[i] << " ";
Ekranda:
B h r k l i u l r o h l i
Yuqoridagi misolda, sikl tugashi uchun k[i] element '\0' belgiga teng bo'lishi kerak.
Ko’p o’lchovli massivlar asosiy tushunchalar
C++ da massiv deganda ko’rsatkichni tushunish mumkin. Ko’rsatkich esa ixtiyoriy turda bo’lishi mumkin, ya’ni massiv ixtiyoriy turdagi elementlardan tashkil topishi mumkin, jumladan, massivdan iborat ko’rsatkich bo’lishi ham mumkin. Boshqa massivlardan tashkil topgan massivlar ko’po’lchovli deyiladi. Bunday massivlarni e’lon qilganda kompyuter xotirasida bir nechta har xil ob’ektlar hosil qilinadi. Masalan, Ikki o’lchovli int arr[4][3] massivini e’lon qilish bajarilganda xotirada arr o’zgaruvchining qiymatlarini saqlash uchun joy ajratiladi, ularning har biri esa to’rtta ko’rsatkichdan iborat massivning ko’rsatkichi bo’ladi. To’rtta ko’rsatkichdan iborat bu massiv uchun ham xotira ajratiladi. To’rtta ko’rsatkich ning har biri int turidagi uchta elementdan iborat massivning manzilidan (adres) tashkil topadi. Demak, kompyuter xotirasida int turidagi to’rtta massivni saqlash uchun to’rtta bo’lak ajratiladi. Ularning har biri esa uchta elementdan tashkil topadi. Bunday xotira ajratish quyidagi sxemada ko’rsatilgan:

Arr



























arr[0]



arr[0][0]

arr[0][1]

arr[0][2]

arr[1]



arr[1][0]

arr[1][1]

arr[1][2]

arr[2]



arr[2][0]

arr[2][1]

arr[2][2]

arr[3]



arr[3][0]

arr[3][1]

arr[3][2]

Shunday qilib, arr[4][3] e’lon qilish dasturda uchta har xil ob’ektni hosil qiladi: arr identifikatorli ko’rsatkich, to’rtta ko’rsatkichdan iborat nomsiz massiv va int turidagi 12 ta sondan iborat nomsiz massiv. Nomsiz massivlarga murojat qilish uchun arr ko’rsatkichli manzil ifodalari ishlatiladi. Ko’rsatkichlar massivining elementlariga murojat qilish arr[2] yoki *(arr+2) shaklida bitta indeks ifodasini ko’rsatish bilan amalga oshiriladi. Int turidagi ikki o’lchovli sonlar massiviga murojat qilish uchun arr[1][2] yoki unga ekvivalent *(*(arr+1)+2) va (*(arr+1))[2] ko’rinishidagi ikkita indeksli ifoda ishlatilishi zarur. Shuni nazarda tutish kerakki, C tilining sintaksisi nuqtai nazaridan arr ko’rsatkich va arr[0], arr[1], arr[2], arr[3] ko’rsatkichlar o’zgarmas (konstanta) hisoblanadi va ularni dasturning bajarilish paytida o’zgartirish mumkin emas.


Uch o’lchovli massivlarni joylashtirish ham shu kabi amalga oshiriladi. float arr3[3][4][5] e’lon qilishi float turidagi o’n oltita sondan iborat uch o’lchovli massivning o’zidan tashqari float turidagi to’rtta ko’rsatkichdan iborat massivni, float ga ko’rsatuvchi ko’rsatkichlar massivini ko’rsatuvchi uchta ko’rsatkichlar massividan va float ga ko’rsatkichlar massivining massiviga ko’rsatkich.
Ko’p o’lchovli massiv elementlarini o’rnatganda ular xotirada qator bo’yicha ketma-ket joylashadi, ya’ni oxirgi indeksi barchasidan tezroq o’zgaradi, birinchisi esa sekin o’zgaradi. Bunday tartib ko’p o’lchovli massivning ixtiyoriy elementiga uning birinchi elementi manzilidan va faqat bitta indeksli ifodadan foydalanib murojat qilish imkonini beradi.
Masalan, arr[1][2] elementga int *ptr2=arr[0] shaklidagi ptr2 ko’rsatkich yordamida ptr2[1*4+2] (bu erda 1 va 2 ishlatilayotgan element indekslari, 4 esa qatordagi elementlar soni) murojat kabi yoki ptr2[6] kabi amalga oshirish mumkin. E’tibor berish lozimki, tashqaridan qaraganda arr[6] ko’rinishdagi murojatni bajarish mumkin emasdek tuyuladi, chunki 6 indeksli ko’rsatkich mavjud emas. Uch o’lchovli massivning arr3[2][3][4] elementiga murojat qilish uchun, ptr3[3*2+4*3+4] yoki ptr3[22] ko’rinishidagi bitta indeksli ifoda yordamida float *ptr3=arr3[0][0] ko’rinishida e’lon qilingan ko’rsatkichdan foydalanish mumkin.



Download 0.81 Mb.

Do'stlaringiz bilan baham:
1   ...   20   21   22   23   24   25   26   27   28




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling