Template Class

أنشِئ Class :

اسمه: Addition

المتغيرات : elem1 ,elem2

يحوي : parameterized constructor و دالة لحساب مجموع العنصرين  و دالة لطباعة محتوى  .

-أجعل هذا الـ class يستقبل أي نوع من البيانات ، بمعنى يمكنه جمع أي عددين سواءً int أو double أو أي نوع آخر .

الحل:

جعل الـ class يستقبل أي نوع من البيانات يعني استخدام مفهوم template .

//main.cpp
#include <iostream>
using namespace std;
#include <string>

template <typename T>
class Addition
{

 T elem1;
 T elem2;

public:

 Addition(T val1, T val2);
 T calc();
 void print();

};


template <typename T> Addition<T>::Addition(T val1, T val2)
{
 elem1 = val1;
 elem2 = val2;
}

template <typename T> T Addition<T>::calc()
{
 return elem1 + elem2;
}

template <typename T> void Addition<T>::print()
{
 cout << "Result is: " << calc() << endl;

}

void main()
{
 Addition<int> ADD1st(9, 8);

 cout << "int type| ";
 ADD1st.print();

 Addition<double> ADD2nd(1.2 , 6.2);
 cout << "double type| ";
 ADD2nd.print();

 Addition<string> ADD3rd("HE", "llo");
 cout << "string type| ";
 ADD3rd.print();

 system("pause");
}

 

Inheritance الوراثة

أنشِئ Class :

اسمه: publication

المتغيرات : title , price

يحوي :  Parameterized constructor  و  default constructor و دالة تقرأ من المستخدم  البيانات للمتغيرات  وتخزنها و أخيرًا دالة طباعة.

هذا الـ Class  هو Base Class  ، والتالية هي  Derived Classes  : “مفهوم الوراثة “

الـ Class الأول  :

اسمه: Book 

المتغيرات : Pagecount

يحوي :  Parameterized constructor يقوم بعمل initialize لـ Data Member متضمنة الـ Data Member للـ Base Class  و دالة تقرأ من المستخدم  البيانات للمتغيرات وتخزنها و أخيرًا دالة طباعة.

 

الـ Class الثاني :

اسمه: Tape

المتغيرات : PlayingTinM “Playing Time in minute” .

يحوي :  Parameterized constructor يقوم بعمل initialize لـ Data Member متضمنة الـ Data Member للـ Base Class  و دالة تقرأ من المستخدم  البيانات للمتغيرات وتخزنها و أخيرًا دالة طباعة.

-قم بفصل الـ Class interface  في header file و Class implementation في cpp file

الحل: 

//publication.h

#include <iostream>
#include <string>
using namespace std;

#ifndef CLASS_PUBLICATION
#define CLASS_PUBLICATION

class publication
{
private:
 string title;
 float price;
public:

 publication();
 publication(string t, float p);
 void getdata();
 void putdata() const;
};

#endif
--------------------------------------------------
//publication.cpp
#include <iostream>
#include <string>
#include "publication.h"
using namespace std;

publication::publication(){ title = ""; price = 0; }
publication::publication(string t, float p){ title = t; price = p; }

void publication::getdata()
{
 cout << "Enter title:"; cin >> title;
 cout << "Enter price: "; cin >> price;
}
void publication::putdata() const
{
 cout << "\nTitle: " << title;
 cout << "\nPrice: " << price << endl;
}
-----------------------------------------------
//book.h
#include <iostream>
#include <string>
#include "publication.h"
using namespace std;


class Book :public publication
{
 int PageCount;
public:
 Book(int, float, string);
 void getdata();
 void putdata()const;

};
----------------------------------
//book.cpp
#include <iostream>
#include <string>
#include "publication.h"
#include "Book.h"
using namespace std;


Book::Book(int Pg, float Price, string T) :PageCount(Pg), publication(T, Price){}
void Book::getdata()
{
 publication::getdata();
 cout << "Enter the Page number: "; cin >> PageCount;
}
void Book::putdata()const
{
 cout << "Page Count: " << PageCount << endl << endl;
}
------------------------------------
//tape.h
#include <iostream>
#include <string>
#include "publication.h"
using namespace std;


class Tape : public publication
{
 float PlayingTinM;
public:
 Tape(float, float, string);
 void getdata();
 void putdata()const;
};
----------------------------------------
//tape.cpp
#include <iostream>
#include <string>
#include "publication.h"
#include "Tape.h"
using namespace std;

