REJA - Tiplarni dinamik tarzda

|
Tiplarni dinamik tarzda
|
bet | 51/131 | Sana | 13.05.2024 | Hajmi | 1,83 Mb. | | #228405 |
Bog'liq Tiplarni dinamik tarzda6- MA’RUZA
MAVZU: Sonli sinflar bilan ishlash
REJA
Complex sonli sinf va funksiyalari
Vallaray sonli sinf va funksiyalari
Slice va gslice sonli sinflari va funksiyalari
Qo‘shimcha sonli sinflar
Complex (kompleks) sonli sinf va funksiyalari. C++ standarti kutubxonasidagi kompleks sonlar sinfi obʻyekt modelidan foydalanishning yaxshi namunasidir. Arifmetik amallar qayta aniqlash tufayli bu sinf obʻyektlari o‘rnatilgan maʻlumot tiplaridan biriga tegishli kabi ishlatiladi. Bundan tashqari, anʻanaviy arifmetik o‘zgaruvchilar va kompleks sonlar bir vaqtning o‘zida ixtiyoriy amallarda ishtirok etishi mumkin. (Eslatib o‘tamiz, bu yerda kompleks sonlar matematikasiga oid umumiy savollar bilan shug‘ullanmayapmiz. Matematika bo‘yicha kopleks sonlar nazariyasini o‘qish kerak).
Kalit so‘zlar: kutubxona, sinf, shablon, matematik amallari, kompleks son, to‘plam,
to‘plam osti, to‘lam ustida amalar, saralash, interval son.
Hayot turmush tarzida foydalaniladigan sonlar to‘plamlardan boshqa sonlar to‘plami va ular ustida bajarilajigan amallar mavjud. Masalan, maktabdan bilamizki, kompleks sonlar, oraliq sonlar, qolaversa, zamonaviy ilmiy sohalarda turli fazolarda turlicha sonlar to‘plami ishlatiladi. Interval sonlari, noravshan to‘plamlar shular kabi. Bu sonlar to‘plami hayotdagi qaysidir tizimni modellashtirish va uni jarayonlariga oid masalalarni yechishga xizmat qiladi. Bu masalarni ayniqsa kompyuterda yechish kerak. Shuning uchun baʻzi bir ko‘p foydalaniladigan sonlar to‘plami uchun sinflar yaratilgan. Bu sonlarda ularning amallari, funksiyalari xususiyatlari keltirilgan. Bunday sonlarga complex, vallaray, slice, gslice kabi sinflar va muallif tomonidan 2013 yilda yaratilgan interval sinf kutubxonalarini misol qilib olish mumkin.
Complex (kompleks) sonli sinf va funksiyalari. C++ standarti kutubxonasidagi kompleks sonlar sinfi obʻyekt modelidan foydalanishning yaxshi namunasidir. Arifmetik amallar qayta aniqlash tufayli bu sinf obʻyektlari o‘rnatilgan maʻlumot tiplaridan biriga tegishli kabi ishlatiladi. Bundan tashqari, anʻanaviy arifmetik o‘zgaruvchilar va kompleks sonlar bir vaqtning o‘zida ixtiyoriy amallarda ishtirok etishi mumkin. (Eslatib o‘tamiz, bu yerda kompleks sonlar matematikasiga oid umumiy savollar bilan shug‘ullanmayapmiz. Matematika bo‘yicha kopleks sonlar nazariyasini o‘qish kerak).
Bu sinfni ishlatish uchun complex sarlavha fayl qo‘shilishi kerak. Kichik dastur fragmentiga qarang:
#include
// ...
complex a; complex b;
// ...
complex< double > c = a * b + a / b;
|
Kompleks va arifmatik amallar o‘zaro hamkorlikda bajarailadi.
complex< double > a;
complex< double > complex_obj = a + 3.14159;
|
Kompleks tiplarni arifmetik tiplar bilan ham yaratish va ular uchun operator= ni ishlatish mumkin.
complex< double > complex_obj; double dval = 3.14159; complex_obj = dval;
// ....
int ival = 3; complex_obj = ival;
|
Ammo teskarisi, yaʻni kopmleks tipni arifmetik tipga tenglashtirish mumkin emas.
complex< double > complex_obj;
double dval = complex_obj;
|
Bunda arifmetik tipni akslantirish xato degan xabar beradi.
Kompleksning 2 qismi bo‘ladi haqiqiy va mavhum. Haqiqiy (real) yoki mavhum – qismini oddiy arifmetik tipga qiymat qilib berish mumkin. Kompleks sonlar sinfi o‘z navbatida real va mavhum qismlarni qaytaruvchi ikkita funksiyaga ega. Biz sinf aʻzolaridan foydalanish uchun sintaktiki yordamida ularni olishimiz mumkin:
double re = complex_obj.real();
double im = complex_obj.imag();
|
Yoki bu sintaktikga ekvivalet sintaktik:
double re = real(complex_obj);
double im = imag(complex_obj);
|
Kompleks son sinfi to‘rt matematik amallar - operatorlari qo‘llab-quvvatlaydi.
Bularga [+=], [-=], [*=] va [/=] operatorlari kiradi. Masalan,
complex< double > complex_obj; complex< double > second_complex_obj;
complex_obj += second_complex_obj;
|
Kompleks sonlarni kiritish/chiqarish ham qo‘llab-quvvatlanadi. Chiqish operatori vergullar bilan ajratilgan real va mavhum qismlarni qavslar ichida chop etadi. Masalan, chiqish operatorlarini bajarish natijasi:
complex< double > complex0( 3.14159, -2.171 ); complex< double > complex1( complex0.real() );
cout << complex0 << " " << complex1 << endl;
|
output
|
(3.14159,-2.171) (3.14159,0)
|
Kirishtish operatorlari quyidagi formatlar bilan ishlaydi: Kompleks soning real qismini kiritish oddiy kiritiladi, masalan, 525.25; mavhum qismi qavslar ichida kiritiladi, masalan, (123.5), to‘liq kiritish uchun qavs ichida real va mavhum qismlari vergul bilan ajratiladi. C++ standarti ko‘ra, bu operatorlar bo‘lishi kerak, ishlab chiqaruvchilar ko‘pincha standartlarni yozib tugatishga etib kelolmaydilar.
Bunday amallarni amalga oshirish uchun o‘z operatorimizni aniqlashimiz mumkin. Bu yerda qo‘shish operatorini amalga oshiruvchi funksiyaning varianti keltirilgan.
inline complex& operator+=( complex &cval, double dval ){ return cval += complex( dval );
}
|
Bu misol yordamida, turi boshqa murakkab tayinlash uchun uch operatorlari funksiyalarini yozish muammo emas. Quyidagi dastur uchun murakkab tayinlash
uchun uch operatorlari funksiyalarini qo‘shing va tekshirish uchun uni ishga tushirish.
int main() {
complex< double > cval ( 4.0, 1.0 ); cout << cval << endl;
cval += 1;cout << cval << endl; cval -= 1;
cout << cval << endl; cval *= 2;
cout << cval << endl; cout /= 2.;
cout << cval << endl; system("pause");}
|
C++ standartida kompleks son uchun inkrement va dekrement amallarining bajarilishi ko‘rsatilmagan. Biroq, ularning semantikasi juda aniq, agar cval + = 1 ni yoza olsak, bu cvalning haqiqiy qismini 1 bilan oshirishni anglatadi, unda inkrement amali juda oson ko‘rinadi. Murakkab < double> tipi uchun bu amallarni amalga oshirish va quyidagi dasturni ishga tushirish:
int main() {complex< double > cval( 4.0, 1.0 );
cout << cval << endl;
++cva1;cout << cval << endl;
}
|
Bu yuqoridagilardan tashqari kompleks sonlari bilash ishlash sinfining ko‘plab, matematik funksiyalar mavjud. Ammo C++ standartiga qarab ayrim amallardan, funksiyalardan foydalanib bo‘lmaydi. Shuning uchun foydalanuvchining o‘z mustaqil kutubxona yaratib ishlashi maqul.
|
| |