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;
}

طباعة الأحرف باستخدام Recursion

-أكتب recursive function تستقبل char ، إذا كان حرف سواء capital or small تقوم بطباعته وطباعة الأحرف التي تليه إلى حرف الـ z small .

مثال: الحرف هو L 

L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z

مثال اخر: الحرف هو n

n o p q r s t u v w x y z

الحل:

#include <iostream>
using namespace std;

void pintletter(char);
void main()
{
 char L;
 cout << "Enter a Letter: ";
 cin >> L;
 pintletter(L);

 system("pause");

}

void pintletter(char L)
{
 if (L<'A' || L>'z') return; 
 else 
 if(L < 91 || L >96) cout << L << " ";

 pintletter(L + 1);
 
}

 

السطر 20 : في نظام ترميز ASCII يوجد بين الأحرف الكبيرة والأحرف الصغيرة بعض الرموز لذلك تم وضع الـ if حتى تقوم بعمل control  فإذا كان الـ  L هو رمز وليس حرف لاتقوم بطباعته وينتقل للسطر الأخيرمن البرنامج الذي فيه مناداة الدالة بالرمز الذي يليه .

ASCII Code Table

طباعة الأحرف الكبيرة

-أكتب برنامج يقوم بطباعة الأحرف الكبيرة ( Capital Letters ) من A إلى Z .

  الحل باستخدام for loop:

#include <iostream>
using namespace std;

int main()
{
    for (char i = 'A'; i <= 'Z'; i++)
            cout << i << "  ";

     cout << endl;
    system("pause");
    return 0;
}

نلاحظ أن الـ for لم نضع الـ  action لها بين قوسين {} لأنه action واحد فقط وهو الطباعة .

الحل باستخدام While loop :

#include <iostream>
using namespace std;

int main()
{
    char Letter = 'A';

    while (Letter >= 'A' && Letter <= 'Z')
        cout << Letter++ << "  ";

     cout << endl;
    system("pause");
    return 0;

}

طباعة رقم الآسكي كود

أكتب برنامج يطلب من المستخدم إدخال رمز سواءً حرف أو غيره ثم أطبع الرقم المقابل له في نظام ترميز الآسكي كود (ASCII Code ).

الحل وله عدّة طرق:

الطريقة الأولى :

عند القيام بعملية رياضية على الرمز كالضرب أو الجمع فإن العملية تتم على رقم الآسكي كود له

مثال: حرف a small يقابل الرقم 97 في نظام الآسكي كود

عند القيام بالعملية a+1 يصبح الرمز هو b small والذي يقابل الرقم 98 (97+1)

وعند طباعة العملية مباشرة (أعني العملية الرياضية ) سيتم طباعة رقم الآسكي كود ، مثل

char ch = 'a';
cout<<ch+2<<endl;

سيتم طباعة الرقم 99 لأن 97 +2 يساوي 99

لكن ماذا لو لم نطبع العملية مباشرة بل نطبع الرمز بعد العملية ؟ مثل :

char ch = 'a';
    ch += 2;
    cout << ch <<endl;

سيتم طباعة الرمز المقابل للرقم 99 وهو c small

إذًا الحل سنقوم بجمع العدد صفر على الرمز ونقوم بطباعة العملية مباشرة وبالتالي سيكون هو رقم الآسكي كود المقابل للرمز كما هو مطلوب في السؤال

#include <iostream>
using namespace std;

int main()
{
    char ch ;
    cout << "Enter a Character: ";
    cin >> ch;
    cout << ch+0<<endl;

    system("PAUSE");
    return 0;
}

الطريقة الثانية:

استخدام دالة التحويل static_cast ومن ثم حفظه في متغير int

وهي كالتالي : static_cast<النوع المرغوب> (المتغيّر المحوَّل )

#include <iostream>
using namespace std;

int main()
{
    char ch ;
    cout << "Enter a Character: ";
    cin >> ch;
    int num = static_cast<int>(ch);
    cout << num<<endl;
    system("PAUSE");
    return 0;
}

الطريقة الثالثة:

أن نحفظ المتغير من نوع char في متغيّر من نوع int لأنه في هذه الحالة سيقوم بحفظ رقم الآسكي كود في المتغير int

#include <iostream>
using namespace std;

int main()
{
    char ch ;
    cout << "Enter a Character: ";
    cin >> ch;
    int num = ch;
    cout << num << endl;

    system("PAUSE");
    return 0;
}

وهنا صورة لنظام الترميز ASCII Code

ASCII Code Table