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

دورة السي بلس بلس , من البداية الي الاحتراف

بدأه البارودي في 31 مايو 2005 · 43 رد · 17,360 مشاهدة · في المواضيع والدروس
مشاركة: واتساب X فيسبوك تيليجرام
#26

• إشغال التراكيب المتداخلة

كيف تشغل متغيرات تركيبة و التي تحتوي نفسها علي تركيبات أخري ؟

البيان التالي يشغل المتغير Dining بنفس القيم التي أعطيت له في برنامج ENGLAREA :

Room dining = { { 13 , 6.5 } , { 10 , 0.0 } };

كل تركيبة من النوع Distance , و التي مضمنة في إل Room , تشغل منفصلا . تذكر بان هذا يتضمن إحاطة القيم بالشيالات و يفصلهم بالفواصل.

التركيبة Distance الأولي تشغل بـ

{ 13 , 6.5 }

و الثانية بـ

{ 10 , 0.0 }

هذه قيمتي التركيبتين Distance و التي ستستخدم بعد ذلك لإشغال متغيرات التركيبة Room , يحيطهم ثانية بالشيالات و يفصلهم بالفواصل .

#27

• عمق التداخل

نظريا , التركيبات يمكن أن تتداخل إلي أي عمق . في البرنامج الذي يصمم العمارات السكانية , ستجد نفسك ببيانات مثل هذه :

Apartment1.laundry_room.washing_machine.width.feet
#28

• مثال لعبة الكروت أو البطاقات ( الكوتشينة )

هيا بنا نختبر نوع آخر من الأمثلة .

هذه احد استخدامات التراكيب لتشكيل أوراق اللعب . البرنامج يقلد لعبة تم لعبها اسمها Cardsharp ( مقامرون محترفون ) في الكرنفالات .

لعبة Cardsharp تظهر إليك ثلاث كروت , ثم تقوم بوضعهم معكوسين علي وجوههم علي المنضدة و تقوم بتغيير مواقعهم عدة مرات .

لو أنت قدرت تأخذ حزرك بشكل صحيح عند تحديد أين البطاقة المحددة , ستفوز . كل شئ بالبصر البسيط ( بالعين المجردة ) , بالرغم من ذلك فان إل Cardsharp تقوم بتغيير أماكن الكروت بسرعة و بشكل مشوش حتى إن اللاعب ( العلامة ) عادتا ما يفقد مسار الكروت و يخسر اللعبة و التي بالطبع , لعبها من اجل الفلوس .

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

post-36368-1213303700_thumb.jpg

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

يدير العدد من 2 حتى 14 , حيث أن 11 و 12 و 13 و 14 تنوب عن إل Jack و إل Queen و إل king و إل Ace علي التوالي ( هذا الأمر يستخدم في لعبة البوكر ) .

المجموعات تدير من صفر حتى 3 حيث تمثل هذه الأعداد الأربعة إل Clubs و إل Diamonds و إل Hearts و إل Spades .

ها هو برنامج CARDS :

post-36368-1213303946_thumb.jpg

هنا عينة من بعض التفاعلات مع البرنامج :

post-36368-1213304073_thumb.jpg

post-36368-1213304134_thumb.jpg

في هذه الحالة , اللاعب المنحوس اختار البطاقة الخطأ ( الجواب الصحيح 2 ).

البرنامج بدأ بتعريف عدد من المتغيرات من النوع Const int لوجه البطاقة و قيم المجموعة . ( ليس كل هذه المتغيرات مستخدمة في البرنامج; هم تم وضعهم للإكمال ) بعد ذلك يتم تحديد تركيبة إل Card .

البرنامج بعد ذلك يقوم بتعريف ثلاث متغيرات لم يتم إشغالهم من النوع Card : temp و chosen و prize . يعرف ثلاث بطاقات أيضا – Card1 و Card2 و Card3 – و التي تشغل إلي ثلاث قيم كروت اعتباطية .

إنها تطبع قيم هذه البطاقات كمعلومات للمستخدم . ثم بعد ذلك تضع متغير إل Card و إل Prize إلي احد قيم هذه الكروت كطريقة لتذكرها . هذه البطاقة هي احد الأماكن التي سيسأل عنها اللاعب و التي سيخمنها في نهاية اللعبة .