Tape::Tape(float PTIM, float Price, string T) :PlayingTinM(PTIM), publication(T, Price){}

void Tape::getdata()
{
 publication::getdata();
 cout << "Enter the Playing Time in miunte: "; cin >> PlayingTinM;
}
void Tape::putdata()const
{
 cout << "the Playing Time in miunte: " << PlayingTinM << endl;
}

 

السطر 7 و 8 و 23 : هذا الـ Directive هو حل لهذا الخطأ

 Error 1 error C2011: ‘publication’ : ‘class’ type redefinition c:\users\amjad\documents\visual studio 2013\projects\myblog\myblog\publication.h 7 1 myBlog

السطر 52 و 88 : طريقة الوراثة بكتابة نوع الوراثة ثم اسم الـ Base Class

السطر 70  و 104 : طريقة عمل initialize لمتغيرات الـ Base Class عن طريق مناداة الـ Constructor للـ Base Class

Composition & Friend Class & Pointer to object

أنشِئ Class :

اسمه: Job

المتغيرات : role , salary , id .

 

أنشِئ Class :

اسمه: Person

المتغيرات : Job  object  وهي عبارة عن”Composition “has-a relationship.

يحوي : Print Salary function تقوم بطباعة الراتب بدون get function .

-أجعل Person Class friend لـ Job class .

في main function :

* أنشِئ  Job & Person وأطبع الـ Salary باستخدام Person Object .

-أكتب ترتيب مناداة الـ Destructors للـ objects بمعنى آخر أي الـ objects تم تدميره أولًا .

-قم بفصل الـ Class interface  في header file و Class implementation في cpp file

الحل:

//Job.h
#include <iostream>
#include <string>
using namespace std;
class Job
{
private:
 string role;
 float salary;
 int id;

public:
 Job();
 ~Job();//destructor 

 string getRole()const;
 void setRole(string Role);

 float getSalary()const;
 void setSalary(float Salary);

 int getId()const;
 void setId(int ID);

 friend class Person; //friend class
};
------------------------------------------------
//Job.cpp
#include "Job.h"

Job::Job(){ role = " "; salary = 0; id = 0; }
Job::~Job(){ cout << "Job has been destructed\n\n"; } //destructor 

string Job::getRole()const { return role; }
void Job::setRole(string Role){ role = Role; }

float Job::getSalary()const{ return salary;}
void Job::setSalary(float Salary) { salary = Salary; }

int Job::getId()const{ return id; }
void Job::setId(int ID) { id = ID; }
-----------------------------------------------
//Person.h
#include "Job.h" //Must Include
class Person {

private:
 Job job; //composition has-a relationship


public:
 Person(const Job& myjob); //Copy Constructor 
 ~Person(); //destructor 
 void printSalary();
};

--------------------------------------------------
//Person.cpp
#include "Person.h"

Person::Person(const Job & myjob)
{
 job.salary = myjob.salary; 
 job.id = myjob.id;
 job.role = myjob.role;
}

Person::~Person(){ cout << "\nPerson has been destructed\n"; }//destructor 

void Person::printSalary()
{
 //Person can access a private data member of job class because it's friend

 cout << "The Salary is: " <<job.salary <<endl;
}
---------------------------------------------
//Main.cpp
#include <iostream>
#include <string>
#include "Person.h"

using namespace std;

void main()
{
 Job job;

 job.setRole("maneger");
 job.setId(4333200);
 job.setSalary(30000);

 Person *person = new Person(job); //Pointer to Person object

 person->printSalary();

 delete person; //to trace the destructor operation 

 system("pause");
}

السطر 25 : طريقة الـ class friend .

السطر 48 : Object Data Member .

السطر 74 : يستطيع Person الوصول للـ Private Data Memeber لـ Job لأنه Friend بدون الحاجة للـ Get Function .

السطر 92  : طريقة إنشاء Pointer to object .

السطر 94 : طريقة مناداة الـ pointer للـ function عن طريق Arrow “->” بدل “.” 

Statcic and Const data member and Const function

أنشِئ Class :

اسمه: Patient

المتغيرات : Name , Age , ID , DoctorName

:يحوي  Parameterized constructor و Display function “لطباعة معلومات كل مريض “.

-Get function , Display function يجب أن تكون read only .

-ID الخاص بكل مريض يتم إنشاؤه أوتوماتكيًا ولايمكن تغييره .

–قم بفصل الـ Class interface  في header file و Class implementation في cpp file

*في Main function أنشِئ 3 objects وأطبع معلوماتهم.

الحل:

المقصود بـ read only هي أن تكون constant function وهذا النوع من الـ functions لايمكنه تغيير قيمة أي متغير ، مثال لايمكن كتابة هذه الجملة داخل هذا النوع من الدوال : Name = “Amjad” >> “Error.

إنشاء الـ ID أتوماتيكيًا يتم عن طريق تعريف static data member بحيث أن static هو متغيّر عام تشترك فيه كل objects لهذا الـ class وليس خاص لكل object ، بحيث أن كل تغيير على static تستطيع أن تراه كل الـ objects .

-ID يكون const حتى لايتم تغييره ، وبذلك لايحتاج إلى set function لأنه لايمكن التعديل عليه .

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

class patient
{
 string Name;
 float age;
 const int ID; //const ID
 string doctorName;
 static int num; // stataic var. to generate the ID automatically
public:

 patient(string, string, float); //Parameterized constructor 

//set functions 
 void SetName(string);
 void SetdoctorName(string);
 void Setage(float);

//read only get functions
 string GetName() const;
 string GetdoctorName() const;
 float Getage() const;
 int GetID() const;

//const display function
 void Display() const;
};
-----------------------------------------------------------------
//.cpp
#include <iostream>
#include <string>
#include "patient.h"
using namespace std;

int patient::num = 0; //initialize static data memebr

////Parameterized constructor 
//initialize the data members using initializer list
patient::patient(string N, string DN, float A) :Name(N), doctorName(DN), age(A), ID(++num){}//initialize ID by num

//set functions
void patient::SetName(string N){ Name = N; }
void patient::Setage(float A){ age = A; }
void patient::SetdoctorName(string DN){ doctorName = DN; }

//const get functions
string patient::GetName() const{ return Name; }
string patient::GetdoctorName() const { return doctorName; }
float patient::Getage() const{ return age; }
int patient::GetID() const { return ID; }


//const display function
void patient::Display() const
{
 
 cout << "Your ID: " << GetID() << endl;
 cout << "Your Name: " << GetName() << endl;
 cout << "YOur Age: " << Getage() << endl;
 cout << "Your D. Name: " << GetdoctorName() << endl << endl;
}
------------------------------------------------------------
//main.cpp
#include <iostream>
#include <string>
#include "patient.h"
using namespace std;


void main()
{
 string Name[3], doctorName[3]; float age[3];

//read the info
 for (int i = 0; i<3; i++)

 {
 cout << "you are patint #" << i + 1 << endl;
 cout << "Enter Your Name: ";
 cin >> Name[i];
 cout << "Enter YOur Age: ";
 cin >> age[i];
 cout << "Enter Your D. Name: ";
 cin >> doctorName[i];
 cout << endl;
 }

//create objects
 patient obj1(Name[0], doctorName[0], age[0]);
 patient obj2(Name[1], doctorName[1], age[1]);
 patient obj3(Name[2], doctorName[2], age[2]);

//print info
 obj1.Display();
 obj2.Display();
 obj3.Display();

 system("pause");

}




-السطر 38 طريقة تعريف static  في cpp.

-السطر 42 يحوي طريقة initialize ID باستخدام static data member.

Pointer data member

أنشِئ Class :

اسمه:  Fraction

المتغيرات : *numerator و  denominator

:يحوي   Parameterized constructor  و Copy constructor و Default constructor

قم بفصل الـ Class interface  في header file و Class implementation في cpp file

لهدف من السؤال هو كيفية التعامل مع الـ pointer في constructors , destructor , set & get  .

الحل:

//.h
class Fraction
{
 int *numerator; //pointer data member
 int denominator;

public:

 Fraction(); //Default constructor
 Fraction(int, int);//Parameterized constructor 
 Fraction(const Fraction &);// Copy constructor 
 ~Fraction();//destructor

 void setNumerator(int);
 void setDenominator(int);

