الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

شابتر 3 (التفاعلات)

بدأه XMasterrrr في 30 أكتوبر 2010 · 24 رد · 2,771 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

بسم الله الرحمن الرحيم و الصلاة و السلام على اخير الانبياء سيدنا محمد صلى الله عليه و سلم

ملاحظة : سيتم وضع بعض الدروس البسيطة + درس read/write file يوم الاربعاء مع الامثلة و الاسئلة و الاختبارات البرمجية بأذن الله لضيق الوقت.

الكائن cin

الملخص : الكائن cin يُستخدم لقراءة البيانات من الكيبورد.

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

فى الواقع, اغلبية البرامج تطلُب من المستخدم ادخال الارقام المراد استعمالها فى المتغيرات. هذا يعنى اننا لن نقوم بتغيير اعدادات السورس كود كل مرة.

ببساطة بما ان ال cout هى الكائن الخاص بالطباعة على الscreen فال cin هى الخاصة بالكتابة من على الكيبورد

// This program asks the user to enter the length and width of
// a rectangle. It calculates the rectangle's area and displays
// the value on the screen.
#include <iostream>
using namespace std;
int main()
{
int length, width, area;

cout << "This program calculates the area of a ";
cout << "rectangle.\n";
cout << "What is the length of the rectangle? ";
cin >> length;
cout << "What is the width of the rectangle? ";
cin >> width;
area = length * width;
cout << "The area of the rectangle is " << area << ".\n";
system("pause");
return 0;
}

المخرجات :

This program calculates the area of a rectangle.

What is the length of the rectangle? 10[Enter]

What is the width of the rectangle? 20[Enter]

The area of the rectangle is 200.

بدل ان نقوم بمعرفة المساحة الخاصة بمستطيل واحد, هذا البرنامج يستطيع معرفة مساحة اى مستطيل. الارقام التى تم تخزينها داخل المتغيرات length و width ادخلت بواسطة المستخدم اثناء عمل البرنامج

cout << "What is the length of the rectangle? ";
cin >> length;

فى هذان السطران و بالتحديد الصطر الاول الكائن cout بطباعة

اقتباس

What is the length of the rectangle?

السطر التالى له

cin >> length;

يقوم باستقبال البيانات من الكيبورد

العلامة

>>

تأتى هنا تمام مثل cout لكن بأختلاف الجهة فقط , هذه العلامة تشير الى ان ال cin سوف تضع شئ ما فى المتغير التالى له

فى هذا السطر الكائن cin وضع شيئا ما فى المتغير length .

ببساطة الخطوات التالية هى الخطوات الاساسية فى استقبال مدخلات للبرنامج الخاص بك

1 – استخدام الكائن cout لكى تعرض السؤال على الشاشة

2 – استخدام الكائن cin لأستقبال المدخلات من الكيبورد

السؤال الذى تطبعه على الشاشة يجب ان يدُل على شئ المثال التالى يوضح ذلك

اقتباس

What is the length of the rectangle?

سألنا هنا عن طول المسطتيل لكى يعرف القارئ ان يدخل طول المسطتيل,عند اذ يقوم المستخدم بأدخال الطول الخاص بالمستطيل. (لاحظ نحن نتكلم عن الطول فقط)

حسنا لاحظ التالى فى جملة ال cout تكون السهم هكذا

<<

و لاحظ المعنى. المعنى هنا انها تعُطى شئ اى انها تعطى النص الى الشاشة

بعكس ال cin و السهم هكذا

>>

و معناها انها تأخذ شئ , هنا تأخذ مننا نحن المدخلات :D.

الكائن cin يسبب الى انتظار البرنامج حتى يتم ادخال البيانات من الكيبودرة و يتم ضغط الزر [Enter].

لن يعمل اى سطر فى البرنامج قبل ان يتم ادخال البيانات المطلوبة ب cin .

الكائن cin يقوم تلقائيا بتحويل البيانات المأخوذة من المستخدم من الكيبورد الى بيانات تخزن فى المتغيرات .

مثال : لو اليوزر ادهل 10 , ستقرأ كحروف '1' و '0' لأنك ادخلتهم من الكيبورد لكن ال cin ذكية كفاية لمعرفة ان هذا الرقم سيدخل الى int قبل ان يتم تخزينها فى المتغير length. ال cin ايضا ذكية كفاية لمعرفة ان الرقم 10.7 ليس له القدرة على ان يتم وضعه داخل متغير int لو المستخدم ادخل رقم floating point داخل متغير int فسوف تلقائيا يقوم بقراءة فقط الجزء قبل الكسر.

ملاحظة : يجب عليك استخدام مكتبة iostream لأستخدام هذا الكائن (cin)

ملاحظة : اختصار كلمة cin هو "see in" و اختصار كلمة cout هى "see out"

ادخال اعداد مزدوجة

الكائن cin ربما يستخدم لأدخال اكثر من ناتج فى نفس السطر

سوف نستخدم المثال السابق مع تغيير بسيط و هو

ادخال ال length و ال width فى سطر واحد

سيتم ادخال ال length اولا ثم ال width

المثال:

// This program asks the user to enter the length and width
// a rectangle. It calculates the rectangle's area and displays
// the value on the screen.
#include <iostream>
using namespace std;
int main()
{
int length, width, area;

cout << "This program calculates the area of a ";
cout << "rectangle.\n";
cout << "Enter the length and width of the rectangle ";
cout << "separated by a space.\n";
cin >> length >> width;

area = length * width;
cout << "The area of the rectangle is " << area << endl;

system("pause");
return 0;
}

المخرجات

اقتباس

This program calculates the area of a rectangle.

Enter the length and width of the rectangle separated by a space.

10 20[Enter]

The area of the rectangle is 200

فى مخرجات هذا المثال , المستخدم ادخل 10 و 20 اذا ال 10 تم ادخالها ل length و ال 20 لل width.

لاحظ ان المستخدم ابعد الارقام عن بعض بأستخدام الفراغات,هكذا كيف يعرف الكائن cin اين يبدء المتغير التالى.

لا يفرق كم هى عدد الفراغات .

مثال .... من الممكن استخاد الفراغات التالية :

10 20

الكائن cin ايضا يقدرعلى قراءة اكثر من متغير فى سطر واحد فى اكثر من شكل مثال :

// This program demonstrates how cin can read multiple values
// of different data types.
#include <iostream>
using namespace std;
int main()
{
int whole;
double fractional;
char letter;

cout << "Enter an integer, a double, and a character: ";
cin >> whole >> fractional >> letter;
cout << "whole: " << whole << endl;
cout << "fractional: " << fractional << endl;
cout << "letter: " << letter << endl;

system("pause");
return 0;
}

المخرجات:

اقتباس

Enter an integer, a double, and a character: 4 5.7 b[Enter]

whole: 4

fractional: 5.7

letter: b

كما رئيت فى المثال المدخلات وُضعت تمام كما اردنا فى اماكن متغيراتها لكن ماذا يحدث لو لم ندخلها مثل الترتيب الماضى, مثال:

اقتباس

Enter an integer, a double, and a character: 5.7 4 b[Enter]

whole: 5

fractional: 0.7

letter: 4

عندا يكتب المستخدم الارقام التى يريدها هذه الارقام اولا يتم تخزينها فى مساحة ذ اكرة اسمها keyboard buffer.

اذا,عندما يدهل المستخدم 5.7, 4, b يتم تخزينهم فى ال keyboard buffer .

عندما يتم ضغط على Enter الكائن cin يُدخل رقم 5 الى المتغير whole لأنه لا يأخذ كسور.ثم يأخذ ال .7 و يقوم بتخزينها فى المتغيير fractional. المسافة بينهم و بين الرقم التالى (4) يتم تفاديها ثم يتم أخذ الر قم 4 و وضعه فى ال char (راجع شابتر 2) لأننا هنا نأخذ فقط 3 متغيرات فأن ال b يتم وضعه فى ال keyboard buffer . فى هذه الحالة سيتم وضع ال 5 داخل ال whole و من ثم يخزن ال .7 الى fractional و الحرف '4' داخل letter.

من المهم ان يتم ادخال المتغيرات فى نفس الترتيب

ادخال النصوص

الكائن cin يقدر على قرائة النصوص و تخزينها داخل الذاكرة ك نص بطريقة لغة ال C . C-Strings عبارة عن مصفوفة من ال character. فى هذا الفصل سوف نأخذ بعض الاساسيات فى المصفوفات.

المصفوفة هى مثل مجموعة من المتغيرات بنفس الاسم, تخزن مع بعضها البعض فى الذاكرة .

هذا مثال لمصفوفة ال char :

char company[12]

الرقم داخل القوس هو رقم مساحة المصفوفة. الاسم الخاص للمصفوفة هو company, و هى كافية كفاية لكى تحمل12 حرف.

تذكر, مهما حدث ان ال C-strings يوجد بها ال null terminator التى تحدثنا عنها فى شابتر 2 اذا فأنها كافية فقط لحمل 11 حرف لأنه يوجد حرف دائم لل null terminator

ملاحظة:لو مصفوفة ال char مصنوعة لحمل النصوص يجب عليك ان تقوم بعمل مساحة اضافية للمصفوفة لكى تحمل ال null terminator .

البرنامج التالى يوضح كيفية ادخال النصوص

//This program demonstrates how cin can read a string into
//a character array.
#include <iostream>
using namespace std;

int main()
{
	char name[21]

	cout << "What is your name? ";
	cin >> name;
	cout << "Good morning " << name << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

What is your name? Charlie[Enter]

Good morning Charlie

هيا لشرح طريقة عمل المصفوفة:

قمنا بعمل

char name[21]

الاسم الخاص بالمصفوفة هو name و هى كافية كفاية لحتواء 21 حرف. لكن تذكر ال null terminator تأخذ 1 بايت اذا فالحجم الواقعى هو 20.

تحذير : لو ادخل المستخدم نص اكبر من مساحة المصفوفة فأن البرنامج سوف يخرج نتائج غريبة و يقوم بتدمير البرنامج كاملا.

لاحظ اننا عندما قمنا بأدخال النص فقد قمنا بالتالى فى الكود:

cin >> name;
cout << "Good morning " << name << endl;

عندما تقوم بادخال مصفوفة من النصوص , نستخدم اسم المصفوفة فقط و ليس المصفوفة + الرقم الجانبى للمصفوفة

cin >> name[21];
cout << "Good morning " << name[21] << endl;

هذا المثال لن يعمل كما قولنا سابقا

المثال تالى يوضح اكثر من مصفوفة لل char فى برنامج واحد

//This program reads two strings into two character arrays.
#include <iostream>
using namespace std;

int main()
{
	char first[16], last[16];

	cout << "Enter your first and last names and i will\n";
	cout << "reverse them>\n":
	cin >> first >> last;
	cout << last << ", " << first << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

Enter your first and last names and I will

Reverse them.

Johnny Jones[Enter]

Jones, Johnny

المصفوفاتين الخاصة ب first و last كبيرة كفاية لكى تحمل 15 حرف نصى. فى السطر :

cin >> first >> last;

الكائن cin قراء كل مصفوفة على حدى.

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

فى المشاركة القادمة سوف نتحدث عن التعبيرات الرياضية فى البرمجة

هذا السؤال يدعوا موجه, اى انه يسأل المستخدم بأدخال البيانات التى يحتاجها. يجب على البرامج ايا كان ان يعرض الموجه (الجملة النصية) قبل ادخال ال cin . هى ليست قاعدة لكنها لكى تُعرف المستخدم ان هنا ستقوم بأدخال بياناتك بأستخدام الكيبورد.

ملاحظة : الزر Enter يَضغط عليه بعد اخر رقم قد كُتب

تم تعديل هذه المشاركة بواسطة XMasterrrr في 30 أكتوبر 2010 في 05:29

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#2

التعبيرات الرياضية

[/size]الملخص : السى++ يعطيك القدرة على عمل مثائل حسابية معقدة و يعطى لك بعض رموز التى تساعدك على هذا.

فى الشابتر 2 تعرفنا على اساسيات العمليات الرياضية فى السى++. اى تعبير فى البرمجة يكون لديه ناتج. عادة, التعبير يحتوى على علامة رياضية مثال:

Sum = 21 + 3;

بما ان ال 21 + 3 هى ارقام , اذا فهى تعبير رياضى. و الناتج سيكون 24 سيخزن فى المتغير sum . التعبيرات من الممكن ان لا تكون فى شكل رياضى فقط , فمن الممكن ان تكون على الشكل التالى:

Number = 3;

هذا ايضا تعببير

هذه بعض التعبييرات :

result = x;
result = 4;
result = 15 / 3;
result = 22 * number;
result = sizeof(int);
result = a + b + c;

فى كل سطر من السطور الماضية يوجد , رقم , اسم متغير اخر او تعبيير رياضى يظهر على الناحية اليمين بعد رمز =.

الناتج هنا قد ظهر بناء على ما بعد رمز ال = و تم تخزينه داخل المتغير الى هو result . كل هذه امثلة على التعبيرات .

المثال التالى يوضع تعبير رياضى :

// This program asks the user to enter the numerator and denominator
// of a fraction and it displays the decimal value.
#include <iostream>
using namespace std;
int main()
{
double numerator, denominator;
cout << "This program shows the decimal value of a fraction.\n";
cout << "Enter the numerator: ";
cin >> numerator;
cout << "Enter the denominator: ";
cin >> denominator;
cout << "The decimal value is " << (numerator / denominator) << endl;
system("pause");
return 0;
}

المخرجات :

اقتباس

This program shows the decimal value of a fraction.

Enter the numerator: 3[Enter]

Enter the denominator: 16[Enter]

The decimal value is 0.1875

الكائن cout سوف يعرض اى عملية حسابية صحيحة على الشاشة . فى البرنامج الماضى قمنا بعمل التالى

قسم البسط على المقام و ثم عرضها على الشاشة

ملاحظة : كما رئينا فى المثال الماضى المتغيرات كانت من نوع double و لكننا ادخلنا 3 و 16 اى integer و لكن اللغة زكية كفاية لكى تعرف ان هذا المتغير double اذا فسوف يخزنون على شكل 3.0 و 16.0

ملاحظة : فى بعض الاحيان عندما ترسل تعبيرات رياضة تحتوى على علامات رياضية الى الكائن cout يفضل وضع هذه التعبيرات الرياضية داخل قوسين مثل هذا ( ) بعض التعبيرات الرياضية المتقدمة سوف تعطينا نتائج خاطئة اذا لم تقم بما قولته سابقا.

الاسبقية

من السهل ان تقوم ببناء تعبيرات حسابية بأكتر من رمز فى نفس العملية.

المثال القادم سوف يقوم بعمل الجمع ل 17,المتغير x , 21 و المتغير y و يتم التخزين داخل متغيير answer.

answer = 17  + x + 21 + y;

بعض التعبيرات ليست على خط مستقيم, ايا كان فلننظر الى المثال التالى :

outcome = 12 + 6 / 3;

ما هو الناتج الذى سيتم تخزينه فى هذا المتغيير ؟ رقم 6 تم استخدامه فى العمليتان الحسابية فقط استخدم فى الجمع و ايضا استخدم فى القسمة . النتيجة من الممكن ان تكون 6 او 14 بحسب العلامات الرياضية فمن له القوة اولا ؟؟؟ فى حالتنا هذه الجواب سيكون 14 لأن علامة القسمة تبدء اولا ثم علامة الجمع اى ان علامة القسمة لها الاسبقية :D

التعبيرات الرياضية تعمل من اليسار الى اليمين , لكن عندما نقوم بعملية حسابية مثل السابقة لأن علامة القسمة لها الاسبقية فأنها ستعمل اذا فالحسبة الماضية تعمل كالتالى :

اقتباس
1 – ال 6 تقسم على 3 , الناتج 3

2 – تُجمع ال 12 الى 2 , الناتج 14

الشكل التالى يوضح اكثر

اقتباس

Outcome = 12 + 6 / 3

\ /

Outcome = 12 + 2

Outcome = 14

الجدول التالى يوضح من له الاسبقية الاعلى ثم الاسبقة الاقل

(من الاعلى الى الاقل)

اقتباس

(unary negation) –

علامة الضرب – القسمة – و المتبقى

الجمع و الطرح

الضرب و القسمة و المتبقى يحتون على نفس الاسبقية , ايضا الطرح و الجمع يحتون على نفس الاسبقية

بعض التعبيرات الرياضية التى تشرح ذلك :

اقتباس

العملية الحسابية الناتج

5 + 2 * 4 13

10 / 2 -3 2

8 + 12 * 2 -3 28

4 + 17 % 2 – 1 4

6 – 3 * 2 + 7 -1 6

ترتيب الاسبقية

حسنا رئينا كيف كانت الاسبقية التلقائية لكن كيف نقوم بعمل الاسبقية الخاصة بنا ؟

مثال:

اقتباس

5 – 3 + 2

اقتباس

((5-3) + 2)

مثال اخر :

اقتباس

12 / 6 * 4

اقتباس

((12/6) * 4)

الجدول التالى يوضح لنا ما هو مسار الرموز الرياضية

اقتباس

الرمز الاسبقية

(unrary negation) - من اليمين الى اليسار

/ * % من اليسار الى اليمين

+ - من اليسار اليمين

طريقة ترتيب الاسبقية

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

مثال طريقة حسابة a + b يُقسم على 4

Result = (a+b) / 4;

منغير ان نضع الاقوسا سيتم التالى سيُقسم ال b على 4 و يتم جمع ال a على الناتج الخاص بالقسمة

الجدول التالى يوضح بعض التعبيرات و النتائج الخاصة بهم

اقتباس

التعبير الناتج

( 5 + 2) * 4 28

10 / (5 – 3) 5

8 + 12 * (6 – 2) 56

( 4 + 17 ) % 2 – 1 0

( 6 – 3 ) * ( 2 + 7 ) / 3 9

التحويل من عمليات جبرية الى برمجية

فى الجبر ليس من المهم ان نضع علامة الضرب مثلا. لكن فى السى++ يجب علينا ان نضع اى رمز لأى عملية حسابية

الجدول التالى يوضح لنا عمليات الضرب فى الجبر و البرمجية:

اقتباس

الجبرية نطقها فى الواقع فى السى++

6B 6 ضرب B 6 * b

(3)(12) 3 ضرب 12 3 * 12

4xy 4 ضرب y 4 * x * y

عندما تقوم بتحويل من التعبيرات الجبرية الى تعبيرات برمجية , يجب عليك وضع اقواس لبعض العمليات الحسابية فى البرمجة و التى لا تظهر فى العمليات الجبرية مثال:

       X = a+b / c

الى ان يحول فى جملة برمجية, سنقوم بادخال a+b داخل قوسيين كالتالى:

x = (a+b)/c;

الجدول التالى يوضح كيفية التحويل

اقتباس

التعبير الجبرى التعبير البرمجة

y = 3x/2 y = x / 2 * 3;

z = 3bc+4 z = 3 * b * c + 4;

A = 3x+2 / 4a-1 A = (3*x+2)/(4*a-1)

[/size]لا يوجد علامة ال ^

اغلبيات لغات البرمجات ستجدون بها هذه العلامة دالة على الباور الخاص بالرقم , لكن السى++ ليس به هذه العلامة لكنه لديه هذه الخاصية بطريقة اخرى.

لكى نقوم بعمل power للرقم يجب علينا ان نستخدم مكتبة الرياضيات. مكتبة السى++ ليست مكان لتواجد الكتب لكنها دوال خاصة تساعدنا فى بعض الاعمال الروتينية بدلا من ان نستهدم رموز. واحدة من دوال مكتبة الرياضيات تُدع pow

مثال :

area = pow(4.0, 2.0);

هذه الجملة تستدعى التابع pow الارقام التى بداخل القوسين هم الارقام التى نريدها و نريد لها ال power الخاص بها.

اولا الرقم الاول هو رقمنا الاساسى اى اننا هنا نريد ان نقوم بعمل ال power لهذا الرقم و الباور هو الرقم الثانى اى ان هذه الجملة تعادل 4.0^2.0 ثم تعود النتيجة الى المتغيير area بناتج 16

الجملة الماضية تعادل فى الجبر

area = 4^2

مثال اخر, فى هذا المثل سوف نقوم بضرب 3 فى 6^3 و تخزين الناتج فى x

x =  3 * pow(6.0, 3.0);

المثال التالى يوضح طريقة عرض الباور الخاص بأى رقم مندون ان قوم بعمل متغيير

cout << pow(5.0, 4.0);

يجب ان يحتوى برنامجك على مكتب cmath . ثانيا يجب ان تكون الارقام داخل الباور هى double و يجب ان يكون المتغير ايضا double مثال:/

البرنامج التالى سيقوم بحل مشكلة جبرية . يطلب من المستخدم ان يدخل القطر الخاص بالدائرة ثم سيقوم بحسابة المساحة الخاصة بالدائرة, التركيبة هى

اقتباس

Area =πr^2
Area = 3.14159 * pow(radius, 2.0);

المثال التالى يوضح ذلك

//This program calculates the area of circle
//the formula for the area of a circle is Pi times
//the radius is squared. Pi is 3.14159
#include <iostream>
#include <cmath> //needed for pow function
using namespace std;

int main()
{
	double area, radius;

	cout << "This program calculates the area of a circle.\n";
	cout << "What is the raduis of the circle? ";
	cin >> radius;
	area = 3.14159 * pow(radius, 2.0);
	cout << "The area is " << area << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

This program calculates the area of circle.

What is the radius of the circule? 10[Enter]

The area is 314.159

ملاحظة : البرنامج الماضى قمنا بستخدام pow لكن فى الواقع برنامج بسيط كهذا من الممكن العمل عليه بطرق ابسط و هى

Area = 3.14159 * radius * radius;

ال pow مفيدة لكن فى برامج اكبر من هذا.

فى المشاركة القادمة سوف نتحدث عن تحويل الانواع

العلامتين + و – لديهم نفس الاسبقة و لديهم الاسبقية من اليسار الى اليمين اذا لدينا الحاجة لكى نقوم بعمل الاسبقية الخاصة بنا و المثال الماضى هو هو نفسه المثال القادم :
هنا قمنا بعمل قوسين اولا فى مثل هذه العملايت الاقواس الداخلية جدا تبداء اولا فهنا يتم الطرح اولا 5 -3 يساوى 2 و ثم القوس التالى له و هو الاخير يتم اضافة ال 2 الى 2 الناتج 4 .
لأن ال / و * لديهم نفس الاسبقية و ايضا يقعون تحت خط من اليسار لليمين فسوف يعملون تمام كالمثال التالى :
هنا تم التالى اولا من الداخل للخارج قسمة ال 12 على ال 6 الناتج هو 2 ثم ضرب ال 2 فى 4 يساوى 8 اذا فالناتج يساوى 8.
و فى البرمجة تكتب كالتالى

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#3

تحويل الانواع التلقائى

الملخص : عندما تقوم بعمل عملية حسابية و تستخدم اكثر من نوع من المتغيرات , هذا سيأثر على الناتج.

اذا ضُرب int فى float , اى نوع سيتم تخزين الناتج به ؟؟؟؟ لو تم قسمة double على unsigned int ؟؟ هل تعرف ما النوع الذى سيتم التخزين به ؟؟؟ الاجابة هى نعم. السى++ تتبع بعض القواعد عندما تقوم بعمل العمليات الحسابية على متغيرات من انواع مختلفة. من المفيد ان تعرف انك عندما تقوم بعمليات حسابية من انواع مختلفة فسوف تنتج بعض الاخطاء و المشاكل.

مثل ضباط الجيش كل منهم له رتبته , تمام كأنواع المتغيرات فهى ايضا مرتبة , فأذا قمت بعمل ضرب double فى int النوع الذى سيتمكن و يتم احتسابه هو double لأنه اقوى من ال int

الجدول التالى يوضح الاعلى الى الاقل:

اقتباس

Long double

Double

Float

Unsigned long

Long

Unsigned int

Int

يوجد استثناء واحد فقط فى الجدول الماضى عندما يكون ال int و ال long فى نفس الحجم. فى هذه الحالة فأن ال unsigned int اقوى و اكبر من long لأنها تحمل رقم ايجابى اكبر.

عندما يعمل السى++ مع العلامات الرياضية دائما تحول البيانات الموجودة الى النوع الأعلى كما رئينا فى الجدول الماضى و شرحنا ذلك . هذا التحويل التلقائى يدعى type coercion. عندما يتم تغير النوعية الى اعلى, فهى تقول انها تطورت. انظروا للقواعد التالية و سوف تعرفون الى ماذا يتحول الانواع مع بعضها

القاعدة الاولى : char , short and unsigned shor .

ستلاحظ انك لم ترى هذه الانواع فى الجدول الماضى هذا لأنهم تلقائيا فى اى عملية رياضية يحولون الى int.

الاستثناء الوحيد هو عندما يكون ال unsigned short يقدر على حمل نفس الكمية الخاصة ب int . هذا يحدث فى بعض الانظمة القديمة عندما يكونون فى نفس المساحة فى تلك الحالة فسوف يتم تحويلهم الى unsigned int و ليست Int.

القاعدة الثانية : عندما يتم عمل عملية حسابية بنوعين مختلفين يتم تطوير النوع الاقل الى النوع الاعلى؟

المثال :

int year;
float interestRate
year * interestRate

قبل ان تتم عملية الضرب , سيتم تغيير ال year الى float.

القاعدة الثالثة : عندما يتم اخذ الناتج لعملية حسابية و تخزينها فى متغير , سوف يتم تحويل الناتج الى النوع الخاص بالمتغير.

مثال:

فلنقل ان area من نوع long و length , width من نوع int:

area = length * width

بما ان length , width من نوع واحد و هو Int فلن يتم التحويل, الناتج للضرب سيتم تخزينه فى area و بما انها من النوع long سيتم تحويلهم الى نوع long لكى يتم تخزينهم فى area .

لاحظ المثال التالى , عندما يتم ضرب float ب Int و يتم التخزين داخل متغير int :

int x, y = 4;
flaot z = 2.7;
x = y * z;

فى عملية الضرب سيتم التحويل الى floa لأنها الاقوى و سيتم تخزين الناتج 10.8 لكن بما ان x هى int فسيتم تحويل 10.8 الى 10 و يتم التحزين حينها .

قسمة ال integer

عندما تقوم بقسمة int على int فالناتج سيكون int :D جبت التايهه , لكن ان كان هناك باقى فسوف يتحتفى , الناتج النهائى فى المتغيير سيكون 2.0 , فلننظر افضل:

double parts;
parts = 15/6;

ال 15 قسمت على 6 فالناتج هو 2.5 , لكننا نقوم بقسمة int على int (لاحظ اننا لم نضع كسور) لا يهم اننا قمنا بعمل المتغيير حامل النتيجة ك double .لكى تقوم بأرجاع الناتج و هو يحمل الكسور يجب عليك ان تضع و لو رقم واحد بداخله كسر كثال:

double parts;
parts = 15.0/6;

فى هذا الكود الرقم كان 15.0 و كان ك floating point اذا فسوف يتم ارجاع ناتج به كسور فالناتج سيكون

اقتباس

2.5

تجاوز الحد الاعلى و الادنى

Overflow and Underflow

الملخص : عندما تقوم بعمل متغير و تقوم بوضع رقم اكبر من قدرته او ان تقوم بوضع رقم اصغر من قدرته فسوف يقوم المتغير بعمل overflow او underflow.

المشكلة قد تبدء عندنما تقوم بوضع ناتج اكبر من الحجم الاساسى للمتغير . فى الجملة التالية , سيكون هناك a,b and c و سيكونون كلهم من نوع short:

a = b *c;

لو كان c و b بداخلهم ارقام كافية فقط لل short فأن الضرب سزف يعطى ناتج كبير جدا و لا يمكن تخزينه داخل short مما يؤدى الى overflow or underflow لكى نحل هذه المشكلة نقوم بعمل a ك int or long لك تتحمل الناتج.

اذا كان الناتج اكبر فسوف تكون overflow و اذا كان الناتج اصغر من النوع فسوف تكون underflow . المثال تالى سوف يوضح ماذا سيحدث عندما يحدث overflow & underflow :

// This program demonstrates integer overflow and underflow.
#include <iostream>
using namespace std;
int main()
{
short testVar = 32767;
cout << testVar << endl;
testVar = testVar + 1;
cout << testVar << endl;
testVar = testVar - 1;
cout << testVar << endl;
system("pause");
return 0;
}

المخرجات :

اقتباس

32767

-32768

32767

بالتحديد, عندما يحدث overflow ل integer و هنا اتحدث عنها بشكل عام, فما يحدث هو النزول الى اقل رقم فى النوع (سلبى) و من ثم اضافة 1 اليها .

ما حدث فى المثال الماضى هو النزول من 32,767 الى -32,768 و اضافة 1 اليها و عندما تم طرح 1 منها رجعت كما كانت و ما حدث هو underflowed , مما ادى الى رجوعها الى 32,768 . لن يقوم باعطائك رسائل error او تحذيرات اذا فكن حريص عندما تعمل مع ارقام قريبة الى اكبر رقم او اصغر رقم فى ال integer. اذا حدث overflow or underflow فسوف تظهر لنا نتائج غريبة.

عندما يحدث underflow or overflow ل floating point , الناتج سيكون حسب ال compile .

من الممكن حدوث ايا من التالى :

1 – ظهور ناتج خطاء و اكمال البرنامج عمله

2 – ظهور رسالة خطاء

3 – ظهور رسالة خطاء و وقوف البرنامج لكن تخزين الناتج 0 لو كان underflow

4- اعطائك تحذير

سوف تعرف ماذا سيقوم جهازك بالعمل عندما تجرب البرنامج التالى :

// This program can be used to see how your system handles
// floating-point overflow and underflow.
#include <iostream>
using namespace std;

int main()
{
float test;
test = 2.0e38 * 1000; // Should overflow test
cout << test << endl;
test = 2.0e-38 / 2.0e38; // Should underflow test
cout << test << endl;
system("pause");
return 0;
}

فى المشاركة القادمة سوف نتحدث عن طريقة تحويل الانواع

تحويل انواع البيانات

Type Casting

الملخص : يتيح لك الحرية فى تغير انواع البيانات بشكل manual اى بطريقتك الشخصية

تحويل انواع البيانات تسمح لك بأن تحول لنوع اعلى او اقل , الطريقة هى

static_cast<النوع>(اسم المتغيير)

او بالانجليزية

static_cast<DataType>(Value)

ال value هو المتغيير الذى نريد تحويله مثال , سوف يوضح لنا تحويل من double الى int

double number = 3.7;
int val;
val = static_cast<int>(number);

فى هذا الكود قمنا بعمل متغييرين number و كان من double و val و كان من نوع int , فى السطر الثالث قمنا بعمل التحويل , قمنا بتحويل number الى int . عندما يحدث ذلك الجزء الخاص بالكسور سوف يتم حذفه و الباقى هو 3 اذا فالناتج 3 .

تغيير الانواع يكون مفيد فى بعض الاحيان التى لن يقوم فيها السى++ بالتحويل الاوتوماتيكى, المثال التالى سيقوم بالتحويل من int الى double لكى تتم عملية القسمة بشكل افضل :

//This program uses a type cast to avoid integer division.
#include <iostream>
using namespace std;

int main()
{
	int books;
	int months;
	double perMonth;

	cout << "How many books do you plan to read? ";
	cin >> books;
	cout << "How many months will it take you to read team? ";
	cin >> months;
	perMonth = static_cast<double>(books) / months;
	cout <<"That is " << perMonth << " books per month.\n";
	system("pause");
	return 0;
}

المخرجات:

اقتباس

How many books do you plan to read? 30[Enter]

How many months will it take you to read them? 7[Enter]

That is 4.28571 books per month.

المتغير books كان int لكن الناتج الخاص به تحول الى doubleقبل عملية القسمة. من دون ان تحول فسوف تكون القسمة بمتبقى .

تحذير : فى البرنامج الماضى لو قمنا بعمل السطر كالتالى فأنه سيقوم بعمل قسمة integer

perMonth = static_cast<double>(books/months);

فى هذه الحالة قسمة ال books على ال months ستكون 4 ثم يتم التحويل الى double فتكون 4.0 . بالتالى لا تستخدم هذه الطريقة.

مثال اخر :

//This program uses a trpe cast expression to print a character from a number
#include <iostream>
using namespace std;

int main()
{
	int number = 65;

	cout << number << endl;

	cout << static_cast<char>(number) << endl;
	system("pause");
	return 0;
}

المخرجات

اقتباس

65

A

ملاحظة : يوجد اكثر من طريقة تغيير الانواع و اشهرهم و اكترهم استخداما هو static_cast فسوف نستخدمه فى دروسنا بأذن الله, لكن سوف نتعرف على نوعيين اخرين ايضا.

السى++ يدعم طريقتين قديمتين فى التغيير : طريقة ال C و طريقة السى++ الغير ثابتة. اولا

طريقة السى: نكتب اسم النوع الذى نريده فى قوسين و جانبه اسم المتغيير الذى نريد ان نغيره مثال:

val = (int)number;

مثال اخر:

perMonth = (double)books / months;

فى هذا المثال تم تحويل books الى double قبل ان تتم عملية القسمة

ثانيا:

طريقة السى++ الغير ثابتة(القديمة) , هى عكس طريقة السى فقط فهنا نكتب النوع الذى نريد تغيره ثم اسم المتغير داخل القوسيين مثال:

perMonth = double(books) / months;

لكن اعرف ان الطريقة الافضل هى static_cast فهى ثابتة , فى بعض الاحيان سترى بعض الاكواد بالطريقة القديمة

فى الدرس القادم سوف نتعرف على الثوابت التى لا تتغير مهما حدث

فى الدرس القادم سوف نتحدث عن تجاوز الحد الاعلى و تجاوز الحد الادنى

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#4

الثوابت المسماه

المخلص: الثوابت تأخذ دائما اسماء توصف ما تفعله فى البرامج.

فى شابتر 2 تعلمنا ان الارقام و النصوص هى ثوابت , المثال التالى به ثوابت

newAmount = balance * 0.129;

الثوابت هنا هى 0.129

فلنقول ان هذا السطر موجود فى برنامج للبنوك يحسب الفوائد السنوية . يوجد مشكلتان الأن , اولا ليس من الواضح ما هو ال 0.129 الا المبرمج الحقيقى لهذا البرنامج ,واضح انها نسبة الفوائد , لكن فى بعض الاحيان يوجد بعض الناس قد لا يقدرون على فهم هذا , كيف نقوم بجعلها واضحة وضوح الشمس لأى شخص ؟ سنرى قريبا

المشكلة الثانية : لو تم استخدام هذا الرقم فى اى عملية حسابية اخرى ؟ حسنا اذا اردنا مثلا ان نقوم بتغير رقم الفوائد فى السورس الخاص بنا لكن يوجد اكثر من عملية حسابية تستخدم هذا الرقم ؟؟ اى كود سوف نبحث فيه ؟؟؟

هاتان المشكلتان يتم حلهما بأستخدام الثوابت المسماه , هى مثل المتغيرات لكنها ثوابت تقراء فقط read – only, و لا يمكن تغيرها فى حين تشغيل البرنامج

مثالأ:

const double INTEREST_RATE = 0.129;

هى تشبه تمام تعريف المتغير لكن الفرق هى كلمة const و كتابة الاسم فى الحروف الكبيرة فقط؟

الكلمة const تخبر الكومبايلر ان هذا المتغير يُقرء فقط . سوف يفضل الناتج داخل هذا الثابت ( ثوابت) كما هو اثناء تشغيل البرنامج. ليس من المهم كتابة كل حروف اسم المتغيير بالحروف الكبيرة , لكن للعلم فقط هى افضل لأنها تظهر واضحة اكثر و اكثر ( انا عن نفسى لا اقوم بعمل ذلك :D )

عندما تقوم بعمل ثوابت ينبغى عليك اضافة الناتج الذى تريده له اثناء سطر التعريف ذات نفسه

المثال التالى لن يعمل :

const double INTEREST_RATE;
INTEREST_RATE = 0.129;

هذا لن يعمل و سوف يعطيك رسالة خطاء , و ايضا سيعطيك رسالة خطاء اذا حاولت اثناء الكود ان تغيير الناتج الخاص به.

من المميزات الخاصة بالثوابت المسماه هى انها تجعل البرنامج سهل القراءة , مثال:

newAmount = balance * 0.129;

تحول الى :

newAmount = balance * INTEREST_RATE;

اى مبرمج مبتدئ يقدر على قراءة السطر الثانى بسهولة و معرفة انها تقوم بعمل الفوائد . ميزة اخرى و هى انك من السهل التغيير فى قيمة الثوابت المسماه بسهولة تامة فمثلا اذا اردنا تحويل الفوائد

const double INTEREST_RATE = 0.132;

هذا البرنامج جاهز الأن و كل سطر به المتغيير INTEREST_RATE سوف يتحول الى الناتج الجديد

من المفيد ايضا ان تقوم بعمل ثوابت مسماه لنتائج من الصعب تذكرها , مثال القطر الخاص بالدارئة رقمه هو : 3.14159 و استخدمناه فى المتغيير PI من الاسهل الأن ان نقوم بعملها ك ثواتب مسماه

المثال:

// This program calculates the area of a circle. The formula for the
// area of a circle is PI times the radius squared. PI is 3.14159.
#include <iostream>
#include <cmath> // Needed for the pow function
using namespace std;
int main()
{
const double PI = 3.14159;
double area, radius;
cout << "This program calculates the area of a circle.\n";
cout << "What is the radius of the circle? ";
cin >> radius;
area = PI * pow(radius, 2);
cout << "The area is " << area << endl;
system("pause");
return 0;
}
سابقا فى هذا الدرس رئيتم  كيفية عمل مصفوفة لل char لكى نحمل نصوص بطريقة ال C القديمة , من السهل الأن ان نستخدم ثوابت مسماه تحمل اسم SIZE بداخلها حجم المصفوفة مثال:
const int SIZE = 21;
char nane[SIZE];

هذا يجعل البرنامج اسهل فى القراءة , عندما نخزن الحجم الخاص بالمصفوفة فى ثوابت مسماه , ايضا يمكنا استخدام الثاوبت المسماه تلك كأرقام عادية للعمليات الحسابة او اى مصفوفة اخرى , اذا فأن احتاجنا لتغيير حجم المصفوفة  فقط سوف نغير الثوابت المسماه.



الطريقة الاخرى فى الثوابت المسماه هى #define و هى طريقة السى القديمة  هيا لنتعرف عليها

الطريق القديمة هى فى استخدام #define تماما مثل ما نقوم به فى #include  فهنا نحن نأخذ المكتبات التى نريدها لكن فى ال #define فهنا نعرف المتغيرات التى نريدها , هى تُفضل عن الطريقة الماضية . يوجد بعض البرامج التى تستخدم تلك الخاصية حتى الأن فى شابتر 13 سوف نتعلم استخدامات اخرى لل #define من المهم ان تفهمها اللأن

مثالأ:
// This program calculates the area of a circle. The formula for the
// area of a circle is PI times the radius squared. PI is 3.1459.
#include <iostream>
#include <cmath> // Needed for the pow function
using namespace std;
#define PI 3.14159
int main()
{
double area, radius;
cout << "This program calculates the area of a circle.\n";
cout << "What is the radius of the circle? ";
cin >> radius;
area = PI * pow(radius, 2);
cout << "The area is " << area << endl;
system("pause");
return 0;
}

تذكر ان اى شئ يبدء ب # او ما يسمى بال preprocessor يعمل قبل ان يتم عمل كومبايل للبرنامج الخاص بك

فلنشرح الأن

#define PI 3.14159

الكلمة PI الأن تعتبر ثوابت و الناتج الخاص بها هو 3.14159 اى مرة سيتم استخدام كلمة PI سييكون بالاصح الرقم 3.14159

مثال: جعلنا البرنامج يقراء التالى :

area = 3.14159 * pow(radius, 2.0);

عندما نكتب

cout << PI << endl;

فهنا معناها اننا نكتب

cout << 3.14159 << endl;

من المهم ان تعرف الفرق بين الثوابت المسماه المُعرفة بمتغيرات و الثوابت المصنوعة ب define , الثوابت المسماه تصنع كمعتغيرات لديهم انواع و مساحة محددة فى الذاكرة . هم تماما مثل المتغيرات العادية بالاضافة الى كلمة const فقط. لكن الثوابت المصنوعة ب #define ليست متغيرات لكنها كنصوص يتم استخدامها كل اسم للثوابت يتم حذفه و وضع النص الذى بداخله كما رئينا سابقا.

دائما لاحظ انك لا تكتب فى نهاية ال #define ال semi colon ; مجددا احذر انا اقول لك انك لا تكتب ال ; فى نهاية السطر

فلو قمنا بكتابته فسوف يتم وضعه داهل الكود الذى نكتبه مثال:

#define PI 3.14159;

السطر الرياضى

area = PI * pow(radius, 2);

اذا فعلنا ذلك فكأننا كتبنا السطر التالى :

area = 3.14159; * pow(radius, 2);

اذا فأى حرف تكتبه سوف يُكتب داخل الكود الذى تستخدمه به كما رئينا

ملاحظة : اى سطر مبدوء ب # لا يتطلب ; لمعرفة انه تم انهاءه

فى المشاركة التالية سوف نتحدث عن التهيئات الجماعية.

التهييئات الجماعية

Multiple Assignment and Combined Assignment

الملخص : التهيئات الجماعة تعطى نفس القيمة لأكثر من متغير.

السى ++ يتيح لك ان تعطى نفس القيمة لأكثر من متغير فى نفس السطر . لو البرنامج لديه مجموعة من المتغيرات مثل

a,b,c,d و كلهم يحتاجون نفس القيمة الا و هى 12 من الممكن تهيئتهم جماعيا فالننظر:

a = b = c = d = 12;

القيمة 12 سوف تُضع داهل كل متغير من ما مضى.

التهيئات السريعة

بعض البرامج تستخدم سطور مثل التالى :

number = number +1;

هذا التعبير على يمين الكود يقوم بعمل اضافة 1 الى المتغير نفسه .لكن يوجد طريقة اسرع و افضل من تلك لأضافة 1 على نفس المتغيير مثال اخر :

number = number -5;

اذا لم ترى هذا النوع من هذه الجمل من قبل فالجدول التالى سيوضح لك ما عمله بالظبط

اقتباس

التعبير ماذا يفعل القيمة الخاصة ب x بعد الانتهاء

x = x + 4; اضافة 4 على x 10

x = x – 3; طرح 3 من ال x 3

x = x * 10; ضرب ال x فى 10 60

x = x / 2; قسمة ال x على 2 3

x = x % 4 متبقى قسمة ال x على 4 2

هذه التعبيرات تعتبر اساسية فى البرمجة لكن السى++ تعطيك ادوات خاصة لعمل تلك التعبيرات بطريقة اسهل

اقتباس

الرمز المثال المستخدم يساوى

+= x += 5; x = x+5;

-= y -= 2; y = y – 2;

*= z *= 10; z = z * 10;

/= a /= b; a = a / b;

%= c %= 3; c = c % 3;

كما رئينا التهيئات السريعة لا تطلب ان تكتب اسم المتغير مرتين , و ايضا واضحة جدا

مثال على ما درسنا :

/* This program tracks the inventory of three widget stores
   that opened at the same time. Each store started with the 
   same number of widgets in inventory. By subtracting the
   number of widgets each store has sold from its inventory,
   the current inventory can be calculated.                  */
#include <iostream>
using namespace std;

int main()
{
	int begInv,
		sold,
		store1,
		store2,
		store3;
	cout << "One week ago, 3 new widget stores opened\n";
	cout << "at the same time with the same begining\n";
	cout << "inventory. What was the beginning inventory? ";
	cin >> begInv;

	store1 = store2 = store3 = begInv;

	cout << "How many widgets has store 1 sold? ";
	cin >> sold;
	store1 -= sold;

	cout << "How many widgets has store 2 sold? ";
	cin >> sold;
	store2 -= sold;

	cout << "How many widgets has store 3 sold? ";
	cin >> sold;
	store3 -= sold;

	cout << "\nThe current inventory of each store:\n";
	cout << "Store 1: " << store1 << endl;
	cout << "Store 2: " << store2 << endl;
	cout << "Store 3: " << store3 << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

One week ago, 3 new widget stores opened

at the same time with the same begining

inventory. What was the beginning inventory? 100[Enter]

How many widgets has store 1 sold? 25[Enter]

How many widgets has store 2 sold? 15[Enter]

How many widgets has store 3 sold? 45[Enter]

The current inventory of each store:

Store 1: 75

Store 2: 85

Store 3: 55

حسنا سنرى تهيئات جماعية اخرى مثال :

result *= a +5;

فى هذا السطر قمنا بضرب result فى مجموع a+5 , فى مثل هذه الجمل البرمجية عليك ان تعرف ان التهيئات الجماعية تأتى دائما فى نهاية العمليات الرياضية مثال

لكى يأتى الناتج الصحيح لنا من قبل كنا نقوم بعمل الاقواس فى العمليات الرياضية:

result = result * (a+5);

و هى مختلفة عن

result = result * a + 5;

الجدول القادم يوضح ذلك بشكل اكبر

اقتباس

المثال المستخدم يساوى

x += b + 5; x = x + (b + 5);

y -= a * 2; y = y - (a * 2);

z *= 10 - c; z = z * (10 - c);

a /= b + c; a = a / (b + c);

c %= d - 3; c = c % (d - 3);

فى المشاركة القادمة سوف نتحدث عن طريقة عمل شكل جمالى فى النصوص و المخرجات

تم تعديل هذه المشاركة بواسطة HGB في 30 أكتوبر 2010 في 19:36

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#5

تنسيق المخرجات

Formatting output

الملخص : الكائن cout لديه القدرة على تنسيق العرض على الشاشة بطريقة جميلة جدا.

حسنا المثال التالى يعرض لكن نفس الرقم لكن يعرض بأكثر من طريقة:

اقتباس

720

720.0

720.00000000

720

7.2e+2

+720.0

هم هم نفس الارقام لكن بأكثر من طريقة عرض.

حسنا كيف نسيطر الأن على البيانات التى نريدها ؟؟؟؟

سنرى ذلك الأن بأذن الله:

فى البداية سوف اقوم بتقسم الدرس الى عدة اقسام لأن ال format ليس بالسهل

نبتدى بال

setw

#include <iostream>
using namespace std;
int main()
 {
 int num1 = 2897, num2 = 5, num3 = 837,
 num4 = 34, num5 = 7, num6 = 1623,
 num7 = 390, num8 = 3456, num9 = 12;

 // Display the first row of numbers
 cout << num1 << " " << num2 << " " << num3 << endl;

 // Display the second row of numbers
 cout << num4 << " " << num5 << " " << num6 << endl;

 // Display the third row of numbers
 cout << num7 << " " << num8 << " " << num9 << endl;
system("pause");
 return 0;
 }

حسنا و الاخراج لهذا المثال هو التالى

اقتباس

2897 5 837

34 7 1623

390 3456 12

انظرون الى المنظر الارقام تحت بعضا لا يمكن التفريق اين السطر اليس كذلك

لكن العنصر cout يقدم لنا شيئا فريد من نوعه لحل هذه المشكلة و هو setw

حسنا سنوضحه فى المثال البسيط التالى:

value = 23;
cout << "(" << setw(5) << value << ")";

سيظهر لنا الناتج التالى

اقتباس

( 23)

اذا ما يفعله setw هى عمل فراغات فى الماكن الذى تحدده بالمساحة الذى تحددها

حسنا سنرى الأن المثال الذى تحدثنا عنه فى البداية و نرى الحل له

سنضع بين كل رقم 6 فواصل و سيكونون بهذا الشكل :

#include <iostream>
#include <iomanip> // Header file needed to use setw
using namespace std;

int main()
 {
 int num1 = 2897, num2 = 5, num3 = 837,
 num4 = 34, num5 = 7, num6 = 1623,
 num7 = 390, num8 = 3456, num9 = 12;
 // Display the first row of numbers
 cout << setw(6) << num1 << setw(6) << num2 << setw(6) << num3 << endl;

// Display the second row of numbers
cout << setw(6) << num4 << setw(6) << num5 << setw(6) << num6 << endl;

 // Display the third row of numbers
 cout << setw(6) << num7 << setw(6) << num8 << setw(6) << num9 << endl;
system("pause");
 return 0;
}

و الاخراج سيكون على الشكل التالى :

اقتباس

2897 5 837

34 7 1623

390 3456 12

ارئيتم التنسيق الجمالى الذى حدث ؟؟؟ هذا ما اتكلم عنه

الأن لنشرح

قمنا الأن بكتاب

cout << setw(6) << num1 << setw(6) << num2 << setw(6) << num3 << endl;

اتدرون ما الذى فعلته setw

حسنا قامت بعمل 2 فراغات فى بداية البرنامج لأن ال 4 اعداد التى بعدها تطلب ان يكون هناك مساحة لها فى ال setw و نحن اعطينا لل setw 6 مساحات فقط لعرض المتغير و المتغير الذى قمنا بأدخاله يوجد به 4 ارقم اذا سنأخذ 2 فراغ و الباقى للمتغير وضحت ؟؟؟؟

ثم طباعة اول رقم ثم 5 مسافات نعم 5 مسافات لأن المسافة السادسة هى الرقم الذى كتب

ثم 3 فراغات و ال 3 الاخرون يحتوون على الرقم الذى نريده

ظهر لنا الأن مكتبة جديدة تدعى

Iomanip

هذه المكتبة تستخدم فى التنسيق الجمالى للشكل.

الأن لنتعمق بعض الشئ فى هذه الدالة الصغيرة التى ترينا شكلا جماليا رائعا.

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

حسنا ستستغرب عندا تكتب رقم متغير اكبر من ال setw مثل التالى:

value = 18397;
cout << setw(2) << value;

المخرجات هى :

اقتباس

18

حسنا من الممكن استخدام ال setw فى ال string , floating points, int values اى من الممكن استخدامها فى اى شئ نريدها و هذا مثال على ما اقول :

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

int main()
 {
 int intValue = 3928;
double doubleValue = 91.5; 
string stringObjectValue = "Jill Q. Jones";

cout << "(" << setw(5) << intValue << ")" << endl;
cout << "(" << setw(8) << doubleValue << ")" << endl;
cout << "(" << setw(16) << stringObjectValue << ")" << endl;
system("pause");
return 0;
}

الناتج الذى سيخرج لنا هو التالى :

اقتباس

) 3928)

) 91.5)

