Nazariy materialar
Download 0.57 Mb. Pdf ko'rish
|
4 AMALIY
- Bu sahifa navigatsiya:
- Dasturga izoh
- Toifalarni moslashtirish.
- X bo’linuvchi Y bo’luvchi Bo’luv natijasi misol
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 a 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
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
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 <> 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
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 oshkora o’girish cout<< "float(int_value15) / int_value2 = " <<
float(int_value15) / int_value2 << endl // toifani oshkora o’girish
toifani oshkora o’girish cout<<
"static_cast /
2
static_cast unar amali yordamida
kiritish mumkin << "static_cast < 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; }
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++; }
} Download 0.57 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling