201-guruh talabasi Rustamov Farruxning Mustaqil ishi


Download 107.08 Kb.
bet4/4
Sana18.06.2023
Hajmi107.08 Kb.
#1572788
1   2   3   4
Bog'liq
Rustamov Programalash maruza

C++ istisno turlari

C++ kodda ishlatilishi mumkin bo'lgan sinfida aniqlangan standart istisnolar ro'yxatini taqdim etadi. Ushbu istisnolar ierarxiya bo'yicha joylashtirilgan:





Istisno

Tavsif

std::exception

Istisno va barcha standart C++ istisnolarining asosiy klassi.

std :: bad_alloc

Odatda yangi tomonidan tashlanadi.

std :: bad_cast

Odatda dynamic_cast tomonidan tashlanadi.

std :: bad_typeid

Odatda typeid tomonidan tashlanadi.

std :: bad_exception

Kutilmagan istisnolarni hal qilish uchun foydali qurilma.

std :: logic_failure

Kodni o'qish orqali aniqlanishi mumkin.

std :: runtime_error

Kodni o'qish orqali aniqlab bo'lmaydi.

std::domain_error

Matematik jihatdan yaroqsiz domendan foydalanilganda tashlanadi.

std::invalid_argument

Yaroqsiz argumentlardan foydalanilganda tashlanadi.

std::length_error

Katta std::string yaratilganda tashlanadi.

std::out_of_range/td>

at usuli bilan tashlangan.

std :: overflow_error

Matematik toshib ketish sodir bo'lganda tashlanadi.

std::range_error

Diapazondan tashqaridagi qiymatni saqlashga urinayotganda tashlanadi.

std :: underflow_error

Matematik kam oqim sodir bo'lganda tashlanadi.




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; jcout << array[j] << " ";
return 0;
}

Download 107.08 Kb.

Do'stlaringiz bilan baham:
1   2   3   4




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