Файл: Ozbekiston respublikasi oliy va orta maxsus talim vazirligi navoiy davlat pedagogika instituti.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 328

Скачиваний: 8

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

So‘z boshi

I BOB. C++ DASTURLASH TILIGA KIRISH Ushbu bobda C ++ tilining asosiy elementlari, ya’ni, alifbosi, o‘zgaruvchilar, o‘zgarmaslar, ma’lumotlar turlari, asosiy amallar, standart funksiyalar, dastur tuzilishi va ma’lumotlarni kiritish hamda chiqarishga oid ma’lumotlar berilgan. 1.1-§. C++ tilining leksik asoslari C++ dasturlash tili 1980-yilning boshida Bjarne Stroustrup tomonidan C dasturlash tiliga asoslangan holda yaratilgan bo`lib, uning kutubxonasida turli funksiyalar mavjud. Ushbu tilni o`rganish ikki qismga bo‘linadi. Birinchi qismda C++ dasturlash tilini o‘rganish, ikkinchisi esa C++ dasturlash tilining standart kutubxonasidagi tayyor obyekt va funksiyalarni qo‘llashni o‘rganishga asoslangan.Dastlab, mazkur mavzuda C++ dasturlash tili imkoniyatlarini Dev-C++ muhitidan foydalanib, misol va masalalarni dasturlashni ko‘rib chiqamiz. Dev-C++ – bu C / C ++ dasturlash tillari asosida dasturiy mahsulotlarni ishlab chiqish muhiti hisoblanadi. Dev-C ++ dasturi Bloodshed Software firmasi xodimi Colin Laplace tomonidan yaratilgan va shundan so‘ng, Windows operatsion tizimiga moslashtirilgan versiyalari ishlab chiqarila boshlagan.Hozirda Embarcadero firmasi tomonidan, Embarcadero Dev-C ++ shaklida ishlab chiqarish davom etmoqda. Embarcadero Dev-C ++ – bu Bloodshed Dev-C ++ dasturlash tilining yangi va takomillashtirilgan versiyalaridan biri hisoblanadi.Bugungi kunda, ushbu tilning ko`plab versiyalari ishlab chiqilgan bo`lib, mazkur mavzuda Dev C++ muhitining 5.11-versiyasi va unda misol va masalalarni dasturlashni ko`rib chiqamiz. Ushbu dasturni ishga tushirish quyidagi ketma-ketlikda amalga oshiriladi: Пуск – Все программы – Bloodshed Dev-C++ – Dev-C++ . So‘ngra, File – New – Source File (Ctrl+N) ketma-ketligi tanlanadi. Shu bilan birga, Windowsning ishchi maydonidagi yorliq orqali ham uni ishga tushirish mumkin. Yuqrida qayd etilgan ketma-ketlik asosida Dev C++ muhitining 5.11- versiyasi ishga tushirilgandan so‘ng, dastur oynasi quyidagicha namoyon bo‘ladi: 1-rasm.Ushbu oynaning Untitled1 maydoniga dastur kodi kiritiladi va F9- tugmasidan foydalanib, dastur kodi kompilyatsiya qilinadi. F11- tugmasi yordamida esa bir vaqtda kompilyatsiya qilinadi va ishga tushirib, natija olinadi. Agar dastur kodida xatolik aniqlansa, xatolik topilgan qator ajratilib ko‘rsatiladi.C++ dasturlash tili alifbosi va xizmatchi so‘zlariTanlab olingan algoritm asosida qo‘yilgan masalani kompyuterda yechish uchun har qanday algoritmik tilning o‘z alifbosi, buyruqlar majmuasi va maxsus dasturlar jamlangan kutubxonasi bo‘lishi zarur. Bu imkoniyatlar C++ dasturlash tilida ham mavjud bo`lib, uning alifbosi quyidagica bo`ladi. 1-jadvalC++ dasturlash tili alifbosi t/r Nomi Ishlatiladigan belgilar 1 Katta va kichik lotin alfaviti xarflari (A,B,..,Z, a,b,…,z) 2 Raqamlar 0,1,2,3,4,5,6,7,8,9 3 Maxsus belgilar “ , {} | [] () + - / % \ ; ‘ . : ? < = > _ ! & * # ^ Keltirilgan jadvaldan tashqari satrlarni o‘zaro ajratish uchun ishlatiladigan belgilar (misol uchun bo‘shliq, tabulyatsiya, yangi qatorga o‘tish belgilari) ham mavjud.Izohlar satrini tavsiflashC++ dasturlash tilida ikki turdagi izohlardan foydalaniladi: 1. Bir satrli. Masalan: // Beriladigan izoh (satr boshida ikkita drop belgisini qo‘yish orqali bir satrli izoh yoziladi);2. Ko‘p satrli. Masalan: /* Beriladigan izoh */ (izoh boshiga /* belgilari, izoh oxirida esa */ belgilari yoziladi).C++ tilida operatorlarC++ dasturlash tilida tuziladigan dastur kodi, kutubxona fayllariga murojaat va bir nechta funksiyalardan iborat bo‘lishi mumkin. Bunda, main nomli asosiy funksiya bo‘lishi zarur. Agar dasturda faqat asosiy funksiyadan foydalanilsa, dastur kodi quyidagicha yoziladi:#includeusing namespace std;int main(){ // dastur tanasi;} 2-rasm.Bunda:1. #include – xizmatchi so‘zi, kutubxona fayliga murojaat qiladi. Foydalanuvchi tomonidan qiymat kiritiladigan yoki ekranga qandaydir ma’lumot chiqariladigan dasturda iostream kutubxona fayli yoziladi. Masalan, kiritish va chiqarish operatoridan foydalanish uchun iostream kutubxona faylidan foydalaniladi;2. using namespace std – standart nomlarni e’lon qilish;3. int main() – asosiy funksiya hisoblanib, misol va masalalarning dastur kodi, ushbu bo‘limga, ya’ni { va } belgilari oralig‘iga kiritiladi;4. { va } – dastur kodi bloki hisoblanadi. Bunga dasturchi tomonidan kiritiladigan buyruqlar bitta operator sifatida qaraladi.Standart funksiyalar va ularning yozilishiC++ dasturlash tilida funksiyalar kutubxona fayllarida mavjud bo‘lib, undan foydalanish uchun #include xizmatchi so‘zi yordamida tegishli kutubxonaga murojaat qilinadi. Masalan, matematik funksiyalar joylashgan kutubxonaga murojaat qilish uchun math.h buyrug‘i yoziladi:#include#includeusing namespace std;int main(){ // dastur tanasi;}Ushbu math.h kutubxonasida quyidagi matematik funksiyalar mavjud:2-jadvalmath.h kutubxonasidagi ba’zi bir funksiyalarning berilishi va vazifalari t/r Berilishi Vazifasi 1 abs(x) Butun qiymatli x ning moduli 2 fabs(x) Haqiqiy qiymatli x ning moduli 3 sin(x) x ning sinusi 4 cos(x) x ning kosinusi 5 tan(x) x ning tangensi 6 atan(x) x ning arktangensi 7 acos(x) x ning arkkosinusi 8 asin(x) x ning arksinusi 9 exp(x) eksponenta, ex 10 log(x) natural logorifm (x>0) 11 log10(x) o‘nli logorifm (x>0) 12 sqrt(x) kvadrat ildiz (x>0) 13 pow(x,a) x ning a-chi darajasi 14 ciel(x) x ni katta butun songacha yaxlitlash 15 floor(x) x ni kichik butun songacha yaxlitlash Ushbu 2-jadvalda keltirilgan funksiyalardan foydalanib, ba’zi bir matematik amallar yozilishini 3-jadvalda ko‘rib chiqamiz.3-jadvalBa’zi bir matematik formulalarning C++ dasturlash tilida yozilishi Matematik formulalar C++ dasturlash tilida yozilishi 1. 1. pow((a+b)*(a+b), 1./5)2. pow(pow(a+b,2), 1./5)3. pow((a+b)*(a+b), (float)1/5)4. pow(pow(a+b,2), (float)1/5) 2. pow(sin(x), n) 3. exp(3*n) 4. exp(6*cos(2*x/a)) 5. pow(cos(sqrt(x+a)),2) 6. 1. log(abs(x-5))2. log(fabs(x-5)) 7. log(2*b)/log(a) 8. log10(b*b+1)/log10(a) 9. 3,4/pow(2,x) 10. pow(tan(pow(x,5)), 1/k) -pow(cos(2*x),2/3) 11. log(2*x)/log(b)-log(x) 12. pow(x,-3)-pow(2,5-x) 13. (2*x-(x-pow(x,6))*pow((x-pow(x,3)),x) /(sin(x)-abs(x-1) Konsol orqali muloqot qilishDev-C++ dasturlash muhitida konsolli rejim yordamida misol va masalalarning natijalarini qulay tartibda olish imkoniyati mavjud. Konsolli rejimda yangi dasturlash oynasini hosil qilish uchun File – New – Source File (Ctrl+N) ketma-ketligi tanlanadi. Hosil qilingan oynada tegishli dastur kodi yozilgandan so‘ng, uni kompyuter xotirasiga saqlash mumkin. Buning ikki xil usuli mavjud: 1. File – Save (Ctrl+S) ketma-ketligi yordamida lozim bo‘lgan disk yoki katalog tanlanadi;2. F9- yoki F11- tugmalari bosilganda hosil qilingan faylni saqlash so‘raladi. Shundan so‘ng, kompilyatsiya amali bajariladi. Natijada *.cpp fayl kengaytma bilan kompyuter xotirasiga saqlanadi. Agar kiritilgan dastur kodi, kompilyatsiyadan muvaffaqiyatli o‘tsa (dastur kodida xatolik bo‘lmasa) *.exe fayl kengaytma bilan tanlangan disk yoki katalogda, joriy fayl sifatida saqlanadi.Chiqarish operatoriDev-C++ dasturlash muhitida ma’lumotlarni ekranga chiqarish uchun iostream kutubxona faylida joylashgan cout<< operatoridan foydalaniladi. Bu yerda “cout” – chiqarish operatori, “<<” – esa chiqarish oqimi hisoblanadi. Misol uchun “2021-yil Yoshlarni qo‘llab-quvvatlash va aholi salomatligini mustahkamlash yili” jumlasini ekranga chiqarish uchun quyidagi dastur kodi yoziladi:#includeusing namespace std;int main(){cout<<"2021-yil Yoshlarni qo‘llab-quvvatlash va aholi salomatligini mustahkamlash yili";} 3-rasm.Ushbu dastur kodi kiritilgandan so‘ng, F11- tugmasi yordamida kompilyatsiya qilinadi. Natijada, quyidagi oyna hosil bo‘ladi: 4-rasm.Yuqorida keltirilgan tartibda bir nechta jumlalarni ham chiqarish mumkin. Buning uchun chiqariladigan ma’lumotlar oralig‘iga << – chiqarish oqimi yoziladi:#includeusing namespace std;int main(){cout<<"Mening birinchi dasturim"<<" Dasturlashni o‘rganaman "<<"Yosh dasturchi";} 5-rasm.Ushbu jumlalarni ustun shaklda chiqarish uchun ma’lumotlar oralig‘iga endl operatori kiritiladi. Ya’ni, quyidagi dastur kodi yoziladi: cout<<"Mening birinchi dasturim"< 6-rasm.Yuqorida keltirilgan tartibda faqat jumlalarni emas, balki hisoblash natijalarini ham chiqarish mumkin.Kiritish operatoriDev-C++ dasturlash muhitida ma’lumotlarni muloqot usulida kiritish uchun iostream kutubxona faylida joylashgan cin>> operatoridan foydalaniladi. Bu yerda “cin” – kiritish operatori, “>>” – esa kiritish oqimi hisoblanadi. Ushbuga oid misollarni keyingi mavzularda ko‘rib chiqamiz.Mustaqil bajarish uchun topshiriqlar1. Dev-C++ dasturlash muhitini kompyuterga o‘rnating.2. Dev-C++ dasturlash muhitini turli usullar bilan ishga tushiring.3. Dev-C++ dasturlash muhitida yangi dasturlash oynasini hosil qiling va uni kompyuter xotirasiga saqlang.4. Quyidagi misollarni hisoblash dasturini tuzing:1) .2) .3) .4) .5) .6) .7) .8) .9) .10) .5. Quyidagi jumlalarni ustun va satr shaklda chiqaruvchi dastur tuzing: “1-sentyabr O‘zbekiston Respublikasining mustaqillik kuni”, “9-may Xotira va qadrlash kuni” , “8-dekabr O‘zbekiston Respublikasining Konstitutsiyasi qabul qilingan kun”.1   2   3   4   5   6   7   8   9   10   11

1.2-§. O‘zgaruvchi va o‘zgarmas tipli kattaliklar

1.3-§. Dasturlash operatorlari

II BOB. BOSHQARUV OPERATORLARI

2.1-§. C++ dasturlash tilida shartli operatorlar

2.2-§. C++ dasturlash tilida takrorlanuvchi jarayonlar

2.3-§. C++ dasturlash tilida funksiyalar

2.4-§. C++ dasturlash tilida massivlar

2.5-§. C++ dasturlash tilida ko‘rsatkichlar

2.6-§. C++ dasturlash tilida satrlar va ular ustida amallar C++ dasturlash tilida ikki xil belgilar majmuasini mujassamlashtirgan. Birinchi toifaga, an’anaviy, ya’ni, tor belgilar deb nomlanuvchi 8 bitli, ikkinchisiga esa 16 bitli belgilar kiradi. Til kutubxonasida har bir guruh belgilari uchun maxsus funksiyalar to‘plami mavjud. Satrni char turidagi belgilar massivi sifatida qarash mumkin va bu belgilar ketma-ketligi nol kodli belgi bilan tugaydi (‘\0’). Odatda, nol bilan tugaydigan satrlarni ASCIIZ – satrlar deyiladi. Shuningdek, C++ dasturlash tilida satrlar bilan ishlashni qulaylashtirish uchun string sinfi kiritilgan. String sinfida satr oxirida ‘\0’ belgi qo‘yish talab etilmaydi.Satrli o‘zgarmas deb – qo‘shtirnoqlar ichiga olingan belgilar ketma-ketligiga aytiladi. Qo‘shtirnoqlar ichidagi belgilar ketma-ketligiga satr deyiladi.Quyida C++ dasturlash tilida belgi sifatida ishlatilishi mumkin bo‘lgan o‘zgarmaslar to‘plami keltirilgan: katta harflar – ‘A’ …’Z’, ‘A’…’Я’; kichik harflar – ‘a’ …’z’, ‘a’…’я’; raqamlar – ‘0’ …’9’; gorizontal bo‘sh joy qoldirish (ASCII kodi 9), satrni o‘tkazish (ASCII kodi 10), vertikal bo‘sh joy qoldirish (ASCII kodi 11), formani o‘tkazish (ASCII kodi 12), navbatdagi satrga o‘tkazish (ASCII kodi 13); punktuatsiya belgilari (ajratuvchilar) ! ” # $ & ‘ ( ) * + - , . / : ; < = > ? @ [ \ ] ^ _ { | }

2.7-§. C++ dasturlash tilida strukturalar va birlashmalar

2.5-§. C++ dasturlash tilida ko‘rsatkichlar


Dastur matnida o‘zgaruvchi e’lon qilinganda, kompilyator unga xotiradan joy ajratadi (dastur kodi xotiraga yuklanganda berilganlar uchun segmentning boshiga nisbatan siljishini aniqlaydi) va obyekt kodini hosil qilishda, ushbu o‘zgaruvchi uchragan joyga uning manzilini joylashtiradi.

Umuman olganda, dastur obyektlarining (o‘zgaruvchilar, funksiyalar) manzillarini xotirani alohida joyida saqlash va ular ustidan amallar bajarish mumkin. Qiymatlari manzili bo‘lgan o‘zgaruvchilarga ko‘rsatkich o‘zgaruvchilar deyiladi.

Ko‘rsatkich uch xil turda bo‘lishi mumkin:

a) birorta obyektga, xususan o‘zgaruvchiga ko‘rsatkich;

b) funksiyaga ko‘rsatkich;

v) void tipiga ko‘rsatgich.

Ko‘rsatkichning bu xususiyatlari, uni qabul qilishi mumkin bo‘lgan qiymatlari bilan farqlanadi.

Ko‘rsatkich albatta birorta turga bog‘langan bo‘lishi kerak, ya’ni u ko‘rsatgan manzilda qandaydir qiymat joylanishi mumkin va bu qiymatning xotirada qancha joy egallashi oldindan ma’lum bo‘lishi shart.

Funksiya ko‘rsatkichida dastur joylashgan xotiradagi funksiya kodining boshlang‘ich manzili ko‘rsatiladi, ya’ni funksiyaga murojaat bo‘lganda (chaqirilganda) boshqarish, ushbu manzilga uzatiladi.

Funksiyaga ko‘rsatkich orqali murojaat qilish, funksiyaga vositali murojaat hisoblanadi. Chunki, funksiyaga, uning nomi bo‘yicha emas, balki ko‘rsatuvchi o‘zgaruvchi orqali amalga oshiriladi. Funksiyani boshqa funksiyaga argument sifatida uzatish ham funksiya ko‘rsatkichi orqali bajariladi.

Funksiyaga ko‘rsatkichning yozilish sintaksisi quyidagicha:

(* ) (
);


Bunda – funksiya qiymat turi; * – ko‘rsatkich o‘zgaruvchining nomi; – funksiya parametrlarining (yoki ularni turlarining) ro‘yxati.

Masalan: int (*xyz)(float, float);

Bu yerda xyz nomidagi funksiyaga ko‘rsatkich e’lon qilingan – funksiya qiymati butun son hamda u ikkita haqiqiy turdagi parametrlardan iborat.

Biror obyektga (shu jumladan o‘zgaruvchiga) ko‘rsatkich. Bunday ko‘rsatkichda ma’lum turdagi (tayanch yoki hosilaviy) berilganlarning xotiradagi manzili joylashadi. Obyektga ko‘rsatkich quyidagicha e’lon qilinadi:

*nom;

Bu yerda - ko‘rsatkich aniqlaydigan manzildagi qiymat turi bo‘lib, u maydon turidan tashqari xar qanday tur bo‘lishi mumkin. Agar bir turda bir nechta ko‘rsatkichlar e’lon qilinadigan bo‘lsa, har bir ko‘rsatkich uchun ‘*’ belgisi qo‘yilishi talab etiladi: int *i, j,* k; float x,*y,*z;

Bu misolda i va k - butun turdagi ko‘rsatkichlar va j - butun turdagi o‘zgaruvchi, ikkinchi operatorda x - haqiqiy o‘zgaruvchi va y, z haqiqiy turdagi ko‘rsatkichlar e’lon qilingan .

void tipli ko‘rsatkich. Bu ko‘rsatkich obyekt turi oldindan ma’lum bo‘lmaganda ishlatiladi, ya’ni bir ko‘rsatkichda turli vaqtda har xil turdagi obyektlar manzili saqlanishi mumkin. Faqat void tipidagi ko‘rsatkichga har qanday turdagi ko‘rsatkichning qiymatini yuklash mumkin. Lekin, ko‘rsatilgan manzildagi qiymatni ishlatishdan oldin, uni turi aniq bir turga oshkor ravishda keltirilishi kerak.

void tipidagi ko‘rsatkichni e’lon qilish quyidagicha yoziladi:

void *;

Ko‘rsatrichni o‘zi o‘zgarmas yoki o‘zgaruvchan bo‘lishi, shuningdek o‘zgarmas yoki o‘zgaruvchiga o‘zlashtirilishi mumkin, masalan:

int i; // butun o‘zgaruvchi;

const int ci=1; // butun o‘zgarmas;

int *pi; // butun o‘zgaruvchiga ko‘rsatkich;

const int *pci; // butun o‘zgarmasga ko‘rsatkich;

int *const cp=&i; // butun o‘zgaruvchiga o‘zgarmas-ko‘rsatkich;

const int * const cpc=&ci; // butun o‘zgarmasga o‘zgarmas-ko‘rsatkich.

Misollardan ko‘rinib turibdiki, ‘*’ va ko‘rsatkich nomi orasida turgan const modifikatori faqat ko‘rsatkichning o‘ziga tegishli hisoblanadi, uni o‘zgartirish mumkin emasligini bildiradi. ‘*’ belgisidan chapda turgan const esa ko‘rsatilgan manzildagi qiymatni o‘zgarmas ekanligini bildiradi.

Ko‘rsatkichga boshlang‘ich qiymatni berish uchun ‘&’ - manzilni olish amali ishlatiladi.

Ko‘rsatkichlar ko‘pincha dinamik xotira (boshqa nomi “uyum” yoki “heap”) bilan bog‘liq holda ishlatiladi. Dinamik xotira bilan ishlatilishiga sabab, bu sohadagi bo‘sh xotira dastur ishlash jarayonida, kerakli paytida ajratib olinadi va bu xotiraga zarurat bo‘lmaganida qaytariladi (bo‘shatiladi) hamda u keyinchalik dastur tomonidan yana ishlatilishi mumkin. Bunday xotiraga faqat ko‘rsatkichlar yordamida murojaat qilish mumkin. Ushbu o‘zgaruvchilar dinamik o‘zgaruvchilar deyiladi va ularni faoliyat vaqti yaratilgan nuqtadan boshlab dastur oxirigacha yoki oshkor ravishda xotira bo‘shatilishigacha davom etadi.

Ko‘rsatkichlarni e’lon qilishda, unga boshlang‘ich qiymatlar berish mumkin. Boshlang‘ich qiymat ko‘rsatkich nomidan so‘ng yoki qavs ichida yoki ‘=‘ belgidan keyin beriladi. Boshlang‘ich qiymatlar quyidagi usullar bilan berilishi mumkin:

1.Ko‘rsatkichga mavjud bo‘lgan obyektning manzilini o‘zlashtirish:

a) manzilni olish amali orqali:

int i=5,k=4; // butun o‘zgaruvchilar;

int *p = &i; // p ko‘rsatkichga i o‘zgaruvchini manzili yoziladi;

int *p1(&k); // p1 ko‘rsatkichga k o‘zgaruvchini manzili yoziladi.

b) boshlang`ich qiymat berilgan boshqa ko‘rsatkichni qiymatini berish:

