د .نضال خضير العبادي /جامعة الكوفة [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
Search
Read the Text Version
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246
- 247
- 248
- 249
- 250
- 251
- 252
- 253
- 254
- 255
- 256
- 257
- 258
- 259
- 260
- 261
- 262
- 263
- 264
- 265
- 266
- 267
- 268
- 269
- 270
- 271
- 272
- 273
- 274
- 275
- 276
- 277
- 278
- 279
- 280
- 281
- 282
- 283
- 284
- 285
- 286
- 287
- 288
- 289
- 290
- 291
- 292
- 293
- 294
- 295
- 296
- 297
- 298
- 299
- 300
- 301
- 302
- 303
- 304
- 305
- 306
- 307
- 308
- 309
- 310
- 311
- 312
- 313
- 314
- 315
- 316
- 317
- 318
- 319
- 320
- 321
- 322
- 323
- 324
- 325
- 326
- 327
- 328
- 329
- 330
- 331
- 332
- 333
- 334
- 335
- 336
- 337
- 338
- 339
- 340
- 341
- 342
- 343
- 344
- 345
- 346
- 347
- 348
- 349
- 350
- 351
- 352
- 353
- 354
- 355
- 356
- 357
- 358
- 359
- 360
- 361
- 362
- 363
- 364
- 365
- 366
- 367
- 368
- 369
- 370
- 371
- 372
- 373
- 374
- 375
- 376
- 377
- 378
- 379
- 380
- 381
- 382
- 383
- 384
- 385
- 386
- 387
- 388
- 389
- 390
- 391
- 392
- 393
- 394
- 395
- 396
- 397
- 398
- 399
- 400
- 401
- 402
- 403
- 404
- 405
- 406
- 407
- 408
- 409
- 410
- 411
- 412
- 413
- 414
- 415
- 416
- 417
- 418
- 419
- 420
- 421
- 422
- 423
- 424
- 425
- 426
- 427
- 428
- 429
- 430
- 431
- 432
- 433
- 434
- 435
- 436
- 437
- 438
- 439
- 440
- 441
- 442
- 443
- 444
- 445
- 446
- 447
- 448
- 449
- 450
- 451
- 452
- 453
- 454
- 455
- 456
- 457
- 458
- 459
- 460
- 461
- 462
- 463
- 464
- 465
- 466
- 467
- 468
- 469
- 470
- 471
- 472
- 473
- 474
- 475
- 476
- 477
- 478
- 479
- 480
- 481
- 482
- 483
- 484
- 485
- 486
- 487
- 488
- 489
- 490
- 491
- 492
- 493
- 494
- 495
- 496
- 497
- 498
- 499
- 500
- 501
- 502
- 503
- 504
- 505
- 506
- 507
- 508
- 509
- 510
- 511
- 512
- 513
- 514
- 515
- 516
- 517
- 518
- 519
- 520
- 521
- 522
- 523
- 524
- 525
- 526
- 527
- 528
- 529
- 530
- 531
- 532
- 533
- 534
- 535
- 536
- 537
- 538
- 539
- 540
- 541
- 542
- 543
- 544
- 545
- 546
- 547
- 548
- 549
- 550
- 551
- 552
- 553
- 554
- 555
- 556
- 557
- 558
- 559
- 560
- 561
- 562
- 563
- 564
- 565
- 566
- 567
- 568
- 569
- 570
- 571
- 572
- 573
- 574
- 575
- 576
- 577
- 578
- 579
- 580
- 581
- 582
- 583
- 584
- 585
- 586
- 587
- 588
- 589
- 590
- 591
- 592
- 593
- 594
- 595
- 596
- 597
- 598
- 599
- 600
- 601
- 602
- 603
- 604
- 605
- 606
- 607
- 608
- 609
- 610
- 611
- 612
- 613
- 614
- 615
- 616
- 617
- 618
- 619
- 620
- 621
- 622
- 623
- 624
- 625
- 626
- 627
- 628
- 629
- 630
- 631
- 632
- 1 - 50
- 51 - 100
- 101 - 150
- 151 - 200
- 201 - 250
- 251 - 300
- 301 - 350
- 351 - 400
- 401 - 450
- 451 - 500
- 501 - 550
- 551 - 600
- 601 - 632
Pages: