Axborot texnologiyalari” kafedrasi “Dasturlash tillari” fanidan kurs ishi mavzu


Download 75.61 Kb.
bet5/6
Sana27.01.2023
Hajmi75.61 Kb.
#1132440
1   2   3   4   5   6
Bog'liq
Kompleks sonlar sinfi

Operatorlarni qayta yuklash
C++ dasturlash tilida operatorlani biror belgilangan vazifa bo’yicha sinflarda qayta aniqlash imkoniyati mavjud. Bu jarayonni operatorlarni qayta yuklash deyiladi. Operatorlarni qayta yuklash imkoniyati sinflarda operatorlarning qo’llanilishini yanada kengaytiradi. Misol uchun ‘+’ operatori sonlarni qiymatini qo’shishni, ikkita satrni biriktirishni bajaradi, lekin ikkita sonli massivni mos elementlarini qo’shishni bajara olmaydi. Buning uchun massivlarning elementlarini bir-biriga qo’shishni mos ravishda sinfda ‘+’ operatorini qayta aniqlab bajarish mumkin. Operatorlarni unar va binar operatorlarga ajratish mumkin. Unar operatorlar bitta operand bilan, binar operatorlar ikkita operand bilan qo’llaniladi
Sinflar va tuzilmalardagi usullar bilan bir qatorda biz operatorlarni ham aniqlashimiz va ortiqcha yuklashimiz mumkin. Masalan, bizda quyidagi Counter klassi bor
class Counter
{
public int Value { get; set; }
}
Bu sinf ba'zi hisoblagichni ifodalaydi, uning qiymati Value xususiyatida saqlanadi.
Aytaylik, bizda Counter sinfining ikkita ob'ekti bor - standart taqqoslash va qo'shish operatsiyalari yordamida Value xususiyatiga qarab solishtirmoqchi yoki qo'shmoqchi bo'lgan ikkita hisoblagich:
Counter counter1 = new Counter { Value = 23 };
Counter counter2 = new Counter { Value = 45 };
bool result = counter1 > counter2;
Counter c3 = counter1 + counter2;

Ammo hozirda Counter ob'ektlari uchun na taqqoslash operatsiyasi, na qo'shish amali mavjud emas. Bu operatsiyalar bir qator ibtidoiy turlarda qo'llanilishi mumkin. Masalan, sukut bo'yicha biz raqamli qiymatlarni qo'shishimiz mumkin, ammo kompilyator murakkab turdagi ob'ektlarni - sinflar va tuzilmalarni qanday qo'shishni bilmaydi. Va buning uchun bizga kerak bo'lgan operatorlarni ortiqcha yuklashimiz kerak.


Operatorni haddan tashqari yuklash biz ob'ektlari uchun operatorni aniqlamoqchi bo'lgan sinfda maxsus usulni aniqlashdan iborat:
public static возвращаемый_тип operator оператор(параметры)
{ }
Ushbu usulda umumiy statik modifikatorlar bo'lishi kerak, chunki haddan tashqari yuklangan operator ushbu sinfning barcha ob'ektlari uchun ishlatiladi. Keyin qaytish turining nomi keladi. Qaytish turi biz ob'yektlarni olmoqchi bo'lgan turni ifodalaydi. Masalan, ikkita Counter ob'ektini qo'shish orqali biz yangi Counter ob'ektini olishni kutamiz. Va ikkalasini solishtirish natijasida biz bool tipidagi ob'ektni olishni xohlaymiz, bu shartli ifodaning to'g'ri yoki noto'g'ri ekanligini ko'rsatadi. Ammo vazifaga qarab, qaytarish turlari har qanday bo'lishi mumkin.
So'ngra usul nomi o'rniga operator kalit so'zi va operatorning o'zi mavjud. Va keyin parametrlar qavs ichida keltirilgan. Binar operatorlar ikkita parametrni, unarli operatorlar bitta parametrni oladi. Va har qanday holatda, parametrlardan biri operator aniqlangan turni - sinf yoki tuzilmani ifodalashi kerak.
class Counter
{
public int Value { get; set; }
public static Counter operator +(Counter counter1, Counter counter2)
{
return new Counter { Value = counter1.Value + counter2.Value };
}
public static bool operator >(Counter counter1, Counter counter2)
{
return counter1.Value > counter2.Value;
}
public static bool operator <(Counter counter1, Counter counter2)
{
return counter1.Value < counter2.Value;
}
}
Barcha haddan tashqari yuklangan operatorlar ikkilik bo'lgani uchun - ya'ni ular ikkita ob'ektda amalga oshiriladi, har bir ortiqcha yuk uchun ikkita parametr mavjud.
Qo'shish amalida biz Counter sinfining ikkita ob'ektini qo'shmoqchi bo'lganimiz sababli, operator ushbu sinfning ikkita ob'ektini qabul qiladi. Va biz qo'shish natijasida yangi Counter ob'ektini olishni xohlayotganimiz sababli, bu sinf qaytish turi sifatida ham qo'llaniladi. Ushbu operatorning barcha harakatlari Value xususiyati ikkala parametrning Value xususiyatining qiymatlarini birlashtirgan yangi ob'ektni yaratishga to'g'ri keladi:
public static Counter operator +(Counter counter1, Counter counter2)
{
return new Counter { Value = counter1.Value + counter2.Value };
}

