1-ma’ruza C++ da Sinflar va obyektlar. Konstruktor va destruktor. Sinf usullari reja
Download 86.61 Kb.
|
Algoritmlashga kirish fanidan majmua
- Bu sahifa navigatsiya:
- Sinf qoliplar
- ArrayDouble
Sinf usullarining aniqlanishi
Sinf usulini aniqlash uchun sinf nomidan so’ng ikkita ikki nuqta (::) belgisi, funksiya nomi va uning parametrlari ko’rsatiladi. Masalan: non sinfining patir ob’yektidagi usullarni aniqlash dasturi: # include < iostream.h > class non { public : int baho; int og`irlik; void yasash ( ); }; void non :: yasash ( ); { cout << “hamir qoriladi, zuvala tutiladi, doira holiga keltiriladi”<< endl; } void main ( ) { non patir; patir.baho = 1200; patir.og`irlik = 500; cout <<”men olgan patir “< <<” so’m”< cout <<” u quyidagich yasaladi:”; patir . yasash ( ); } Misollar: #include #include struct waw { char fam[15]; char ism[15]; int tel; int date[3]; }; class note { waw A[3],t; public: void kiritish(); void saralash(); void taqqoslash(); void chiqarish(); }; void note::kiritish() { for( i=0; i<3; i++) { cout<>A[i].fam; cin>>A[i].ism; cin>>A[i].tel; cin>>A[i].date[0]>>A[i].date[1]>>A[i].date[2]; } } // saralash tel. raqamining 1-chi 3 ta raqami bo’yicha void note::saralash() { int x,y; for( i = 0; i < 2; i++) { x = A[i].tel / 10000; for(int j = i; j < 3; j++) { y = A[j].tel / 10000; if(x > y) { t = A[i]; A[i] =A[j]; A[j] = t; } } } } void note::taqqoslash() { char f[15]; int w=0; cout<<”\n\nfamilyani kiriting = “; cin>>f; for(i=0; i<3; i++) if( strcmp(A[i].fam, f)==0) { cout<<«\n\nfamiliya ismi --- >”<cout<<«telifon nomeri---> “< “<w++; break; } if(w==0) cout<<”bunday familiya haqida ma'lumot yo'q”; } void note::chiqarish() { for(i = 0; i < 3; i++) { cout<<”\n\nfamiliya ismi --- >”<cout<<”telifon nomeri--->“ < “<} } void main() { note B; //ob’yekt tavsifi cout<<”ma'lumotlarni kiriting: (familiya, ism, tel.nomer, tug'ilgan sana):\n”; B.kiritish(); cout<<”\n tartiblangan holatda : \n\n”; B.saralash(); B.chiqarish(); cout<<”\n\n kiritilgan familiya haqida malumot chiqarish:\n\n”; B.taqqoslash(); getch(); } y = Ax+B chiziqli tenglama. A koeffisient sifatida first maydoni – kasr son; B koeffisient sifatida kasr son bo’lgan second maydoni olinmoqda. Chiziqli tenglama ildizini aniqlovchi root () usuli tatbiq qilinsin. Usul B koeffisientning nolga teng emasligini tekshirmog’i lozim. #include { float surat; unsigned int maxraj; }; class tenglama { public: kasr A, B; float y, x; void vvod (void); void root(void); }; void tenglama::vvod(void) { cout << «\n x = « ; cin >> x; cout << «\nA kasr surati = « ; cin >> A.surat; cout << «\nA kasr maxraji = « ; cin >> A.maxraj; cout << «\nB kasr surati = « ; cin >> B.surat; cout << «\nB kasr maxraji = « ; cin >> B.maxraj; } void tenglama::root(void) { y = x * (float)(A.surat / A.maxraj) + (float)(B.surat / B.maxraj); } int main(int argc, char* argv[]) { tenglama C; C.vvod(); C.root(); cout << “\n\nnatija :\n y =”<< C.y ; getch(); return 0; } Qiymatlari gradus va minutlarda berilgan tekislikdagi burchaklar bilan ishlovchi Angle sinfi tuzilsin. Bunda radianlarga o’tkazish, 0-360 diapazonga keltirish, burchakni berilgan qiymatga ko’paytirish yoki kamaytirish, sinusni tashkil etish, burchaklarni taqqoslashni tatbiq etilsin. #include { float gradus; float minut; float radian; float sinus; public : void read(void);//float *gradus, float *minut, float *sinus); void converter(void); void write(void); }; void angle :: converter(void) { radian = (gradus + minut / 60) / 180 * 3.14; } void angle :: read(void)//float *gradus_value, float *minut_value, float *sinus_value) { cout << «\ngradus = « ; cin >> gradus ; if(gradus > 360) { int qoldiq = gradus; qoldiq = qoldiq % 360; gradus = qoldiq; } cout <<”minut =”; cin >> minut ; radian = (gradus + minut / 60) / 180 * 3.14; sinus = sin(radian * 180 / 3.14); } void angle :: write(void) { cout <<”\ngradus = ” << gradus; cout <<”\nminut = ” << minut; cout << ”\nradian = ” << radian; cout <<”\nburchak sinusi = ” << sinus; } int main(int argc, char* argv[]) { angle info[10]; int n, i, min, max; cout << ”elementlar soni =” ; cin >> n ; for(i = 0; i < n; i++) { cout << i + 1 <<”- inchi ma’lumotni kiriting” ; info[i].read(); } cout << ”\nnatija : \n” ; for(i = 0; i < n; i++) { cout <<”\n\n”<< i <<” - inchi ma’lumotni : “ ; info[i].write(); } getch(); return 0; } Student sinfi tashkil etilib, guruh talabalari orasidan 4 va 5 baho olgan talabalarni familiyasi, guruhi chiqadigan dastur tuzilsin. #include { public : char fam[20]; int baho; int guruh; int bilimdon (int ); }; int student :: bilimdon (int x) { if(x>=4) return x; else return 0; } int main ( ) {student alo[10]; int i,a=0; for (i=0;i<5;i++){ cout<>alo[i]. fam; cout<< ”guruhi: ”; cin>>alo[i].guruh; cout<< ”bahosi: ”; cin>>alo[i].baho;} cout<<”4 va 5 olgan talabalar: ”< int y=alo[i] . bilimdon (alo[i].baho ); if(y!=0){a++; cout<< familiya: ”< return 0; } Uchburchakni aniqlashtiruvchi Triangle sinfi tashkil etilsin. Ma’lumotlar maydoni tarkibiga burchaklar va tomomnlari kiritilsin. Berilganlar maydonlarini olish va o’zgartirish, yuzasini hisoblash, perimetrni hisoblash, balandliklarni hisoblash hamda uchburchak turini aniqlash amallarini joriy etish talab etiladi. #include #pragma hdrstop #include #include #include #pragma argsused class triangle { float x[3]; float y[3]; float tomon[3]; float h[3]; float s; float p; char stil_treugolnik[101]; public : void vvod(void); void schitat(void); }; void triangle :: vvod(void) { cout << “\nA uchni \nX =” ; cin >> x[0]; cout << “Y =” ; cin >> y[0]; cout <<“\nB uchni \nX = ” ; cin >> x[1]; cout <<“Y = ” ; cin >> y[1]; cout <<“\nC uchni \nX = ” ; cin >> x[2]; cout << “Y = ” ; cin >> y[2]; } void triangle :: schitat(void) {
cout <<”\n ucburchak tomonlari : “< float p2 = p; s = sqrt(p2 * (p2-tomon[0])*(p2-tomon[1])*(p2- tomon[2]) ); cout << “\nyuza =”<< s;
cout <<”\n balandliklar :”< tomon[2] || tomon[0] == tomon[2]) strcpy(stil_treugolnik, “teng yonli”); else strcpy(stil_treugolnik, “turli tomonli”); cout <<”\n uchburchak turi :”< int main(int argc, char* argv[]) { triangle info; info.vvod(); info.schitat(); getch(); return 0; } Sinf qoliplar Keling, bunday muammoning misolini ko'rib chiqaylik va qoliplar uni hal qilishda bizga qanday yordam berishi mumkin. Konteyner sinflari haqidagi darsda biz ma'lum bir turdagi ma'lumotlarning bir nechta ob'ektlarini o'z ichiga olgan sinflarni amalga oshirish uchun kompozitsiyadan qanday foydalanishni bilib oldik . Misol sifatida biz ArrayInt sinfidan foydalandik: #ifndef ARRAYINT_H #define ARRAYINT_H #include class ArrayInt { private: int m_length; int *m_data; public: ArrayInt() { m_length = 0; m_data = nullptr; } ArrayInt(int length) { assert(length > 0); m_data = new int[length]; m_length = length; } ~ArrayInt() { delete[] m_data; } void Erase() { delete[] m_data; // Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating! m_data = nullptr; m_length = 0; } int& operator[](int index) { assert(index >= 0 && index < m_length); return m_data[index]; } int getLength() { return m_length; } }; #endif Bu sinf butun sonlar qatorini yaratishning oson yo'lini ta'minlasa-da, agar biz ikki tomonlama qiymatlar bilan ishlashimiz kerak bo'lsa-chi? An'anaviy dasturlash usullaridan foydalanib, biz dublonlar bilan ishlash uchun yangi ArrayDouble #ifndef ARRAYDOUBLE_H #define ARRAYDOUBLE_H #include class ArrayDouble { private: int m_length; double *m_data; public: ArrayDouble() { m_length = 0; m_data = nullptr; } ArrayDouble(int length) { assert(length > 0); m_data = new double[length]; m_length = length; } ~ArrayDouble() { delete[] m_data; } void Erase() { delete[] m_data; // Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating! m_data = nullptr; m_length = 0; } double & operator[](int index) { assert(index >= 0 && index < m_length); return m_data[index]; } int getLength() { return m_length; } }; #endif Kod juda ko'p bo'lsa-da, sinflar deyarli bir xil, faqat ma'lumotlar turi o'zgaradi! Siz taxmin qilganingizdek, bu qoliplardan foydalanish uchun ideal holat. Sinf qolipini yaratish funksiya qolipini yaratishga o'xshaydi . Masalan, Array sinf qolipini yaratamiz: Array.h #ifndef ARRAY_H #define ARRAY_H #include template class Array { private: int m_length; T *m_data; public: Array() { m_length = 0; m_data = nullptr; } Array(int length) { m_data = new T[length]; m_length = length; } ~Array() { delete[] m_data; } void Erase() { delete[] m_data; // Osilib turgan ko'rsatkichni oldini olish uchun m_data ni nullptr ga o'rnating! m_data = nullptr; m_length = 0; } T& operator[](int index) { assert(index >= 0 && index < m_length); return m_data[index]; } // Massiv uzunligi har doim butun son bo'lib, massiv elementlarining turiga bog'liq emas. int getLength(); // определяем метод и шаблон метода getLength() ниже }; template int Array #endif Ko'rib turganingizdek, bu versiya ArrayInt versiyasi bilan deyarli bir xil, faqat biz sinf qolipining parametr deklaratsiyasini qo'shdik va ma'lumotlar turini int dan ga o'zgartirdik T. E'tibor bering, biz getLength() funksiyasini sinf tanasidan tashqarida belgilaganmiz. Bu ixtiyoriy, lekin yangi boshlanuvchilar odatda sintaksis tufayli qoqilib ketishadi. Sinf tanasidan tashqarida e'lon qilingan har bir sinf qolip usuli o'zining qolip deklaratsiyasiga muhtoj. Shuni ham yodda tutingki, sinf qolipining nomi Array Array sinf qolipini ishlatadigan misol: #include #include "Array.h" int main() { Array Array for (int count = 0; count < intArray.getLength(); ++count) { intArray[count] = count; doubleArray[count] = count + 0.5; } for (int count = intArray.getLength()-1; count >= 0; --count) std::cout << intArray[count] << "\t" << doubleArray[count] << '\n'; return 0; } Natija: 9 9.5
7 7.5 6 6.5 5 5.5 4 4.5 3 3.5 2 2.5 1 1.5 0.5 Sinf qoliplari xuddi funksiya qoliplari kabi ishlaydi: kompilyator sinf qolipini nusxalaydi, sinf qoliplari parametrlari turlarini haqiqiy (o'tgan) ma'lumotlar turlari bilan almashtiradi va keyin nusxani kompilyatsiya qiladi. Agar sizda sinf qolipiga ega bo'lsangiz, lekin undan foydalanmasangiz, kompilyator hatto uni kompilyatsiya qilmaydi. Sinf qoliplari konteyner sinflarini amalga oshirish uchun juda mos keladi, chunki ko'pincha bunday sinflar turli xil ma'lumotlar turlari bilan ishlashlari kerak va qoliplar buni minimal kod miqdorida tartibga solishga imkon beradi. Sintaksis biroz xunuk va xato xabarlari ba'zan "katta" bo'lishi mumkin bo'lsa-da, sinf qoliplari haqiqatan ham C++ tilining eng yaxshi va foydali xususiyatlaridan biridir. Download 86.61 Kb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling