201-guruh talabasi Rustamov Farruxning Mustaqil ishi
Download 107.08 Kb.
|
Rustamov Programalash maruza
- Bu sahifa navigatsiya:
- Istisno Tavsif
- C++ da istisnolarni tashlash
- Mustaqil ish 8
C++ istisno turlari
C++ kodda ishlatilishi mumkin bo'lgan
C++ da istisnolarni tashlash Istisnolar boshqaruvni ishlov beruvchilar deb ataladigan maxsus funktsiyalarga o'tkazish orqali dasturlardagi istisno holatlarga javob berish usulini ta'minlaydi. Quyidagi sabablarga ko'ra an'anaviy xatolarni qayta ishlashdan ko'ra zamonaviy C++ da istisnolar afzal ko'riladi: Ular qo'ng'iroq kodini xato holatlarini aniqlashga va ularni boshqarishga majbur qiladi. Bu ularning dastur bajarilishini to'xtatishiga to'sqinlik qiladi. C++ istisno sodir bo'lgandan keyin barcha ob'ektlarni yo'q qiladi va shu bilan resurslardan foydalanishni kamaytiradi. Istisno xatoni aniqlaydigan kod va xatoni hal qiluvchi kod o'rtasida toza ajratishni ta'minlaydi. Xato turlarini birgalikda guruhlash mumkin, bu istisno ob'ektlarning ierarxiyasini yaratish, ularni nomlar bo'shliqlari yoki sinflar bo'yicha guruhlash va ularni turiga qarab toifalarga ajratish imkonini beradi. Istisno throw C++ da kalit so'z yordamida chiqariladi. Kalit throw so'z dasturchiga maxsus istisnolarni belgilash imkonini beradi. Mustaqil ish 8 Masala: “ArrayInt” sinfini haqiqiy son uchun “ArrayFloat” ko’rinishida yozish. }#ifndef ARRAYINT_H #define ARRAYINT_H #include class ArrayFloat { private: int m_length; float *m_data; public: ArrayFloat(): m_length(0), m_data(nullptr) {} ArrayFloat(int length): m_length(length) { assert(length >= 0); if (length > 0) m_data = new float[length]; else m_data = nullptr; } ~ArrayFloat() { delete[] m_data; } void erase() { delete[] m_data; // Chiqishda keraksiz koʻrsatkich boʻlmasligi uchun m_data ga nullptr ni oʻrnatish m_data = nullptr; m_length = 0; } float& operator[](int index) { assert(index >= 0 && index < m_length); return m_data[index]; } // reallocate() funksiyasi massiv hajmini oʻzgartiradi. Massiv ichidagi barcha mavjud elementlar yoʻq qilinadi. Jarayon tez void reallocate(int newLength) { // Massiv ichidagi barcha mavjud elementlarni olib tashlash erase(); // Agar massivimiz boʻsh boʻlishi kerak boʻlsa, bu yerga qaytish if (newLength <= 0) return; // Keyin yangi elementlarni ajratish m_data = new float[newLength]; m_length = newLength; } // resize() funksiyasi massiv hajmini oʻzgartiradi. Barcha mavjud elementlar saqlanadi. Jarayon sekin void resize(int newLength) { // Agar massiv kerakli uzunlikda boʻlsa, return buyrugʻini bajaring if (newLength == m_length) return; // Agar massivni boʻsh qilish kerak boʻlsa, buni bajaring va keyin return-ni bajaring if (newLength <= 0){erase();return; } // Endi, deylik newLength kamida bitta elementga ega. Quyidagi harakatlar ketma-ketligi amalga oshiriladi: // 1. Yangi massivni ajratish. // 2. Mavjud massivdagi elementlarni yangi tanlangan massivimizga nusxalash. // 3. Eski massivni yoʻq qilish va yangi massivga ishora qilish uchun m_data buyrugʻini berish. // Yangi massiv ajratish float *data = new float[newLength]; // Keyin yangi massivga nusxa koʻchirish uchun elementlar soni bilan shugʻullanish kerak. // Kichik massivda qancha element boʻlsa, shuncha koʻp nusxa koʻchirishimiz kerak if (m_length > 0) { int elementsToCopy = (newLength > m_length) ? m_length : newLength; // Поочередно копируем элементы for (int index=0; index < elementsToCopy ; ++index) data[index] = m_data[index]; } // Eski massivni oʻchirib tashlash, chunki endi kerak emas delete[] m_data; // Eskisini oʻrniga yangisini ishlatish. E'tibor bering, m_data yangi dinamik ravishda ajratilgan massivimiz koʻrsatgan manzilga ishora qiladi. // Ma’lumotlar dinamik ravishda ajratilganligi sababli, ular koʻrinish sohasidan chiqib ketganda yoʻq qilinmaydi m_data = data; m_length = newLength; } void insertBefore(int value, int index) { // Oʻtkazilgan indeksning toʻgʻriligini tekshirish assert(index >= 0 && index <= m_length); // Eski massivdan bir element kattaroq yangi massiv yaratish float *data = new float[m_length+1]; // Barcha elementlarni indeksgacha nusxalash for (int before=0; before < index; ++before) data[before] = m_data[before]; // Yangi elementni yangi massivga joylashtirish data [index] = value; // Kiritilgan elementdan keyin barcha qiymatlarni nusxalash for (int after=index; after < m_length; ++after) data[after+1] = m_data[after]; // Eski massivni oʻchirish va uning oʻrniga yangi massivdan foydalanish delete[] m_data; m_data = data; ++m_length; } void remove(int index) { // Oʻtkazilgan indeksning toʻgʻriligini tekshirish assert(index >= 0 && index < m_length); // Agar bu massivning oxirgi elementi boʻlsa, u holda massivni boʻshatamiz va returnga oʻtamiz if (m_length == 1){ erase(); return; } // Eski massivdan bir element kichik yangi massiv yaratish float *data = new float[m_length-1]; // Barcha elementlarni indeksgacha nusxalash for (int before=0; before < index; ++before) data[before] = m_data[before]; // Oʻchirilgan elementdan keyin barcha qiymatlarni nusxalash for (int after=index+1; after < m_length; ++after ) data[after-1] = m_data[after]; // Eski massivni oʻchirish va uning oʻrniga yangi massivdan foydalanish delete[] m_data; m_data = data; --m_length; } // Qulaylik uchun bir nechta qoʻshimcha funksiyalar void insertAtBeginning(int value) { insertBefore(value, 0); } void insertAtEnd(int value) { insertBefore(value, m_length); } int getLength() { return m_length; } }; #endif //Edi dasturni testdan oʻtkazamiz (-listing). #include //#include using namespace std; int main() { // 10 ta elementdan iborat massivni e'lon qilish ArrayFloat array(10); // Massivni 1 dan 10 gacha raqamlar bilan toʻldirish for (int i=0; i<10; i++) array[i] = i*1./125; // Massiv hajmini 7 ta elementga oʻzgartirish array.resize(7); // 4-indeksdagi elementdan oldin 15 raqamini qoʻyish array.insertBefore(15, 4); // 5-indeksdagi elementni olib tashlash array.remove(5); // 35 va 50 raqamlarini oxiriga va boshiga qoʻshish array.insertAtEnd(35); array.insertAtBeginning(50); // Massivning barcha elementlarini koʻrsatish for (int j=0; j return 0; } Download 107.08 Kb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling