Nazariy materialar


Download 0.57 Mb.
Pdf ko'rish
bet4/4
Sana02.01.2022
Hajmi0.57 Mb.
#196689
1   2   3   4
Bog'liq
4 AMALIY

Ko’rsatkichli  toifalar.  Xotirada  joylashgan  bironta  ma’lumot  adresini 

saqlash  uchun  ishlatiladi.  Ma’lumotlar  ustida  amal  bajarishda  uning  adresiga 

ko’rsatkich  orqali  murojaat  qilinadi.  Agar  ko’rsatkichga  tuzilmaviy  ma’lumot 

adresi o’zlashtirilgan bo’lsa, u bunday ma’lumotlar saqlangan birinchi bit adresini 

ko’rsatadi.  Ko’rsatkichlar  odatda  dinamik  ob’ektlar  bilan  ishlashda  va  katta 

ob’ektlarni  (masalan,  massivlarni,  klass  ob’ektlarini)  funksiyalarga  parametr 

sifatida  uzatishda  ishlatiladi.  Ko’rsakichlarni  C++  da  quyidagicha  ifodalash 

mumkin. 


int *p;//ko’rsatkich e’lon qilindi 

int a=3;// butun toifali o’zgaruvchi yaratilindi 

p=&a;//p 

ko’rsatkichga 

ning 


adresi(masalan, 

0x22ff44) o’zlashtirildi 




p=a// xato!!! Ko’rsatkichga qiymat berish mumkin emas 

      *p++;//p  ko’rsatayotgan  manzildagi  qiymatni  1 

taga oshirish, yani 3+1=4 

Misol.  Massiv  elementlarining  o’rta  afirmetik  qiymatidan  katta  bo’lgan 

elementlari sonini aniqlang. 

#include  

#include  

using namespace std; 