( Jill Q. Jones)

3 ملاحظات على ما سبق الأن:

حجم المساحات لل Floating Points يتضمن ال Decimal Point .

حجم المساحات لل Strings يتضمن كل الحروف فى ال String من بينهم المسافات.

اى فراغ عام سيكون على اليسار اوتوماتيكيا و سنرى حل لهذا فى ما يلى.

انتهى الأن درسنا عن ال setw .

serprecision

ما هى ال setprecision

هى التقريب (ان اقلل من الرقم الاخير و ارى اذا كان اكثر من 5 ام اصغر من 5 لأحسب التقريب له)

فى ال floating point حسنا ما هو التريب فلنقل ان المتغير التالى سيظهر كما هو

double test = 4.91877;

اريد ان اظهره كما هو اذا سيظهر كما هو

لكن ان اردت ان اقلل رقم من فسوف اقلل رقم الاخير

اذا فسيكون شكله كالتالى

اقتباس

4.9188

التالى

4.919

التالى

4.9

التالى

5

انتهينا

من المؤكد انها واضحة جدا.

حسنا فنرى المثال الان:

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

int main()
{
double quotient, number1 = 132.364, number2 = 26.91;

quotient = number1 / number2;
cout << quotient << endl;
cout << setprecision(5) << quotient << endl;
cout << setprecision(4) << quotient << endl;
cout << setprecision(3) << quotient << endl;
cout << setprecision(2) << quotient << endl;
cout << setprecision(1) << quotient << endl;
system("pause");
return 0;
}

المخرجات هى :

اقتباس

4.91877

4.9188

4.919

4.92

4.9

5

الأن فلندخل للشرح :

اول متغير يظهر لنا ظهر بطبيعته لأننا اردناه هكذا و لم نضع ال setprecision

و من ثم نضع ال setprecision و نبدء بالتدريج كما اوضحنا من قبل

اظن انه واضح .

فى ما بعد سوف نرى كيف التحكم فى الرقم الذى بعد ال decimal point فقط.

لو كان المتغير رقمه اقل من رقم ال setprecision سيظهر كاملا .

الجدول القادم يشرح كيف تعمل ال setprecision

اقتباس

الرقم --------------------------------------------- الكمية التى نضعها --------------------------- الرقم المرئى

28.92786 setprecision(3) 28.9

21 setprecision(5) 21

109.5 setprecision(4) 109.5

34.78596 setprecision(2) 35

اتمنى انها تكون وصلت يارب

ايضا نفس المكتبة يجب استخدامها

iomanip

المثال القادم يشرحلنا كيف دمح setw + setprecision و سوف يقوم المستخدم بأدخال الارقام التى يريديها:

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

int main()
{
double day1, day2, day3, total;
cout << "Enter the sales for day 1: ";
 cin >> day1;
 cout << "Enter the sales for day 2: ";
 cin >> day2;
 cout << "Enter the sales for day 3: ";
 cin >> day3;

 total = day1 + day2 + day3;

 cout << "\nSales Figures\n";
 cout << "-------------\n";
 cout << setprecision(5);
 cout << "Day 1: " << setw(8) << day1 << endl;
 cout << "Day 2: " << setw(8) << day2 << endl;
 cout << "Day 3: " << setw(8) << day3 << endl;
 cout << "Total: " << setw(8) << total << endl;
system("pause");
 return 0;
}

حسنا المخرجات ستكون كالتالى :


Enter the sales for day 1: 321.57[Enter]
Enter the sales for day 2: 269.62[Enter]
Enter the sales for day 3: 307.77[Enter]
Sales Figures
-------------
Day 1: 321.57
Day 2: 269.62
Day 3: 307.77
Total: 898.96

حسنا اظنها واضحة و لا تحتاج الى شرح

انتهى الان شرح ال setprecision .

fixed

ما هى ال fixed

اذا كان الرقم كبير جدا ليظهر مع ال setprecision فقط او ان يضعه فى هيئة e+ و الكل يعرفها.

حسنا سأعطى مثالا الأن

اقتباس

Enter the sales for day 1: 145678.99[Enter]

Enter the sales for day 2: 205614.85[Enter]

Enter the sales for day 3: 198645.22[Enter]

Sales Figures

-------------

Day 1: 1.4568e+005

Day 2: 2.0561e+005

Day 3: 1.9865e+005

Total: 5.4994e+005

لكى نتفادى هذا يجسوف نستخدم ال fixed

عندما يندمج ال fixed مع ال setprecision يعطون شيئا اخر فهم يقللون من الرقم الذى يأتى خلف ال decimal point فقط وليس الرقم بأكمله

هذا ما نريده و حتى من الممكن استخدام ال setw معهم ايضا :

amount1 = 125.00 * .075; // amount1 is set to 9.375
amount2 = 125.00 * .06; // amount2 is set to 7.5
cout << setprecision(4);
cout << setw(5) << amount1 << endl;
cout << setw(5) << amount2 << endl;

المخرجات ستكون بالشكل التالى :

اقتباس

9.375

7.5

لكن بستخدام ال fixed + setprecision سوف نقدر على حل هذا الشكل الردئ نوعا ما.

تذكر فسوف نستخد فى ال setprecision(2) فالأن لن نتحكم بالاعداد كاملة بل سوف نتحكم بال decimal point فقط

اذا المثال القادم يوضح لنا

cout << fixed << setprecision(2);
cout << setw(5) << amount1 << endl;
cout << setw(5) << amount2 << endl;

الناتج سوف يكون كالتالى :

اقتباس

9.38

7.50

اعتقد انها سهلة و لن نسبح بها اكثر من ذلك.

انتهينا الأن من ال fixed

showpoint

ما هى ال showpoint

هى اداة تعرض دائما ال decimal point حتى لو كان العدد ليس به decimal point و هذا مفيد جدا.

سوف نستخدم كل الادوات التى تعرفنا عليها منذ قليل setw + setprecision + fixed + showpoint .

#include <iostream>
#include <iomanip> // Needed to use stream manipulators
using namespace std;
int main()
{
double amount1 = 125.00 * .075; // amount1 is set to 9.375
double amount2 = 125.00 * .06; // amount2 is set to 7.5
double amount3 = 125.00 * .20; // amount3 is set to 25.0

 cout << fixed << showpoint << setprecision(2);
cout << setw(5) << amount1 << endl;
cout << setw(5) << amount2 << endl;
cout << setw(5) << amount3 << endl;
system("pause");
return 0;
 }

المخرجات هى :

اقتباس

9.38

7.50

25.00

اذا هنا تحكمنا فى خروج decimal points لكل الاعداد حتى التى لا تمتلك اى decimal point فقط للمنظر الجمالى

انتهيت الأن من درس ال showpoint

right & left

ما هو ال right & left

حسنا كل الامثلة السابقة كانت تضع الارقام على اليمين و هذا يضايق اى شخص اذا الحل هنا.

انتا تريد انم يظهر المثال من ال left اذا فسوف اريك كيف هذا مع ال fixed+showpoint+setprecision . لأننى اريد ان اجعلك تتحكم بها بأذن الله

#include <iostream>
#include <iomanip> // Needed to use stream manipulators
#include <string>
using namespace std;

int main()
{
string month1 = "January",
month2 = "February",
month3 = "March";
int days1 = 31,
days2 = 28,
days3 = 31;

double high1 = 22.6,
high2 = 37.4,
high3 = 53.9;

cout << fixed << showpoint << setprecision(1);
cout << "Month Days High\n";

cout << left << setw(12) << month1
 << right << setw(4) << days1 << setw(9) << high1 << endl;
cout << left << setw(12) << month2
 << right << setw(4) << days2 << setw(9) << high2 << endl;
 cout << left << setw(12) << month3
 << right << setw(4) << days3 << setw(9) << high3 << endl;
system("pause");
 return 0;
}

المخرجات :

اقتباس

Month Days High

January 31 22.6

February 28 37.4

March 31 53.9

اظن انها واضحة وضوح الشمس.

حسنا الجدول التالى يريكم ما درسناه و ما هو عملهم

اقتباس

الدالة --------------------------------- استخدامها ----------------------------------------------------------------

setw(n) تضع المساحة المحددة من المسافات الترى تريد استخدامها

fixed تضع لنا الحد الذى نريد اظهار به ال ديسيمال بوينت

showpoint تضع لنا ال ديسيمال بوينت مهما كان الرقم لا يوجد به اى ديسيمال بوينت

setprecision(n) تقرب لنا الارقام على حسب الفراغات المطلوبة

left تجل الظهور من اليسار ( يفضل استخدامه)

right تجعل الظهور من اليمين

فى المشاركة التالية سوف نتحدث عن طريقة تنسيق المدخلات

تنسيق المدخلات

Formated Input

الملخص : الكائن cin يقدم اكثر من طريقة للتحكم فى الدخلات النصية.

الكائن cin لديه ادوات التنسيق شبيه لادوات cout .مثلا لكى نعرف المدى الخاص بالادخال عن طريق setw. هذه هى اكثر اداة مفيدة فى المدخلات . فمثلا عندما يتم ادخال نصوص و ادخالها كمصفوفة char فأنك ستظن ال cin ليس لديها اداة تساعدها على معرفة حجم المدخلات. لو المستخدم ادهل اكثر من المصفوفة تسمحل فسوف يتم تحزين النصوص و الكتابة فوق بيانات اخرى داخل الذاكرة و تسبب خطاء يدعى buffer overrun و من الممكن ان يؤدى الى مشكلة صعبة بحق , لكن من الممكن ان تستبعد كل هذا بتعريف ال cin عن طريق setw بكم حرف سيتم ادخاله.

هنا مثال يشرح ذلك عن طريقة مصفوفة تسمح فقط ب 10 حروف

char word[10]
cin >> setw(10) >> word;

مكان المدخلات الأن جُهز ل 10 حروف فقط . cin سوف تقرائها 9 لأنها تعلم ان هناك مكان لل null terminator

مثال كامل الأن :

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

int main()
{
	const int SIZE = 5;
	char word[SIZE];

	cout << "Enter a word: ";
	cin >> setw(SIZE) >> word;
	cout << "You entered " << word << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

Enter a word: Eureka[Enter]

You entered Eure

فى هذا البرنامج cin قرئت فقط 4 حروف فى المصفوفة word .من دون التحكم الماضى cin كانت سوف تدخل Eureka داخل المصفوفة و القيام بعمل overflow . الكلمة Eureka + null terminator سوف يدخلون الى الذاكرة و سوف يتم اختيار 4 حروف فقط + ال null terminator و اى حروف اخرى سيتم تدميرها

يوجد شيئان عليك تذكرهم

1 – المساحة الخاصة بالمدخلات التى تُحدد فى البرنامج تبدء من اول حرف ادخال ثم الى اخير حرف تدخله ثم تبدء فى معرفة كم كان حجم المساحة ثم ازالة من الاخير الى ان تعر ان هنا كانت نهاية المساحة .

2 – ال cin تقف فى الادخال عند اى مساحة بيضاء (Enter, space and tab)

الادخال النصوص الكاملة

الكائن cin لديه دالة لأدخال نصوص داخلها فراغات و تُسمى getline و هى تدخل كل شئ من مسافات و حروف و كل شئ حتى يُضغط على زر enter مثال:

cin.getline(sentence, 20);

رئينا هنا ان هناك عمليتان داخل قوس يفرق بينهم فاصلة الاولى هى اسم المصفوفة و الثانية هى حجم المصفوفة التى نريدها ال cin سوف يقراء حرف اقل من المكتوب لكى يضمن مساحة null tterminator هذا يجعلنا لسنا فى حاجة لأستخدام setw . اذا فالجملة البرمجية الماضية تقراء 19 حرف و الحرف الاخير لل null terminator

المثال التالى به مصفوفة تسمح حتى 80 حرف

#include <iostream>
using namespace std;

int main()
{
	const int SIZE = 81;
	char sentence[SIZE];

	cout << "Enter a sentence: ";
	cin.getline(sentence, SIZE);
	cout << "You entered " << sentence << endl;
	system("pause");
	return 0;
}

المخرجات :

اقتباس

Enter a sentence: To be, or not to bem that is question.[Enter]

You entered : To be, or not to bem that is question.

انتهينا..............

الى هنا اكون قد انتهينت من اغلبية هذا الفصل يوم الاربعاء بأذن الله بعض الدروس البسيطة + بعض الامثلة التذكيرية + الاسئلة + شرح Write/Read File و هو درس من اكثر الدروس فائدة و صعب الى درجة ما لذلك سيتم شرحه فى يوم لوحده ( الاربعاء) بأذن الله

كل ما اتمناه هو دعائكم فقط.

و اتأسف على تأخرى فى وضع الدروس لكنه لظروف خارجة عن ارادتى.

لماذا لأن ال cout من الكائنات الذكية و هو اخذ امر فقط بطباعة الرقم الذى بداخل setw مهما كانت نتيجته فسوف يطبعه فقط اذا لن يوجد ال 3 ارقام الاخيرة و سوف يطبع اول رقمين فقط.

تم تعديل هذه المشاركة بواسطة HGB في 30 أكتوبر 2010 في 19:38

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#6

شباب تنويه بسيط فقط

درس ال Format input له تكملة يوم الاربعاء بأذن الله

المواعيد بأذن الله هتبقى زى الاول

كل يوم جمعة بعد الصلاة

و يوم الاربعاء صباحا الدروس المتبقية + امثلة المراجعة + الاسئلة + تحديات برمجية

اتمنى انكم تعذرونى انى مقدرتش اكمل الدروس كلها الخاصة بالشابتر مع الوعد بأذن الله بتكملتها يوم الاربعاء بحيث انى بأذن الله اتمم وعدى و ان تكون الدورة على اعلى مستوى ممكن

و السلام عليكم و رحمة الله و بركاته.

تم تعديل هذه المشاركة بواسطة XMasterrrr في 30 أكتوبر 2010 في 13:44

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#7

^_^ يعطيك الف عافيه ..

ونعذرك بخصوص الامتحانات .. وندعو لك ان تاتي بالدرجه الكامله إن شاءالله

ولكن لا نعذرك ان تقطع الدوره ^_^ فنحن متحمسين وخصوصاَ الفصول الاخيـره ^

بالتوفيق

#9

فى انتظار المشاركات التحفيزية :D

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#10

تم تأخير الأسئلة إلى الأربعاء القادم :sleep: بأمر من صاحب الدورة.

تم تعديل هذه المشاركة بواسطة khaled_prg في 31 أكتوبر 2010 في 00:12

#11

لي عوده ان شاءالله .. وعندي اسئله كثيره ( قراءتها ع السريع ) .. ^

وان شاءالله يوم الثلاثاء .. سوف ازعجك فيها

#12

غدا بأذن الله تحديث موضوع الفهرس لمعرفة كل المعلومات عن الدورة

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#13

تم التعديل على موضوع الفهرس و اضافة القوانين و كمية الشباتر و اشياء اخرى....................... (فهرس) دورة السى++ من الصفر الى الاحتراف

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#14

اين التفاعل ياخوان .... سبحان الله

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#15

اخي .. متحمس جداا لدورتك .. لكن غدا عندي امتحان ..

وانا عند وعدي غدا سوف ازعجك بالاسئله .. ^_^

ودورتك من جد ضخمـه ^_^

ولكن اتمنى من الذي يقرا من مووضوعك يرد عليك .. لان المشاهدات ضخمه

ولكن عند كل اضافه تشابتر وتتطور اكثر الدروس .. سوف تجد الاسئله من المشاهدين ..

كم انا مشتاق لـ غدااااا لكي اقرا بتمعن ..

#16

لا تقلق لن اقوم بأيقاف الدورة بأذن الله

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#17

ماشاء الله عليك يا أحمد هذا الدرس فعلا قيّم، أكمل على بركة الله.

****************************

بالنسبه للثوابت المعرفه بـ define يمكن فى اى وقت تغيير قيمتها و ذلك عن طريق إستخدام undef يليها define من جديد لنفس الإسم و لكن بقيمه جديده، انظر المثال التالى:

#define PI 3.14f

#ifdef PI
   #undef  PI
   #define PI 1.23456f
#endif

و الله ولي التوفيق

مدونتي: C++ Tips and Tricks

#18
محمد علاء الدين كتب:

ماشاء الله عليك يا أحمد هذا الدرس فعلا قيّم، أكمل على بركة الله.

****************************

بالنسبه للثوابت المعرفه بـ define يمكن فى اى وقت تغيير قيمتها و ذلك عن طريق إستخدام undef يليها define من جديد لنفس الإسم و لكن بقيمه جديده، انظر المثال التالى:

#define PI 3.14f

#ifdef PI
   #undef  PI
   #define PI 1.23456f
#endif

و الله ولي التوفيق

شكرا للمشاركة استاذ محمد....

سيتم تدريس ال define بشكل تفصيلى فى شابتر 13 بأذن الله :wink: :wink: :)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#19

شباب انا اسف بس غصب عنى والله هتأخر شوية فى الاسئلة لأن الاسبوع ده مليان امتحانات و بأذن الله برضك هيبقى الاسئلة و الشابتر فى نفس الاسبوع يعنى زى محنا بس تأخر بسيط يوم او يومين

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#20

بالتوفيق اخي احمد ..

وانا كانت عندي اسئله امس . ولكن علمت ان عندك امتحانات وأجلتها الى يوم الجمعه ( اذا فيه امكانيه انك تجاوب عليها )

وعشان بعد نشوف التكمله وتكون الاسئله دفعه واحده ^_^

#21

يوم الجمعة بأذن الله ستجدون ما يسركم

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#22

تمت اضافة الجزء الثانى و الاخير من الشابتر 3شابتر 3 (ألجزء الثانى)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#23

تمت اضافة اسئلة شابتر 3 اسئلة: شابتر 3 ( التفاعلات)

تم تعديل هذه المشاركة بواسطة XMasterrrr في 10 نوفمبر 2010 في 05:49

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#24

تم اضافة شابتر 4 :شابتر 4 (اتخاذ القرارات)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

#25

تم اضافة شابتر 4 (الجزء الثانى)

.Everyone has a dream

.I never thought that I would be the one I am on now

...No Pain No Gain

مشرف قسم السى/سى++ و الاسيمبلى سنة 2015 بأذن الله ...

تعديل: مشرف قسم السى/سى++ من 2012.

مواضيع مشابهة