0% found this document useful (0 votes)
7 views7 pages

AP1 Session #08

C++ Session 8 Practical Tishreen University

Uploaded by

miriam.fondue
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
7 views7 pages

AP1 Session #08

C++ Session 8 Practical Tishreen University

Uploaded by

miriam.fondue
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 7

‫التمرين األول‬

‫اكتب صف يعبّر عن وقت أو ساعة ‪ Time‬يحتوي على الحقول التالية‪:‬‬


‫• جزء الساعات من الوقت ‪.h‬‬
‫• جزء الدقائق من الوقت ‪.m‬‬
‫• جزء الثواني من الوقت ‪.s‬‬
‫ويحتوي على التوابع التالية باإلضافة للباني الذي تراه مناسباً‪:‬‬
‫• تحميل المعامل >> لقراءة الوقت كامالً (ساعات ودقائق وثواني)‪.‬‬
‫• تحميل المعامل << لطباعة الوقت بالتنسيق التالي ‪hh:mm:ss‬‬
‫• تحميل زائد للمعامل ‪ +‬بحيث يرد حاصل جمع عدة أوقات مع بعضها‪.‬‬
‫الحل‪:‬‬
‫{‪class Time‬‬
‫;‪int h,m,s‬‬
‫‪public:‬‬
‫{)(‪Time‬‬
‫;‪h=0; m=0; s=0‬‬
‫}‬
‫{)‪friend istream& operator>>(istream &input, Time &t‬‬
‫;‪cout << "Enter Hours part: (0-11)" << endl‬‬
‫;‪input >> t.h‬‬
‫;‪cout << "Enter Minutes part (0-59" << endl‬‬
‫;‪input >> t.m‬‬
‫; ‪cout << "Enter Seconds part (0-59" << endl‬‬
‫;‪input>>t.s‬‬
‫;‪return input‬‬
‫}‬
friend ostream& operator<<(ostream &output, Time &t){
output<<t.h<<":"<<t.m<<":"<<t.s<<endl;
return output;
}
Time operator+(Time t){
Time result;
int seconds=t.s+s;
result.s=seconds%60;
int minutes=(seconds/60)+t.m+m;
result.m=minutes%60;
int hours=(minutes/60)+t.h+h;
result.h=hours%12;
return result;
}
};
int main(){
Time t1,t2;
cin>>t1>>t2;
cout <<t1<<t2;
Time t3;
t3 = t1+t2+t1;
cout<<t3;
return 0;
}
‫التمرين الثاني‬
‫اكتب صف يعبّر عن عدد عقدي ‪ Complex‬يحتوي على الحقول التالية‪:‬‬
‫• الجزء الحقيقي من العدد ‪.real‬‬
‫• الجزء التخيلي من العدد ‪.imaginary‬‬
‫ويحتوي على البواني التالية (استفد من مفهوم استدعاء باني لباني آخر)‪:‬‬
‫باني دون وسطاء لتهيئة القسم الحقيقي والتخيلي بالصفر وطباعة عبارة ‪“Constructor with‬‬ ‫•‬
‫”‪.no parameters‬‬
‫باني مع وسيط واحد يقوم بتهيئة القسم الحقيقي برقم مدخل امما القسم التخيلي يهيئه بالصفر ويطبع‬ ‫•‬
‫عبارة ”‪.“Constructor with one parameter‬‬
‫باني بوسيطين لتهيئة القسمين ويطبع ”‪.“Constructor with two parameters‬‬ ‫•‬
‫باني ناسخ ويطبع ”‪.“Copy Constructor‬‬ ‫•‬
‫هادم‪.‬‬ ‫•‬
‫ويحتوي على التوابع التالية‪:‬‬
‫تحميل زائد للمعامل ‪ +‬بحيث يرد حاصل جمع عددين عقديّين‪.‬‬ ‫•‬
‫تحميل زائد للمعامل – بحيث يقوم بتحويل العدد من ‪ x+yi‬إلى ‪.-x-yi‬‬ ‫•‬
‫تحميل زائد للمعامل >> إلدخال العدد العقدي بجزئيه‪.‬‬ ‫•‬
‫تحميل زائد للمعامل << لطباعة العدد العقدي بجزئيه‪.‬‬ ‫•‬
‫في البرنامج الرئيسي قم باستخدام صفك كما يلي وحاول توقع الخرج قبل التنفيذ‪:‬‬
‫;)‪Complex c1(3,9), c2(3,5‬‬
‫;‪Complex c3‬‬
‫;‪cin >> c3‬‬
‫;‪Complex c4 = c1‬‬
‫;‪Complex c5‬‬
‫;‪cout << c1‬‬
‫;‪-c1‬‬
‫;‪cout << c1‬‬
‫;‪c4 = c1 + c2 + c3‬‬
‫;‪cout << c4‬‬
:‫الحل‬
class Complex{
int real, imaginary;
public:
Complex(int real, int imaginary){
cout << "Constructor with two parameters" << endl;
this -> real = real ; this -> imaginary = imaginary;
}
Complex():Complex(0,0){
cout << "Constructor with no parameters" << endl;
}
Complex(int real): Complex(real, 0){
cout << "Constructor with one parameter" << endl;
}
Complex(const Complex &c){
cout << "Copy Constructor" << endl;
real = c.real; imaginary = c.imaginary;
}
Complex operator+(Complex &c){
Complex result(real+c.real, imaginary+c.imaginary);
return result;
}
void operator-(){
real *= -1;
imaginary *= -1;
}
friend istream& operator>>(istream &input, Complex &c){
input >> c.real;
input >> c.imaginary;
return input;
}
friend ostream& operator<<(ostream &output, Complex &c){
if (c.imaginary > 0 ){
cout << c.real << "+" << c.imaginary << "i" << endl;
}
else{
cout << c.real << c.imaginary << "i" << endl;
}
return output;
}
};
1
2
3
4

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
‫‪ -1‬استدعاء الباني بوسيطين من أجل إنشاء الغرض ‪.c1‬‬
‫‪ -2‬استدعاء الباني بوسيطين من أجل إنشاء الغرض ‪.c2‬‬
‫‪ -3‬استدعاء الباني بدون وسطاء والذي بدوره يقوم باستدعاء الباني بوسيطين من أجل إنشاء الغرض ‪c3‬‬
‫نتيجة وجوده ضمن الئحة التهيئة الخاصة به‪ ،‬ولذلك تم تنفيذ تعليمة طباعة المشيد ذو الوسيطين قبل‬
‫المشيد بدون وسطاء‪.‬‬
‫‪ -4‬تكملة استدعاء الباني بدون وسطاء من أجل ‪.c3‬‬
‫‪ -5‬إدخال الغرض ‪ c3‬نتيجة استدعاء تابع التحميل الزائد للمعامل >>‬
‫‪ -6‬استدعاء الباني الناسخ لتهيئة ‪ c4‬والذي يقوم بنسخ محتويات ‪ c1‬ويضعها ضمن ‪ c4‬دون أن يقوم‬
‫بالتعديل على ‪.c1‬‬
‫‪ -7‬استدعاء الباني بدون وسطاء والذي بدوره يقوم باستدعاء الباني بوسيطين من أجل إنشاء الغرض ‪c5‬‬
‫نتيجة وجوده ضمن الئحة التهيئة الخاصة به‪ ،‬ولذلك تم تنفيذ تعليمة طباعة المشيد ذو الوسيطين قبل‬
‫المشيد بدون وسطاء‪.‬‬
‫‪ -8‬تكملة استدعاء الباني بدون وسطاء من أجل ‪.c5‬‬
‫‪ -9‬طباعة الغرض ‪ c1‬نتيجة استدعاء تابع التحميل الزائد للمعامل <<‬
‫طباعة الغرض ‪ c1‬نتيجة استدعاء تابع التحميل الزائد للمعامل << وذلك بعد عكس إشارات‬ ‫‪-10‬‬
‫‪ c1‬عن طريق تطبيق تابع التحميل الزائد للمعامل – في السطر الذي يسبق تعليمة الطباعة‪.‬‬
‫استدعاء المشيد ذو الوسيطين لتهيئة المتحول المحلي ‪ result‬الناتج عن استدعاء تابع التحميل‬ ‫‪-11‬‬
‫الزائد للمعامل ‪ +‬من أجل العملية )‪ (c1 + c2‬مع مالحظة أن عملية الجمع ضمن ‪ c++‬تتم من‬
‫اليسار إلى اليمين وبالتالًي سيتم جمع ‪ c2 + c1‬ومن ثم إضافة الناتج إلى ‪.c3‬‬
‫استدعاء المشيد ذو الوسيطين لتهيئة المتحول المحلي ‪ result‬الناتج عن استدعاء تابع التحميل‬ ‫‪-12‬‬
‫الزائد للمعامل ‪ +‬من أجل العملية ‪ Z+c3‬بفرض كان ‪ Z‬يمثل ناتج العملية ‪.c1+c2‬‬
‫استدعاء الهادم من أجل المتحول المحلي ‪ result‬الذي تم إنشاؤه في الخطوة ‪.12‬‬ ‫‪-13‬‬
‫استدعاء الهادم من أجل المتحول المحلي ‪ result‬الذي تم إنشاؤه في الخطوة ‪.11‬‬ ‫‪-14‬‬
‫طباعة الغرض ‪ c4‬نتيجة استدعاء تابع التحميل الزائد للمعامل <<‬ ‫‪-15‬‬
‫استدعاء الهادم من أجل المتحول ‪.c5‬‬ ‫‪-16‬‬
‫استدعاء الهادم من أجل المتحول ‪.c4‬‬ ‫‪-17‬‬
‫استدعاء الهادم من أجل المتحول ‪.c3‬‬ ‫‪-18‬‬
‫استدعاء الهادم من أجل المتحول ‪.c2‬‬ ‫‪-19‬‬
‫استدعاء الهادم من أجل المتحول ‪.c1‬‬ ‫‪-20‬‬

‫مالحظات‪:‬‬
‫‪ -1‬يتم هدم المتحوالت المؤقتة المعرفة ضمن التوابع فور االنتهاء من تنفيذ التابع ولذلك تم استدعاء الهادم‬
‫في الخطوتين ‪ 13‬و‪ 14‬قبل تنفيذ تعليمة الطباعة في الخطوة ‪.15‬‬
‫‪ -2‬يتم هدم المتحوالت المعرفة ضمن البرنامج الرئيسي أو أي تابع آخر بعكس ترتيب إنشائها‪ ،‬بما أن‬
‫استدعاء التوابع ضمن ‪ c++‬يتم عن طريق مكدس استدعاء التوابع والذي يعتمد مبدأ ‪LIFO: Last-‬‬
‫‪ In First-Out‬لذا يتم هدم المتحول ‪ c5‬قبل ‪ c4‬و‪ c4‬قبل ‪ c3‬وهكذا‪...‬‬

You might also like