Файл: Ozbekiston respublikasi oliy va orta maxsus talim vazirligi navoiy davlat pedagogika instituti.docx
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 08.11.2023
Просмотров: 329
Скачиваний: 8
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
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
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
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:
Bu yerda
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(
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
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) ! ” # $ & ‘ ( ) * + - , . / : ; < = > ? @ [ \ ] ^ _ { | }
;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
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)