Important Announcement
PubHTML5 Scheduled Server Maintenance on (GMT) Sunday, June 26th, 2:00 am - 8:00 am.
PubHTML5 site will be inoperative during the times indicated!

Home Explore ++C من البداية الى البرمجة الكيانية

++C من البداية الى البرمجة الكيانية

Published by Abedalrhman Hazem, 2021-04-10 14:35:05

Description: ++C من البداية الى البرمجة الكيانية

Search

Read the Text Version

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫‪ 4.22‬الوسائط الثابتة ‪Constant Argument‬‬ ‫من الممكن في ‪ C++‬الأعلان عن وسيط لدالرة ويكرون هرذا الوسريط ثابرت كمرا‬ ‫يأتي‪:‬‬ ‫; )‪int strlen (const char * p‬‬ ‫; )‪int length (const string &s‬‬ ‫ان المعررف (‪ )const‬يخبرر المتررجم بران الدالرة سروف لا تغيرر الوسريط‪ .‬لرذلك‬ ‫فان المترجم سيصدر رسالة خطأ اذا ماكانت هنا محاولة لتغيرة‪.‬‬ ‫ملاحظة‪//:‬‬ ‫الوسررائط مررن النرروع الثابررت تسررتخدم فقررط عنرردما تمرررر معرراملات بالمرجعيررة او‬ ‫المؤشرات‪.‬‬ ‫‪ 4.21‬تطابك الدوال ‪Functions Overloaded‬‬ ‫تطابق الدوال يشير الى اسرتخدام نفرب الكيران لأغررا مختلفرة‪ C++ .‬تسرمح‬ ‫بتطرابق الردوال‪ ،‬هرذا يعنري ان بامكانرك اسرتخدام نفرب اسرم الدالرة لخلرق دوال تقروم‬ ‫بانجاز مهام مختلفة‪ ،‬وهذا يدعى في البرمجة الكيانية (‪.)overloaded‬‬ ‫تررروفر ‪ C++‬للمبررررمج وسررريلة جيررردة فررري أسرررتعمال أسرررماء الررردوال والأدوات‬ ‫لأغرا متعرددة كرل منهرا يرؤدي دورا معينرا‪ .‬وبهرذة الطريقرة سرتكون فري البرنرامج‬ ‫عدة دوال بنفب الأسم فمثلا الكثير منا يسرتعمل الكلمرة (أقررأ) وهرذا الفعرل يردل علرى‬ ‫عمرل معرين هرو فعرل القرراءة مثرل (يقررأ القررأن‪ ،‬يقررأ الكتراب‪ ،‬يقررأ الرسرالة‪ ،‬يقررأ‬ ‫المجلة)‪ ،‬وهنا عدة أسماء يمكن تكوينها من الفعل أقرأ لذا نقول أن الفعرل اقررأ يردل‬ ‫على قرراءة مجموعرة مرن الحرالات أو الوسرائل (القررأن‪ ،‬الكتراب‪ ،‬الرسرالة‪ ،‬المجلرة)‪.‬‬ ‫ومن مفهوم البرمجة كلما كانت المعلومات المطلوب من المبرمج معرفتها حول دالة‬ ‫معينة محدودة كلما كان أسلوب البرمجة أفضل‪ .‬فمثلا لا توجد ضرورة للمبررمج ان‬ ‫يعررف أو يخبرر عرن ماهيرة الدالرة التري ترؤدي الرى طباعرة نرص او عردد صرحيح او‬ ‫حقيقي وأنما المترجم يجب أن يميز نوع المادة المراد طباعتها‪ ،‬مثال‬ ‫‪215‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫; “ ‪cout << “ This is test‬‬ ‫; ‪cout << 12345‬‬ ‫; ‪cout <<123.4567‬‬ ‫لذا فأن الدالة (<< ‪ )cout‬تسمى دالة متعددة الأغرا ‪ .‬ويستطيع المتررجم أن‬ ‫يميرز الدالرة مرن خرلال متغيراتهرا‪ ،‬ان اسرتخدام مفهروم تطرابق الردوال سريمكنك مرن‬ ‫استخدام عائلة من الدوال التي لهرا نفرب الأسرم ولكرن لكرل واحردة منهرا قائمرة وسرائط‬ ‫مختلفة كرأن تختلرف بالعردد او تتشرابة بالعردد وتختلرف برالنوع جميعرا او قسرم منهرا او‬ ‫تختلف بالعدد والنوع‪.‬‬ ‫الردوال سرروف تنجررز مهامرا مختلفررة اعتمررادا علرى قائمررة الوسررائط فرري دوال‬ ‫الاسرتدعاء‪ .‬الدالرة التري سروف تنفرذ عنرد الاسرتدعاء تعتمرد علرى فحرص عردد ونروع‬ ‫الوسائط في دالة الاستدعاء ومطابقتها مرع الردوال المختلفرة لتنفرذ الدالرة التري تتطرابق‬ ‫معها ولا دخل لنوع الدالة في ذلرك‪ .‬مثرال الدالرة ادنرا لهرا نفرب الاسرم ()(‪ )add‬لكنهرا‬ ‫تتعامل مع انواع بيانات مختلفة‪:‬‬ ‫* الأعلان عن الدوال‪:‬‬ ‫; )‪1. int add (int a ،int b‬‬ ‫; )‪2. int add (int a ،int b ،int c‬‬ ‫; )‪3. double add ( double x ،double y‬‬ ‫; )‪4. double add (int p ،double q‬‬ ‫; )‪5. double add (double p ،int q‬‬ ‫* استدعاء الدالة‪:‬‬ ‫; )‪cout << add (5, 12‬‬ ‫يستخدم النموذج ‪1‬‬ ‫; )‪cout << add (15, 5, 10‬‬ ‫يستخدم النموذج ‪2‬‬ ‫‪216‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; )‪cout << add (12.5, 2.8‬‬ ‫يستخدم النموذج ‪3‬‬ ‫; )‪cout << add (54, 12.7‬‬ ‫يستخدم النوذج ‪4‬‬ ‫; )‪cout << add (0.7611 , 34‬‬ ‫يستخدم النموذج ‪5‬‬ ‫في حالة استدعاء الدالة تعمل اولا علرى مطابقرة النمروذج الرذي لره نفرب العردد‬ ‫والنرروع مررن المعرراملات فرراذا حصررل التطررابق يررتم تنفيررذ الدالررة المتطابقررة مررع امررر‬ ‫الاستدعاء‪ .‬ان افضل مطابقة يجب ان تكون وحيدة‪.‬‬ ‫عملية اختيار الدالة يتبع الخطوات التالية‪:‬‬ ‫‪ .1‬يحاول المترجم اولا ايجاد تطابق تام بين امرر الاسرتدعاء والردوال التري لهرا نفرب‬ ‫اسم الدالة المستدعاة‪ .‬حي يتطابق عدد الوسائط وكذلك نوع كرل وسريط فري أمرر‬ ‫الاستدعاء مع نوع الوسيط المقابل له في الدالة المستدعاة‪.‬‬ ‫‪ .2‬اذا لررررم يكررررن هنررررا تطررررابق تررررام‪ ،‬فرررران المترررررجم يسررررتخدم أسررررلوبا يسرررررمى‬ ‫بترقيات التكامل اي ان هنا انواعا يمكن ان تحول الى انواع اخرى مكملة لهرا‪،‬‬ ‫مررثلا مررن الممكررن تحويررل (‪ )float‬الررى (‪ )double‬وكررذلك مررن الممكررن تحويررل‬ ‫(‪ )char‬الى (‪ ،)int‬هذ التحويلات من الممكرن ان تسراعد علرى ايجراد تطرابق بعرد‬ ‫اجرائها‪.‬‬ ‫‪ .3‬في حالة الفشل بايجاد التطابق مرن خرلال الخطروتين اعرلا ‪ ،‬فران المتررجم يحراول‬ ‫استخدام التحويلات المثبتة داخليا (تحويلات المساواة الضمنية) للوسرائط وبعردها‬ ‫يتم الفحص لأيجاد تطابق وحيد‪.‬‬ ‫* برنامج لايجاد حجم مكعب‪ ،‬اسطوانة‪ ،‬ومستطيل‬ ‫‪// Example 4.10‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫‪217‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ int volume (int); double volume (double َ int); long volume (long َ int َ int); main(){ cout<<volume (10) <<\"\\n\"; cout<<volume (2.5 , 8) <<\"\\n\"; cout<<volume (100, 15, 75); return 0; } int volume (int s) {return(s*s*s); } double volume (double r َint h) // cylinder {return ( 3.14159*r*r*h); } long volume (long L َint b َint h) //rectangle {return (L*b*h); } //:4.21 ‫مطرجا البرنامج‬ 1000 157.2595 112500 //:‫ملاحظة‬ ‫بالامكران اسرتخدام دالرة كوسريط ضرمن دالرة اخررى برالرغم مرن عردم تحبيرذ هرذ‬ ‫العلاقات نمرا لصعوبتها مثل‬ 218

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ ‫ ويرتم اسرتخدامها كمرا‬square(),cube() ،triple() ،(double) ‫وجرود الردوال التاليرة‬ ‫يأتي‬ Answer = (double(triple(square(cube(myValue))))); //:‫ملاحظة‬ ‫ يعردها مرن نروع الاعرداد‬C++ ‫ فرأن متررجم‬،‫أي دالة لا يرتم تعريرف نوعهرا أبترداءا‬ .‫الصحيحة‬ x – x3/3! + x5 /5! - ….. xn /n! ‫ برنامج لايجاد مجموع السلسلة‬:‫* مثال‬ // Example 4.11 #include<iostream> using namespace std; void main( void ){ long int fact (int); float power (float, int ); float sum َ temp َ x َ powe ; int sign , i, n ; long int factval ; cout<<\" enter a value for n ? \" << endl; cin>>n; cout<<\" enter a value for x ?\"<<endl ; cin>>x ; i=3; Sum=x; sign=1 ; while (i<=n){ Factval =fact(i); 219

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫;)‪powe=power (x, i‬‬ ‫;‪sign=(-1)*sign‬‬ ‫;‪Temp=sign*powe / factval‬‬ ‫;‪sum=sum+temp‬‬ ‫} ;‪i=i+2‬‬ ‫;‪cout<<\"sum of x- (x^3)/3! + (x^5)/5!- …..=\"<<sum‬‬ ‫}‬ ‫)‪long int fact ( int max‬‬ ‫;‪{ long int value =1‬‬ ‫)‪for ( int i=1 ; i<=max ; ++i‬‬ ‫; ‪value=value*i‬‬ ‫};)‪return(value‬‬ ‫{) ‪float power ( float x َ int n‬‬ ‫;‪float value2=1‬‬ ‫)‪for( int j=1;j<=n;++j‬‬ ‫;‪value2=value2*x‬‬ ‫;)‪return(value2‬‬ ‫}‬ ‫‪ 4.13‬الاستدعاء ال اتي ‪Recursion‬‬ ‫فرري ‪ C++‬الدالررة ممكررن ان تسررتدعي نفسررها‪ ،‬مثررل هررذ الدالررة تسررمى دالررة‬ ‫الاستدعاء الذاتي‪ ،‬بحي يتم استدعاء الدالة من داخل جسم الدالرة أي الدالرة تسرتدعي‬ ‫نفسها‪ ،‬الاستدعاء الذاتي هي عمليرة تعريرف شريء بدلالرة نفسرة وفري بعرض الاحيران‬ ‫يسمى التعريف الدائري‪.‬‬ ‫‪211‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫بعض المشاكل يكون حلها اكثر سهولة بواسطة دوال الاستدعاء الذاتي عرادة‪,‬‬ ‫هذا يحدث عندما تعمل على بيانات وبعدها تعمل على نتائجهرا وبرنفب الطريقرة‪ ،‬كرلا‬ ‫النروعين مرن الاسرتدعاء الرذاتي المباشرر وغيرر المباشرر يعمرلان بطرريقتين مختلفترين‬ ‫بالنهاية ينتجان الجواب‪ .‬من المهم ملاحمة عندما تسرتدعي الدالرة نفسرها فران نسرخة‬ ‫جديدة من الدالرة سرتعمل علرى المتغيررات المحليرة فري الدالرة الثانيرة (النسرخه الثانيرة)‬ ‫وتكون مستقلة عن النسخة الاولى ولاتؤثر واحدة على الاخرى بشركل مباشرر‪ ،‬دوال‬ ‫الاستدعاء الذاتي تحتاج دائما الى شرط توقف بعض الاحيان يجب ان يحدث لايقاف‬ ‫الاستدعاء الذاتي او سوف يستمر عمل الدالة ولاينتهي ابدا‪.‬‬ ‫* برنامج لايجاد مجموع ارقام موجبة بطريقة الاستدعاء الذاتي‬ ‫‪1+2+3+……+n‬‬ ‫‪// Example 4.12‬‬ ‫>‪# include<iostream‬‬ ‫;‪using namespace std‬‬ ‫; )‪int sum(int‬‬ ‫{ )‪void main(void‬‬ ‫; ‪int n َ temp‬‬ ‫; ‪cout<<\"enter any integer number \"<<endl‬‬ ‫; ‪cin>>n‬‬ ‫;)‪temp = sum (n‬‬ ‫; ‪cout<<\"value = \"<<n<<\"and its sum=\"<<temp‬‬ ‫}‬ ‫‪int sum(int n) // recursive function‬‬ ‫{‬ ‫; ‪int value = 0‬‬ ‫‪211‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫;)‪if (n==0) return(value‬‬ ‫‪else‬‬ ‫; )‪value = n + sum(n-1‬‬ ‫;)‪return (value‬‬ ‫}‬ ‫التوضيح التالي من الممكن ان يساعد على ادرا وفهم دالة الاستدعاء الذاتي‬ ‫فلررو فرضررنا انرره تررم ادخررال قيمررة للمتغيررر (‪ )n=6‬لنرررى كيررف سرريتم ايجرراد‬ ‫المجموع‪ ،‬اعتمادا على قيمة العبارة‬ ‫;)‪value = n + sum (n-1‬‬ ‫هنرا العبرارة ()‪ )sum(n-1‬هري اسرتدعاء للدالرة ()‪ ،)sum(int‬ونمررا لان هرذا‬ ‫الاسرتدعاء مرن داخرل الدالرة نفسرها اذن هرو يمثرل اسرتدعاء ذاتري اي اسرتدعاء لنفسرة‬ ‫وسيكون عملها كما يأتي‪:‬‬ ‫‪212‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫شكل (‪ :)2.2‬يبين كيفية تنفيذ دالة الاستدعاء الذاتي لبرنامج جمع متوالية‬ ‫)‪n + sum (n-1) = 6 + sum (5‬‬ ‫* يتم استدعاء الدالة لايجاد المجموع عندما (‪ )n=5‬ويضاف الى (‪)6‬‬ ‫* تستمر العملية لحين الوصول الى (‪ )n=0‬فتعاد القيمة (‪ )value‬والتي قيمتهرا‬ ‫(‪.)1‬‬ ‫* الان يكون الرجوع لتعويض القريم المسرتنتجة والبردء اولا بقيمرة ()‪)sum (1‬‬ ‫حي وجدت قيمتة (‪ )1‬لتعو بمكانها كما في اعلا‬ ‫* سرررتجمع نتيجرررة ()‪ )sum(1‬مرررع الررررقم (‪ )2‬لاسرررتخراج نتيجرررة ()‪)sum(2‬‬ ‫وتستمر العملية الى النهاية كما في الشكل ‪2.2‬‬ ‫* برنامج لايجاد مضروب )‪ (factorial‬ا قم‬ ‫‪// Example 4.13‬‬ ‫>‪#include <iostream‬‬ ‫‪213‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ using namespace std; long factorial (long a) { if (a > 1) return (a * factorial (a-1)); else return (1); } int main () { long number; cout << \"Please type a number: \"; cin >> number; cout << number << \"! = \" << factorial (number); return 0; } //:4.23 ‫مطرجا البرنامج‬ Please type a number: 9 9! = 362880 ‫( او لا‬prime number) ‫* برنامج لاختبار اي رقم فيما اذا كان اولي‬ . // Example 3.31 #include<iostream> using namespace std; 214

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ char prime ( int x ) { for ( int i=2 ; i<= ( x/2) ; i++ ) if ( x % i = = 0 ) { prime = ' Y ' ; break ; } else prime = ' N ' ; } main(){ int x; cin >> x; while ( x !=0 ) { char Z = prime ( x ) ; if ( Z = = ' Y ' ) cout << \" The number \" << x << \" is prime \\n \" ; else cout << \" The number \" << x << \" is not prime \\n\" ; cout << \" Enter zero if no more numbers to test\\n\" ; cin >> x ; } return 0; } 215

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪ 4.14‬دوال خاوة‬ ‫مرن الممكرن اسرتخدام بعرض الردوال الخاصرة المحرددة لاعمرال معينرة‪ ،‬فمرثلا‬ ‫الاصناف (‪ )istream AND ostream‬وهي‪:‬‬ ‫‪ ) get () AND put ()( .1‬للتعامرل مرع عمليرة أدخرال وأخرراج حررف واحرد‪.‬‬ ‫طريقة عمل هاتان الدالتان تختلرف قلريلا عمرا تعلمنرا فهمرا يعمرلان وفقرا للصريغة‬ ‫التالية‪:‬‬ ‫; )( ‪cin.get (c) ; OR c = cin.get‬‬ ‫; )‪cout.put (x‬‬ ‫حي أن الدالة الأولى ستقوم بأدخال حرف واحد مرن لوحرة المفراتيح ووضرعة‬ ‫برالمتغير الحرفري (‪ ،)c‬أمرا الدالرة الثانيرة فسرتقوم بعرر محتويرات المتغيرر الحرفري‬ ‫(‪ )x‬على الشاشة‪.‬‬ ‫ملاحظة‪//:‬‬ ‫في حالة استخدام أرقام مع الدالة )) (‪ ( cout.put‬فأنهرا سرتعاملها علرى أسراس أنهرا‬ ‫) ‪ (ASCII code‬وستطبع ما يقابلها من رمز وفقا لشفرة ) ‪ . ( ASCII‬مثال‬ ‫; ) ‪cout.put( 68‬‬ ‫هذا الأمر سيطبع الحرف ) ‪ ( D‬حسب شفرة ) ‪( ASCII‬‬ ‫‪ .2‬الدالة ()( ‪ :)getline‬وهوي تعمول موع الأمور (‪ )cin‬وتقووم بقوراءة جميوع موا موجوود‬ ‫علوى السوطر الو ي يؤشور عليوه المسويطر ولغايوة أمور سوطر جديود (‪ )\\n‬او الأمور‬ ‫(‪ .)enter‬الصيغة العامة للأمر هي‪:‬‬ ‫; )‪cin.getline (line ،size‬‬ ‫مثال‬ ‫; ] ‪char name [ 20‬‬ ‫‪216‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; )‪cin.getline (name , 21‬‬ ‫ملاحظة‪//:‬‬ ‫أذا تم أدخال سلسلة رمزية بحجم أقل من الحجم المحدد ) ‪ (size‬فأنها ستسرند الرى‬ ‫المتغير الحرفي ) ‪. ( line‬‬ ‫أذا كان حجم السلسلة الرمزية المدخلة أكبر من الحجم المحدد ) ‪ ،( size‬فأن عدد‬ ‫الحرروف التري ستسرند الرى المتغيرر الحرفري ) ‪ ( line‬تسراوي ) ‪ ،( size – 1‬وذلرك‬ ‫لأن الحرف ) ‪ ( null‬سيضاف اليا الى أخر السلسلة‪.‬‬ ‫‪ .3‬الدالوة ()( ‪ :)write‬وهوي تعمول موع الأمور (‪ )cout‬لعورض سلسولة رمزيوة محوددة‬ ‫الحج والصيغة العامة له ه الدالة هي‪:‬‬ ‫; )‪cout.write (line ،size‬‬ ‫حير سرتقوم بعرر السلسرلة الرمزيرة الموجرودة فري المتغيرر (‪ )line‬وحسرب‬ ‫عدد الحروف المحددة بالمتغير (‪)size‬‬ ‫ملاحظة‪//:‬‬ ‫أذا كان الحجم ) ‪ ( size‬المحدد بالدالة )) ( ‪ ( cout.write‬أصغر من حجرم السلسرلة‬ ‫الرمزية ) ‪ ( line‬فأنها ستعر السلسلة الرمزية وفقا للحجم المحدد دون أشكال‪.‬‬ ‫أما أذا كان الحجرم المحردد ) ‪ ( size‬أكبرر مرن حجرم السلسرلة الرمزيرة ) ‪ ( line‬فرأن‬ ‫الدالة )) (‪ ( cout.write‬سوف لا تتوقف عن عر الحروف حتى وأن ترم قرراءة‬ ‫الحرف ) ‪ ( null‬الذي يمثل أخر حرف في السلسرلة وستسرتمر برالعر لمرا وراء‬ ‫السلسلة ) ‪( line‬‬ ‫ملاحظة‪//:‬‬ ‫من الممكن أيضا استخدام الدالة )) (‪ ( cout.write‬بشكل متكرر لعر أكثرر مرن‬ ‫سلسلة رمزية بشكل متجاور ‪ .‬مثال‬ ‫; ) ‪cout.write ( s1 ،m ) . write ( s2 ،n‬‬ ‫‪217‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫• برنامج لقراءة سلسلتين حرفية و باعته بطر مختلفة كحروف‪,‬سلاسل متجواور‬ ‫و باعة السلسلة بحج اكبر من حجمها‪( .‬ملاحظة‪ :‬هناك بعض الايعازات التوي‬ ‫ل يوت التطور لهوا لغايوة الان وسونتطر لهوا لاحقوا لكون البرنوامج فقوط لتوضوي‬ ‫الايعازات التي تحدثنا عنها هنا)‪.‬‬ ‫‪. // Example 4.14‬‬ ‫>‪#include <iostream‬‬ ‫>‪#include <string‬‬ ‫;‪using namespace std‬‬ ‫) (‪main‬‬ ‫{‬ ‫; \"‪char *s1 = \"C++‬‬ ‫; \"‪char *s2 = \"Programming‬‬ ‫; ) ‪int m = strlen( s1‬‬ ‫; ) ‪int n = strlen( s2‬‬ ‫) ‪for ( int i=1; i<n ; i++‬‬ ‫} ; \"‪{ cout.write(s2 َi); cout<<\"\\n‬‬ ‫) ‪for ( i=n ; i>0 ; i--‬‬ ‫} ; \"‪{ cout.write( s2 َi ) ; cout <<\"\\n‬‬ ‫; ) ‪cout.write( s1,m ).write ( s2 َn‬‬ ‫; \"‪cout<<\"\\n‬‬ ‫; ) َ ‪cout.write( s121‬‬ ‫}‬ ‫* برنامج لابدال قيمتين عدديتين‬ ‫‪218‬‬

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ // Example 4.15 #include <iostream> using namespace std; void swap(int x َint y); int main() { int x = 5 َy = 10; cout << \"Main. Before swap َx: \" << x << \" y: \" << y << \"\\n\"; swap(x,y); cout << \"Main. After swap َx: \" << x << \" y: \" << y << \"\\n\"; return 0; } void swap (int x َint y) { int temp; cout << \"Swap. Before swap َx: \" << x << \" y: \" << y << \"\\n\"; temp = x; x = y; y = temp; cout << \"Swap. After swap َx: \" << x << \" y: \" << y << \"\\n\"; } 219

‫ من البداية إلى البرمجة الكيانية‬C++ .‫* برنامج لايجاد مساحة مكعب باستخدام القيم الافتراضية في الدالة‬ // Example 4.16 #include <iostream> using namespace std; int AreaCube(int length َint width = 25 َint height = 1); int main() { int length = 100; int width = 50; int height = 2; int area; area = AreaCube(length َwidth َheight); cout << \"First area equals: \" << area << \"\\n\"; area = AreaCube(length َwidth); cout << \"Second time area equals: \" << area << \"\\n\"; area = AreaCube(length); cout << \"Third time area equals: \" << area << \"\\n\"; return 0; } AreaCube(int length َint width َint height) { return (length * width * height); } 221

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫‪ 4.15‬الاعلان عن الدالة ‪Function Declaration‬‬ ‫الاعلان عن الدالة يخبر عن كل ما تحتاج الى معرفترة لكتابرة اسرتدعاء الرى‬ ‫الدالة‪ .‬الاعلان عن الدالة يتطلب ان يمهر قبل استدعاء الدالة التي لم يمهر تعريفهرا‬ ‫بعد‪ .‬الاعلان عن الدالة عادة يوضع قبل الدالة )‪ )main‬في برنامجك‪.‬‬ ‫الصيغة القواعدية‪:‬‬ ‫; )‪Type_returned function_name(parameter_list‬‬ ‫مثال‪:‬‬ ‫; )‪double total_weight (int number ،double weight_of_one‬‬ ‫الدالة مثل برنامج وغير‬ ‫لفهم الدوال‪ ،‬ضع النقاط الثلاث التالية في ذهنك‪:‬‬ ‫‪ .1‬تعريف الدالة هو مثل برنامج صغير واسرتدعاء البرنرامج هرو نفرب الشريء‬ ‫لتنفيذ البرنامج‪.‬‬ ‫‪ .2‬الردوال تسرتخدم الوسرائط الرسرمية (‪ ،)formal‬بالاضرافة الرى ‪ cin‬لغرر‬ ‫الادخررال‪ .‬الوسررائط الررى الرردوال هرري مرردخلات وهرري تسررد مسررد الوسررائط‬ ‫الرسمية‪.‬‬ ‫‪ .3‬الرردوال عررادة لاترسررل المخرجررات الررى الشاشررة‪ ،‬ولكنهررا ترسررل نرروع مررن‬ ‫المخرجرات الررى البرنرامج‪ .‬ان قيمررة الاعرادة فرري الدالرة هرري مشرابهة الررى‬ ‫المخرجات من الدالة‪ .‬الدالة تستخدم عبرارة الاعرادة بردلا مرن عبرارة ‪cout‬‬ ‫لهذا الاخراج‪.‬‬ ‫‪ 4.16‬الاجراءات المجردة ‪Procedural Abstraction‬‬ ‫عند تطبيق تعريف دالة‪ ،‬فران مبردأ الاجرراءات المجرردة تعنري ان دالترك يجرب‬ ‫ان تكترب كري تسرتخدم مثرل الصرندوق المغلرق‪ .‬هرذا يعنري ان المبررمج الرذي يسرتخدم‬ ‫الدالة سوف لايحتاج الى النمر الى تعريف جسم الدالة كري يررى كيرف تعمرل الدالرة‪.‬‬ ‫‪221‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫الاعلان عن الدالة والتعليقرات التري ترافقهرا سروف تكرون كرل مايحتراج المبررمج الرى‬ ‫معرفتة لغر استخدام الدالة‪ .‬وللتاكد من ان تعريف دالترك لره هرذ الصرفة المهمرة‪،‬‬ ‫فانك يجب ان تلتزم بصرامة بالقواعد التالية‪:‬‬ ‫كيف تكتب تعريف دالة على شكل صندوق مغلق(التي تعيد قيمة)‬ ‫* تعليقات اعلان الدالة يجب ان يخبر المبرمج عن كل الشروط المطلوبة مرن‬ ‫العوامل الى الدالة ويجب ان يصف القيمة التي يتم اعادتهرا بواسرطة الدالرة‬ ‫عندما يتم استدعائها مع تلك العوامل‪.‬‬ ‫* كل المتغيرات التري تسرتخدم فري جسرم الدالرة يجرب ان يعلرن عنهرا فري جسرم‬ ‫الدالة (الوسائط الرسمية لاتحتاج الى اعرلان وذلرك لانهرا تردون فري اعرلان‬ ‫الدالة)‪.‬‬ ‫‪ 4.17‬مختصرات التصري ‪Assert Macro‬‬ ‫مختصر التصريح هو اداة للتاكد من ان الشروط المتوقعة صرحيحة فري موقرع‬ ‫عبارة التصريح ‪ .assert‬اذا كان الشرط لايتفق فران البرنرامج سروف يعرر رسرالة‬ ‫خطأ وينهي البرنامج‪ .‬لاستخدام التصريح اولا ضمن التعريرف ‪ assert‬فري برنامجرك‬ ‫مع عبارة التممين التالية‪:‬‬ ‫>‪#include<cassert‬‬ ‫لاستخدام عبارة التصريح اضف سطر الشفرة التالي في الموقع الذي ترغرب‬ ‫ان تفر فيه التصريح مع تعبير منطقي الذي سوف يقيم الى صح‪:‬‬ ‫; )‪assert (Boolean_expression‬‬ ‫ان عبارة التصريح هي برنامج مختصر ‪ macro‬وهي عبارة عرن هيكرل شربية‬ ‫بالدالة‪.‬‬ ‫مثرال‪ ،‬نفرر الاجرراء الرذي يسرتخدم طريقرة نيروتن لحسراب الجرذر التربيعري‬ ‫لرقم ما (‪)n‬‬ ‫‪222‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫)‪Sqrti+1 = ½ (sqrti + n / sqrti‬‬ ‫هذا الاجراء الذي ينفذ هرذ الخوارزميرة يتطلرب بران تكرون (‪ )n‬موجبرة وعردد‬ ‫مرات التكرار التي سرتعيد الحسراب كرذلك قيمرة موجبرة‪ .‬مرن الممكرن ان نضرمن هرذا‬ ‫الشرط باضافة ‪ assert‬الى الاجراء كما في ادنا ‪:‬‬ ‫)‪double newton_sqroot ( double n َ int num_iterations‬‬ ‫{‬ ‫; ‪double answer = 1‬‬ ‫; ‪int I = 0‬‬ ‫;))‪assert ( (n>0) && (num_iterations > 0‬‬ ‫) ‪while ( I < num_iterations‬‬ ‫{‬ ‫;) ‪Answer = 0.5 * ( answer + n / answer‬‬ ‫; ‪I++‬‬ ‫}‬ ‫; ‪return answer‬‬ ‫}‬ ‫‪ 4.19‬الدوال والمتغيرا الماتقره ‪Static Variables and Functions‬‬ ‫المتغيرات المستقرة ‪Static Variables‬‬ ‫نفر البرنامج التالي الذي يعمل على تغيير قيم اعداد صحيحة بالقسمة مررة‬ ‫وبالاضافة مرة اخرى‪.‬‬ ‫‪// Example 4.17‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫‪223‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ void Starter (int y){ double a = 112.50; double b = 175.25; a = a / y; b = b + 2; cout << \"y = \" << y << endl; cout << \"a = \" << a << endl; cout << \"b = \" << b << endl; cout << \"b / a = \" << b / a << \"\\n\\n\"; } int main() { Starter(2); Starter(2); Starter(2); Starter(2); return 0; } //: 4.27 ‫مطرجا البرنامج‬ y=2 a = 56.25 b = 177.25 b / a = 3.15111 y=2 224

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫‪a = 56.25‬‬ ‫‪b = 177.25‬‬ ‫‪b / a = 3.15111‬‬ ‫‪y=2‬‬ ‫‪a = 56.25‬‬ ‫‪b = 177.25‬‬ ‫‪b / a = 3.15111‬‬ ‫‪y=2‬‬ ‫‪a = 56.25‬‬ ‫‪b = 177.25‬‬ ‫‪b / a = 3.15111‬‬ ‫الدالة ()(‪ )Starter‬تستلم معامل واحد يمررر عنرد اسرتدعائها‪ .‬الدالرة المسرتدعاة‬ ‫ايضرا تسرتلم نفرب المعامرل كرل وقرت‪ .‬انمرر الرى النتيجرة‪ ،‬المعامرل المررر الرى الدالرة‬ ‫والمتغيرات المحلية المعلرن عنهرا داخرل الدالرة المسرتدعاة تحفرظ نفرب القيمرة فري كرل‬ ‫وقت تستدعى الدالة‪ .‬عليه فعند خروج الدالة )( ‪ Starter‬فان القيم تبقى نفسها‪.‬‬ ‫نحرن نعلرم ان الدالرة عنردما تعررف فران اي متغيرر اعلرن عنره محليرا يعرود الرى‬ ‫الدالة او تاثيرها‪ ،‬ولايمكنره التمردد الرى مراوراء جسرم الدالرة‪ .‬فراذا كنرت تريرد المتغيرر‬ ‫المعلن عنه محليا ان يحفرظ قيمترة التري تغيررت عنردما تخررج الدالرة التري تستضريفة‪،‬‬ ‫فعليك ان تعلن عن هكذا متغير على انه مستقر ‪.static‬‬ ‫للاعرلان عرن متغيرر مسرتقر‪ ،‬ضرع الكلمرة المفتاحيرة علرى يسرار نروع بيانرات‬ ‫المتغير‪ .‬مثال‪ ،‬اذا كنت تخطرط للاعرلان عرن متغيرر باسرم (‪ )Radius‬كمتغيرر مسرتقر‬ ‫في الدالة )( ‪ ، Area‬فانك من الممكن ان تكتبة كما يأتي‪:‬‬ ‫‪225‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫)(‪double Area‬‬ ‫{‬ ‫;‪static double Radius‬‬ ‫}‬ ‫م ح‪،‬ة‪//:‬‬ ‫عندما تعلن عن متغير على انه مستقر‪ ،‬فانه سيبتدأ بالقيمة صفر‪ .‬بخلاف ذلك‪ ،‬فان‬ ‫بامكانك ان تبتدئة بقيمة من اختيار عند الاعلان عنه‪ .‬ولجعل المتغيرات المحلية‬ ‫للدالة )( ‪ Starter‬مستقرة‪ ،‬بالامكان ان تعلن عنهم كما في المثال ‪4.18‬‬ ‫‪// Example 4.18‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫)‪void Starter(int y‬‬ ‫{‬ ‫;‪static double a = 112.50‬‬ ‫;‪static double b = 175.25‬‬ ‫;‪a = a / y‬‬ ‫;‪b = b + 2‬‬ ‫;‪cout << \"y = \" << y << endl‬‬ ‫;‪cout << \"a = \" << a << endl‬‬ ‫‪226‬‬

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ cout << \"b = \" << b << endl; cout << \"b / a = \" << b / a << \"\\n\\n\"; } int main() { Starter(2); Starter(2); Starter(2); Starter(2); return 0; } //:4.28 ‫مطرجا البرنامج‬ y=2 a = 56.25 b = 177.25 b / a = 3.15111 y=2 a = 28.125 b = 179.25 b / a = 6.37333 y=2 227

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪a = 14.0625‬‬ ‫‪b = 181.25‬‬ ‫‪b / a = 12.8889‬‬ ‫‪y=2‬‬ ‫‪a = 7.03125‬‬ ‫‪b = 183.25‬‬ ‫‪b / a = 26.0622‬‬ ‫م ح‪،‬ة‪//:‬‬ ‫لاحظ‪ ،‬في هذا الوقت‪ ،‬كل متغيرر محلري يحرافظ علرى قيمترة الجديردة التري تغيررت‬ ‫عند خروج الدالة‪ .‬حي ان معاملات الدالة من الممكن ان تسرتلم قريم مختلفرة عنرد‬ ‫استدعاء الدالة باوقات مختلفرة‪ ،‬بالامكران ان تختبرر برنامجرك بتمريرر قريم مختلفرة‬ ‫الى معاملاتها كما في البرنامج ‪4.19‬‬ ‫‪// Example 4.19‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫)‪void Starter(int y‬‬ ‫{‬ ‫;‪static double a = 112.50‬‬ ‫;‪static double b = 175.25‬‬ ‫;‪a = a / y‬‬ ‫‪228‬‬

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ b = b + 2; cout << \"y = \" << y << endl; cout << \"a = \" << a << endl; cout << \"b = \" << b << endl; cout << \"b / a = \" << b / a << \"\\n\\n\"; } int main() { Starter(2); Starter(5); Starter(14); Starter(25); return 0; } 229

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫مطرجا البرنامج ‪//:4.28‬‬ ‫‪y=2‬‬ ‫‪a = 56.25‬‬ ‫‪b = 177.25‬‬ ‫‪b / a = 3.15111‬‬ ‫‪y=5‬‬ ‫‪a = 11.25‬‬ ‫‪b = 179.25‬‬ ‫‪b / a = 15.9333‬‬ ‫‪y = 14‬‬ ‫‪a = 0.803571‬‬ ‫‪b = 181.25‬‬ ‫‪b / a = 225.556‬‬ ‫‪y = 25‬‬ ‫‪a = 0.0321429‬‬ ‫‪b = 183.25‬‬ ‫‪b / a = 5701.11‬‬ ‫* برنامج لايجاد مضروب ‪ factorial‬لاي رقم باستخدام الاستدعاء الذاتي‬ ‫‪// Example 4.19‬‬ ‫>‪#include<iostream‬‬ ‫‪231‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫; ‪using namespace std‬‬ ‫; )‪int fac (int‬‬ ‫{ ) (‪main‬‬ ‫; ”‪cout << “ Enter a number \\n‬‬ ‫; ‪int x‬‬ ‫; ‪cin >> x‬‬ ‫;”‪cout << “The factorial of “ << x << “ is = “ << fact(x) << “\\n\\n‬‬ ‫; ‪return 0‬‬ ‫}‬ ‫)‪int fact ( int x‬‬ ‫{‬ ‫) ‪if ( x == 0 || x ==1‬‬ ‫; ‪return 1‬‬ ‫‪else‬‬ ‫; )‪return x*fact(x-1‬‬ ‫}‬ ‫اسئلة للحل ‪// :‬‬ ‫‪ .1‬اكتب برنامج باستخدام الدوال لايجاد كل مما ياتي‪:‬‬ ‫‪P(n, k) = n! / (n – k ) ! .A‬‬ ‫‪ .B‬اختبار عدد اذا كان اولي ام لا‪.‬‬ ‫‪ .C‬ايجاد القاسم المشتر الاعمم لرقمين موجبين‪.‬‬ ‫‪ .D‬ايجاد معدل اربع اعداد‪.‬‬ ‫‪ .E‬اختبار اي عدد فيما اذا كان مربع او لا (العدد المربع هو‬ ‫الذي ينتج من حاصل ضرب رقم في نفسه)‪.‬‬ ‫‪231‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪ .F‬حساب الحجم والمساحة السطحية لكرة لاي نصف قطر‬ ‫يعطى‪.‬‬ ‫‪ .2‬مثل باسكال هو مصفوفة مثلثة من الارقام تبدأ كما في الشكل التالي‬ ‫كل قيمة في مثل باسكال تستنتج من العلاقة التالية‬ ‫!) ‪C(n, k) = n! / k! ( n – k‬‬ ‫حي ان ‪ n‬تمثل رقم الصف بينما ‪ k‬تمثل رقم العمود‪ .‬فمثلا اذا اردنا استخراج‬ ‫القيمة التي في الصف السابع والعمود الثال فستكون النتيجة كمايلي‬ ‫‪C ( 7, 3) = 35‬‬ ‫المطلوب كتابة برنامج باستخدام الدوال لطباعة مثل باسكال لغاية الصف ‪.15‬‬ ‫‪232‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫الفصل الخامس‬ ‫المصفوفات‬ ‫‪ARRAYS‬‬ ‫‪ 5.1‬المقدمة‬ ‫نبردأ هنرا مرحلرة جديردة مرن البرمجرة‪ ،‬فلغايرة الأن لسرنا قرادرين علرى معالجرة‬ ‫وخزن كميات كبيرة من البيانات بطريقة مناسبة‪ ،‬في هذا الفصل سريتم التركيرز علرى‬ ‫نرروع جديررد مررن هياكررل البيانررات هرري المصررفوفات بنوعيهررا المصررفوفات ذات البعررد‬ ‫الاحرادي والمصرفوفات المتعرددة الأبعراد مرع امثلرة توضريحية والعمليرات التري مررن‬ ‫الممكن ان تجرى عليها‪.‬‬ ‫‪ 5.2‬المصفوفات‬ ‫المصفوفات هي هيكل بيانات يخزن مجموعة من المتغيرات لهرا نفرب النروع‪،‬‬ ‫فهي تجميع لكيانات البيانات المتشابهة والتي تخزن في مواقع ذاكررة متجراورة تحرت‬ ‫اسررم محرردد‪ ،‬بكررلام اخرررَ فرران المصررفوفة هرري مجموعررة مررن الكيانررات (تسررمى‬ ‫العناصرر)‪ ،‬جميرع هرذ العناصرر مرن نروع واحرد ويرتم خزنهرا فري الرذاكرة فري مواقرع‬ ‫متجراورة‪ ،‬وتعررف المصرفوفة مرن خرلال الاسرم الرذي يسرند لهرا ويرتم اختيرار اسرم‬ ‫المصفوفة وفقا لقواعد اختيار اسماء المتغيرات التري سربق وان ترم شررحها ويسرتخدم‬ ‫هرذا الأسررم للاشررارة الرى المصررفوفة ولرريب الرى عناصررر المصررفوفة اذ ان عناصررر‬ ‫المصفوفة يتم الاشارة الى كل واحد منها باستخدام أسم المصفوفة متبوعا برقم يشير‬ ‫الى موقع العنصر فيها‪.‬‬ ‫تستخدم المصفوفة كبديل ل علان عرن عردد مرن المتغيررات المتشرابهة النروع‪،‬‬ ‫فمرثلا برنرامج يحتراج الرى عشررة متغيررات مرن نروع الأعرداد الصرحيحة‪ ،‬فبردلا مرن‬ ‫الأعرلان عرن عشررة متغيررات وبأسرماء مختلفرة يمكرن ان تعلرن عرن هرذ العناصرر‬ ‫كمصفوفة من نوع الأعداد الصحيحة‪ ،‬حجمها عشرة عناصرر ولهرا اسرم واحرد‪ ،‬وان‬ ‫‪233‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫كل عنصر ممكن ان يعامل كمتغير منفررد لريب لره علاقرة ببراقي عناصرر المصرفوفة‬ ‫الأخرى ويتم الاشارة له من خلال أسم المصفوفة وموقع العنصر في المصفوفة‪.‬‬ ‫‪ 5.3‬المصفوفات الاحادية‬ ‫المصفوفة الاحادية هي عبارة عن سلسلة من العناصر المتشابهة النوع والتري‬ ‫تخزن في الذاكرة في مواقع متجاورة والتي من الممكن الاشرارة لكرل واحرد مرن هرذ‬ ‫العناصربشركل منفررد مرن خرلال اضرافة رقرم الدلالرة )‪ (index‬الرى الأسرم التعريفري‬ ‫الوحيد لها‪ ،‬ومثلها مثرل المتغيررات الاعتياديرة فران المصرفوفة يجرب ان يرتم الأعرلان‬ ‫عنها قبرل اول اسرتخدام لهرا‪ ،‬ويكرون الاعرلان عرن المصرفوفة الاحاديرة بكتابرة النروع‬ ‫اولا متبوع باسم المصفوفة كما في المتغيرات‪ ،‬مع اضرافة قوسرين مرربعين بعرد اسرم‬ ‫المصفوفة يحتويان على عدد عناصر المصفوفة (يشار لره بحجرم المصرفوفة ايضرا)‪،‬‬ ‫والصيغة العامة ل علان عن المصفوفة هو‪:‬‬ ‫; ] ‪Type ArrayName [ number of elements‬‬ ‫حير ان النروع هرو اي نروع مرن انرواع المتغيررات المقبولرة فري لغرة ‪،C++‬‬ ‫والاسرم هرو اي اسرم يرتم اختيرارة مرن قبرل المبررمج علرى ان يتبرع القواعرد المعروفرة‬ ‫بتسمية المتغيرات‪ ،‬واخيرا عدد العناصر التري تحتويهرا المصرفوفة الرذي يجرب دائمرا‬ ‫ان يكرون محرددا برين قوسرين مرربعين‪ ،‬وعنرد الاعرلان عرن المصرفوفة فران المتررجم‬ ‫سريحجز عرددا مرن المواقرع المتجراورة فري الرذاكرة طرول كرل موقرع (عردد البايترات‬ ‫المحددة له) يساوي الحجم المحدد لذلك النوع‪ ،‬وطبعا نفتر ان هذ المواقرع خاليرة‬ ‫مرن اي قيمرة او ربمرا هري تحتروي علرى قيمرة قديمرة لريب لهرا علاقرة بهرذا البرنرامج‬ ‫ويجب تغييرها‪.‬‬ ‫مثال‪:‬‬ ‫; ] ‪int ABC [ 5‬‬ ‫‪234‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫في هذا المثال سيتم تحديد خمسة مواقع متجاورة في الذاكرة من نروع الأعرداد‬ ‫الصحيحة (طول كل موقع ‪ 2‬بايت) خالية من القيم وتحت مسمى واحد هرو (‪.)ABC‬‬ ‫وكما في الشكل ‪5.1‬‬ ‫‪11‬‬ ‫‪234‬‬ ‫‪ABC‬‬ ‫‪int‬‬ ‫شكل ‪ : 5.2‬شكل توضيحي للمصفوفة الاحادية بعد الأعلات عنها‬ ‫لاحظ ان الأرقام التي على المصفوفة تمثرل أرقرام مواقرع العناصرر نسربة لهرذ‬ ‫المصفوفة ودائما في مصفوفات ‪ C++‬فان أول موقع يبدأ بالرقم صفر وليب واحد‪.‬‬ ‫ملاحظة‪//:‬‬ ‫دائما الرقم الموجود بين القوسرين المرربعين والرذي يمثرل عردد العناصرر يجرب ان‬ ‫يكون من الاعداد الصحيحة الموجبة فقط‪ .‬التعبيرات التالية غير مقبولة‬ ‫;]‪Static int value[0.02‬‬ ‫;]‪Float number[-90‬‬ ‫;]‪Char s[$‬‬ ‫ملاحظة‪//:‬‬ ‫قبرل اسرتخدام أي مصرفوفة احاديرة او متعرددة الابعراد فري البرنرامج‪ ،‬يجرب تروفير‬ ‫المعلومات التالية الى المترجم او المفسر‬ ‫‪ -1‬نوع المصفوفة ( مثل ًا ‪ )char , int, float …….‬ال‬ ‫‪ -2‬اسررم المصررفوفة ( ويررتم اختيررارة مررن المبرررمج ويفضررل ان يرردل علررى عمررل‬ ‫المصفوفة)‬ ‫‪235‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫‪ -3‬عردد الأبعراد (‪ )subscript‬فري المصرفوفة ( هرل المصرفوفة احاديرة او متعرددة‬ ‫الابعاد)‬ ‫‪ -4‬العدد الكلي لمواقع الذاكرة المخصصة او بتحديد اكثر‪ ،‬عدد العناصر لكل بعد‬ ‫من أبعاد المصفوفة ‪.‬‬ ‫‪ 5.4‬انشاء المصفوفة ‪Array Initialization‬‬ ‫عند الاعلان عن المصفوفة فانها ستنشأ كمصرفوفة خاليرة مرن القريم‪ ،‬حير ان‬ ‫عناصرها لاتحتوي على قيم (ربما تكون هنا قيم مخزونرة مرن اعمرال سرابقة) مرالم‬ ‫يرتم خرزن قريم فيهرا ا اسرناد قريم ابتدائيرة لهرذ العناصرر وتسرمى هرذ العمليرة ابترداء‬ ‫المصفوفة‪ ،‬لذلك يجب عدم أجراء اي عملية على عناصر المصفوفة اذا لم يتم اسناد‬ ‫قيم لها‪ ،‬كما هو الحال مع المتغيرات الاعتيادية‪.‬‬ ‫المصفوفات ايضا يمكن ان تعررف علرى انهرا محليرة او عامرة مثرل المتغيررات‬ ‫الاعتياديرة‪ ،‬وفري كلترا الحرالتين سرواء كانرت مصرفوفة عامرة او محليرة‪ ،‬فران بامكانرك‬ ‫اسناد قيم ابتدائية لكل عنصر من عناصرها وذلرك مرن خرلال وضرع قريم برين قوسرين‬ ‫متوسطين تفصل بين قيمة واخرى فارزة (بنفب طريقرة كتابرة المجراميع) ومسراواتها‬ ‫الى المصفوفة كما يأتي‪:‬‬ ‫; } ‪ABC [5] = { 5, -234, 45, 0, 123‬‬ ‫ويجب ان تنتبة الى ان عدد القيم بين القوسين المتوسطين يجب ان لاتزيد عن‬ ‫عدد عناصر المصفوفة التي تم الاعلان عنها فري اعرلان المصرفوفة (فراذا اعلنرا عرن‬ ‫مصرفوفة مرن خمسرة عناصرر ووضرعنا برين القوسرين المتوسرطين سرتة قريم فعنرد ذا‬ ‫سيصدر المترجم رسالة خطأ‪ .‬القيم ستسند (تخرزن فري مواقرع الرذاكرة) الرى عناصرر‬ ‫المصفوفة بالتتالي من اليسار الى اليمين (اي ان القيمة في اقصى اليسار (‪ )5‬ستسرند‬ ‫الى العنصر في الموقرع (‪ ،)1‬والقيمرة التري علرى يمينهرا (‪ )-234‬ستسرند الرى العنصرر‬ ‫في الموقع (‪ ..)1‬وهكذا)‪.‬‬ ‫‪236‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫ملاحظة‪//:‬‬ ‫عندما يتم ابتداء القيم سوف تسند لعناصر المصرفوفة‪ C++ ،‬يسرمح بامكانيرة ترر‬ ‫الاقررواس المربعرره فارغررة ][‪ .‬فرري هررذ الحالررة‪ ،‬فرران المترررجم سرريفر حجررم‬ ‫للمصفوفة يطابق عدد القيم الموجودة بين الاقواس المتوسطة‪ .‬مثال‬ ‫; }‪ABC [] = { 3, 4, 5‬‬ ‫هنا سيحدد المترجم عدد العناصر بثلاث‪.‬‬ ‫ملاحظة‪//:‬‬ ‫يجرب ان تميرز برين رقرم موقرع العنصرر ومحتروى هرذا الموقرع‪ ،‬اذ ان الررقم برين‬ ‫القوسين المربعين هو دليل الرى مكران العنصرر فري المصرفوفة ولريب اكثرر‪ ،‬بينمرا‬ ‫المحتوى هو يمثل القيمة التري يحتويهرا هرذا الموقرع‪ .‬كمثرال‪ ،‬لرو تخيلنرا شرارع فري‬ ‫منطقة سكنية يحتوي الشارع عدد من الدور السكنية ولكل دار رقم تسلسلي يمثرل‬ ‫موقرع الردار فري الشرارع‪ ،‬عليره فانرك يمكنرك ان تعتبرر الشرارع بردور مصرفوفة‪،‬‬ ‫فاسم الشارع يمثل اسم المصفوفة‪ ،‬ولكي تعنون احرد الردور فتقرول الردار رقرم كرذا‬ ‫في الشارع الفلاني‪ ,‬لتعرف ما يحتوي الدار وهري نفرب طريقرة الاشرارة لعناصرر‬ ‫المصرفوفة (اسرم المصرفوفة ثرم رقرم العنصرر ;]‪ ،)ABC [2‬لرذلك فران رقرم الردار‬ ‫لايمثرل سراكني الردار فعنردما تقرول دار (‪ )2‬فران ذلرك سروف لايوضرح لرك عردد‬ ‫ساكني دار ‪ 2‬وهل هم رجال او نساء او اي شيء اخر‪ ،‬نؤكد ان رقرم الموقرع هرو‬ ‫مجرد رقم تسلسلي فقط‪.‬‬ ‫ملاحظة‪//:‬‬ ‫في ادنا بعض الامثلة المقبولة لابتداء المصفوفة‬ ‫;}‪int value[7]={10,11,12,13,14,15,16‬‬ ‫;}‪float coordinate[5]={0, 0.45, -0.5, -4.0, 5.0‬‬ ‫;}` ‪char sex[2]={`M`,` F‬‬ ‫‪237‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫;}`‪char name[5]={`s`, `i`, `n`, `a`, `n‬‬ ‫ملاحظة‪//:‬‬ ‫ان عناصر المصفوفات العامة وتلرك مرن نروع )‪ ،(static‬سروف تبردأ اليرا مرع القريم‬ ‫الافتراضرية‪ ،‬والتري هري لكرل الانرواع الاساسرية والرذي يعنري املائهرا مرع القيمرة‬ ‫صفر‪.‬‬ ‫بالأمكران انشراء المصرفوفة وذلرك باسرناد قريم لعناصرر المصرفوفة مرن لوحرة‬ ‫المفاتيح عند تنفيذ البرنامج‪.‬‬ ‫* برنرامج للاعرلان عرن مصرفوفة واسرناد قريم لعناصررها مرن لوحرة المفراتيح‬ ‫اثناء تنفي البرنامج‪.‬‬ ‫‪//Example 5.1‬‬ ‫>‪#include<iostream‬‬ ‫;‪using namespace std‬‬ ‫{ )‪void main (void‬‬ ‫;]‪int a[7‬‬ ‫; ‪int i‬‬ ‫) ‪for ( i=0 ; i<=6 ; i++‬‬ ‫; ]‪cin >> a[i‬‬ ‫}‬ ‫لاحرظ اننرا اسرتخدمنا حلقرة تكررار بعردد عناصرر المصرفوفة وذلرك لكري يرتم‬ ‫المرور على جميع مواقع المصرفوفة ويسرند لهرا قريم‪ .‬امرا طباعرة عناصرر المصرفوفة‬ ‫فتتم بنفب الطريقة التي استخدمنا فيهرا حلقرة التكررار لأسرناد قريم لعناصرر المصرفوفة‬ ‫مع تغيير ايعاز الادخال بايعاز الاخراج‪ ..‬على ان تنتبة الرى انره لايمكنرك طباعرة اي‬ ‫عنصر من عناصر المصفوفة اذا لم تسبقة بعملية اسناد قيم لعناصر المصفوفة‪.‬‬ ‫‪238‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫* برنامج يوضح طريقة اسناد وطباعة عناصر مصفوفة‬ ‫‪//Example 5.2‬‬ ‫>‪# include<iostream‬‬ ‫;‪using namespace std‬‬ ‫{ )‪void main (void‬‬ ‫;}‪int a[7]={11, 12, 13, 14, 15, 16, 17‬‬ ‫; ‪int i‬‬ ‫;\" ‪cout<<\" contents of the array \\n‬‬ ‫)‪for (i=0 ; i<=6; i++‬‬ ‫; '‪cout << a[i] << '\\t‬‬ ‫}‬ ‫ملاحظة‪//:‬‬ ‫ان محاولرة الكتابرة فري مواقرع خرارج مردى المصرفوفة سريؤدي الرى نترائج غيررر‬ ‫متوقعة فاذا كنت محموظ فران البرنرامج سريتلف او يرتحطم مباشررة‪ ،‬واذا لرم تكرن‬ ‫محموظ فانك ربما ستحصل على نترائج غريبرة لاحقرا او ربمرا ترؤدي الرى الترأثير‬ ‫على بعض البيانات المخزنة لبرامج اخرى او النمام‪ .‬مثال‬ ‫مصفوفة حجمها ‪ 5‬عناصر تحت اسم ‪ Myarray‬فاذا حاولت اسناد قيمة كمايأتي‬ ‫; ‪Myarray [40] = 34‬‬ ‫في هذ الحالة فان المترجم سيحسب عنوان الموقع ‪ 41‬ويضع فيه القيمرة المحرددة‬ ‫والتي هي ربما في مكان اخرر مرن البرنرامج او خرارج البرنرامج ممرا سريؤدي الرى‬ ‫تغيير قيم لانرغب بتغييرها‪.‬‬ ‫‪239‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫ِ ‪ :5.1‬مقطع من اكره افترايي يويُّ كيفية زإ عنااللهر المَافوفة‬ ‫في اللاكره‪.‬‬ ‫ان من اكثر الاخطاء التي تحدث هري عنردما تحراول خرزن عنصرر فري مواقرع‬ ‫ماوراء حجم المصفوفة‪ ،‬فمثلا لو عرفت مصفوفة كمايأتي‪:‬‬ ‫; ]‪int a[6‬‬ ‫عنردما تسرتخدم هرذ المصرفوفة فران دليرل المصرفوفة يترراوا برين (‪ ،)5-1‬فراذا‬ ‫حددت الدليل بغير ذلك فان خطأ سيحدث‪ .‬في معمرم الحواسريب لايوجرد تحرذير عنرد‬ ‫‪241‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫اسرتخدام دليرل خرارج حجرم المصرفوفة‪ ،‬كمثرال افرر انرك حرددت قيمرة الرى الردليل‬ ‫الموضح ادنا ‪:‬‬ ‫; ‪A[7] = 225‬‬ ‫هنا الحاسوب سيعامل هذا الامر على انه صحيح وسيحاول وضع القيمرة ‪225‬‬ ‫في العنوان المناسب في الذاكرة‪ ,‬ولكن عند حسراب موقرع او عنروان هرذ القيمرة فانهرا‬ ‫سرتكون فري العنروان الرذي يحروي المتغيرر (‪ )more_stuff‬حسرب الشركل ‪ ,5.2‬ولرذلك‬ ‫فان هذ القيمة الخاصة بالمتغير (‪ )more_stuff‬سوف تتغير بشكل غير مقصود‪.‬‬ ‫‪ 5.5‬الووول الى عناور المصفوفة‪:‬‬ ‫عند كتابة برنامج يحتوي على مصفوفة فان بامكانك الوصول الى اي عنصر‬ ‫مرن عناصرر المصرفوفة بشركل منفررد وفري اي مكران مرن البرنرامج وتتعامرل مرع هرذا‬ ‫العنصرر كمرا تتعامرل مرع اي متغيرر عرادي مرن حير القرراءة والتغييرر‪ .‬ان الصريغة‬ ‫المستخدمة للاشارة الى اي عنصر يتم من خلال كتابة اسم الدالة متبوعا بررقم موقرع‬ ‫هذا العنصر في المصفوفة‪ ،‬ويكون الرقم محدد بين قوسين مربعين‪ ،‬كما في ادنا ‪:‬‬ ‫; ] ‪Name [ index‬‬ ‫هذ الصيغة تمثل قيمة العنصر‪ ،‬وهي تكرافيء اسرم المتغيرر الاعتيرادي وعلرى‬ ‫هرذ الصريغة بالامكران اجرراء كرل العمليرات التري بالامكران اجراءهرا علرى المتغيرر‬ ‫الاعتيادي من ذلك النوع‪ .‬فمثلا اذا كنت ترغب باسناد القيمة ‪ 45‬الى العنصرر الثراني‬ ‫في المصفوفة (‪ ،)ABC‬فسيتم ذلك كمايأتي‪:‬‬ ‫; ‪ABC [ 2 ] = 45‬‬ ‫كما يمكنك ان تمرر هذ القيمة الى متغير اخر اعتيادي مثلا (‪ ،)x‬وكمايأتي‪:‬‬ ‫; ] ‪x = ABC [ 2‬‬ ‫عليه فان المتغير (‪ )x‬ستكون قيمتة مساوية الى ‪.45‬‬ ‫ملاحظة‪//:‬‬ ‫‪241‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫تستخدم الاقواس المربعة مع المصفوفات لامرين‪:‬‬ ‫الأول ‪ :‬يستخدم ل علان عن حجم المصفوفة عندما يحتوي عرددا صرحيحا‬ ‫موجبا وقت الاعلان عن المصفوفة‪.‬‬ ‫الثاني ‪ :‬يستخدم في تحديد موقع العنصر في المصفوفة‪.‬‬ ‫ملاحظة‪//:‬‬ ‫اذا لم يتم مساواة عدد عناصر المصفوفة خارجيا عند ابتداء المصفوفة كأن يكون‬ ‫عدد القيم المسندة والمحددة بين القوسين المتوسطين هو اقل من العدد الذي يحردد‬ ‫حجم المصفوفة‪ ،‬ففي هذ الحالة‪ ،‬فان هذ القريم ستسرند الرى العناصرر المقابلرة لهرا‬ ‫اما باقي العناصر فستسند لها القيم الافتراضية وهي صفر‪ .‬مثال‬ ‫; } ‪Myarray [ 5 ] = { 3, 65, 21‬‬ ‫فستكون قيم العناصر كمايأتي‪:‬‬ ‫; ‪Myarray [ 0 ] = 3‬‬ ‫; ‪Myarray [ 1 ] = 65‬‬ ‫; ‪Myarray [ 2 ] = 21‬‬ ‫; ‪Myarray [ 3 ] = 0‬‬ ‫‪Myarray [ 4 ] = 0 ;.‬‬ ‫ملاحظة‪//:‬‬ ‫في ‪ C++‬لايسمح بالعمليات البسيطة التي تتضمن كامل المصفوفة‪ .‬حير ان اسرم‬ ‫المصررفوفة يعامررل كمتغيررر منفصررل للعمليررات مثررل عمليررة المسرراواة (الاسررناد)‪،‬‬ ‫عمليرات المقارنرة ‪...‬وهكرذا فمرثل ًا لرو كانرت (‪ )b ،a‬مصرفوفتان مرن نفرب النروع‬ ‫وذات الحجرم فرأن عمليرات الاسرناد والمقارنرة يجرب ان تجرري فقرط لعنصرر مرع‬ ‫عنصر اخر‪.‬‬ ‫‪242‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫}‪int a[4]={2,3,4,5‬‬ ‫فالعمليات التالية مقبولة‪:‬‬ ‫}‪int b[4]={1,3,5,7‬‬ ‫) ] ‪* if (a [ 2 ] > b [ 2‬‬ ‫;\" ‪cout<<\" array are different \\n‬‬ ‫) ] ‪* while ( a [ 1 ] == b[ 3‬‬ ‫العمليات التالية غير مقبولة‪:‬‬ ‫;\" ‪cout<<\" AAAAAAAAAA \\n‬‬ ‫)‪* if (a == b‬‬ ‫;\" ‪cout<<\" array elements are equal \\n‬‬ ‫)‪* while (a>b‬‬ ‫;\" ‪cout<<\" array processing \\n‬‬ ‫‪ 5.6‬المصفوفات المتعددة الابعاد‬ ‫المصفوفات المتعددة الابعاد ممكن ان تعرف على انها مصفوفة المصفوفات‪،‬‬ ‫فمن الممكن ان تكون لك مصفوفة تحوي على اكثر من بعد واحد‪ ،‬كل بعد ممكن ان‬ ‫يمثل في المصفوفة كرقم دلالرة‪ ،‬انرت تعلرم ان المصرفوفة ذات البعرد الواحرد كران لهرا‬ ‫رقم دلالة واحد بعد اسم المصفوفة‪ ،‬لذا فان المصفوفة ذات البعدين يكرون لهرا رقمري‬ ‫دلالة بعد اسم المصفوفة‪ ،‬والمصفوفة ذات الثلاثة ابعاد لها ثلاثة ارقام دلالة بعد اسم‬ ‫المصفوفة وهكذا‪ .‬المصفوفات من الممكن ان يكون لهرا اي عردد مرن الابعراد‪ ،‬ولكننرا‬ ‫سرنكتفي فري هرذا القسرم بشررا المصرفوفة ذات البعردين لانهرا والمصرفوفة ذات البعرد‬ ‫الواحد الاكثر اسرتخداما‪ ،‬وجميرع المصرفوفات ذات الابعراد الاكثرر تطرابق المصرفوفة‬ ‫ذات البعردين بالعمرل‪ .‬مرن الامثلرة الجيردة للمصرفوفات الثنائيرة هري رقعرة الشرطرنج‪،‬‬ ‫حي تتكون من ثمانية صفوف وثماني اعمدة (كل صف يمثل مصفوفة احاديرة وكرل‬ ‫عمود يمثل مصفوفة احادية ايضا)‪ ،‬المصفوفات الثنائية تتكون مرن صرفوف واعمردة‬ ‫‪243‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫ترقم الصفوف ابتداءا من الرقم (‪ )1‬وترقم الاعمدة ايضا ابتداءا من الرقم (‪ .)1‬وكرل‬ ‫خليرة فري المصرفوفة الثنائيرة تمثرل موقرع بالرذاكرة وبالترالي سرتخزن قيمرة‪ ،‬وكمرا فري‬ ‫المصفوفات الاحادية فان لكل مصفوفة ثنائية اسم وحيد تعررف بره وهرو اي اسرم يرتم‬ ‫اختيرارة مرن المبررمج علرى ان يتبرع قواعرد تسرمية المتغيررات‪ ،‬وبالتاكيرد فران لكرل‬ ‫مصرفوفة ثنائيرة نروع وهرو يمثرل نروع البيانرات المخزنرة فري المصرفوفة وبالامكران‬ ‫استخدام اي نوع من الانواع المقبولة في لغة ‪.C++‬‬ ‫المصفوفات الثنائيرة لهرا اسرتخدامات كثيررة وهري تسراعد علرى تسرهيل التعامرل‬ ‫مع بعرض المسرائل المعقردة‪ ..‬فمرثلا لردينا عردد مرن المعامرل (ثلاثرة معامرل‪ ..‬معمرل‪،1‬‬ ‫معمل‪ ،2‬معمل‪ )3‬التي تنتج مواد كهربائيرة متشرابهة مثرل (تلفزيرون‪ ،‬ثلاجرة‪ ،‬غسرالة‪،‬‬ ‫مجمدة‪ ،‬مكيف) فيمكن تمثيرل انتاجهرا بمصرفوفة ثنائيرة والتعامرل مرع قيمهرا علرى هرذا‬ ‫المبدأ كمايأتي‪:‬‬ ‫معمل‪1‬‬ ‫مكيف‬ ‫مجمدة‬ ‫غسالة‬ ‫ثلاجة‬ ‫تلفزيون‬ ‫معمل‪2‬‬ ‫معمل‪3‬‬ ‫‪21‬‬ ‫‪12‬‬ ‫‪56‬‬ ‫‪34‬‬ ‫‪23‬‬ ‫‪21‬‬ ‫‪34‬‬ ‫‪44‬‬ ‫‪43‬‬ ‫‪22‬‬ ‫‪12‬‬ ‫‪15‬‬ ‫‪23‬‬ ‫‪31‬‬ ‫‪42‬‬ ‫شكل ‪ 5.3‬مثال توضيحي لتمثيل المصفوفات الثنائية‬ ‫الان لرو سرألنا كرم غسرالة انتجرت فري المعمرل‪ ..1‬بالتاكيرد سريكون الجرواب ‪،56‬‬ ‫واذا كران السرؤال كرم مكيرف انرتج فري المعمرل ‪ 3‬فسريكون الجرواب ‪ 12‬وهكرذا (عليرك‬ ‫الان ان تستنتج الطريقرة التري تتعامرل بهرا مرع عناصرر المصرفوفة)‪ .‬حجرم المصرفوفة‬ ‫هو (‪( )5×3‬اسماء الاعمدة والصفوف في الشكل هي للتوضيح)‪.‬‬ ‫‪ 5.6.2‬الاعلان عن المصفوفة الثنائية‬ ‫يتم الاعلان عن المصفوفة الثنائية بنفب الطريقرة التري يرتم فيهرا الاعرلان عرن‬ ‫المصرفوفة الاحاديرة وذلرك بكتابرة نروع المصرفوفة متبوعرا باسرم المصرفوفة ثرم عردد‬ ‫‪244‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫العناصر في المصفوفة وهنا يكون عردد العناصرر موزعرا علرى اربرع اقرواس مربعرة‬ ‫(لأنها ثنائية)‪ ،‬القوسين المربعين الاولى يحمل عدد الصرفوف فري المصرفوفة الثنائيرة‬ ‫والقوسين المربعين الاخرى يمثل عدد الاعمدة في المصفوفة‪ ،‬وكما يأتي‪:‬‬ ‫; ]‪int TestArray [3][5‬‬ ‫الاعلان اعلا يمثل اعلان عن مصفوفة ثنائية (عدد الاقرواس المربعرة اربعرة‬ ‫وهذا يعني انها ثنائية) من نوع الاعداد الصحيحة (اي ان جميع عناصررها مرن نروع‬ ‫الاعررداد الصررحيحة)‪ ،‬تحررت اسررم (‪ )TestArray‬وهرري تحترروي علررى ثلاثررة صررفوف‬ ‫وخمسة اعمدة (اي ان عدد عناصررها الكلري يسراوي حاصرل ضررب عردد الصرفوف‬ ‫في عدد الاعمدة وسيكون مساوي ‪.)3×5=15‬‬ ‫ملاحظة‪//:‬‬ ‫لايجوز اطلاقا تخصيص القوسرين المرربعين الاولرى للاعمردة والثانيرة للصرفوف‪،‬‬ ‫لان المترجم دائما ينمر الى القيمة التي فري القوسرين المرربعين الاولرى علرى انهرا‬ ‫عدد الصفوف ونفب الشيء للقوسين المرربعين الثانيرة فيعرد القيمرة التري فيره علرى‬ ‫انها عدد الاعمدة‪.‬‬ ‫‪ 5.6.1‬الووول لعناور المصفوفة الثنائية‬ ‫الية الوصول الى اي عنصر في المصفوفة الثنائية يكون من خلال كتابرة اسرم‬ ‫المصفوفة ثم الاقواس المربعة‪ ،‬حي القوسين الاولى سيشرير الرى رقرم الصرف الرذي‬ ‫يتواجد به العنصر المطلوب‪ ،‬اما القوسين الثانية فيشير الرى رقرم العمرود الرذي يوجرد‬ ‫فيره العنصرر المطلروب (انمرر الشركل ‪ ،)5.4‬اذ ان العنصرر المطلروب هرو العنصرر‬ ‫المضلل وهو موجود بالصف الرابع والعمود الثال ‪ ،‬لذلك فان الوصول لاي عنصر‬ ‫مرن عناصرر المصرفوفات الثنائيرة يكرون بدلالرة رقرم الصرف ورقرم العمرود (ودائمرا‬ ‫القوسرين المرربعين الاولرى يسرتخدم لرررقم الصرف والقروس المرربعين الثرانيين لرررقم‬ ‫العمود)‪.‬‬ ‫‪245‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫الاعمده‬ ‫الَـــــــــــفوف‬ ‫‪01‬‬ ‫‪23456‬‬ ‫‪7‬‬ ‫‪1‬‬ ‫‪1‬‬ ‫‪2‬‬ ‫‪3‬‬ ‫‪4‬‬ ‫‪5‬‬ ‫‪6‬‬ ‫]‪7 TwoDarray [4][3‬‬ ‫شكل (‪ :)5.4‬تمثيل للمصفوفة الثنائية‬ ‫عند الوصول لاي عنصر من عناصر المصفوفة الثنائية فيمكنك التعامرل معره‬ ‫واجراء كافة العمليات التي تتناسب مع نوعة كأي متغير اعتيادي‪ ،‬مثال‬ ‫لغر أسناد القيمرة (‪ )56‬لعنصرر مرن عناصرر مصرفوفة ثنائيرة (نفرر انره‬ ‫العنصر في الموقع ‪ ) 3×5‬فيتم ذلك كمايأتي‪:‬‬ ‫; ‪TestArray [3][5] = 56‬‬ ‫لاحظ عند العمل على عناصر المصفوفة لاتحتاج لتحديد النوع لانه تم تحديدة‬ ‫عند الاعلان عن المصفوفة‪.‬‬ ‫الان لو اردت طباعة قيمة هذا العنصر على الشاشة فسيكون كمايأتي‪:‬‬ ‫; ]‪cout << TestArray[3][5‬‬ ‫‪246‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫ويمكن مساواته لاي متغير اعتيادي مثل‬ ‫; ]‪x = TestArray[3][5‬‬ ‫طبعا ستكون قيمة المتغير )‪ (x‬تساوي (‪.)56‬‬ ‫‪ 5.6.3‬ابتداء المصفوفة الثنائية‬ ‫يقصد بالأبتداء هو اسناد قيم ابتدائية للمصفوفة ويكون بعدة طرق‪:‬‬ ‫* يمكوون ان تبتوودأ المصووفوفة الثنائيووة بوونفس الطريقووة التووي توو فيهووا بوودأ المصووفوفة‬ ‫الاحاديوة وذلو مون خولال كتابوة اسو المصوفوفة موع الاقوواس التوي تمثول الابعواد‬ ‫ومساواتها الى مجموعة من القي (تتكون من مجموعة من القي تفصول بوين قيموة‬ ‫واخرى فارزة وتحدد القي بين قوسين متوسطين مع ملاحظة ان عدد القي يجوب‬ ‫ان لايزيد عن عدد عناور المصفوفة) وكمايأتي‪:‬‬ ‫; } ‪int theArray[5][3] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15‬‬ ‫في هذ الحالة فان اول ثلاث قيم يرتم اسرنادها الرى المواقرع الرثلاث فري الصرف‬ ‫(‪ )1‬وثاني ثلاث عناصر تسند الى المواقع الثلاث في الصف الاول وهكذا‪.‬‬ ‫* ويمكون ان تكوون مجواميع ثلاثيوة ضومن المجموعوة الرئيسوة وتسوندها للمصوفوفة‬ ‫وكمايأتي‪:‬‬ ‫;}}‪int theArray[5][3]={{1,2,3}, {4,5,6}, {7,8,9}, {10,11,12}, {13,14,15‬‬ ‫المترجم سيهمل الاقواس الداخلية التري ستسراعد علرى فهرم توزيرع القريم بشركل‬ ‫سهل‬ ‫• بالامكوان اسوناد قوي الوى عناوور المصوفوفة باسوتخدام لوحوة المفواتي اثنواء تنفيو‬ ‫البرنامج وذل باسوتخدام حلقتوي تكورار متوداخلتين الحلقوة الخارجيوة تعمول كعوداد‬ ‫للصفوف (تضع مؤشر على الصفوف) بينما الحلقة الداخلية تعمل كعداد للأعمدة‬ ‫(تضوع مؤشور علوى الاعمودة)‪( ،‬بكولام اخور فوان حلقتوي التكورار سوتعملان علوى‬ ‫وضوع قوي للصوفوف بالتتوابع اي يوت وضوع قوي لعناوور الصوف (‪ )1‬ابتوداءا مون‬ ‫العمود (‪ )1‬الى العمود الاخير ث ينتقل الى الصف الاول وهك ا‪.‬‬ ‫‪247‬‬

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫• برنامج لقراءة مصفوفة ثنائية بادخال قيم عناصر من لوحة المفاتيح‬ ‫‪//Example 5.3‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫)(‪int main‬‬ ‫{‬ ‫; ]‪int SomeArray[5][4‬‬ ‫)‪for (int i = 0; i<5 ; i++‬‬ ‫)‪for (int j=0; j<4 ; j++‬‬ ‫; ]‪cin >> SomeArray [i][j‬‬ ‫;‪return 0‬‬ ‫}‬ ‫‪ 5.6.4‬باعة المصفوفة‬ ‫يستخدم نفب البرنامج السابق لغر طباعة عناصرر المصرفوفة علرى ان يرتم‬ ‫ابدال امر الادخال بامر الاخراج وكما يأتي‪:‬‬ ‫• برنامج لقراءة وطباعة عناصر مصفوفة ثنائية‬ ‫‪//Example 5.4‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫)(‪int main‬‬ ‫{‬ ‫; ]‪int SomeArray[5][4‬‬ ‫‪248‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫)‪for (int i = 0; i<5; i++‬‬ ‫)‪for (int j=0; j<4; j++‬‬ ‫; ]‪cin >> SomeArray [i][j‬‬ ‫)‪for (int i = 0; i<5; i++‬‬ ‫)‪for (int j=0; j<4; j++‬‬ ‫; '‪cout << SomeArray [i][j]<< '\\t‬‬ ‫;‪return 0‬‬ ‫}‬ ‫لاحرظ فري المثرال ‪ 5.4‬لايمكرن اسرتخدام اوامرر الاخرراج مرالم يرتم اسرناد قريم‬ ‫لعناصر المصفوفة باحدى طرق اسناد القيم المبينرة اعرلا ‪ .‬المثرال ‪ 5.4‬يمكرن ان يرتم‬ ‫اخراجة بطريقة افضل بحير تكرون طباعرة المصرفوفة مشرابهة لطريقرة كتابتهرا‪ ،‬اي‬ ‫علررى شرركل شرربكة‪ ..‬اسررطر واعمرردة (فرري المثررال ‪ 5.4‬سرريتم طباعررة كامررل عناصررر‬ ‫المصفوفة على سطر واحد)‪..‬‬ ‫• برنامج لطباعة عناصر مصفوفة على شكل صفوف واعمدة‬ ‫‪//Example 5.5‬‬ ‫>‪#include <iostream‬‬ ‫;‪using namespace std‬‬ ‫)(‪int main‬‬ ‫{‬ ‫; ]‪int SomeArray[5][4‬‬ ‫)‪for (int i = 0; i<5; i++‬‬ ‫‪249‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ for (int j=0; j<4; j++) cin >> SomeArray[i][j] ; for (int i = 0; i<5; i++) { for (int j=0; j<4; j++) cout << SomeArray[i][j]<< \"\\t\" ; cout << endl ; } return 0; } ،)‫ عنصررر‬111( ‫• برنررامج لقررراءة مصررفوفة اعررداد صررحيحة احاديررة حجمهررا‬ ‫وايجاد العدد الاكبر في المصفوفة‬ //Example 5.6 #include<iostream> using namespace std; void main (void) { int a[100] ; int i َn ,larg ; cout<<\"enter the elements \"<<endl; for(i=0; i<=99; ++i) { cin>>a[i] ; } larg=a[0]; 251

[email protected] . ‫ جامعة الكوفة‬/ ‫ نضال خضير العبادي‬.‫د‬ for (i=0 ; i<=99 ; ++i) if (larg < a[i]) larg = a[i] ; cout<<\" largest value in the array = \"<< larg ; return 0; } ‫• برنامج لقراءة مجموعة من الارقام وترتيب الارقام ترتيب تصاعدي‬ //Example 5.7 #include<iostream> using namespace std; void main (void) { int a[100]; int i, j, n, temp ; cout<<\"enter the elements \"<<endl; for(i=0; i<=99; ++i) cin>>a[i]; for (i=0; i<=98; ++i){ for (j=i+1; j<=99; ++j) if (a[i]<a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } cout<<\" contents of the sorted array \"<<endl ; for (i=0;i<=99;++i) 251

‫‪ C++‬من البداية إلى البرمجة الكيانية‬ ‫;'‪cout<<a[i]<<'\\t‬‬ ‫;‪return 0‬‬ ‫}‬ ‫‪ 5.7‬مصفوفات الأحرف ‪Character Arrays‬‬ ‫السلاسل الرمزية هي سلسلة من الحروف‪ ،‬السلاسل الوحيردة التري ترم رايتهرا‬ ‫في هذا الكتاب لغاية الان هي السلاسل الرمزيرة الثابترة غيرر المسرماة والتري تسرتخدم‬ ‫مع عبارات (<< ‪ ،)cout‬مثل‬ ‫;\"‪cout << \"hello world.\\n‬‬ ‫في لغة ‪ C++‬فأن السلاسل الرمزية هي عبارة عرن مصرفوفة ل حررف تنتهري‬ ‫برالحرف (‪( )null‬حررف النهايرة) حير يمثرل نهايرة السلسرلة الرمزيرة‪ ،‬بالأمكران ان‬ ‫تعلن وتبتدأ السلاسل الرمزية كما تفعل بالضبط مع مصرفوفات البيانرات مرن الأعرداد‬ ‫الصحيحة والحقيقية‪ ،‬مثال‬ ‫;} '‪char Greeting[ ] = { `H' ،`e' ،`l' ،`l' ،`o' ،` ` ،`W','o','r','l','d' ،`\\0‬‬ ‫لاحظ ان الحرف الاخير هو ('‪ )null) ('\\0‬مابعد الشرطة المعكوسة هو صفر‪.‬‬ ‫لغرة ‪ C++‬تروفر امكانيرة اختصرار الطريقرة اعرلا والتري تعتمرد علرى ادخرال‬ ‫حرف بعد الأخر‪ ،‬وكمايأتي‪:‬‬ ‫;\"‪char Greeting[ ] = \"Hello World‬‬ ‫حي ان هذ القاعدة توفر شيئين‪:‬‬ ‫• فبرردلا مررن اسررتخدام الحاصرررات المفررردة المفصررولة بررالفوارز والمحاطررة‬ ‫بالاقواس فانك ستستخدم الحاصرات المزدوجة بدون فوارز واقواس‪.‬‬ ‫• عدم الحاجة لأضافة حرف النهاية لان المترجم سيضيفة عوضا عنك‪.‬‬ ‫‪252‬‬

