Complex (kompleks) sonli sinf va funksiyalari

|
Complex (kompleks) sonli sinf va funksiyalari
|
bet | 57/143 | Sana | 20.07.2024 | Hajmi | 0,81 Mb. | | #268096 |
Bog'liq Tiplarni dinamik tarzda-fayllar.orgComplex (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.
|
| |