بعد ذلك البرنامج يقوم بإعادة ترتيب الكروت . يقوم بتبديل أول و ثالث كرت , و ثاني و ثالث كرت , و أول و ثاني كرت . في كل مرة يخبر المستخدم ماذا يفعل . ( إذا وجدت البرنامج سهلا جدا , يمكنك إضافة سطور بيانات أكثر لخلط الكروت أكثر . لمعان البيانات علي الشاشة لتحديد الوقت سيزيد التحدي أيضا .)

أخيرا يسال البرنامج اللاعب ما مكان أو وضع البطاقة الموجودة . انه يضع متغير من النوع card , chosen , للبطاقة التي في هذا الموضع أو المكان , ثم بعد ذلك يقارن ما بين الكروت chosen و prize .

لو كانوا متشابهين سيكون مكسب للاعب و إذا كانوا غير ذلك سيكون خسارة للاعب .

لاحظ كم من السهل تبديل البطاقات .

Temp = card3; card3 = card1; card1 = temp;

بالرغم من أن البطاقات تمثل التراكيب , يمكنهم أن يتحركوا بسهولة طبيعية جدا , الشكر إلي قدرة معامل التخصيص = للعمل مع التراكيب .

لسوء الحظ , كما أن التراكيب لا يمكن أن تضاف , هم أيضا لا يمكن أن يقارنوا . لا يمكنك أن تقول

If ( chosen == prize )   // Not legal yet

لان ليس هناك روتين تم بناءه حول المعامل = = و الذي يعرف عن التركيبة Card . و لكن , كما هو الحال مع الإضافة , هذه المشكلة يمكن أن تحل بزيادة تحميل المعامل , كما سنري لاحقا .

#29

• التركيبات و الفصائل

نحن يجب أن نعترف إليك بعد أن ضللناك بعض الشئ علي قابلية التراكيب .

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

علي أي حال , في إل C++ , التراكيب في الحقيقة يمكنها أن تحمل كل من البيانات و الدوال . ( في إل C يمكنها فقط أن تحمل البيانات . )

إن التمييز النحوي بين التركيبات و الفصائل في إل C++ اقل ما يمكن , لذا هم يمكنهم نظريا أن يستخدموا تقريبا بشكل متبادل .

لكن أكثر مبرمجي إل C++ يستخدمون التركيبات كما نلاحظ في هذا المستوي , بشكل خاص للبيانات .

الفصائل تستخدم عادتا لحمل كل من البيانات و الدوال كما سنري بعد ذلك .

#30

• التعدادات أو إل Enumerations

كما رأينا , التراكيب يمكن أن ينظر إليها علي أنها طريقة لتزويد أنواع البيانات المعرفة من قبل المستخدم .

الطريقة المختلفة لتعريف أنواع بياناتك الخاصة هي التعدادات أو إل Enumerations .

هذه ميزة في إل C++ اقل حاسمة من التراكيب .

أنت يمكنك أن تكتب برامج موجهة الكائنات في إل C++ جيدة جدا بدون معرفة أي شئ عن التعدادات .

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

تم تعديل هذه المشاركة بواسطة البارودي في 14 يونيو 2008 في 00:33

#31

• أيام الأسبوع

أنواع التعدادات Enumerated types تعمل عندما تكون عارف مقدما محدود ( عادتا تكون قصيرة ) قائمة القيم و التي أنواع البيانات يمكن أن تتعامل معها .

هنا برنامج مثال , DAYENUM , و الذي يستخدم التعدادات Enumeration لأيام الأسبوع :

post-36368-1213393045_thumb.jpg

يعرف الإعلان enum مجموعة كل الأسماء التي ستكون قيم مباحة أو متوفرة من النوع . هذه القيم المتوفرة تدعي التعدادات أو Enumerators .

النوع enum " days_of_week " لديه سبع تعدادات enumerators : Sun , Mon , Tue , و هكذا حتى Sat .

الشكل التالي يعرض شكل تركيبة الإعلان Enum :

post-36368-1213393309_thumb.jpg

التعدادات أو إل Enumerations هي قائمة لجميع القيم المحتملة .

هذا علي خلاف مواصفات إل Int , علي سبيل المثال , الشروط التي أعطيت في حجم أو مدي القيم . في إل enum يجب أن تعطي اسم معين لكل قيمة محتملة .

الشكل التالي يعرض الفرق بين إل Int و إل enum .

عندما أعلنت عن النوع Enum " days_of_week " كما رأينا , يمكنك أن تعرف متغيرات من هذا النوع .

DAYENUM لديه هذين المتغيرين , day1 و day2 , و الذي تم تعريفهم في الجملة

Days_of_week day1 , day2;

( في إل C أنت يجب أن تستخدم الكلمة المحجوزة Enum قبل اسم النوع , كما في

Enum days_of_week day1 , day2;

في إل C++ هذا ليس ضروري .)

post-36368-1213393531_thumb.jpg

متغيرات النوع التعدادات enumerated type , مثل day1 و day2 , يمكن أن يأخذ أي من القيم المدرجة في الإعلان enum .

في المثال نحن نعطيهم القيم Mon و Thu . أنت لا يمكنك أن تستخدم قيم ليست مدرجة في الإعلان .

مثل هذه الجملة :

Day1 = Halloween;

غير مسموح بها .

يمكنك استخدام المعاملات الحسابية القياسية في الأنواع enum .

في البرنامج قمنا بطرح قيمتين .

يمكنك استخدام معاملي المقارنة أيضا , كما سنري .

هنا ناتج البرنامج :

post-36368-1213393071_thumb.jpg

استخدام المعاملات الحسابية و العلائقية لا يؤثر كثيرا ببعض أنواع إل enum .

علي سبيل المثال , لو كان لديك الإعلان

Enum pets { cat , dog , hamster , canary , ocelot };

ثم هو قد لا يكون واضح ماذا يعني التعبير

( dog + canary ) أو ( cat < hamster ).

التعدادات أو إل enumerations يتم معالجتها داخليا مثل الأعداد الصحيحة .

و هذا يوضح لماذا أنت يمكنك أن تؤدي عمليات حسابية و علائقية عليهم . بشكل عادي الاسم الأول في القائمة يأخذ القيمة صفر ,و الاسم الذي يأتي بعده يأخذ القيمة 1 , وهكذا . في مثال DAYENUM , القيم Sun حتى Sat تخزن قيم الأعداد الصحيحة من صفر حتى 6 .

العمليات الحسابية في النوع Enum تحدث علي قيم العدد الصحيح .

علي أي حال , بالرغم أن المعالج ( المجمع ) يعرف بان متغيراتك enum أعداد صحيحة جدا , أنت يجب أن تكون حذر من المحاولة لاستغلال هذه الحقيقة . إذا تقول

Day1 = 5;

المعالج أو المجمع سيصدر تحذير ( بالرغم انه سيعالجها ) . من الأفضل نسيانها – إن أمكن ذلك – أن إل enum أعداد صحيحة ايضا .

تم تعديل هذه المشاركة بواسطة البارودي في 15 يونيو 2008 في 00:49

#32

• شئ واحد أو آخر

يحسب مثالنا القادم الكلمات في تعبير واحد و التي تم طباعتها أو كتابتها بواسطة المستخدم . علي خلاف مثال CHCOUNT السابق , علي أية حال , هو لا يحسب الفراغات ببساطة لتقرير عدد الكلمات . بدلا من ذلك هو يحسب الأماكن حيث صف الحروف الغير فضاء ( مسافات ) تتغير إلي فضاء , كما هو واضح بالشكل التالي ..

post-36368-1213560974_thumb.jpg

بهذه الطريقة أنت لن تحصل علي إحصاء خاطئ إذا طبعت فراغات متعددة بين الكلمات .

( هو مازال لا يعالج إل Tabs و حروف المساحات البيضاء الأخرى ) .

ها هي قائمة إل WDCOUNT : هذا المثال يظهر تعدادا بين اثنين من التعدادات فقط .

post-36368-1213561093_thumb.jpg

ها هي مخرجات البرنامج :

post-36368-1213561148_thumb.jpg

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

عمل هذا يتطلب البرنامج أن يتذكر سواء هو في منتصف الكلمة أو في منتصف خط الفراغ . انه يتذكر ذلك بمتغير إل enum ( isWord ) .

هذا المتغير تم تعريفه لكي يكون من النوع itsaWord . هذا النوع تم تحديده في الجملة

Enum itsaWord { no , yes };

المتغيرات من النوع itsaWord لها فقط قيمتين محتملتين :No و Yes.

لاحظ ذلك القائمة بدأت ب No , لذا فان قيمتها ستكون بصفر – هذه القيمة تشير إلي false .

( نحن أيضا يمكننا أن نستخدم متغير من النوع Bool لهذا الغرض ) .

إن متغير isWord يأخذ القيمة No عند بداية البرنامج .

عندما البرنامج يصادف أول فراغ , فانه يضع قيمة isWord ب yes لكي يشير إلي انه في منتصف كلمة .

انه يحتفظ بهذه القيمة حتى يجد الفراغ التالي , في هذه الحالة فانه يقوم بإرجاع القيمة إلي No . سرا , no تأخذ القيمة صفر و yes تأخذ القيمة 1, لكن نحن نتجنب استخدام هذه الحقيقة .

نحن كان يمكننا أن نستخدمٍ

 if( isWord )

بدلا من

 if( isWord == yes )

و

 If( !isWord )

بدلا من

 if ( isWord == no )

, لكن هذا ليس أسلوبا جيدا .

لاحظ أيضا إننا نحتاج مجموعة أخري من أقواس الشيالات حول جملة if الثانية في البرنامج , لذلك فان جملة else ستعمل مع جملة if الأولي .

#33

• تنظيم البطاقات

ها قد وصلنا إلي مثالنا الأخير من النوع enum .

تذكر أن في برنامج CARDS السابق بهذا المستوي نحن عرفنا مجموعة من الثوابت من النوع const int لكي تمثل عن البطاقات .

post-36368-1213649516_thumb.jpg

هذا النوع من القائمة إلي حد ما غير ملائم .

هيا بنا نراجع برنامج CARDS لاستخدام التعدادات enumerations بدلا من ذلك .

ها هي قائمة CARDENUM :

post-36368-1213649604_thumb.jpg

ها هي المخرجات :

post-36368-1213649731_thumb.jpg

هنا مجموعة التعريفات للمجموعات المستخدمة في برنامج CARDS استبدلت بالإعلان enum :

enum suit { clubs , diamonds , hearts , spades );

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

Card1.suit = 5;

ذلك أدي إلي تحذير من المعالج أو المجمع .

#34

• تحديد قيم العدد الصحيح

قلنا بان في إعلان enum , التعداد الأول يأخذ القيمة صفر , الثاني يأخذ القيمة 1, وهكذا . هذا الطلب يمكن أن يعدل باستعمال إشارة يساوي " = " لتحديد نقطة بداية ما عدا الصفر . يمكنك أن تقول

Enum suit  { clubs = 1 , diamonds , hearts , spades };

الأسماء اللاحقة تأخذ قيم من بداية هذه النقطة , لذا diamonds يأخذ 2 , hearts يأخذ 3 , و spades يأخذ 4 . في الحقيقة يمكنك استخدام الإشارة يساوي " = " لتعطي قيم محددة إلي أي تعداد .

تم تعديل هذه المشاركة بواسطة البارودي في 17 يونيو 2008 في 00:09

#35

• غير متقن

صفة مزعجة واحدة للنوع enum بأنهم لم يعرفوا من قبل جمل مدخلات ومخرجات إل C++ input / output ( I/O ) .

كمثال , ماذا تعتقد الجزء من الكود التالي سيؤدي إلي أي نتيجة معروضة؟

post-36368-1213650793_thumb.jpg

هل حسبت الناتج انه سيكون south ؟ هذا سيكون جميلا , لكن مخرجات ومدخلات إل C++ ( I/O ) سيعالج متغيرات النوع enum كأعداد صحيحة , لذلك فان المخرجات ستكون 1 .

• أمثلة أخري

ها هي بعض الأمثلة الأخرى من إعلانات البيانات المحسوبة , لإعطائك الشعور بالاستخدامات المختلفة لهذه الميزة :

post-36368-1213651045_thumb.jpg

نحن سنشاهد أمثلة أخري في برامج مستقبلية .