int * r=p; // p oldin e’lon qilingan va qiymatga ega bo‘lgan ko‘rsatkich.

c) massiv yoki funksiya nomini berish:

int b[10]; //massivni e’lon qilish;

int * t=b; //massivning boshlang‘ich manzilini berish;



void f(int a) { /* … */} // funksiyani aniqlash;

void (*pf)(int); // funksiyaga ko‘rsatkichni e’lon qilish;

pf=f; // funksiyani manzilini ko‘rsatkichga o‘tkazish.

2. Oshkor ravishda xotirani absolyut manzilini o‘zlashtirish:

char *ab = (char *)0xB8000000;

bunda 0xB8000000 – o‘n oltilik o‘zgarmas son va (char *) – turga keltirish amali bo‘lib, u ab o‘zgaruvchi xotiraning absolyut manzilidagi baytlarni char sifatida qayta ishlovchi ko‘rsatkich turiga aylantiriladi.

3. Bo‘sh qiymat berish:

int *suxx = NULL;

int *r=0;

Birinchi satrda maxsus NULL o‘zgarmasi ishlatilgan, ikkinchi satrda 0 qiymat ishlatilgan. Ikkala holda ham ko‘rsatkich hech qanday obyektga murojaat qilmaydi. Bo‘sh ko‘rsatkich asosan ko‘rsatkichni aniq obyektga ko‘rsatyotganligi yoki yo‘qligini aniqlashda foydalaniladi.