 int getDenominator();
 int getNumerator();

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

//Default constructor
Fraction::Fraction()
{
 numerator = new int; //allocate pointer
 if (!numerator) { cout << "Allocation failure"; exit(1); } //if not allocate
 //initialize
 setNumerator(1);
 setDenominator(1);
}

//Parameterized constructor
Fraction::Fraction(int N, int D)
{
 setNumerator(N); setDenominator(D);
}

//Copy constructor
Fraction::Fraction(const Fraction &obj)
{ numerator = new int; //allocate the pointer for the new object 
if (!numerator) { cout << "Allocation failure"; exit(1); } //if not allocte

//copy information
setNumerator(*obj.numerator); //use '*' to copy the value 
setDenominator(obj.denominator); }

//destructor
Fraction::~Fraction()
{ delete numerator; //delete pointer
}

void Fraction::setNumerator(int num)
{//use '*'
 *numerator = num; 
}
void Fraction::setDenominator(int num){ denominator = num; }

int Fraction::getDenominator(){ return denominator; }

int Fraction::getNumerator()
{ //use '*'
 return *numerator; 
}

مثال copy constructor و فصل interface عن implementation

أنشِئ Class :

اسمه:  Date 

المتغيرات : Day , Month , Year

الدوال الإضافية  : Display function “لطباعة التاريخ “

:يحوي   Parameterized constructor  و Copy constructor

-قم بفصل الـ Class interface  في header file و Class implementation في cpp file 

 في Main funtion :

أطلب من المستخدم إدخال اليوم والشهر والسنة ثم أنشِئ object وأملأه بالمعلومات المُدخلة ، ثم أطبع التاريخ ، بعد ذلك أنشِئ object آخر يحمل نفس معلومات الـ object  الأول ثم أطبع التاريخ للـ object الثاني.

الحل:

//.h
class Date
{
 int Day, Month, Year;
public:
 Date(int, int, int); // Parameterized constructor
 Date(const Date &); //Copy constructor

 ~Date(); //destructor

//set functions
 void SetDay(int);
 void SetMonth(int);
 void SetYear(int);

//get functions
 int GetDay();
 int GetMonth();
 int GetYear();

//dispaly
 void Display();

};

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

// Parameterized constructor
Date::Date(int D, int M, int Y){ SetDay(D); SetMonth(M); SetYear(Y); }

//Copy constructor
Date::Date(const Date &obj)
{
 SetDay(obj.Day); SetMonth(obj.Month); SetYear(obj.Year);
}

Date::~Date(){ }

void Date::SetDay(int D) { Day = D; }
void Date::SetMonth(int M){ Month = M; }
void Date::SetYear(int Y) { Year = Y; }

int Date::GetDay(){ return Day; }
int Date::GetMonth(){ return Month; }
int Date::GetYear(){ return Year; }

void Date::Display()
{
 cout << "The Date is is: " << GetDay() << "\\" << GetMonth() << "\\" << GetYear() << endl;
}
-------------------------------------------------------
//main
#include <iostream>
#include "Date.h" //must include
using namespace std;

void main()
{
 int Day, Month, Year;

 cout << "Ente the Day: "; cin >> Day;
 cout << "Ente the Month: "; cin >> Month;
 cout << "Ente the Year: "; cin >> Year;

//initialized by Parameterized constructor
 Date obj1(Day, Month, Year);
 obj1.Display();

//initialized by copy constructor
 Date obj2(obj1);
 obj2.Display();

 system("pause");
}

Letter Counter Class

-أنشِئ “Class “Letter_Counter يحوي :

    Data Member : Counter

 (  Member Function : int letter_counting(char * s1,char letter 

هذه الـ function تستقبل جملة و حرف وتقوم بحساب عدد المرّات الذي ظهر فيها الحرف في الجملة ثم تقوم بعمل return لعدد المرّات.

 الجملة والحرف يجب قراءتها من المستخدم ، ويجب استخدام الـpointer في letter counting function.

الحل:

في الحل تم اختيار 40 حرف كحد أقصى لعدد حروف الجملة ، بإمكانك اختيار عدد اخر.

 

#include <iostream>
using namespace std;

class letter_count
{
//private by default

//Data members
 int counter;

public:
//Member functions

//Constructor and destructor
 letter_count(){ counter = 0; }
 ~letter_count(){}

//set and get
 void setcount(int c){ counter = c; }
 int getcount(){ return counter; }

//letter counting function
 int letter_counting(char * s1, char letter)

 { //s1 is the sentence
 for (; *s1 != 0; s1++)
 if (*s1 == letter) { counter++; }
 return counter;
 }
};

void main()
{
 char sentance[40];
 char letter;

 letter_count obj;

 cout << "Enter a sentance with 40 letters maximum: ";
 cin.getline(sentance, 40);

 cout << "Enter a letter: ";
 cin >> letter;

 cout << "The number of Letter '" << letter << "' appers in your sentance is: " << obj.letter_counting(sentance, letter) << endl;

 system("pause");
}