#36

• الخلاصة

نحن غطينا موضوعين في هذا المستوي : التركيبات و التعدادات

( structures and enumerations ) . التركيبات هي احد المكونات المهمة في إل C++ , منذ أن أصبحت تركيبتها النحوية مثل الفصائل classes . في الحقيقة , الفصائل هي ( بشكل نحوي , علي الأقل ) لا شئ أكثر من تركيبة تحتوي علي الدوال functions . التركيبات بالضبط هي تجميع مجموعة من أعضاء البيانات مع بعضهم البعض لتشكيل كيان واحد. إعلان التركيبة يدرج المتغيرات التي تنشئ التركيبة . التعريفات ثم وضعها بجانب الذاكرة لمتغيرات التركيبة . متغيرات التركيبة تعتبر وحدات غير قابلة للقسمة في بعض الحالات ( مثل وضع تركيبة واحدة مساوية لتركيبة أخري ) , لكن في حالات أخري أعضائهم داخلة بشكل منفرد

( تستخدم معامل النقطة في اغلب الأحيان ) .

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

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

تم تعديل هذه المشاركة بواسطة البارودي في 17 يونيو 2008 في 00:28

#38

ممكن يكون الشرح بكتاب مرفق للمستوى الثالث لأني مازالت أتابع شرح الكتاب الأول

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

#39

يعطيك العافية ع الشرح

طريقة سهلة وسلسة لفهم الstructures

#40

بارك الله فيك اخى البارودى :)

#41

لسلام عليكم ،،،

بارك الله فيك أخي البارودي على الجهد الرائع في ترجمة الكتاب

لي طلب بسيط يا ليت تجمع الجزء الثاني لوحده والثالث واختباره في ملف ليسهل قراءته مثل ماسويت بالأول..

لاني رحت ابغى احملها من منتدى المحيط العربي رفض مايتحمل يقول فيه خطااااااا

...

وشكرررااااااااااااااااا

تم تعديل هذه المشاركة بواسطة صعب تكراري في 25 ديسمبر 2011 في 19:08

#42

ماشاء الله درس جميل

#43
البارودي كتب:

<span style='font-size:14pt;line-height:100%'>• التراكيب البسيطة</span>

هيا بنا نبدأ مع تركيبة تحتوي علي ثلاث متغيرات :

عددان صحيحان ( من النوع Integer )

و رقم عشري ( من النوع Floating Point ).

تمثل هذه التركيبة بند في عملية جرد جزء من قطعة شركة.

( نفترض بان القطعة متكونة من عدة أجزاء .) التراكيب هو نوع من أنواع المخططات يحدد ما هي المعلومات الضرورية لأحد الأجزاء.

الشركة تنتج عدة أنواع من القطع , لذلك فان رقم نموذج القطعة سيكون هو أول رقم في التركيبة.

رقم الجزء نفسه سيكون هو الرقم الثاني في التركيبة .

و الرقم الأخير هو تكلفة الجزء .

( هؤلاء منك و الذي يعتبر أرقام الأجزاء تعد الحاجة الغير مثيرة لفتح عيونك إلي رومانسية التجارة ).

برنامج PARTS يعلن عن أجزاء التركيبة , يعرف متغيرات التركيبة و التي تكون من النوع الذي يسمي part1 , و التي تخصص القيم إلي أعضائها , وبعد ذلك تعرض هذه القيم.

#include<iostream.h>

/////////////////////////////////////////////////
struct part
{
	int modelnumber;
	int partnumber;
	float cost;
};
/////////////////////////////////////////////////
int main()
{
	part part1;
	part1.modelnumber=6244;
	part1.partnumber =373;
	part1.cost=217.55f;

	cout<<"Model "<<part1.modelnumber;
	cout<<", part "<<part1.partnumber;
	cout<<",costs $"<<part1.cost<<endl;

	return 0;
}

#44

السلام عليكم

لو سمحت اين اجد المستوي الاول والثاني ؟

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

عدد الزوار حالياً

المتواجدون خلال آخر دقيقتين · يتحدّث كل ٣٠ ثانية

—الإجمالي—أعضاء مسجّلون—زوار بدون تسجيل

جارٍ التحقق من المتواجدين…