Operator Overloading

أنشِئ Class :

اسمهFraction

المتغيرات numerator , denominator

يحوي : default constructor و  set & get و  overloading functions للعمليات التالية :

جمع ، أقل من ، ضرب >> as global functions .

قسمة ، إسناد “=”  >> as member functions .

قراءة وطباعة .

-في main قم باختبار كل الـ operator overloading functions .

الحل:

مفهوم operator overloading هو أن نعيد تعريف الـ built-in operator حتى نتمكن من تطبيقها على الـ objects كأن نجمع 2 objects أو نضربهما ..الخ .

نلاحظ في السؤال أنه لم يتم التوضيح بالنسة لعملية القراءة cin والطباعة cout ماإذا كانت member or global لأنها في الواقع لايمكن ان تكون سوى global أي friend .

-يجب أن نراعي في الحل قوانين ضرب وجمع وقسمة ومقارنة الكسور .

 

//.h
#include <iostream>
using namespace std;

class Fraction
{
private:
 int numerator;
 int denominator;

public:
 Fraction(){ numerator = 0; denominator = 0; }

 void setNumerator(int num)
 {
 numerator = num;
 }
 void setDenominator(int num)
 {
 denominator = num;
 }
 int getNumerator()
 {
 return numerator;
 }
 int getDenominator()
 {
 return denominator;
 }

 //global means (friend) "optional"
 friend Fraction operator +(Fraction &obj1, Fraction &obj2);
 friend bool operator < (Fraction &obj1, Fraction &obj2);
 friend Fraction operator *(Fraction &obj1, Fraction &obj2);

 //member function "optional"
 void operator = (Fraction &obj);
 Fraction operator /(Fraction &obj);

 //must be friend
 friend ostream& operator << (ostream& outs, const Fraction& ob);
 friend istream& operator>>(istream& inc, Fraction& ob);

};
-----------------------------------------------------------
//.cpp
#include "Fraction.h"
#include <iostream>
using namespace std;

Fraction operator +(Fraction &obj1, Fraction &obj2)
{
 Fraction obj3;
 obj3.denominator = obj1.denominator * obj2.denominator;
 obj3.numerator = (obj1.numerator*obj2.denominator) + (obj2.numerator*obj1.denominator);
 return obj3;
}

bool operator < (Fraction &obj1, Fraction &obj2)
{
 if ((obj1.numerator / obj1.denominator) < (obj2.numerator / obj2.denominator))

 return true;

 else return false;
}

Fraction operator *(Fraction &obj1, Fraction &obj2)
{
 Fraction obj3;
 obj3.denominator = obj1.denominator*obj2.denominator;
 obj3.numerator = obj1.numerator*obj2.numerator;
 return obj3;
}

void Fraction::operator = (Fraction &obj)
{
 numerator = obj.numerator;
 denominator = obj.denominator;
}

Fraction Fraction::operator/(Fraction &obj)
{
 Fraction obj3;
 obj3.denominator = denominator*obj.numerator;
 obj3.numerator = numerator*obj.denominator;
 return obj3;
}

ostream& operator << (ostream& outs, const Fraction& ob)
{
 outs << "The result is: ";
 outs << ob.numerator << "/" << ob.denominator << endl;
 return outs;
}

istream& operator >> (istream& inc, Fraction& ob)
{
 cout << "Enter the number numerator: ";
 inc >> ob.numerator;
 cout << "Enter the number denominator: ";
 inc >> ob.denominator;
 return inc;
}
---------------------------------------------------
//main.cpp
#include <iostream>
using namespace std;
#include "Fraction.h"
int main() {

 Fraction f1, f2;

 cin >> f1;
 cin >> f2;

 cout << " << operator:\n";
 cout << f1 << f2;

 cout << " + operator: ";
 Fraction f3 = (f1 + f2);
 cout << f3;

 cout << " < operator: ";
 cout << (f1<f2) << endl;

 cout << " * operator: ";
 Fraction f4 = f1*f2;
 cout << f4;

 cout << " = operator: ";
 Fraction f5 = f1;
 cout << f5;

 cout << " / operator: ";
 cout << (f1 / f2);



 system("pause");
 return 0;
}

قائمة العمليات الحسابية

-أكتب برنامج يعرض قائمة العمليات الحسابية ( × , + , – , ÷ , ^ ) وخيار الخروج “Exit” ويطلب من المستخدم الاختيار من القائمة ثم يقرأ منه الرقمين الذين سيجري عليهما العملية الحسابية إذا لم يختار الخروج ، ويكرر العملية إلى أن يختار المستخدم خيار Exit .

الحل:

#include <iostream>
using namespace std;