4. Dinamik xotirada new amali bilan joy ajratish va uning manzilini ko‘rsatkichga berish:

int * n =new int; // birinchi operator;

int * m =new int(10); // ikkinchi operator;

int * q=new int [10]; // uchinchi operator.

Birinchi operatorda new amali yordamida dinamik xotirada int uchun yetarli joy ajratib olinib, uning manzili n ko‘rsatkichga yuklangan. Ko‘rsatkichning o‘zi uchun joy kompilyatsiya vaqtida ajratiladi.

Ikkinchi operatorda joy ajratishdan tashqari m manziliga boshlang‘ich qiymat - 10 sonini joylashtiradi.

Uchinchi operatorda int turidagi 10 element uchun joy ajratigan va uni boshlang‘ich manzili q ko‘rsatkichga beriladi. Bu misolda, aniqrog‘i massivga joy ajratilib, unga q nomi berilgan bo‘lib, keyinchalik shu nom orqali massiv elementlariga murojaat qilish mumkin.

Xotira new amali bilan ajratilgan bo‘lsa, u delete amali bilan bo‘shatilishi kerak:

delete n; delete m; delete [ ] q;

Agarda xotira new[] amali bilan ajratilgan bo‘lsa, uni bo‘shatish uchun delete[] amalini o‘lchovi ko‘rsatilmagan holda qo‘llash kerak.