Ikki taqqoslash operatori ham qayta aniqlandi. Agar biz ushbu taqqoslash operatorlaridan birini qayta belgilasak, u holda ushbu taqqoslash operatorlarining ikkinchisini ham qayta belgilashimiz kerak. Taqqoslash operatorlarining o'zlari Value xususiyatlarining qiymatlarini solishtiradilar va taqqoslash natijasiga qarab, rost yoki noto'g'ri qiymatlarni qaytaradilar.


Endi dasturda haddan tashqari yuklangan operatorlardan foydalanamiz:
Counter counter1 = new Counter { Value = 23 };
Counter counter2 = new Counter { Value = 45 };
bool result = counter1 > counter2;
Console.WriteLine(result); // false
Counter counter3 = counter1 + counter2;
Console.WriteLine(counter3.Value); // 23 + 45 = 68
Shuni ta'kidlash kerakki, operator ta'rifi mohiyatan usul bo'lganligi sababli, biz bu usulni ortiqcha yuklashimiz mumkin, ya'ni uning uchun boshqa versiyani yaratishimiz mumkin. Masalan, Counter sinfiga boshqa operator qo'shamiz:
public static int operator +(Counter counter1, int val)
{
return counter1.Value + val;
}
Bu usul Value xususiyatining qiymatini va ba'zi sonlarni qo'shib, ularning summasini qaytaradi. Shuningdek, biz ushbu operatorni qo'llashimiz mumkin:
Counter counter1 = new Counter { Value = 23 };
int result = counter1 + 27; // 50
Console.WriteLine(result);
Operatorlarni ortiqcha yuklaganda, barcha operatorlarni ortiqcha yuklash mumkin emasligini yodda tuting. Xususan, biz quyidagi operatorlarni ortiqcha yuklashimiz mumkin:

birlik operatorlar +x, -x, !x, ~x, ++, --, true, false


ikkilik operatorlar +, -, *, /, %


taqqoslash operatorlari ==, !=, <, >, <=, >=


bitli operatorlar &, |, ^, <<, >>


mantiqiy operatorlar &&, ||




Xulosa
Kompleks son deb a+bi ifodaga aytiladi, bu yerda a va b haqiqiy sonlar, i – mavhum birlik bo’lib, u yoki i2= -1 tengliklar bilan aniqlanadi; a – kompleks sonning haqiqiy qismi, bi – mavhum qismi deyiladi. Faqat mavhum qismining ishorasi bilan farq qiladigan ikki kompleks son: a+bi va a-bi o’zaro qo’shma deyiladi.
1. Qo’shish amali. α1=a1+b1i va α2=a2+b2i kompleks sonlarning yig’indisi deb haqiqiy qismi qo’shiluvchi kompleks sonlar haqiqiy qismlarining yig’indisiga, mavhum qismi ularning mavhum qismlarining yig’indisiga teng bo’lgan α kompleks songa aytiladi va u quyidagicha yoziladi:
α=( a1+ a2) + (b1+ b2)i
2. Ayirish amali. α1=a1+b1i kompleks sondan α2=a2+b2i kompleks sonning ayirmasi deb α1 va α2 ga qarama-qarshi bo’lgan – α2 sonlarning yig’indisidan iborat bo’lgan kompleks songa aytiladi:
α= α1 + (-α2)= ( a1 - a2) + (b1 - b2)i
3. Ko’paytirish amali. α1=a1+b1i va α2=a2+b2i kompleks sonlarning ko’paytmasi
α= α1× α2=(a1a2 – b1b2) + (a1b2 + a2b1)i
4. Bo’lish amali. . α1=a1+b1i kompleks sonning α2=a2+b2i kompleks songa bo’linmasi deb α1= α× α2 tenglikni qanoatlantiradigan α kompleks songa aytiladi va u quyidagi formula bilan topiladi:

Dasturning ishlashi bu ikkita kompleks soning qo’shilmasi, ayirmasi, ko’paytmasi va bo’linmasini hisoblaydi. Ikkita quydagi ko’rinishdagi α1=a1+b1i α2=a2+b2i ko’mpleks son berilgan deb tasavvur qilamiz va dastur kodi ikkita ko’pleks sonning qo’shilmasi, ayirmasi, ko’paytmasi va bo’linmasini chiqaradi.
Kompleks sonlar uchun arifmetik amallar bajaruvchi dastur yaratish uchun dastur qismida α=a+bi ko’rinsihdagi kompleks sonni mavhum qismi i-ni Console (qora oyna)ga chiqarish uchun i-ni yozuv ko’rinishda oldim, a va b esa haqiqiy(dobule) turdagi o’zgaruvchidir.
C# dasturlash tilida operatorlani biror belgilangan vazifa bo’yicha sinflarda qayta aniqlash imkoniyati mavjud. Bu jarayonni operatorlarni qayta yuklash deyiladi. Operatorlarni qayta yuklash imkoniyati sinflarda operatorlarning qo’llanilishini yanada kengaytiradi. Misol uchun ‘+’ operatori sonlarni qiymatini qo’shishni, ikkita satrni biriktirishni bajaradi, lekin ikkita sonli massivni mos elementlarini qo’shishni bajara olmaydi. Buning uchun massivlarning elementlarini bir-biriga qo’shishni mos ravishda sinfda ‘+’ operatorini qayta aniqlab bajarish mumkin. Operatorlarni unar va binar operatorlarga ajratish mumkin. Unar operatorlar bitta operand bilan, binar operatorlar ikkita operand bilan qo’llaniladi. Keyingi unar amallarni qayta yuklash mumkin: +, -, !, ~, ++, --
Unar operatorni qayta yuklashning umumiy formati quyidagi ko’rinishga ega:
public static qaytariladigan_tur operator op(operand_turi operand)
{
// Operatorni qayta yuklash metodi tanasi
}
Binar operatorni qayta yuklashning umumiy formati quyidagi ko’rinishga ega:
public static qaytariladigan_tur operator op(operand1_turi operand1, operand2_turi operand2)
{
// Operatorni qayta yuklash metodi tanasi
}
Bu yerda: public static – operatorlarni qayta yuklash metodi ochiq (public) ham statik (static) bo’lishi kerak. qaytariladigan_tur – qayta yuklanayotgan operator bajarilishi natijasida qanday qiymat qaytishi kerak bo’lsa shu qiymatning tur nomi yoziladi. Agar natija ob’ekt ko’rinishida bo’lsa shu sinf nomi yoziladi. operator – kalit so’z bo’lib operatorlarni qayta yuklashda qo’llaniladi. op – qayta yuklanayotgan operatorning o’zi. (+, -, *, …) operand_turi - operatorga uzatiluvchi rasmiy operandlarning turi, bunda oddiy turlardan bittasi bo’lishi mumkin yoki operand ob’ekt bo’lsa tur sifatida sinf nomi yoziladi.

Download 75.61 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6




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