int main()
{
    int num1, num2, Choice;

do{
    cout << "-------------Calculator----------------\n";

    cout << "Choose the operation:\n";
    cout << "1. Addition\n";
    cout << "2.Subtracting\n";
    cout << "3.Multiplication\n";
    cout << "4.Division\n";
    cout << "5.Power\n";
    cout << "6.Exit\n\n";
    cin >> Choice;
    
    while(Choice<1 || Choice>6)
    {cout << "Invalid input, Please enter your choice again: "; cin >> Choice;}

    if (Choice!=6)
    {
        cout << "\nEnter Two Numbers:\n";
        cin >> num1 >> num2;

        switch (Choice)
        {
        case 1: cout << "The Result : " << num1 << " + " << num2 << " = " << num1 + num2 << endl<<endl; break;
        case 2: cout << "The Result : " << num1 << " - " << num2 << " = " << num1 - num2 << endl<<endl; break;
        case 3: cout << "The Result : " << num1 << " x " << num2 << " = " << num1 * num2 << endl<<endl; break;
        case 4: cout << "The Result : " << num1 << " ÷ " << num2 << " = " << num1 / num2 << endl<<endl; break;
        case 5: cout << "The Result : " << num1 << " ^ " << num2 << " = " << pow(num1, num2) << endl<<endl; break;
        }//End switch

    }//End if

    } while (Choice != 6);
    
    system("pause");
    return 0;
}

السطر رقم 20 : يتم اختبار اختيار المستخدم ، فإذا قام بإدخال رقم غير موجود في القائمة تظهر رسالة الخطأ مع طلب إدخال خيار آخر وتتكرر العملية إلى أن يدخل خيارًا صحيحيًا ، أي بعد هذه العملية نضمن أن الخيار المُدخل صحيح وسوف يكون أحد الأعداد الظاهرة في القائمة (1-2-3-4-5-6 ).

السطر رقم 23 : ماذا لو اختار المستخدم الخيار الأخير Exit ؟! ليس اختيار خاطئ ، وفي الوقت نفسه يجب أن لايمر الـ compiler على كود الـ switch وأن لايطلب إدخال الرقمين لهذه الأسباب تم وضع الـ if .

السطر رقم 34 : الاختيار رقم 5 وهو عملية الرفع إلى قوة ، يتم استخدام دالة الـ power والتي يمثّل فيها num1 الأساس و num2 الأس

السطر رقم 40 : شرط الـ while هو أن يكون المستخدم لم يختار الخروج ، لأنه كما طلب في السؤال يجب تكرار عملية ظهور قائمة العمليات الحسابية إلى ان يختار المستخدم Exit .

*نلاحظ أنه لم نضع الـ default للـ switch ؛ وذلك لأنه عند تتبع الكود نجد عند الوصول للـ switch يكون Choice يحمل أحد الأرقام من 1 إلى 5 ويستحيل أن يحمل غير هذه الأرقام لذلك لاداعي لوجود الـ default .

الآلة الحاسبة

-أكتب برنامج يقرأ من المستخدم رقمين صحيحين ويقوم  بالعمليات التالية

ضرب ، قسمة ، جمع ، طرح هذين العددين ومن ثم يقوم بطباعة النتيجة لكل عملية.

الحل:

#include <iostream>
using namespace std;
int main()
{

    int num1, num2;

    cout << "Welcome to my simple calculator, Please enter two integer numbers\n";

    cin >> num1 >> num2;

    cout << "\nThe First number:" << num1 << endl << "The Second number:" << num2 << endl << endl;

    cout << num1 << "+" << num2 << "=" << num1 + num2 << endl;
    cout << num1 << "-" << num2 << "=" << num1 - num2 << endl;
    cout << num1 << "x" << num2 << "=" << num1*num2 << endl;
    cout << num1 << "÷" << num2 << "=" << num1 / num2 << endl;

    system("pause");
    return 0;
}

ضرب متغيرين

-أكتب برنامج يقرأ من المستخدم رقمين صحيحين ومن ثم أطبع نتيجة ضرب هذين الرقمين.

الحل:

تحليل السؤال:

يقرأ من المستخدم : تعني أن المستخدم هو من يختار الرقمين وليس المبرمج

صحيحين : نوع الرقمين int

#include <iostream>
using namespace std;

int main()
{
             int x , y , result ;
             cout<<"Enter tow numbers: ";
             cin>> x >>y;
             result= x* y ;
             cout<<"The result is: "<<result<<endl;
             system("pause");
             return 0 ;

}/*End main*/

,,

السطر رقم 6 : يمكن تعريف المتغيرات من نفس النوع في سطر واحد والفصل بينهم بـ ,

,,

والكود نفسه يستخدم لجمع وطرح وقسمة رقمين ويتم عن طريق استبدال علامة الضرب * بـ

+ لـ الجمع ,, لـ الطرح ,, / لـ القسمة

ويوجد هناك عدة طرق لكتابة هذا الكود مثلاً أن لا يتم حفظ قيمة ضرب العددين في متغيّر result ويتم طباعتهم مباشرة  بعد الـ cin

#include <iostream>
using namespace std;

int main()
{
             int x , y ;
             cout<<"Enter tow numbers: ";
             cin>> x >>y;
             cout<<"The result is: "<<x*y<<endl;
             system("pause");
             return 0 ;

}/*End main*/

ماذا لو كانت الرقمين معروفة للمبرمج ممسبقًا أي ليس المستخدم هو من يختارها ، مثلاً أكتب برنامج يطبع نتيجة ضرب 5 و 9؟

#include <iostream>
using namespace std;
int main()
{
    
    cout << "The result is: " << 5*9 << endl;
    system("pause");
    return 0;

}/*End main*/