‫د‪ .‬نضال خضير العبادي ‪ /‬جامعة الكوفة ‪[email protected] .‬‬ ‫هنرا حجرم المصرفوفة يسراوي (‪ )12 byte‬وذلرك لان كلمرة (‪ )Hello‬تحتراج الرى‬ ‫خمرب بايترات‪ ،‬فررا واحرد يحتراج بايرت واحرد‪ ،‬وكلمرة (‪ )World‬تحتراج الرى خمرب‬ ‫بايتات‪ ،‬واخيرا بايت واحد لحرف النهاية‪.‬‬ ‫لذلك فعندما تعلن عن مصفوفة حرفية وتكتب حجمها فيجب ان يكرون حجمهرا‬ ‫بعدد الاحرف زائدا واحد (الفرا بين الأحرف يعامل معاملة الحروف)‪ ،‬مثال‬ ‫; ”‪char Colour [4] = “RED‬‬ ‫سيتم اسناد الأحرف لكل موقع في مصفوفة الاحرف كما يأتي‪:‬‬ ‫; ’‪Colour[0] =’R‬‬ ‫; ’‪Colour[1] =’E‬‬ ‫; ’‪Colour[2] =’D‬‬ ‫;'‪Colour [3] = '\\0‬‬ ‫مثال اخر‪:‬‬ ‫‪char Name [5] = \" Ahmed \" // error‬‬ ‫المساواة التالية سوف تكون لكل خلية‬ ‫; `‪Name [0] = `A‬‬ ‫; `‪Name [1] = `h‬‬ ‫; `‪Name [2] = `m‬‬ ‫; `‪Name [3] = `e‬‬ ‫; `‪Name [4] = `d‬‬ ‫الاعررلان اعررلا خطررأ‪ ،‬وذلررك بسرربب عرردم وجررود خليررة لحفررظ حرررف )‪(null‬‬ ‫فري المصرفوفة كحررف نهايرة ويمكرن تصرحيح ذلرك باعرادة الأعرلان عرن المصرفوفة‬ ‫اعلاة كما يأتي‪:‬‬ ‫‪char Name [6] = \" Ahmed \" // right‬‬ ‫‪253‬‬

‫ من البداية إلى البرمجة الكيانية‬C++ ‫المساواة التالية ستكون لكل خلية‬ Name [0] = `A` ; Name [1] = `h` ; Name [2] = `m` ; Name [3] = `e` ; Name [4] = `d` ; Name [5] = `\\0`; ‫الاعلان التالي مقبول‬ char line [ ] = \" this a test program \" ‫الاقواس المربعة ممكن ان تكون فارغة‬ ‫برنامج لقراءة مصفوفة احرف وطباعتها‬ //Example 5.8 #include <iostream> using namespace std; int main() { char buffer[80]; cout << \"Enter the string: \"; cin >> buffer; cout << \"Here's the buffer: \" << buffer << endl; return 0; } 254


Like this book? You can publish your book online for free in a few minutes!
Create your own flipbook