83 - DARS. G’AYRI ODDIY HOLATLARNI DASTURLASH.
G’ayri oddiy holatlarga nol'ga bo’lish, fayl ohiri kabi holatlar kiradi. G’ayri oddiy holatlarni dasturlash uchun C++ tilida Quyidagi uchta hizmatchi so’z ishlatiladi:
try (nazorat qilish)
catch ( ilib olish)
throw ( otli, hosil qilish, generatsiya qilish)
try – hizmatchi so’zi dastur matni ihtiyoriy qismida nazorat qiluvchi blok tashkil qilishga imkon beradi;
try generatorlar
try generatorlar ichida ta'riflar e'lonlar va oddiy generatorlardan tashkil topadi. G’ayri oddiy hodisalar hosil qiluvchi qo’yidagi operator ham ishlatiladi:
throw ifoda.
Bunday operator bajarilganda mahsus chetlanish deb ataluvchi statik ob'ekt hosil qilinadi. Bu obekt tili ifoda tili orqali aniqlanadi.
chetlanishli qayta ishlovchilar quyidagi ko’rinishga ega bo’ladi.
catch (chetlanish tip nomi )
{dasturlar}
Figurali qavs ichidagi operatorlar chetlanishlarni qayta ishlash bloki deb ataladi. Chetlanishliklarni qayta ishlovchi tashqi tomondan va ma'no jihatdan qiymat qaytarmaydigan bitta parametrli funktsiyaga yaqindir. Agar qayta ishlovchilar bir nechta bo’lsa, ular chetlanish tillari farq qilishlari lozimdir. Chetlanishlarni dasturlashni Evklid algoritm misolida ko’rib chiqamiz. Bu algoritm ikki butun manfiy bo’lmagan sonlarning EKUBini topishga mo’ljallangandir. Algoritm har bir qadamida quyidagi amallar bajariladi.
Agar x>=y bo’lsa javob topilgan
Agar xAgar x>y bo’lsa x=x-y
Quyidagi dastur GCM ( ) funktsiyasini o’z ichiga olib, bu funktsiya nazorat qiluvchi blokni o’z ichiga oladi:
#include
int GCM ( int x, int y )
{
try { if (x==0)(y==0)
throw “ \ n zero!”;
if (x<0) throw “ \ negative parameter1”;
If (y<0) throw “ \ negative parameter 2”;
While (x:=y);
else
y=y-x
}
return x;
}
catch ( count char* report)
{cer2 << report << “x= “<return 0
}
}
void main ( )
{
count << “ \ n GCM (66,44)= ”” “ \ n GCM (66,44);
count << “ \ n GCM (0,7)= ”” “ \ n GCM (0,7);
catch (con 2t char * report)
{cer2<}
Natija:
GCM_New (66,44)=22 GCM (0,7)=0
zero: x=0, y=7 GCM negdtive parametr1. x=-12, y=8
GCM (-12,8)=0
Bu dastur birinchi chetlashishni qayta ishlagandan so’ng ishni to’htadi. Chetlanish funktsiya tanasidan tashqaridan qayta ishlagani uchun, qayta ishlovchi funktsiya parametriga murojat qila olmaydi. Bu kamchilikdan halos bo’lish uchun cheklanishni mahsus sinov ob'ekti sifatida hosil qilish mumkindir.
Quyidagi misolda DATA sinfi kiritilgandir.
# include
struct DATA
{ int n,m;
char*S;
DATA (int x, int y, char*c)
{n=x; m=y; s=c;)
};
int GCM_ONE (int n, int y);
{if (x==0||y==0) throw DATA (x,y,”\nZERO!”);
if(x<0) throw DATA (x,y “\n Negative parametr1”);
if(y<0) throw DATA (x,y “\n Negative parametr2”);
while (n!=y)
{if(n>y) x=n-y;
else y=y-x;
}
return x;
}
void main ( )
{ try
{countcountcount}
catch (DATA d);
{cerr<}
Natija
GCM_ONE(66,44)=22
ZERO!x=0,y=7
DATA ishora ob'ekti bu misolda funktsiya tanasida sinf bajarilganda yaratiladi. Bu ob'ekt cheklanish bo’lmaganida chaqirish nuqtasida bo’lar edi. Shunday qilib chegaranishlar sinf ob'ekti bo’lishi lozimdir. Bu sinflarni global ta'riflash shart emas. Asosiy talab tallanish nuqtasida ma'lum
(catch)
misolida DATA sinfi ichida GCM_TWO ( ) funktsyasi. Lekin cheklanishlarni qayta ishlash to’g’ri amalga oshiriladi.
# include
int GCM_ONE (int x, int y)
{struct DATA
{int n, m;
char8S;
DATA (int x, int y, char*c)
{n=x; m=y; s=c;}
};
if (x==0||y=0) throw DATA (x,y “\ZERO!”);
if (x<0) throw DATA (x,y, “\n Negative parametr1”);
if (y<0) throw DATA (x,y, “\n Negative parametr2”);
while (x!=y)
{if (x>y) x=x-y;
else y=y-x;
}
return x;
}
void main ( )
{struct DATA
{int n, m;
char*S;
DATA (int n, int y, char*c)
{n=x; m=y; S=c;)
};
try
{count<cont GCM_ONE (-12,8);
Cont }
catch (DATA d)
{cerr <” <<}
Dastur natijasi:
GCM_TWO (66,44)=22
Negative parametr1
X=12, y=8
Do'stlaringiz bilan baham: |