Xotira bo‘shatilganligiga qaramasdan ko‘rsatkichni o‘zini qayta ishlatish mumkin. Buni quyidagi amallarda ko`rib chiqamiz.

Ko‘rsatkich ustidan amallar

Ko‘rsatkich ustidan quyidagi amallar bajarilishi mumkin:

1) obyektga vositali murojaat qilish;

2) qiymat berish;

3) ko‘rsatkichga konstanta qiymatni qo‘shish;

4) ayirish;

5) inkrement va dekrement;

6) solishtirish;

7) turga keltirish.

Vositali murojaat qilish amali

Bu amal ko‘rsatkichdagi manzil bo‘yicha joylashgan qiymatni olish yoki qiymat berish uchun ishlatiladi:

char x; // char turidagi o‘zgaruvchi e’loni;

char *y =new char; // ko‘rsatkich e’lon qilinib, unga dinamik ajratilgan xotiraning manzilini berish;

*y=‘b’; // y manziliga qiymat joylashtirish;

x =*y; // x o‘zgaruvchiga y manzili qiymatini berish;

Shuni aytib o‘tish kerakki, xotirani bitta joyining manzilini bir paytni o‘zida bir nechta va turli toifadagi ko‘rsatkichlarga berish mumkin va murojaat qilganda har xil qiymatlar qabul qilishi mumkin:

unsigned long int F=0Xcc77ffaa;

unsigned short int*a_int = (unsigned short int*) &F;

unsigned char* a_char=(unsigned char *) &F;

cout<<”*a_int =”<<*a_int<<” *a_char=”<

printf(“ | %x | %x | %x | “ , F, *a_int, *a_char);

Bu misolda quyidagi qiymatlar chop etiladi:

cc77ffaa | ffaa | aa |

Agar har xil turdagi ko‘rsatkichlarga qiymatlar berilsa, albatta turga keltirish amalidan foydalanish lozim:

int n=5;

float x=1.0;

int *pi=&n;

float *px=&x;

void *p;

int *r,*r1;

px=(float *)&n;

p=px;

r=(int *)px;

r1=pi;

Ko‘rsatgich turini void turiga keltirish kerak emas (amal ma’noga ega emas). Xuddi shunday, turlari bir xil bo‘lgan ko‘rsatkichlar uchun turni keltirish amalini bajarishga ehtiyoj yo‘q. Ko‘rsatkich ustidan bajariladigan arifmetik amallarda avtomatik ravishda turlarni o‘lchovi hisobga olinadi.

Arifmetik amallar faqat bir xil turdagi ko‘rsatkichlar ustidan bajariladi va asosan, massivlar uchun qo‘llaniladi.

Inkrement amali ko‘rsatkichni massivning keyingi elementiga, dekrement esa aksincha, oldingi element manziliga ko‘chiradi. Bunda ko‘rsatkichning qiymati (manzil) sizeof() qiymatiga o‘zgaradi. Agar ko‘rsatkichning qiymati k o‘zgarmas qiymatga oshirilsa yoki kamaytirilsa, u k* sizeof() qiymatiga o‘zgaradi.

Masalan:

short int *p=new short [5];

long * q = new long [5];

p++; // p qiymati 2 oshadi;

q++; // q qiymati 4 ga oshadi;

q+=3; // q qiymati 3*4=12 oshadi.

Ko‘rsatkichlarning ayirmasi deb, ular ayirmasini tur o‘lchami bo‘linishiga aytiladi. Ko‘rsatkichlarni o‘zaro qo‘shish mumkin emas.

Murojaatlar

Murojaatlar e’londa ko‘rsatilgan nomning sinonimi sifatida ishlatiladi, yani bitta o‘zgaruvchiga har xil nom bilan murojaat qilish mumkin. Murojaatni doimiy qiymatga ega bo‘lgan ko‘rsatkich deb, qarash ham mumkin. Murojaat quyidagicha e’lon qilinadi:

& ;

Bu yerda – murojaat ko‘rsatuvchi qiymatning turi, ‘&’ belgisi, undan keyin yozilgan – murojaat turidagi nom ekanligini bildiruvchi operator. Boshqacha aytganda ‘&’ belgisiga manzilni olish amali deyiladi.

Misol:

int a;

int & p=a; // p murojaati - a o‘zgaruvchisining alternativ nomi;

const char & z=‘\n’; // z – konstantaga murojaat.

Murojaatni ishlatishda quyidagi qoidalarga rioya qilish lozim: murojaat funksiya parametri sifatida ishlatilgan va sinf maydoniga murojaat qilgan hollardan tashqarida barcha holatlarda boshlang‘ich qiymatga ega bo‘lishi kerak.

Murojaat asosan funksiyalarda manzil orqali uzatiluvchi parametrlar sifatida ishlatiladi. Murojaatni ko‘rsatkichdan farqi shundaki, u alohida xotira egallamaydi u faqat o‘zgaruvchining boshqa nomi sifatida ishlatiladi. Ko‘rsatkichli massivlar quyidagicha ta’riflanadi:

*[]

Misol uchun int *a[5] ta’rif int tipidagi obyektlarga besh elementli massivni kiritadi. Ko‘rsatkichlar massivlari satr massivlarini tasvirlash uchun qulaydir. Misol uchun biror bir ishchi xodim yoki talabalarning familiyalari ro‘yxatini kiritish uchun ikki o‘lchovli massivdan foydalanish kerak:

char fam[][10]={“Mirsanov”,”Toxirov”,”Arziqulov”}

Bunda xotira 30 elementdan iborat bo‘ladi, chunki har bir familiyagacha 0 lar bilan to‘ldiriladi. Ko‘rsatkichli massiv yordamida quyidagicha ta’riflash mumkin:

char *kfam[]= {“Mirsanov”,”Toxirov”,”Arziqulov”}.

Bu holda ro‘yhat xotirada 24 elementdan iborat bo‘ladi, chunki har bir familiya oxiriga 0 belgisi qo‘yiladi.

Ko‘rsatkichli massivlar murakkab elemenlarni sodda usulda tartiblashga imkon beradi.

Yuqorida bayon etilgan fikrlarni tekshirish uchun C++ dasturlash tilida bir nechta misollarni ko‘rib chiqamiz.

1-misol. Kamida 100 ta raqamdan iborat bo‘lgan Mersen sonini hisoblash va ekranga chiqarish dasturi.

Berilgan masalaning dastur kodi quyidagicha:

#include

#include

using namespace std;

void Done(int);

int a[100000], *aP, c[100000], *cP, Len=1;

int main(){

int Simple, i;

aP=a;

Simple=pow(2,11)-1;

*aP=1;

Done(Simple);

--*aP;

aP+=Len-1;

for (i=Len-1; i>0; i--)

cout<<*aP--;

return 0;

}

void Done(int Power)

{

int i;

cP=c;

for (i=0; i

{

*cP=*cP+*aP*2;

if (*cP>9) { *(cP+1)+=(*cP/10); *cP%=10; }

aP++;

cP++;

}

while (c[Len]==0 &&Len>0) Len--;

Len++;

aP=a;

cP=c;

for (i=0; i

{

*aP++=c[i];

*cP++=0;

}

aP=a;

--Power;

if (Power==0) return; else Done(Power);

}

2-misol. Butun N soni berilgan (3≤N≤200000000). N soni tub yoki tub emasligini aniqlash dasturi.

Berilgan masalaning dastur kodi quyidagicha:

#include

#include

using namespace std;

long N, i, j, Simple[1000000], *sP, *tempP, p, pos;

int main()

{

cin>>N;

sP=Simple;

for (i=2; i

{

for (j=2; j

if (i%j==0)

{

p=1;

break;

}

if (p==0)

{

*sP=i;

sP++;

} else p=0;

}

tempP=sP--;

sP=Simple;

while (sP!=tempP)

if (N%*sP==0)

{

p=1;

break;

}

else sP++;

if (p==1) cout<<"Tub son emas.";

else cout<<"Tub son.";

return 0;

}

3-misol. Berilgan massiv elementlarini tanlash usulida ko‘rsatkichlar yordamida saralash dasturi.

Berilgan masalaning dastur kodi quyidagicha:

#include

using namespace std;

int main(){

int array[100], *aP, *startP, *minP, *point, size, i;

int min, temp;

cin>>size;

aP=array;

for (i=0; i

cin>>*aP++;

startP=array;

while (startP!=aP)

{

min=*startP;

minP=startP;

point=startP;

while (point!=aP)

{

if (*point

{

min=*startP;

minP=startP;

}

point++;

}

point--;

if (minP!=startP)

{

temp=*startP;

*startP=*minP;

*minP=temp;

}

startP++;}

aP=array;

for (i=0; i

cout<<*aP++<<" ";

return 0;

}

Mustaqil bajarish uchun topshiriqlar

1. int toifasidagi ko‘rsatkichni e’lon qilish dasturini tuzing.

2. char toifasidagi ko‘rsatkichni e’lon qilish dasturini tuzing.

3. double toifasidagi ko‘rsatkichni e’lon qilish dasturini tuzing.

4. Ko‘rsatkichni manzil qiymatini aniqlovchi dastur tuzing.

5. Ko‘rsatkich joylashgan manzilni aniqlovchi dastur tuzing.

6. Berilgan n soni tub ekanligini tekshiruvchi dastur tuzing.

7. Massiv elementlarini o‘sish tartibida saralovchi dastur tuzing.

8. Berilgan a va b (a butun sonlar oralig‘idagi tub sonlarni chiqaruvchi dastur tuzing.

9. n (n>0) butun son berilgan. n ta tub sonlarni chiqaruvchi dastur tuzing.

10. Rim raqamlarida berilgan sonni arab raqamlarida ifodalovchi dastur tuzing.


2.6-§. C++ dasturlash tilida satrlar va ular ustida amallar


C++ dasturlash tilida ikki xil belgilar majmuasini mujassamlashtirgan. Birinchi toifaga, an’anaviy, ya’ni, tor belgilar deb nomlanuvchi 8 bitli, ikkinchisiga esa 16 bitli belgilar kiradi. Til kutubxonasida har bir guruh belgilari uchun maxsus funksiyalar to‘plami mavjud.

Satrni char turidagi belgilar massivi sifatida qarash mumkin va bu belgilar ketma-ketligi nol kodli belgi bilan tugaydi (‘\0’). Odatda, nol bilan tugaydigan satrlarni ASCIIZ – satrlar deyiladi.

Shuningdek, C++ dasturlash tilida satrlar bilan ishlashni qulaylashtirish uchun string sinfi kiritilgan. String sinfida satr oxirida ‘\0’ belgi qo‘yish talab etilmaydi.

Satrli o‘zgarmas deb – qo‘shtirnoqlar ichiga olingan belgilar ketma-ketligiga aytiladi. Qo‘shtirnoqlar ichidagi belgilar ketma-ketligiga satr deyiladi.

Quyida C++ dasturlash tilida belgi sifatida ishlatilishi mumkin bo‘lgan o‘zgarmaslar to‘plami keltirilgan:

  • katta harflar – ‘A’ …’Z’, ‘A’…’Я’;

  • kichik harflar – ‘a’ …’z’, ‘a’…’я’;

  • raqamlar – ‘0’ …’9’;

  • gorizontal bo‘sh joy qoldirish (ASCII kodi 9), satrni o‘tkazish (ASCII kodi 10), vertikal bo‘sh joy qoldirish (ASCII kodi 11), formani o‘tkazish (ASCII kodi 12), navbatdagi satrga o‘tkazish (ASCII kodi 13);

  • punktuatsiya belgilari (ajratuvchilar) ! ” # $ & ‘ ( ) * + - , . / : ; < = > ? @ [ \ ] ^ _ { | }
;

  • boshqaruv belgilari ASCII kodi 0...1Fh oralig‘ida va 7Fh bo‘lgan belgilar;

  • bo‘sh joy ASCII kodi 32 bo‘lgan belgi;

  • o‘n oltilik raqamlar ‘0’…’9’, ‘A’…’F’, ‘a’…’f’.

    Satr uzunligini aniqlash funksiyalari

    Satrlar bilan ishlashda, aksariyat hollarda, uning uzunligini aniqlash talab etiladi. Buning uchun string.h kutubxonasida strlen() funksiyasi kiritilgan bo‘lib, uning tuzilishi quyidagi ko‘rinishda yoziladi:

    size_t strlen (const char* string)

    Ushbu funksiya uzunligi hisoblanishi lozim bo‘lgan satr boshiga ko‘rsatkich bo‘lgan yagona parametrga ega va u ishlash natijasi sifatida ishorasiz butun sonni qabul qiladi. strlen() funksiyasi satrning real uzunligidan bitta kam qiymat hosil qiladi, ya’ni nol kodli belgi o‘rni hisobga olinmaydi. Xuddi shu maqsadda sizeof() funksiyasidan ham foydalanish mumkin va u strlen() funksiyasidan farqli ravishda satrning haqiqiy uzunligini hosil qiladi.

    Satrlarni nusxalash funksiyasi

    C++ dasturlash tilida satr qiymatini biridan ikkinchisiga nusxalash imkoniyati mavjud. Bulardan biri strcpy() funksiyasini misol sifatida keltirish mumkin. Ushbu funksiya quyidagicha yoziladi: char* strcpy(char* sl1, const char* sl2. Mazkur funksiya sl2 satrdagi belgilarni sl1 satrga nusxalaydi. Nusxalash sl2 satrdagi nol belgi uchraguncha davom etadi. Shu bois, sl2 satr uzunligi sl1 satr uzunligidan katta emasligiga ishonch hosil qilish lozim, aks holda berilgan satrda sl1 dan keyin joylashgan berilganlar “ustiga” sl2 satrning ortiqcha belgilari yoziladi.

    Quyidagi dastur kodi “Nusxalash!” satrini Str satrga nusxalaydi:

    char Str[20];

    strcpy(Str, “Nusxalash!”);

    Satrlarni ulash funksiyasi

    Satrlarni ulash funksiyasi yangi satrlarni hosil qilishda foydalaniladi. Buning uchun C++ dasturlash tilining string.h kutubxonasida strcat() va strncat() funksiyalari mavjud. strcat( ) funksiyasining tuzilish quyidagi ko‘rinishga ega:

    char* strcat(char* sm1, const char* sm2)

    Funksiya ishlashi natiajasida sm2 satr, funksiya natijasi hisoblangan – sm1 satrni oxiriga bog‘lanadi. Funksiyaga murojaat qilishdan avval sm1 satr uzunligi, unga sm2 satr ulanishi uchun yetarli darajada bo‘lishiga e’tibor qaratish lozim. Quyida s satriga qo‘shimcha satr ulanishi ko‘rsatilgan:



    char s[80];

    strcpy(s,”Bu satrga “);

    strcat(s,”satr osti ulandi.”);

    Ushbu amallar ketma-ketligini bajarilishi natiajasida s ga qo‘shimcha satr ulandi.

    strncat( ) funksiyasi strcat( ) funksiyadan farqli ravishda str1 satrga str2 satrning ko‘rsatilgan uzunligidagi satr ostini ulaydi. Ulanadigan satr osti uzunligi funksiyaning uchinchi parametri sifatida beriladi. Ushbu funksiyaning tuzilishi quyidagicha yoziladi:

    char* strncat(char* str1, const char* str2, size_t num)

    Quyida keltirilgan dastur kodida str1 satrga str2 satrning boshlang‘ich 10 ta belgidan iborat satr ostini ulaydi:

    char satr1[80]=”Dasturlash tillariga misol bu-“;

    char satr2[80]=”C++,Python,Java”;

    strncpy(satr1,satr2,10);

    cout<

    Satrlarni solishtirish funksiyasi

    Satrlarni solishtirish, ularning mos o‘rindagi belgilarini, ya’ni, katta yoki kichikligi bilan solishtirib, aniqlanadi. Ushbu amallarni bajarish uchun string.h kutubxonasida standart funksiyalar mavjud. Bulardan biri strcmp( ) funksiyasi misol sifatida keltirish mumkin. Uning tuzilishi quyidagicha:

    int strcmp(const char* str1, const char* str2)

    Bunda funksiya str1 va str2 solishtirish natijasi sifatida son qiymatlarni o‘zlashtiradi va ular quyidagicha izohlanadi:

    <0 – agar str1 satri str2 satridan kichik bo‘lsa;

    =0 – agar str1 satri str2 satriga teng bo‘lsa;

    >0 – agar str1 satri str2 satridan katta bo‘lsa.

    Funksiya harflarning bosh va kichikligini farqlaydi. Buni quyidagi misolda ko‘rishimiz mumkin:

    char satr1[80]=”Dasturlash tillari bu-C++,pascal, Basic.“;

    char satr2[80]=”Dasturlash tillari bu-C++,Pascal, Basic.“;

    int i;

    i= strcmp(satr1,satr2);

    Natijada, i o‘zgaruvchisi musbat qiymat qabul qiladi, chunki solishtirilayotgan satrlardagi “pascal” va “Pascal” satr ostilarida birinchi harflar farq qiladi. Keltirilgan misolda i qiymati 27 ga teng bo‘ladi. Bunda farqlanuvchi harflar satrning 27-elementi hisoblanadi. Agar funksiyaga i= strcmp(satr2,satr1);ko‘rinishida murojaat qilinsa, i qiymati –27 ga teng bo‘ladi.

    Agar satrlardagi bosh yoki kichik harflarni farqlamasdan solishtirish amalini bajarish talab etilsa, stricmp() funksiyasidan foydalanish mumkin.

    Yuqorida keltirilgan misoldagi satrlar uchuni=strcimp(satr2,satr1);ko‘rinishda yoziladi. Bunda,amal bajarilganda i qiymati 0 ga teng bo‘ladi.

    strncmp( ) funksiyasiyaning tuzilishi quyidagi ko‘rinishga ega:

    int strncmp(const char* str1, const char* str2, size_t num);

    Bunda str1 va str2 satrlarni boshlang‘ich num sonidagi belgilarini solishtirilib, funksiya harflar registrini inobatga oladi. Yuqorida misolda aniqlangan satr1 va satr2 satrlar uchun i=strncimp(satr1,satr2,26);amali bajarilishida i qiymati 0 ga teng bo‘ladi. Chunki satrlar boshidagi 26 belgilar bir xil.

    strnicmp( ) funksiyasi strncmp( ) funksiyasi kabi imkoniyatga ega bo`lib, farqli tomoni shundaki, solishtirishda harflarning registri hisobga olinmaydi. Ushbu satrlar uchun i=strcnimp(satr1,satr2,27);amali bajarilishi natijasida i o‘zgaruvchi qiymati 0 ga teng bo‘ladi.

    Satrdagi harflar registrini almashtirish funksiyasi

    Berilgan satrdagi kichik harflarni bosh harflarga yoki aksincha amalni bajarish uchun mos ravishda _strupr() va _strlwr() funksiyalaridan foydalaniladi. Kompilyatorlarning ayrimlarida funksiyalar nomidagi tagchiziq (‘_’) bo‘lmasligi mumkin.

    Ushbu _strlwr( ) funksiyasining tuzilishi quyidagi ko‘rinishga ega:

    char* _strlwr(char* str)

    Bunda, argument sifatida berilgan satrdagi bosh harflarni kichik harflarga almashtiradi va hosil bo‘lgan satr manzili funksiya natijasi hisoblanadi. Quyida _strlwr( ) funksiyasidan foydalanishga oid misol keltirilgan:

    char str[]=”ABDEFGHIJKL”;

    _strlwr(str);

    Natija: “abdefghijkl”.

    _strupr( ) funksiyasi _strlwr( ) funksiyasiga o‘xshash bo‘lib, ammo satrdagi kichik harflarni bosh harflarga almashtiradi:

    char str[]=“abdefghijkl”;

    _strupr(str);

    Natija: ” ABDEFGHIJKL”.

    Dasturlash amaliyotida belgilarni qaysidir oraliqqa tegishli ekanligini bilish zarur hisoblanadi. Buni ctype.h sarlavha faylida e’lon qilingan funksiyalar yordamida aniqlash mumkin. Ularning ba’zi birlari bilan tanishib o`tamiz:

    isalnum( ) – berilgan belgi raqam yoki harf bo‘lsa, true aks holda false qiymat qabul qiladi;

    isalpha( ) – belgi harf bo‘lsa, true aks holda false qiymat qabul qiladi;

    isascii( ) – belgi kodi 0..127 oralig‘ida bo‘lsa, true aks holda false qiymat qabul qiladi;

    isdigit( ) – belgi raqamlar diapazoniga tegishli bo‘lsa, true aks holda false qiymat qabul qiladi.

    Satrni teskari tartiblash funksiyasi

    C++ dasturlash tilida satrni teskari tartiblashni uchun strrev() funksiyasidan foydalaniladi. Ushbu funksiya quyidagi ko‘rinishga ega:

    char* strrev(char* str);

    Misol sifatida quyidagi dastur kodini keltirish mumkin:

    char a[]=”C++Builder”;

    strrev(a);

    Bunda amallar bajarilishi natijasida “redliuB++C” satri hosil bo‘ladi.

    Satrdan belgini qidirish funksiyalari

    C++ dasturlash tilida satrdan birorta belgi yoki qism satrni qidirish uchun string.h kutubxonasidagi standart funksiyalardan foydalaniladi. Satrda qidirilayotgan belgi bor yoki yo‘qligini aniqlashda strchr() funksiyasidan foydalaniladi. Ushbu funksiya quyidagi ko‘rinishga ega:

    char* strchr(const char* k, int s)

    Bu yerda s belgi k satrdan qidiriladi. Agar qidirish muvafaqqiyatli amalga oshirilsa, funksiya natijasi izlanayotgan belgining satrdagi o‘rniga teng bo‘ladi, aks holda funksiya 0 qiymatini qabul qiladi. Bunda belgini izlash satr boshidan boshlanadi. Quyida belgini satrdan qidirishning dastur kodi keltirilgan:

    char k[]=”01234567891011”;

    char* S;

    S=strchr(k,’6’);

    Ushbu dasturni ishlashi natijasida S ko‘rsatkichi k satrning ‘6’ belgisi joylashgan o‘rnini aniqlaydi.

    strrchr() funksiyasi berilgan belgini satr oxiridan boshlab qidiradi. Agar qidirish muvaffaqiyatli amalga oshirilsa, belgidan o‘ng tomonini aniqlaydi, aks holda 0 hosil bo‘ladi. Misol sifatida quyidagi dastur kodini keltirish mumkin:

    char k[]=”0123456789101112”;

    char* s;

    pSatr=strrchr(k,’0’);

    Bunda, amallarni bajarilishi natijasida s ko‘rsatkichi k satrning ‘01112’ qism satrini o‘zlashtiradi.

    strspn() funksiyasi ikkita satrni mos o‘rindagi belgilarni solishtiradi va birinchi ustma-ust tushmagan belgi o‘rnini aniqlaydi (registrni hisobga olgan holda). Ushbu funksiya quyidagi ko‘rinishga ega:

    size_t strspn(const char* string, const char* group)

    Yuqoridagi funksiyadan foydalanib, ikkita satrdagi ustma-ust tushadigan elementlar sonini ham aniqlash mumkin. Buning uchun quyidagi dastur kodidan foydalaniladi:

    char s1[]=”01234567891011121314”;

    char s2[]=”01234567890123”;

    int belgi;

    belgi=strspn(s1,s2);

    Bunda, belgi ning qiymati 10 ga teng bo‘ladi.

    Qidirish funksiyalaridan yana biri, bu strcspn() bo‘lib, u quyidagi ko‘rinishga ega:

    size_t strcspn(const char* st1, const char* st2)

    Bunda, st1 va st2 satrlar solishtiriladi hamda st1 satrining st2 satriga kirmaydigan qism, uning uzunligi aniqlanadi. Misol sifatida quyidagi dastur kodini keltirish mumkin:

    char s[]=”Birinchi satr”;

    int k;

    index=strcspn(s,”sanoq boshi”);

    Mazkur dastur kodida k o‘zgaruvchisi 9 qiymatini qabul qiladi, chunki 9-o‘rindagi belgi ikkinchi satrning birinchi belgisi bilan mos tushadi.

    Satrdagi belgini qidirish uchun strpbrk() funksiyasidan ham foydalanish mumkin. U quyidagi ko‘rinishga ega:

    char* strpbrk(const char* str1, const char* str2)

    Ushbu dastur kodi str1 satrdagi str2 satrga kiruvchi birorta belgini izlaydi. Agar bunday element topilsa, uning manzili funksiya qiymati sifatida olinadi, aks holda funksiya 0 qiymatni qabul qiladi. Buni quyidagi misolda ko‘rish mumkin:

    char satr1[]=”11223456789ABCDEF”;

    char satr2[]=”MNXYabcdefABV”;

    char* k;

    k = strpbrk(satr1,satr2);

    Mazkur dastur kodi ishlashi natijasida k ning qiymati “ABCDEF” ga teng bo‘ladi.

    Turlarni o‘zgartirish funksiyalari

    C++ dasturlash tilida satrli o‘zgaruvchilarni sonli o‘zgaruvchilarga o‘tkazish mumkin. Buning uchun stdlib.h kutubxonasidagi quyidagi funksiyalardan foydalaniladi:

    atof – satrni haqiqiy songa o‘tkazish. Funksiyaning umumiy ko‘rinishi quyidagicha yoziladi: double atof(const char s).

    Masalan:

    char a[10];

    cout<<"a="; cin>>a; // satrli ko‘rinishdagi haqiqiy sonni kiritish

    cout<<"a="<

    natija:

    a=17.45

    a=17.45

    atoi – satrni butun songa o‘tkazish. Funksiyaning umumiy ko‘rinishi quyidagicha yoziladi: int atoi(const char s).

    Masalan:

    char a[10];

    cout<<"a="; cin>>a;

    cout<<"a="<

    natija:

    a=17

    a=171

    atol – satrni uzun butun songa o‘tkazish. Funksiyaning umumiy ko‘rinishi quyidagicha yoziladi: long atol(const char s).

    Masalan:

    char a[10];

    cout<<"a="; cin>>a;

    cout<<"a="<

    natija:

    a=786536879

    a=786536879

    Ushbu funksiyalardan foydalanish uchun dasturning sarlavha qismiga quyidagi #include dastur kodini kiritish talab etiladi.

    Yuqorida bayon etilgan fikrlarni tekshirish uchun C++ dasturlash tilida satrli operatorlardan foydalangan holda bir nechta misollarni ko‘rib chiqamiz.

    1-misol. Berilgan satrdagi belgilar sonini chiqaruvchi dastur.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    #include

    using namespace std;

    int main()

    {

    string s;

    cout << "Satr kiriting" << endl;

    getline(cin, s);

    cout<<"Siz kiritgan satr "<

    cout<<"Siz kiritgan satr "<

    return 0;

    }

    2-misol. Kichik harflardan tashkil topgan satr berilgan. Satrni katta harflarda chiqaruvchi dastur.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    #include

    using namespace std;

    int main()

    {

    char c[20];

    cout << "satr kiriting\n";

    cin.getline(c, sizeof(c));

    for (int i = 0; i < strlen(c); i++)

    c[i] = toupper(c[i]);

    cout << c << endl;

    return 0;

    }

    3-misol. A(n,m) belgili massiv va s belgi berilgan. Massivda s belgi necha narta uchrashini aniqlash dasturi.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    using namespace std;

    int main()

    { char const s='a';

    char a[10][10]={""};

    int i,j,k=0;

    for (i=1; i<=3; i++){

    for (j=1; j<=3; j++){

    cout<<"a["<

    cin>>a[i][j];}}

    for (i=1; i<=3; i++){

    for (j=1; j<=3; j++){

    if (a[i][j]==s) k++;}}

    cout<

    return 0;

    }

    4-misol. Satrli ko`rinishda haqiqiy son berilgan. Berilgan satrni butun va haqiqiy son ko`rinishida chiqaruvchi dastur.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    #include

    using namespace std;

    int main ()

    {

    char c[] = "-3.1415";

    double f;

    int n;

    f = atof(c);

    n = atoi(c);

    cout << f << endl;

    cout << n << endl;

    return 0;

    }

    5-misol. Bo`sh joy (probel) bilan ajratilgan so`zlardan iborat bo`lgan satr berilgan. Satrdagi so`zlarni va so`zlardagi belgilar sonini ustun ko`rinishida chiqaruvchi dastur.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    #include

    using namespace std;

    int main()

    {

    int i=0,a[100];

    char Satr[]="C++ dasturlash tilida ishlash asoslari";

    char Ajratuvchi[]=" ";

    char* Satrdagi_belgi;

    Satrdagi_belgi = strtok(Satr,Ajratuvchi);

    if(Satrdagi_belgi) {

    i++;

    a[i]=strlen(Satrdagi_belgi);

    cout<

    cout<

    }

    while(Satrdagi_belgi)

    {

    Satrdagi_belgi= strtok(NULL,Ajratuvchi);

    if (Satrdagi_belgi)

    {

    i++;

    a[i]=strlen(Satrdagi_belgi);

    cout<

    }

    cout<

    }

    return 0;

    }

    Mustaqil bajarish uchun topshiriqlar

    1. k (0<=k<=255) butun son berilgan. Kodi k ga teng bo‘lgan ASCII jadvalidagi belgini chop etuvchi dastur tuzing.

    2. a belgi berilgan. a belgidan (ASCII jadvalda) keyin joylashgan 4 ta belgini chop etuvchi dastur tuzing.

    3. Bo‘sh bo‘lmagan s satr berilgan. s satrda joylashgan belgilarning orasiga bittadan vergul qo‘yib chop etuvchi dastur tuzing.

    4. Satr berilgan. Unda joylashgan 2 raqami sonini hisoblovchi dastur tuzing.

    5. n (1<=n<=26) soni berilgan. Lotin alifbosidagi oxirgi n ta kichik hartflarni chop etuvchi dastur tuzing.

    6. Satr berilgan. Undagi lotin alifbosining bosh harflari sonini hisoblovchi dastur tuzing.

    7. Satr berilgan. Berilgan satrdagi barcha kichik harflarni bosh harflarga almashtiruvchi dastur tuzing.

    8. Butun musbat sonni tasvirlovchi satr berilgan. Bu sonning raqamlari yig‘indisini hisoblovchi dastur tuzing.

    9. s va s0 satrlar berilgan. s satrda s0 satrning necha marta uchrashini aniqlovchi dastur tuzing.

    10. Bo‘sh joylar bilan ajratilgan o‘zbekcha so‘zlardan iborat satr berilgan. Satrdagi eng uzun so‘zning uzunligini topuvchi dastur tuzing.

    0>
    1   2   3   4   5   6   7   8   9   10   11

    2.7-§. C++ dasturlash tilida strukturalar va birlashmalar


    Strukturalar

    Avvalgi mavzulardan ma’lumki, massiv bir xil turdagi bir nechta ma’lumotlarni saqlash uchun xizmat qiladi. Agar turli tipdagi ma’lumotlarni bir butun sifatida qayta ishlash zaruriyati tug‘ilsa, unda struktura ma’lumotlar turidan foydalaniladi. Bu turli xil ma’lumotlar tipidagi obyektlarni bitta nom ostida guruhlash imkonini beradi.

    Struktura tipidagi o‘zgaruvchilarni e’lon qilish uchun avval strukturaning nomini va uning elementlarini ko‘rsatib, yangi ma’lumotlar turini o‘rnatish talab etiladi. Strukturaning elementlari maydonlar deb nomlanadi. Quyida kitob deb nomlangan strukturali tip na’munasi keltirilgan, uning nomi, muallifi, nashr_yili, sahifa_soni, narxi, nashriyot nomli maydonlari berilgan:

    struct kitob

    {

    // struktura maydonlari

    char nomi [40];

    char muallif [ 8 ];

    int nashr_yili, sahifa_soni, narxi;

    char nashriyot;

    }

    Yaratilgan strukturali tipga asoslanib, kitob tipidagi o‘zgaruvchilarni tavsiflash mumkin. Masalan:

    kitob dasturlash; // kitob tipidagi dasturlash o‘zgaruvchisi;

    kitob A[10]; // elementlari kitob tipidagi massiv;

    kitob *B; // kitob tipli ko‘rsatkich;

    Struktura tipli o‘zgaruvchi maydonlari quyidagicha ko‘rib chiqiladi:

    struktura_nomi . maydon

    Masalan:

    dasturlash . muallif; // dasturlash o‘zgaruvchisi muallif maydoniga murojaat;

    A [3] . narxi; // A[3] elementning narxi maydoniga murojaat;

    A [5] . nashriyot; // A[5] elementning nashriyot maydoniga murojaat.

    Struktura ko‘rsatkichlari

    Strukturaga ko‘rsatkichlar ham oddiy ko‘rsatkichlar kabi tasvirlanadi:

    Complex *a,*b; struct misol *x;

    Strukturaga ko‘rsatkich ta’riflanganda initsializatsiya qilinishi mumkin. Misol uchun ekrandagi rangli nuqtani tasvirlovchi quyidagi strukturali tip va strukturalar massivi kiritiladi. Strukturaga ko‘rsatkich qiymatlari initsializatsiya va qiymat berish orqali aniqlanadi:

    struct nuqta

    {int rang;

    int x, y;

    } i, j;

    struct point *n=&i;

    Ko‘rsatkich orqali struktura elementlariga ikki usulda murojaat qilish mumkin. Birinchi usul manzil bo‘yicha qiymat olish amaliga asoslangan bo‘lib, quyidagi shaklda qo‘llaniladi:

    (* strukturaga ko‘rsatkich).element nomi;

    Ikkinchi usul maxsus strelka (->) amaliga asoslangan bo‘lib, quyidagi ko‘rinishga ega:

    strukturaga ko‘rsatkich->element nomi

    Struktura elementlariga qo‘yidagi murojaatlar o‘zaro tengdir:

    (*n).rang==i.rang==n->rang

    Struktura elementlari qiymatlarini ko‘rsatkichlar yordamida quyidagicha o‘zgartirish mumkin:

    (*n).rang=green;

    n->x=100;

    n->y=200;

    Strukturalar va funksiyalar

    Strukturalardan funksiya argumentlari sifatida yoki funksiya qabul qiladigan qiymat sifatida foydalanish mumkin. Bundan tashqari ikkala holda ham strukturaga ko‘rsatkichlardan foydalanish mumkin. Misol uchun ikki kompleks son yig‘indisini hisoblash funksiyasi:

    Complex summ(complex x, complex y)

    {

    complex a;

    a.real=x.real+y.real;

    a.imag=x.imag+y.imag;

    return a;

    }

    Bu funksiyani ko‘rsatkichlar yordamida quyidagicha yozish mumkin:

    Complex* summ(complex* x, complex* y)

    {

    complex* a; a=(complex*)malloc(sizeof(complex));

    a->real=(*x).real+(*y).real;

    a->imag=(*x).imag+(*y).imag;

    return a;

    }

    Ushbu funksiya Complex tipidagi dinamik obyekt yaratib, manzilini qabul qiladi. Dasturda bu obyekt uchun ajratilgan joyni ozod qilish maqsadga muvofiq hisoblanadi. Bu funksiyaga quyidagicha murojaat qilish mumkin:

    Complex x={0.1,-0.3}, x={0.2,-0.5};

    Complex* n; n=add(&x,&y);

    Birlashmalar

    Birlashmalar - bu har xil tipdagi bir nechta o‘zgaruvchiga xotiraning bitta qismini joylashtirish imkonini beradigan obyektdir. Birlashmalarni e’lon qilish umumiy holda quyidagi ko`rinishda yoziladi:


    union birlashma_nomi

    {

    toifa_nomi 1-o‘zgaruvchi;

    toifa_nomi 2-o‘zgaruvchi;

    ...

    toifa_nomi 2-o‘zgaruvchi;

    }

    Bu yerda birlashma_nomi – to‘g‘ridan-to‘g‘ri yangi yaratilgan turning nomi. 1-o‘zgaruvchi, 2-o‘zgaruvchi, n-o‘zgaruvchi – birlashma tarkibidagi o‘zgaruvchilar. Ushbu o‘zgaruvchilar har xil toifada bo‘lishi mumkin. toifa_nomi – birlashma tarkibidagi o‘zgaruvchilarning toifasi.

    Masalan, tarkibida butun va belgili o`zgaruvchi bo`lgan birlashma quyidagi ko`rinishda yoziladi:

    union birlashma_tur {

    int a;

    char b;

    };

    Strukturalarda bo‘lgani kabi, siz o‘zgaruvchining nomi ta’rifning oxirida yoki alohida e’lon qilishinishi mumkin. birlashma_tur ning x o‘zgaruvchisini e’lon qilish uchun quyidagi dastur kodi yoziladi:

    union birlashma_tur x;

    Bunda x birlashmada butun a o‘zgaruvchi va belgili b o‘zgaruvchi xotiraning bitta qismidan joy egallaydi (bunda a o‘zgaruvchi 2 yoki 4 bayt, b o‘zgaruvchi esa 1 bayt) Quyidagi rasmda a va b o‘zgaruvchilarni xotiraning bitta qismiga qanday joylashishi tasvirlangan. birlashma_tur -dasaqlangan ma’lumotlarga butun son yoki belgi sifatida murojaat qilishingiz mumkin.



    21-rasm.

    1-misol. birlashma_tur toifasidagi o‘zgaruvchini e’lon qilish va uning xotira hajmini aniqlash dasturi.

    Berilgan masalaning dastur kodi quyidagicha:

    #include

    using namespace std;

    int main(){

    union birlashma_tur {

    int a;

    char b;

    };

    birlashma_tur K;

    int d;

    K.a = 20;

    K.b = ‘w’;

    d = sizeof(K);// d=4

    cout<

    }

    Birlashma e’lon qilinganda, kompilyator avtomatik ravishda birlashmada mavjud bo‘lgan eng katta o‘zgaruvchini saqlash uchun yetarli bo‘lgan hajmdagi o‘zgaruvchini yaratadi. Birlashma tarkibidagi elementlarga murojaat qilish uchun “nuqta” (.) yoki “strelka” () operatoridan foydalaniladi.

    To‘g‘ridan-to‘g‘ri birlashma bilan ishlash uchun “nuqta” operatoridan foydalanish lozim. Agar birlashma o‘zgaruvchisiga ko‘rsatgich yordamida murojaat qilinsa, “strelka” operatoridan foydalaniladi. Masalan, birlashma_tur birlashmasining a elementiga 50 butun sonini berish uchun quyidagi dastur kodi yoziladi:

    birlashma_tur.a=50;

    Birlashmalardan foydalanish bizga kompyuter xotirasidan mustaqil (ko‘chma) kod yaratishda yordam beradi. Kompilyator birlashmani tashkil etuvchi o‘zgaruvchilarning haqiqiy o‘lchamlarini kuzatib borganligi sababli, kompyuterga bog‘liqlikni kamaytiradi. Bunda o‘zgaruvchilar butun yoki haqiqiy son, belgilar yoki boshqa tipda bo‘lishi ahamiyatga ega emas.

    Foydalanuvchi tomonidan aniqlangan berilganlar turi

    Misol va masalalarni dasturlashda, ishlov berilishi kerak bo‘lgan ma’lumotlar murakkab tuzilishga ega bo‘lishi mumkin. Uning yetarli darajada namoyish etilishi uchun oddiy ma’lumotlar turlari, massivlar va ko‘rsatgichlar asosida qurilgan ma’lumotlar turlaridan foydalaniladi. C ++ tili dasturchiga o‘zlarining ma’lumotlar turlarini va ular bilan ishlash qoidalarini belgilashga imkon beradi. Bunday turlar dasturchi tomonidan belgilangan turlar deb ataladi.

    Toifa nomini o‘zgartirish (typedef)