int hisoblash(int *arr,int N){ 

int sum=0, counter=0; 

double middle; 

for(int i=0; i



sum+=arr[i]; 



middle=(double)sum/(double)N; 

cout<<"O’rta arifmetic = "<

for(int i=0; i



if(arr[i]>middle) 

counter++; 



return counter; 



int main() 



int *arr, N; 

cout<<"Massiv elementlari sonini kiriting=: "; 

cin>>N; 

arr=new int[N]; 

for(int i=0; i



cout<

cin>>arr[i]; 



int counter=hisoblash(arr,N); 

cout<<"o’rta arifmetik qiymatdan katta elementlar soni 

= "<

Yuqorida  keltirilgan  toifalarga  aynan  siz  ishlatayotgan  operatsion  tizim 



tomonidan nechta bayt ajratilayotganligini bilish uchun dastur tuzamiz. 

#include  

#include  

#include  

using namespace std; 


 

int main(int argc, char* argv[]) 



cout << "     data type      "   << "byte"                      

<< "      "    << "    max value  " << endl // sarlavhani 

chiqarish 

<< "bool               =  " << sizeof(bool)                

<< "         " << fixed << setprecision(2)/* bool toifasi 

uchun  maksimal qiymatni hisoblaymiz */                           

<< (pow(2,sizeof(bool) * 8.0) - 1)               << endl 

<< "char               =  " << sizeof(char)                

<< "         " << fixed << setprecision(2)/* char toifasi 

uchun  maksimal qiymatni hisoblaymiz */                           

<< (pow(2,sizeof(char) * 8.0) - 1)               << endl 

<< "short int          =  " << sizeof(short int)           

<< "         " << fixed << setprecision(2)/* short int 

toifasi uchun  maksimal qiymatni hisoblaymiz */                      

<< (pow(2,sizeof(short int) * 8.0 - 1) - 1)      << endl 

<< "unsigned short int =  " << sizeof(unsigned short 

int)  << "         " << fixed << setprecision(2) 

/* unsigned short int toifasi uchun  maksimal qiymatni 

hisoblaymiz */             << (pow(2,sizeof(unsigned 

short int) * 8.0) - 1) << endl 

<< "int                =  " << sizeof(int)                 

<< "         " << fixed << setprecision(2)/* inttoifasi 

uchun  maksimal qiymatni hisoblaymiz */                            

<< (pow(2,sizeof(int) * 8.0 - 1) - 1)            << endl 

<< "unsigned int       =  " << sizeof(unsigned int)        

<< "         " << fixed << setprecision(2)/* unsigned 

inttoifasi uchun  maksimal qiymatni hisoblaymiz */ 

<< (pow(2,sizeof(unsigned int) * 8.0) - 1)       << 

endl 

<< "long int           =  " << sizeof(long int)            

<< "         " << fixed << setprecision(2)/* long int 

toifasi uchun  maksimal qiymatni hisoblaymiz */                       

<< (pow(2,sizeof(long int) * 8.0 - 1) - 1)       << endl 

<< "unsigned long int  =  " << sizeof(unsigned long 

int)   << "         " << fixed << setprecision(2)/* 

unsigned long inttoifasi uchun  maksimal qiymatni 

hisoblaymiz */ 

<< (pow(2,sizeof(unsigned long int) * 8.0) - 1)  << 

endl 

<< "float              =  " << sizeof(float)               

<< "         " << fixed << setprecision(2)/* floattoifasi 

uchun  maksimal qiymatni hisoblaymiz */                          

<< (pow(2,sizeof(float) * 8.0 - 1) - 1)          << endl 


<< "double             =  " << sizeof(double)              

<< "         " << fixed << setprecision(2)/* 

doubletoifasi uchun  maksimal qiymatni hisoblaymiz */                         

<< (pow(2,sizeof(double) * 8.0 - 1) - 1)         << endl; 

system("pause"); 

return 0; 



Dasturga  izoh:bu  erda  sizeof()    funksiyasi  argumentiga  berilgan  toifaga 

xotiradan  ajratiladigan  joy  xajmini  baytlarda  ko’rsatadi.  Toifaga  beriladigan 

maksimal qiymatni aniqlash uchun 

2^(b * 8 - 1) – 1formula asosida hisoblaymiz. Bu 

erda  b  toifaga  ajratiladiga  xotira  xajmi  (baytda),  uni  8  ga  ko’paytirib  bitga  o’girib 

olamiz va 1 ni ayiramiz. Chunki toifaga ajratilgan xotira xajmining 1-biti ishora uchun 

ajratiladi. Umumiy sondan 1 ni ayirishdan maqsad sonlar diapazoni 0 dan boshlanadi.   



Toifalarni moslashtirish.Toifalar bilan ishlaganda ularni qiymatlarni 1 toifadan 

2-siga o’girishga to’g’ri keladi. Ba’zi o’girishlarni kompilyator avtomatik tarzda o’zi  

bajaradi. Ba’zilariga kod yozish talab etiladi.Kompilyator avtomatik tarzda toifalarni 

moslashtirishiga misollar keltiramiz. 



1-jadval. С++ da toifalarni moslashtirish 

X  bo’linuvchi 

Y bo’luvchi 

Bo’luv natijasi  

misol x = 15 y = 2 

int 


int 

int 


15/2=7 

int 


float 

float 


15/2=7.5 

float 


int 

float 


15/2=7.5 

 

Ba’zida toifalar foydalanuvchilar tomonidan oshkora o’giriladi. Masalan:  



int i=23; float j=12.3,k; 

k=(float)i+j; 

Bu  erda  i  o’zgaruvchisi  haqiqiy  toifaga  o’girilmadi,  faqat  bu  qiymatning 

vaqtinchalik  haqiqiy  toifadagi  nusxasi  yaratilindi.i  o’zgaruvchini  toifasini  boshqa 

toifaga o’girish uchun C++ da quyidagi static_cast funksiyasi ishlatiladi. 



int ret=15; 

static_cast(ret)/2 //natija 7.5 


<>  qavs  ichida  funksiya  argumentidagi  qiymat  yoki  o’zgaruvchi  qaysi  toifaga 

o’girilishi kerakligi ko’rsatiladi. 



Misol. Toifalarni avtomatik va oshkora tarzda o’girilishiga dastur tuzing. 

#include  

#include  

using namespace std; 

 

int main() 



int int_value15 = 15, int_value2 = 2; // int toifali 2 

ta o’zgaruvchi 

float  float_value15  =  15,  float_value2  =  2;  //  float 

toifali 2 ta o’zgaruvchi 

cout<<  fixed  <<  setprecision(2)  //  haqiqiy  sonlarning 

kasr qismini aniqligini kiritish, 2 ga teng 

<< "15   / 2   = " << int_value15   / int_value2   << 

endl   


<<  "15      /  2      =  "  <<  int_value15      /  float_value2 

<
<<  "15      /  2      =  "  <<  float_value15  /  int_value2   

<
<< "15   / 2   = " << float_value15 / float_value2 << 

endl; // toifalar avtomatik moslashtiriladi 

cout<<  "15.0  /  2      =  "  <<  15.0  /  2  <

toifanioshkorao’girish 



<<  "15      /  2.0  =  "  <<  15  /  2.0  <<  endl;  //  toifani 

oshkora o’girish 

cout<<  "float(int_value15)  /  int_value2  =  "  << 

float(int_value15)  /  int_value2  <<  endl  //  toifani 

oshkora o’girish 

<<  "15 /  double(2)  = "  <<  15  /  double(2)  <<  endl;  // 

toifani oshkora o’girish 

cout<< 

"static_cast(15) 







<< 

static_cast(15)  /  2  <<  endl  //  toifani  o’girish 

unar amali yordamida 

<< "static_cast(15) = " << static_cast(15) 

<<  endl    //  ASCII  jadvalidagi  barcha  belgilar  kodlarini 

kiritish mumkin 



<<  "static_cast(20)  =  "  <(20) 

<system("pause"); 

return 0; 

Ushbu toifalardan tashqari C++ da yana bitta  satrtoifasi mavjud. Satr – bu char 



toifadagi elementlar massivi hisoblanadi va oxirgi elementi ikkilik 0 hisoblanadi(yani 


kodi 0 ga teng bo’lgan belgi). Bunday massivga satrli literallar, yani “” belgisi ichida 

belgilar ketma-ketligini o’zlashtirish mumkin.Masalan, quyidagi 3 ta qator bir xil. 



char str1[] = "text"; 

char str2[] = { 't', 'e', 'x', 't', '\0' }; 

char* str3 = "text";   

Ushbu toifaga oid bir qator funksiyalar mavjud. 



Misol.  strncat()  funksiyasi  analogini  yaratish.Bu  funksiya  1-satrga  2-satrning 

boshidagi n  ta belgisini birlashtiradi. 

#include  

using namespace std; 

char* mystrncat(char *s1, char *s2, int num); 

int main() 

char *p1=new char [20]; 



char *p2=new char [20]; 

strcpy(p1, "abce"); 

strcpy(p2, "fghi"); 

char *p3; 

p3=mystrncat(p1,p2, 2); 

cout<


system("pause"); 

char* mystrncat(char *s1, char *s2, int num) 



int len; 

len=strlen(s1); 

int i; 


for(i=0; i

s1[len+i]=s2[i]; 



s1[i]=0; 

return s1; 



Misol.  Strchr()  funksiyasi  analogini  yaratish.  Bu  funksiya  satrdanqidirilayotgan 

belgini  izlaydi  va  1-uchragan  joydan  boshlab  satr  oxirigacha  bo’lgan  qismini 

qaytaradi.  

#include  

using namespace std; 

char* findch(char ma[], char a); 

int main() 




char line[128]; 

char fchar; 

char *pointer; 

cout<<"satrni kiriting: "; 

cin.getline(line,127); 

cout<<"qidirilayotgan belgini kiriting "; 

cin>>fchar; 

pointer=findch(line,fchar); 

cout<<"topilgan qism satr  "<

char* findch(char ma[],char a) 



int i=0; 

while(ma[i]!='\0') 

if(ma[i]==a) 



return&ma[i]; 

else 


i++; 



return NULL; 





 

Download 0.57 Mb.

Do'stlaringiz bilan baham:
1   2   3   4




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