د .نضال خضير العبادي /جامعة الكوفة [email protected] . ملاحظة//: يسررتخدم تعريررف الثابررت فرري أي مكرران داخررل جسررم البرنررامج ،وان أي محاولررة لتغيير قيمتة أثناء تنفيذ البرنامج سيؤدي الى صدور رسالة خطأ. 2.23العوامل Operotors عند وجرود المتغيررات والثوابرت ،فبامكانرك القيرام بالعديرد مرن العمليرات عليهرا مستخدما العوامل المناسبة لكل عملية ..منها: 2.23.2عامل التخصي ) = )Assignment عامل التخصيص واجبة اسناد قيمة الى متغير مثل ;A=7 هنا تم أسناد القيمة ( )7الى المتغير ( )Aودائما تسند القيمة في الجانب الأيمرن من عامل التخصيص الى المتغير في الجانب الأيسر من التخصيص. تختلرف C++عرن اللغرات الأخررى بأمكانيرة اسرتخدام علامرة التخصريص فري الجانب الأيمن أو ان تكون جزء من الجانب الأيمن لعملية تخصيص أخرى مثال ; )A = 8 + (b = 4 وهي تكافيء العبارات التالية ;b=4 ;A=8+b كذلك فان التعبير التالي مقبول أيضا ;A=b=c=d=6 2.23.1العمليات الرياضية ARITHMETIC OPERATORS )(+,-,*,/,% 55
C++من البداية إلى البرمجة الكيانية وهري العمليرات المعروفرة لنرا فري الرياضريات ،والتري هري (الجمرع ،الطررا، الضررب ،والقسرمة) ،يضراف لهرا عامرل أخرر وهرو أسرتخراج براقي القسرمة باسرتخدام العلامة ( )%الجدول ( )1.7يبين هذ العمليات: جدول ) :)1.7يبين العمليات الرياضية التي تدعمها لغة C++ الدمَية الريايية الدام Additionالجمع + Subtractionالطرا - Multiplicationالضرب * Divisionالقسمة / Moduloأستخراج باقي القسمة % 2.23.3المساواة المركبة Compound Assignment وهي استخدام المساواة مع عوامل اخرى ) = | َ = & َ = < َ = > َ = ( + = َ - = َ* = َ / = َ % عنرردما نرغررب بتحرروير قيمررة متغيررر بأنجرراز عمليررات رياضررية علررى القيمررة المخزونة حاليا بالموقع الذي يشير له المتغير فاننا يمكن ان نستخدم عوامل المساواة المركبة ،هذ العمليات تستخدم بطريقة مختلفة عرن العمليرات المتعرارف عليهرا حير ان العوامل الموجودة مع المساواة هي جميعا عوامل ثنائية أي تستخدم مع أثنرين مرن المتغيرات أو القيم ،وجميعها تستخدم وفقا للقاعد التالية: حيرر يسررتخدم العامررل علررى الجانررب الأيسررر مررن المسرراواة لأجررراء العمليررة الرياضية أو المنطقيرة برين المتغيرر فري الجانرب الأيسرر مرن المسراواة مرع المتغيرر أو القيمة على الجانب الأيمن من المساواة ،وتسند النتيجة الى المتغير الذي فري الجانرب الأيسر من المساواة .مثال يوضح ذلك في الجدول (:)1.8 56
د .نضال خضير العبادي /جامعة الكوفة [email protected] . جدول ( :)2.8أمثله توضح استخدام المساواة المركبة التدبير المِافيء له ;value += increase ;value = value + increase ;a - = 5 ;a = a - 5 ;a /= b ;a = a / b ;price *= units + 1 ;)price = price * (units + 1 ملاحظة//: لايجوز ان يكون في الطرف الايسر مرن ( المسراواة) تعبيرر وأنمرا يكرون متغيرر ومتغير واحد فقط. 2.21.4الفاولة ( ),كأداة The comma (,) operator وهي أداة ثنائية ( )binaryوتحترل الاسربقية الأخيررة فري سرلم أسربقيات الأدوات المختلفة ،وتأخذ الصيغة العامة: Expression1 ، Expression2 وتسرتخدم لفصرل تعبيررين علرى يمرين المسراواة ،فعنرد اسرتخدام فاصرلة لتفصرل بين تعبيرين ،فأن تسلسل العمليات يأخذ الترتيب التالي: .1تستخرج قيمة التعبير الأول ال ي علوى يسوار الفاوولة (الفوارزة) ثو تسوند للتعبيور الثاني على يمين الفاولة (الفارزة). .2تسوتخرج قيموة التعبيور الثواني الو ي علوى يموين الفاوولة (الفوارزة) كقيموة نهائيوة لكامل التعبير. مثال: ; )A = (b = 2 ، b+1 فري هرذا المثرال سريعمل المتررجم علرى يمرين المسراواة كمرا هرو متعرارف ،اذ سيسرند القيمرة ( )2الرى المتغيرر (( )bيبردأ أولا برالتعبير الرذي علرى يسرار الفاصرلة)، 57
C++من البداية إلى البرمجة الكيانية المرحلة الثانية ,العمل على التعبير الذي موجود علرى يمرين الفاصرلة فري هرذ الحالرة فأن قيمة ( )bهري ( )2ومنهرا يسرتخرج القيمرة النهائيره للتعبيرر ( )b+1لتكرون النتيجرة هي ( )3وهي تمثل نتيجرة التعبيررين علرى يمرين المسراواة والتري ستسرند الرى المتغيرر ( )Aعلى يسار المساواة. 2.23.5عوامل المساواة والعلائك Relation And Equality Opetotors وتستخدم هرذ العوامرل لأغررا المقارنرة ،وهري (==َ =!َ >َ <َ =>َ =<) والجدول ( )1.9يوضح استخدام هذ العوامل. جدول ( :)2.9عوامل المساواة والمقارنة المستخدمة في لغة C++ استطدامة الدام تساوي = = لا تساوي =! أكبر من > أصغر من < أكبر من أو تساوي => أصغر من أو تساوي =< لغررر المقارنررة بررين تعبيرررين فانررك يمكنررك ان تسررتخدم عوامررل العلاقررات والمساواة .نتيجرة عمليرة المقارنرة هري قيمرة منطقيرة ( )Booleanاي (صرح او خطرأ) وفقا للنتيجة .مثال )(7 = = 5 النتيجة خطأ // )(5 > 4 النتيجة صح // )(3 != 2 النتيجة صح // )(6 > = 6 النتيجة صح // )(5 < 5 النتيجة خطأ // 58
د .نضال خضير العبادي /جامعة الكوفة [email protected] . بالطبع بدلا من اسرتعمال قيمرة رقميرة ثابترة واحردة فانرك بامكانرك اسرتعمال اي تعبير مقبول يتضمن متغيرات ،كمثال نفر ان )(a = 2 ،b = 3 ،and c = 6 ولنلاحظ العلاقات التالية )(a = = 5 // النتيجة خطأ لان ) ( aلاتساوي ()5 النتيجة صح حي ان )(2*3 >= 6 (a*b >= c) // النتيجة خطأ حي ان ) (3+4 > 2*6هي خطأ النتيجة صحيحة (b+4 > a*c) // ((b=2) = = a) // عند كتابة تعبير معقد يحتروي علرى عردد مرن العمليرات ربمرا يحردث لنرا بعرض الغمو عن كيفية أجراء العمليات الرياضية بمعنى أي من المعاملات يحسرب أولا وأيهما لاحقا مثال: a=5+7%2 ربمرا يكرون هنرا غمرو فهرل هرذا التعبيرر يعنري التعبيرر اللاحرق الاول ام التعبير اللاحق الثاني مع نتيجة قدرها ( )6او a = 5 + (7 % 2) // مع نتيجة قدرها صفر a = (5 + 7) % 2 // النتيجرة الصرحيحة هري التعبيرر الاول مرع نتيجرة قردرها ( ،)6وذلرك لأعتمادنرا على ترتيب لأسربقيات حسراب العوامرل (جردول 1.11يبرين الاسربقيات) وهري ليسرت للعوامل الحسابية فقط وأنما لكل العوامل التي تمهر في .C++ 2.24التعبير Expression أي ترتيب من المتغيرات والعوامرل الرياضرية والرذي فري النهايرة يمثرل عمليرة حسرابية يسرمى تدبيارَ والتعبيرر عبرارة عرن أشرترا عناصرر البيانرات مرع العوامرل الحسرابية وهرذ العناصرر ممكرن ان تكرون ثوابرت ،متغيررات ،تعرابير ،وعنرد أجرراء 59
C++من البداية إلى البرمجة الكيانية العمليرة الحسرابية فران النتيجرة تكرون قيمرة واحردة ..ومرن الممكرن ان يكرون جرزء مرن التعبير تعبير أيضا ..مثل ( a+20) * b/3 هذا كله يسمى تعبيرر واجرزاء مثرل ( )a+ 20و ( )b/3كرل منهرا يسرمى تعبيرر أيضا. وتسرتخدم مرع التعبيرر عرادة عبرارة الأسرناد ( )assignment statementوهري علامرة او عبرارة تسرتخدم لأسرناد قيمررة الرى متغيرر وتسرتخدم علامرة المسرراواة (=) لتحقيرق هرذا الغرر ..وبالتأكيرد فران العمليرة سرتتم باسرناد القيمرة المستحصرلة مرن الطرف الأيمن من المساواة الى المتغير الموجود في الطرف الأيسر من المساواة. بالأمكان كتابة تعبير معين يحتروي علرى متغيررات مرن أنرواع بيانرات مختلفرة، مثلا تعبير يحتوي على متغيرات من نوع بيانات صرحيحة وبيانرات مرن نروع بيانرات حقيقيرة ..فري هرذ الحالرة فران عمليرة تحويرل أليرة داخرل الحاسروب سرتتم دون تردخل المستخدم حير سريتم تحويرل المتغيررات ذات النروع الاقرل اسربقية الرى النروع الاكثرر اسبقية ،الجدول ( )1.11يبين أسبقيات العوامل: 61
د .نضال خضير العبادي /جامعة الكوفة [email protected] . جدول ( :)2.21يبين اسبقيات العوامل قواعــــــــــد الأسبـــــقيات The Unary Operators !+ ،- ،++ ،-- ، الاسبقية العليا (تنفذ اولا) العوامل الاحادية الاسبقية الدنيا The Binary Arithmetic Operations * ،/ ،% (تنفذ اخيرا) العوامل الرياضية الثنائية The Binary Arithmetic operations + ،- العوامل الرياضية الثنائية The Boolean operations =>< ،> ،<= ، العوامل المنطقية The Boolean operations =!== ، العوامل المنطقية The Boolean Operations && العوامل المنطقية The Boolean Operations || العوامل المنطقية 2.25توليد الأرقام العشوائي Random Numbers Generation تحتراج بعرض التطبيقرات الرى اسرتخدام أرقرام عشروائية ،وهرذا ممكرن فري لغرة البرمجرة C++وذلرك مرن خرلال اسرتخدام الأمرر ( )Randomالرذي يعمرل علرى توليرد رقم بشكل عشوائي ،وهو يعمل وفقا لما يأتي: * يسووتخدم الأموور ) )randomلتوليوود أرقووام عشوووائية موون نوووع الأعووداد الصووحيحة تتوراو قيمتهوا بوين الصوفر والواحود .والامور ( )randomهوو مواكرو معورف فوي (.)stdlib : randomizeوهي تستخدم لتوليد أساس للأرقام العشوائية التي ستعتمد على الوقت ; randomize ; x = random 61
C++من البداية إلى البرمجة الكيانية هنا المتغير ( )xتكون قيمتة ( )0 <= x < 1وفي كرل مررة يرتم تنفيرذ هرذا الأمرر سنحصل على قيمة جديدة ضمن نفب المدى. * الطريقة الثانية :هي باستعمال الأمر ( ,)Randomizeثم الأمرر ()Random علرى أن يحتروي الأمرر ( )Randomعلرى المردى المطلروب لأيجراد الررقم العشروائي ضرمنه (أي أنره سريولد أعرداد صرحيحة موجبرة عشروائيا تترراوا قيمتهرا برين الصرفر والعدد المحدد بين القوسين بعد ( )Randomناقص واحد والذي يمثل الحد الأعلرى)، مثال: ; Randomize ; )x = random (100 هنرا تكرون قيمرة المتغيرر ( )0<= x < 100( )xوفري كرل مررة يعراد تنفيرذ هرذا الأمرر ستحصررل علرى قيمررة جديردة .أن المرردى المحردد يمكررن تغيرر حسررب طبيعررة التطبيق المراد تنفيذة. * الطريقررررة الثالثررررة :لاسررررتخدام الأمررررر ( )Randomهرررري برررردون اسررررتخدام الأمررررر ( )Randomizeوبدلا منه استخدم المتغير ( )Randseedقبل الأمرر ( )Randomعلرى أن يرررتم أسرررناد قيمرررة للمتغيرررر ( .) Randseedمرررن المفررررو ان يرررتم تغييرررر قيمرررة ( )Randseedعند كل تنفيذ لكي نحصل على عشوائية .مثال ; randseed = 1200 ; x = random OR ; randseed = 3425 ; )x = random (1000 في الحالة الأولى فأن المتغير ( )randseedأسند لره قيمرة وهري ( )1211ووفقرا لها سيولد أرقام عشوائية حقيقية قيمتها أقل من واحد ولو أعدنا التنفيذ مع أسناد قيمرة 62
د .نضال خضير العبادي /جامعة الكوفة [email protected] . مختلفرررة للمتغيرررر ( )randseedفرررأن أرقرررام عشررروائية مختلفرررة سرررتولد (حررراول تنفيرررذ الطريقتين ولاحظ الفرق). أما المثال الثاني فأنه سيولد أرقام عشوائية صحيحة أكبر من الصرفر وأصرغر من (.)1111 2.26التعليقات Comments تعرررد التعليقرررات مرررن الأمرررور المهمرررة فررري البرنرررامج ،واغلرررب المبررررمجين لايسرتعملونها بشركل كراف .عليرك ان تردر ان لريب كرل النراس بدرجرة الرذكاء التري يتمترع بهرا المبررمج ..فضرلا عرن أنرك تحتراج أحيانرا الرى شررا وتوضريح أكثرر لبيران الفكرررة او الغايررة مررن كتابررة عبررارة او أيعرراز معررين او واجررب هررذ العبررارة ضررمن البرنرامج .كرذلك ،فران المبررمج ربمرا لايترذكر بعرد مضري شرهر او أكثرر التفاصريل الكافيرة وراء كتابرة عبرارة او أيعراز معرين ضرمن البرنرامج ..لرذلك تسرتخدم التعليقرات التري تكترب علرى البرنرامج وفقرا لقاعردة كتابتهرا التري سرناتي عليهرا لتشررا لمرن يقررأ البرنامج ماذا نحن عاملون .ولما كانت التعليقات تكترب أمرام عبرارات البرنرامج لرذلك يفضل ان تعطي الصورة العامرة ولريب التفاصريل الدقيقرة جردا والتري تكفري لتوضريح الفكرة .وبشكل عام فان التعليقرات لاتعرد جرزء مرن البرنرامج وسريهملها المتررجم عنرد ترجمة البرنامج. التعليقرات نوعران ..الأول يبردأ بخطرين متروازين ( )//وهنرا المتررجم سريعتبر مابعد الخطين تعليق ليب له علاقة بالبرنرامج ويبردأ التعليرق مرن الخطرين المتروازيين وينتهي بنهاية السطر.مثال تعليق قصير int x ; // أما النوع الثاني فهي التعليقات التي من الممكن أن تكون على عدة أسطر فيتم تحديررد نررص التعليررق بواسررطة ( */و * ) /وهرري مفيرردة مررع التعليقررات الطويلررة ،اذ يستعمل الرمز (* )/لبداية التعليق والرمز ( )*/للدلالة على نهاية التعليق.مثال هذا هو تعليق على عبارات البرنامج *int x ; / وهو تعليق طويل يراد منه توضيح أسباب استعمال نوع البيانات 63
C++من البداية إلى البرمجة الكيانية لذلك أضطررنا الى استعمال عدة سطور من التعليق ...ال */ يجب أن تلاحظ مايلي عند كتابة تعليق: .1عدم تر فرا بين الشرطة ( )/والنجمه (*) من كل جهات جملة التعليق. .2يقروم متررجم C++بأهمرال النصروص المسرتعملة فري جملرة التعليرق (أي لا ينفذها). .3من الممكن وضع جملة التعليق فري أي مكران مرن البرنرامج ،مرا عردا وسرط الأسرررم التعريفررري ( )identifierأو الكلمرررة المحجررروزة ( .)keywordفمرررثلا الأمثلة أدنا غير مقبولة: ' * whi /* name = ' saad ' */ le c = ' Ahmed ; * Sum = /* xxx */ 0 .4لا ينصرح بوضرع تعليرق داخرل تعليرق أخرر ،لأن ذلرك قرد يتسربب بحردوث أخطاء ،مثال /* Program /* written by Saad */ card game */ هنررا المترررجم سرريعتبر الجملرره التعليقيررة تنتهرري عنررد ( ،)Saadوالبرراقي سيعتبر خطأ. .5يهمل المترجم السطر أو بقية السطر الذي يبدأ بخطين مائلين (.)// 2.27عامل الزيادة Increment Operator تستعمل في بعض التطبيقات عدادات لأغرا محددة وهي عرادة تبردأ برالرقم ( )1أو أي رقم أخرر وترزداد بمقردار واحرد (او اكثرر) فري كرل مررة وتكترب عرادة كمرا ياتي: ; count = count + 1 ونمرا لأن هذا العامل واسع الاستعمال لذا فأن لغرة C++وفررت عامرل مفررد (ل ختصررار) لهررذا الغررر وهررو ( )++لأغرررا الزيررادة بمقرردار واحررد أو ()- - 64
د .نضال خضير العبادي /جامعة الكوفة [email protected] . لأغرا النقصران بمقردار واحرد حير يسرتخدم هرذا العامرل بطرريقتين أمرا أن يسربق المتغير مثل ( )++mاو أن يلي المتغير مثل ( )m++وهما ليسا متشابهين فكل منهمرا له معنى خاص فعنردما يسربق المتغيرر عامرل الزيرادة فران المتغيرر ترزاد قيمترة بمقردار واحد ثم يستخدم أما أذا جراء عامرل الزيرادة بعرد المتغيرر فران المتغيرر يسرتخدم حسرب قيمتة الحالية وبعدها يزاد بمقدار واحد .أما العامل ( )- -فتعمل بالطريقة نفسرها التري يستخدم فيهرا عامرل الزيرادة أي قبرل وبعرد المتغيرر مرع الأخرتلاف ان اسرتخدامها يقلرل قيمة المتغير بمقدار واحد ،مثال أذا فرضرنا ان المتغيرر ( )b = 7والمتغيرر ( )a = 2فران قيمرة ( )Cفري التعبيرر التالي: ; C = a * ++b يعو تكرون قيمتهرا ( ،)16حير ان المتررجم سريقوم بزيرادة قيمرة ( )bلتكرون ( )8ثرم عنها في التعبير ويحسب نتيجة التعبير ،أما قيمتها في التعبير التالي: ; C = a* b++ فتكون ( ،)14حي ان المترجم سيستخدم القيمة الحقيقية للمتغير ( )bثرم يقروم بحساب نتيجة التعبير وبعد ذلك تتم زيادة قيمة المتغير ( )bلتكون ()8 ; C = a* --b هنرا قيمرة ( )Cتكرون ( )12حير سريقوم المتررجم بأنقراص قيمرة ( )bبواحرد لتكون قيمتة ( )6ثم تعو قيمتة في التعبير لايجاد قيمة ()C أما قيمتها بالتعبير التالي: ; C = a* b-- تكون ( )14حي ستستخدم قيمة ) (bالحقيقية ( )7لأيجاد قيمة ( )Cبعدها تقلرل قيمة ( )bلتكون قيتها (.)6 65
C++من البداية إلى البرمجة الكيانية 2.28بعض المحددات الخاوة هذ المحددات ستكون اكثر وضوحا في الفصول الاخرى وسريتم شررحها بالتفصريل, هنا فقط يتم الاشارة لها. 2.28.2المحدد (متطايرة) volatile بعكب المحدد ( )constالذي يرؤدي الرى جعرل قيمرة المتغيرر ثابترة فرأن المحردد ( )volatileيؤدي الى جعل قيمة المتغير تتغير كلمرا تطلرب الأمرر ذلرك بردون سريطرة المترجم أو توجيه تحذير الى المبرمج ،وهذا المحدد مفيد في العمليات المتعددة التري تأخذ معلوماتها من الذاكرة .وبعبارة أخرى يحتاج المبرمج الى اسرتخدام ()volatile عندما يتعامل البرنامج مع البرامج الفرعية ذات العلاقة المباشررة بالمكونرات الماديرة للحاسوب ..مثال ; volatile print_register ; volatile port ; ]volatile A[10 2.28.1المحدد (المسجل) register يسرتعمل هرذا المحردد لأعرلام المتررجم أن يحفرظ قريم المتغيررات فري مسرجلات ( )registersوحرردة المعالجررة المركزيررة ( )CPUمباشرررة ،ولرريب فرري الررذاكرة حيرر تخزن عادة قيم المتغيرات .وهذا يعني أن العمليات التي تجرري علرى هرذا النروع مرن المتغيررات تكرون أسررع مرن العمليرات التري تجرري علرى المتغيررات المخزنرة فري الررذاكرة .وممررا تجرردر الاشررارة لرره أن المحرردد ( )registerيتعامررل مررع نرروعين مررن المتغيررات همررا الأعررداد الصررحيحة والرمروز ( )charactersكمررا أنرره يسررتعمل فرري حالات المتغير الموضعي أو متغير الدالة اللذان يعتبران من نروع المتغيررات الذاتيرة ( ،)Autoولذا فأن ( )registerلا تستعمل للمتغير العام ،وتستخدم هذ المتغيرات فري برامج التكرار ( ،)Loopsمثال 66
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ; register int i (for (i = 0 ; i < last ; ++ i أن عدد المتغيرات مرن هرذا النروع يعتمرد علرى نروع المعرالج المسرتعمل وعلرى تطبيقررات C++فمررثلا فرري الأنممرره ذات ( )bit8يسررتخدم متغيررر واحررد وفرري نمررام ( ) bits16يستخدم متغيران. وكمبرمج بلغة C++يمكنك استخدام أي عدد من هذ المتغيرات لأن المتررجم سيسرجل الفرائض مرن هرذ المتغيررات كمتغيررات عاديرة ولريب متغيررات ()register بشكل تلقائي. وينصرح باسرتخدام متغيررات ( )registerفري التطبيقرات التري تسرتخدم حلقرات التكرار ( )Loopsعادة. 2.29الأدوات الدقيقة Bitwise Operators تتميرز لغرة C++عرن سرائر لغرات البرمجرة الراقيرة باسرتخدامها أدوات دقيقرة تعمل على مستوى وحدة التخزين الاولية ( ،)bitوسميت هرذ الأدوات بالدقيقرة لأنهرا تتعامل مع البت بشكل مباشر ،فحصا ،ضربطا ،وازاحرة .وتسرتعمل هرذ الأدوات مرع البيانات الصحيحة ( )intوالرمزية ) (charفقط .ولا تستعمل مع غيرهرا مرن البيانرات والجدول ( )1.11يوضح الأدوات الدقيقة وعملها: جدول ( :)2.22الأدوات الدقيقة واستخدماتها الدوام الدقيقة الدمَيا استطدامها (عمَها) & الريايية | المِافئة تقوم بعملية (و) بين البتات AND Bitwise AND تقوم بعملية (أو) بين OR البتات Bitwise Inclusive OR ^ XOR تقوم بعمل ( )xorبين البتات 67
C++من البداية إلى البرمجة الكيانية ~ NOT Bitwise Exclusive Or << SHL >> SHR عكب قيمة البت bit inversion أزاحة البتات لليسارShift Left أزاحة البتات لليمينShift Right .1النفي يحول كل وفر الى واحد وكل واحد الى وفر. .2أدوات الازاحة أستعمالها يؤدي الى أزاحة قيمة المتغير الصحي (الممثل بالنظام الثنائي) يمينا أو شمالا عدد من الخانات (البتات) وحسب الطلب ،وتمولأ الخانوات المفرغوة أووفارا أو واحودات حسوب أشوارة العودد (فالعودد الموجوب عنود أزاحتوة تملأ فراغاتوة أووفار ،بينموا العودد السوالب تمولأ فراغاتوة واحودات عنود أزاحتوة)، مثال.. أذا أردنا أزاحة المتغير ( )Xالى اليمين خانتين فيكتب كمايأتي: ;X >> 2 جدول ( :)2.21جدول يبين أسبقيات العمليات الدقيقة أسبقيات الأدوات الدقيقة ~1 >><< ، 2 3 & 4 ^ 5 | ملاحظة//: للتأكد من سلامة نتائج عمليات الأزاحة فمن الممكن استخدام القاعدة التالية: كل ازاحة الى اليمين بمقدار بت واحد ينتج عنها قسمة القيمة المزاحة على ( )2 (أي لكل بت ازاحة نقسم العدد على )2 68
د .نضال خضير العبادي /جامعة الكوفة [email protected] . كل ازاحة الى اليسار بمقدار برت واحرد ينرتج عنهرا ضررب القيمرة المزاحرة برالرقم ( ( )2أي لكل بت أزاحة نضرب العدد في )2 2.11تحويل نوع البيانات Type Conversions عند استخدام أكثر من نوع من البيانات في تعبيرر معرين ،فأنره مرن الممكرن أن نحول نوع متغير معين ضرمن التعبيرر الرى نروع أخرر ،وذلرك برأجراء التحويرل علرى المتغير الموجود الرى يمرين المسراواة ،ليصربح نوعرة حسرب نروع المتغيرر فري جانبهرا الأيسر .مثال ; int a,b ;char name ; float x ; name = a ; b = x ; x = name ; x = a نلاحظ أن هرذ الأشركال مرن التحرولات برين أنرواع البيانرات غيرر موجرودة فري العديد من اللغات الأخررى ،وذلرك لأن C++صرممت أصرلا لتكرون لغرة وسريطة برين اللغات العليا ولغة التجميع (.)Assembly * تغيير نوع المتغير: ان تغيير نوع المتغير هو اسم معقد لمفهوم بسيط .فعند تغيير نوع المتغير من نوع الى اخر ،فان كل الذي تعملة هو اخبار الحاسوب باستعمال نوع مختلف لخرزن المتغير .اذن لماذا نحتاج الى عمل ذلك؟ دعنا نقول بانك اعلنت عن متغيرر مرن نروع ،shortفي اغلب الاحيان ان هذا يعني ان اكبر قيمرة موجبرة مرن الممكرن ان تخزنهرا ستكون ،32,767ولكن في مكان ما في البرنامج ،ادركت انك سرتقوم بعمليرة حسراب ستؤدي الى زيادة القيمة فوق هذ القيمة العممى .فمثلا لحساب طول ( cوتر المثل القرائم الزاويرة) ،فانرك تحتراج الرى حسراب الجرذر التربيعري لمربرع الملعرين الاخررين ،a2 + b2ولكن ماذا يحدث لو كانت قيم كل من b ،aكبيرة جدا ،عليه سيكون التربيرع 69
C++من البداية إلى البرمجة الكيانية كبيرا جدا ،فاذا اصبحت القيمة اكبر من 32,767فان قيمتك سرتكون لريب كمرا تتوقرع (اذا استخدمت النوع shortلخزن الناتج) ستكون قيمة الناتج غير صحيحة. عليه فان الحرل هرو تغييرر النروع ،فبامكانرك ان تغيرر النروع للارقرام الرى نروع بيانات اكبر ،مثل ( )long ,intلاغرا الحساب ..وبعدها من الممكرن اعادتهرا ثانيرة الرى shortعنرد الانتهراء ،اذ ان القيمرة النهائيرة للمتغيرر cربمرا سرتكون صرغيرة بمرا يكفي ان تخزنها بالنوع .shortفي الحقيقة هذا مثرال بسريط ويمكرن حرل المشركلة بران تخرزن المتغيرر مرن البدايرة برالنوع ، intمثرال اكثرر فائردة يحردث اذا كران لرديك رقرم والذي يمثل معدلا مثلا ,فانك ربما ترغب ان تمثرل الررقم برالنوع floatلتكرون القيمرة اكثر دقة عند حسابها .ويمكن تغيير النوع ليكون .int كيف يتم تغيير النوع: عملية تغيير النوع في C++عمليرة سرهلة .لنقرل لرديك المتغيرر ( )averageمرن النوع floatلخزن رقم مثل الرقم ( )1.314188526وترغب ان يكون لديك خزن من نوع intلخزن جزء العدد الصحيح من الرقم اعلا .ادنا كيف تعمل ذلك: ; int CastAverage = (int) average لاحرظ هنرا اننرا اعلنرا عرن متغيرر ( )CastAverageمرن النروع intلنضرع فيره القيمة بعرد تغييرر النروع وهنرا اننرا غيرنرا النروع وذلرك بوضرع النروع الرذي نرغرب ان نغير نوع المتغير اليه نضعة بين قوسين قبل اسم المتغير. ملاحظة //: عنرد التحويررل مررن البيانررات الطويلررة الررى أخرررى أقصررر فررأن عرردد مررن الخانررات ( البتات) ستفقد. 71
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ملاحظة//: أن التحويل بين نوع وأخر من أنواع البيانات ،يتم بصورة تلقائية ( أوتوماتيكيرة) داخل التعبير الواحرد ،اذ يقروم متررجم C++بتحويرل جميرع المتغيررات الرى النروع ذي الطول الأكبر ،فيتحول الصحيح الرى حقيقري ويتحرول الحقيقري الرى مضراعف وهكذا. 2.11.2عام تحوي النوع الطا جي Explicit Type Casting Operator عامل تحويل النروع يسرمح لرك بتحويرل نروع معرين الرى نروع أخرر .هنرا عردة طرق لعمرل ذلرك فري ،C++أبسرط طريقرة والتري ورثرت مرن لغرة Cهرو برأن تسربق التعبير المراد تحويلها بالنوع الجديد محاط بقوسين ( ()): ;int i ;float f = 3.14 ;i = (int) f المثال السابق يحول العدد الحقيقي ( )3.14الى عدد صحيح ( ،)3طبعرا البراقي (الكسر) سيفقد .هنا معامل التحويل هرو ( .)intطريقرة أخررى لعمرل نفرب الشريء فري C++وذلك باستخدام النوع الذي سبق التعبيرر المرراد تحويلرة برالنوع الجديرد وتحديرد التعبير بأقواس ;)i = int (f كلا الطريقتين مقبول في C++ 2.12حجم البيانا ()sizeof هرذا العامرل يقبرل وسريط واحرد والرذي ممكرن ان يكرون نوعرا او المتغيرر نفسرة ويعيد قيمة تمثل حجم النوع او الكيان بالبايت: ;)a = sizeof (char في المثال اعلا فران قيمرة ( )aسرتكون ( )1وذلرك لان النروع ( )charهرو نروع بطرول بايرت واحرد .القيمرة المعرادة بواسرطة ( )sizeofثابترة ،لرذلك دائمرا تحسرب قبرل 71
C++من البداية إلى البرمجة الكيانية تنفيذ البرنامج. 2.11الأخطاء التي ترافك البرامج Errors هنرا أربرع أنرواع مرن الأخطراء التري تحردث فري الحاسروب عنرد تنفيرذ برنرامج وهي: .2أخطاء المترجم Compiler errors تحدث هذ الأخطاء أثناء محاولة المترجم ترجمرة البرنرامج ،وهري ناتجرة عرن خطأ قواعدي فري كتابرة البرنرامج ،مثرل عردم وضرع فرارزة منقوطرة فري نهايرة عبرارة كاملة. .1أخطاء الربط Linker errors ان أغلب الأخطاء من هذا النوع تحدث عنردما لايرتمكن الررابط ( )Linkerمرن أيجاد الدوال أو عناصر البرنامج الأخرى والتي يشار اليها في البرنامج. .3أخطاء وقت التنفيذ Run-time errors فري بعرض الأحيران لايرتم الكشرف عرن الخطرأ الا أثنراء تنفيرذ البرنرامج ،مثرال القسمة على صفر. .4أخطاء مرئية Conceptual errors هذ أخطاء يقع بها المبرمج نتيجة لخطأ في الطباعة أو السهو وهري صرحيحة للمترجم ولكنها تعطي نتائج خاطئة. 2.13موجهوات التضومين وفضواء الاسوماء Include Directives and Namespaces جميع برامجك تبدأ بالسطرين التاليين >#include<iostream ;using namespace std 72
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ولمناقشرة وظيفرة هرذين السرطرين سرنبدأ بالسرطر الاول والرذي هرو يتضرمن جزئين ،الجزء الاول هو ( )#includeوهذا يعني ان المطلوب هو تضرمين برنامجرك بالملف الموضح اسمة لاحقا ،وهذ مرن الممكرن ان تكرون اكثرر مرن ملرف واحرد (اي اكثر من )#includeكل واحد منها له وظيفة اضرافة ملرف معرين تحتراج لره فري تنفيرذ برنامجك وهذ الملفات موجودة ضرمن المكتبرة القياسرية للغرة ،امرا الجرزء الثراني مرن السطر الاول والذي سنطلق عليه تسمية الموجة او الملفات الرأسرية (السرطر الاول) فانره يحتروي علرى اسرم الملرف المطلروب اضرافتة الرى البرنرامج ويكرون محرددا برين العلامتين (> <) كما سبق وان اوضحنا ،الملف الموضرح فري هرذا السرطر هرو باسرم ( )iostreamوهذا الملف هو المسؤول عرن تروفير وتفعيرل اوامرر الادخرال والاخرراج ونمرا الى انك في كل برنامج تكتبة لابد مرن الاحتيراج الرى عمليرة ادخرال او اخرراج او كليهما لرذلك فرلا برد مرن ان تكرون مكتبرة iostreamمتروفرة ،هرذ المكتبرة تتضرمن تعريرف ( cout / ،cinوهري اوامرر الادخرال والاخرراج وسريتم شررحها فري الفصرل القادم) ،فضلا عن امور اخرى .هنا ملفات اخرى كثيرة ربمرا تحتراج لهرا فري تنفيرذ برنامجك ولكل منها واجب محدد (لمزيرد مرن المعلومرات يمكنرك الاطرلاع علرى هرذ الملفات في الملاحق). السطر الثاني يتضمن التعبير;using namespace std C++تقسم الاسماء الى فضاءات اسماء ،وفضاء الاسماء هو تجمرع للاسرماء، مثرل الاسرماء ( .)cout ،cinالعبرارة التري تحردد فضراء الاسرماء بالطريقرة الموضرحة ادناة تدعى الموجة .using ;using namespace std هذا الموجرة الخراص ( )usingيفيرد ان برنامجرك يسرتخدم او يفرر اسرتخدام فضراء الاسرماء القياسرية ( ،)stdهرذا يعنري بران الاسرماء التري تسرتخدمها سريكون لهرا المعاني المحددة لها فري فضراء الاسرماء القياسرية .فري هرذ الحالرة ،الشريء المهرم هرو عنردما تكرون الاسرماء مثرل cout ،cinمعرفرة فري ،iostreamتعريفهرا يفيرد انتمراءهم 73
C++من البداية إلى البرمجة الكيانية الى فضاء الاسماء القياسية .لذا ولاجل استخدام الاسماء مثل cout ،cinفانرك تحتراج الى اخبار المترجم بانك تستخدم فضاء الاسماء القياسية. هررذا كررل ماتحترراج الررى معرفتررة الان حررول فضرراء الاسررماء ،ولكررن توضرريح مختصر سوف يحل اللغرز الرذي يحريط اسرتخدام فضراء الاسرماء .السربب ان C++لره فضاء اسماء بشكل مطلرق وذلرك بسربب وجرود اشرياء كثيررة يجرب تسرميتها .كنتيجرة، احيانا يستلم عنصران او اكثر نفب الاسم ،بمعنى اسم مفرد وممكن ان يحصل علرى تعرريفين مختلفرين .ولازالرة هرذا الغمرو C++ ،يقسرم العناصرر الرى مجراميع ،لرذا لايوجد عنصران في نفب التجمع (نفب فضاء الاسماء) لهما نفب الاسم. لاحظ ان فضاء الاسماء هو ليب تجميع بسيط للاسماء .هو جسم لشرفرة C++ والتي تحدد المعنى لربعض الاسرماء ،مثرل بعرض التعريفرات و/او الاعلانرات .وظيفرة فضاء الاسماء هو تقسيم جميرع مواصرفات اسرماء C++الرى تجمعرات (تردعى فضراء الاسماء) اذ ان كل اسم في فضاء الاسماء يملك فقط مواصفة واحدة (تعريف واحرد) في فضاء الاسماء. فضاء الاسماء يقسم الاسماء ولكن ياخذ الكثير من شفرة C++مع الاسماء. مراذا لرو اردت ان تسرتخدم عنصررين فري فضرائي اسرماء مختلفرين ،اذ ان كرلا العنصرين له نفب الاسم؟ من الممكن ان تقوم بذلك وهي ليست معقدة ،وهذا سنشير اليه لاحقا في هذا الكتاب. ملاحظة//: بعض نس C++تستخدم الترالي ،والرذي هرو نسرخة قديمرة او شركل قرديم للموجرة ( includeدون استخدام فضاء الاسماء): >#include<iostream.h فاذا كانت برامجك لاتترجم او لاتنفذ مع العبارات التالية >#include<iostream ;using namespace std 74
د .نضال خضير العبادي /جامعة الكوفة [email protected] . عليك ان تحاول استخدام السطر التالي بدلا من السطرين السابقين >#include<iostream.h فاذا طلرب برنامجرك iostream.hبردلا مرن ،iostreamعليره فران ذلرك يعنري انرك تملك نسخة قديمة من مترجم C++وعليك ان تحصل على نسخة حديثة. جدول ( )2.23بعض الدوال المهمة الدالة التسلسل وظيفتها دالة أيقاف البرنامج (تنهي تنفيذ البرنامج فورا) ) (abort 1 دالة القيمة المطلقة الصحيحة )(abs 2 دالة أيجاد أكبر عدد صحيح للقيمة ( )xمثال )(ceil 3 ) Ceil (8.7هــــــو 9 )(clrscr 4 دالة تنميف الشاشه )(exit 5 دالة الخروج من البرنامج دالة أيجاد أصغر عدد صحيح للقيمة (( )xتستعمل )(floor 6 لأيجاد أصغر عدد صحيح للقيمة الحسابية حسب التعريف الرياضي المعروف ] ( [ xأذا كانت ()x )(log 7 سالبه يحذف كسرها وتنقص واحد) دالة اللوغاريتم الطبيعي (تحسب اللوغاريتم الطبيعي )(log10 8 () )lin (xويجب أن تكون قيمة ( )xأكبر من الصفر. دالة اللوغاريتم العشري (تحسب اللوغاريتم ل ساس 11 )(pow 9 (( )log10(xويجب أن تكون ( )xأكبر من الصفر )(sqrt تحسب هذ الداله قيمة المقدار ( )xyوكمايلي 11 ; )Z = pow (x ،y دالة أيجاد الجذر التربيعي لعدد موجب ( ،)xمثال ;)Y = sqrt (x 75
من البداية إلى البرمجة الكيانيةC++ :اسئلة للحل : اي من التعابير التالية هو متغير مقبول.1 int n = - 10 ; int x = 2.9 ; int 2k ; float y = y * 2 ; char c = 123 ; char h = “c” + 23 ; int !b ; float c ; : اي من العبارات ادنا يمثل معرف مقبول.2 Seven_11 _unique Gross-income Gross$income 2by2 Averag_ weight_of_a_large_pizaa Object.oriented Default @yahoo 76
د .نضال خضير العبادي /جامعة الكوفة [email protected] . الفصل الثاني أوامر الأدخال والأخراج INPUT / OUTPUT INSTRUCTIONS 1.2المقدمة جميع اللغات الطبيعية التري يتعامرل بهرا الأنسران كوسريلة للتخاطرب والتواصرل لها قواعد وضروابط تحردد أليرة اسرتخدامها ،ولمرا كانرت لغرات البرمجرة تصرنف علرى أنها من اللغات العليا (أي اللغات القريبة من لغات البشر) فكران لا برد وأن تكرون لهرا قواعرد تحردد أليرة اسرتخدامها لتكرون واضرحة للمتعامرل معهرا وكرذلك للمتررجم داخرل الحاسروب .عليرة فرأن هرذا الفصرل والفصرول اللاحقرة ستوضرح هرذ القواعرد وسرنبدأ خلال هذا الفصل بمعرفرة كيفيرة تلقريم الحاسروب بالمعلومرات وطررق الحصرول علرى النتائج بعد أنجاز عمليات الحساب. 1.1هيكلية البرنامج Program Construction يتكرون برنرامج لغرة C++مرن (الررأس والجسرم) ( )head and blockوالررأس هرو السرطر الأول فري البرنرامج ويبردأ بكلمرة ( )#includeويتبرع باسرم الملرف الرأسري ( )header fileوالذي يكون محدد بين علامتي الاكبر والاصغر (> <) وكما يأتي: >#include<iostream امرا جسرم البرنرامج فيبردأ بالدالرة ()( )mainثرم يتبرع بالايعرازات والأوامرر التري تمثل الخطوات الواجب أتباعها أو تنفيذها مرن قبرل الحاسروب للحصرول علرى النترائج المطلوبة من البرنامج ،وتكرون هرذ الايعرازات محرددة بأشرارة البدايرة والنهايرة حير تستخدم الأقواس المتوسطة لهذا الغر ( } {). >#include<iostream ) ( main { 77
C++من البداية إلى البرمجة الكيانية ;Set of instructions } 1.3المخرجات والمدخلات Input / Output كل برنامج يجب أن تكون له مخرجرات تبرين النترائج التري ترم الحصرول عليهرا مرن البرنرامج ،هرذ النترائج سريتم عرضرها علرى شاشرة الحاسروب باسرتخدام عبرارة الأخرراج )<< ) coutأن الأمرر (<< )coutمرن الممكرن ان يتررجم علرى انره أكترب ماموجود بعد العلامرة (>>) علرى السرطر الرذي يؤشرر عليره المسريطر ()controller في شاشة التنفيذ. عبرارة الأخرراج لهرا أثنران مرن صرفات C++الجديردة وهري ( )coutو (<<)، حيرر أن المعرررف ( )coutيلفررظ ( )C outوهررو كيرران معرررف مسرربقا يمثررل ترردفق المخرجرات القياسرية فري ،C++هنرا تردفق المخرجرات القياسرية يمثرل طباعتهرا علرى الشاشة ،ومن الممكن أعادة توجية المخرجات الى أجهزة أخرى. أما العامل (<<) ويدعى (( )insertion OR put to operatorعامرل الحشرر أو الوضرع) وواجبرة حشرر أو أرسرال محتويرات المتغيرر الرذي علرى جانبهرا الأيمرن الرى الكيان الذي موجود على جانبها الأيسر. ملاحظة//: ( )bit_wiseيستخدم أيضا العامل ( >>) كعامل تزحيف الى اليسار( يعمل) علرى مستوى البتات ,كما سبق وان اشرنا في الفصل الاول. أن ما يوضع بعد العلامة (>>) سيأخذ حالة من أثنتين: 1.3.2الحالة الأولى ان يكرون مرا بعردها محردد بعلامرات اقتبراس مزدوجرة ( double quotation ) \" \"( )markوبهرذ الحالرة فران مرا موجرود برين علامتري الأقتبراس سريتم طباعترة على الشاشة كما هو دون أدنى تغيير. 78
د .نضال خضير العبادي /جامعة الكوفة [email protected] . برنامج لطباعة عبارة معينة على الشاشة // Example 2.1 >#include <iostream ;using namespace std )(main { ; \"!! cout <<\" Hello World. Prepare to learn C++ } لاحظ مايَي//: اولا/ان مخرجات ه ا البرنامج هي العبوارة التوي تلوي العامول (>>) ،وسوتظهر علوى الشاشة كما يلي: مطرجا البرنامج :1.2 !! Hello World. Prepare to learn C++ ثانيا /عنود تنفيو هو ا البرنوامج سووف لا يمكون ملاحظوة المخرجوات والسوبب هوو أن الحاسوأ سريع جدا بحيوث يعورض ويخفوي شاشوة التنفيو دون أن تلاحو ذلو ، ولغورض رييوة المخرجوات فويمكن بعود ان يوت التنفيو ضوغط الوزرين )(Alt+ F5 معا وعندها ستظهر شاشة التنفي (السووداء) ..ويمكون الخوروج مون شاشوة التنفيو بضغط الزر () Enter ملاحظة//: لغر ايقاف شاشة التنفيذ بعد انتهاء التنفيذ لراية النترائج ،اسرتخدم الامرر الترالي في نهاية البرنامج: ; )\"system ( \"pause مع ملاحمة ان هذا الامر يعمل مع الموجهة >#include<stdlib 79
C++من البداية إلى البرمجة الكيانية وعند استخدامة سوف لاتختفي شاشة التنفيذ بعد انتهاء التنفيذ مع وجرود ملاحمرة تخبر المستخدم بالضغط على اي زر لغر الأستمرار. 1.3.1الحالة الثانية أما أذا كان ما موجود بعد العلامة (>>) ليب محدد بين علامتي أقتباس فعنرد ذلك سيعامل ما موجود بعدها على أنه معرف والمعرفات هنا تكون على واحردة مرن الحالات ادنا : * أما أن تكون مقادير ثابتة (قوي حسوابية) مثول القوي (...78.456 ،-123 ،4567الو ) فهي تطبع مباشرة على الشاشة دون تغيير ،مثلا ; cout << 3456 هنا سيتم طباعة ( )3456على الشاشة. * أو تكووون علوووى شووكل تعبيووور حسوووابي (( )expressionاي مقووادير تفصووول بينهوووا العواموول الرياضووية او المنطقيووة مثوول ( ..* ، - ،+الوو ) وبهوو ه الحالووة فسوويت استخراج قيمة العملية الحسابية او المنطقية و باعتها على الشاشة ،مثال ; cout << 34 + 56 في هذ الحالة سيتم طباعة ( )91على الشاشة. * أو أن تكون علوى شوكل رمووز ،وتعود انو اك متغيورات (والمتغيورات لهوا اسوماء) تؤشور الوى قوي فوي الو اكرة (يجبأ أت تكبوت لهبا قيمبة) (كموا سوبك ان وضوحنا بالفصل الاول فان المتغيرات تشير الى مواقع فوي الو اكرة وهو ه المواقوع تحتووي على قي ) ،ل ا فان الحاسوأ سيطبع قيموة المعورف (المتغيور) علوى شاشوة التنفيو (أي تطبووع القيمووة الموجووودة او المخزونووة فووي موقووع الوو اكرة الوو ي يشووير لووه المتغير). هنرا عليرك أن تلاحرظ أن اسرتخدام أي معررف (متغيرر) داخرل البرنرامج يحتراج الى شرطين: 81
د .نضال خضير العبادي /جامعة الكوفة [email protected] . الأول /أن يوت الأعولان عون المعورف قبول أن يوت اسوتخدامة لأول مورة فوي البرنوامج ويحدد نوعوة وفقوا للأنوواع التوي سوبك أن نوهنوا عنهوا فوي الفصول الاول ،فوأذا كانوت قيموة المتغيور غيور ثابتوة ويمكون ان تتغيور قيمتوة (تتغيور قيمتوة أثنواء تنفيو البرنوامج) فيعلن عنه ويحدد نوعة (ويت ذل بكتابة اس المتغير مسبوقا بنوعة) ،فمثلا أذا كوان المطلوأ استخدام المتغير ( )xوهو من نوع الأعداد الصحيحة ،فيكون بكتابة النوع أولا ثو يتبوع ذلو كتابوة أسو المتغيور( علوى أن يكوون هنواك فوران بوين النووع واسو المتغير) وتنتهي العبارة دائما بفارزة منقو ة ،وكما يأتي: ; int x هرذا المتغيرر هرو مرن نرروع الأعرداد الصرحيحة ( )integerأي أن القيمرة الترري يحملها دائما ستكون عدد صحيح .ويجب ان تلاحظ ان الاعلان عرن المعررف يكرون لمرة واحدة في البرنامج. ثانيا /يجب أن تكون له ا المتغير أو الثابت قيمة عند أول استخدام له داخل البرنامج فموثلا أنو عرفوت المتغيور ( )xمون نووع الاعوداد الصوحيحة لكون كو هوي قيموة هو ا المتغير؟ هو عدد وحي لكن ك !! فعنودما تعطوي الأمور (; )cout << xفكو يجوب على المترج أن يطبع على شاشة التنفي ! ل ا يجب أن تحدد قيمة المتغير أو الثابوت قبل او اثناء أول استخدام. هرذ القيمرة التري تحردد وتسرند للمتغيرر ترأتي مرن احردى عمليترين فأمرا أن تسرند القيمرة للمتغيرر اثنراء كتابرة البرنرامج أو تسرند القيمرة للمتغيراثنراء تنفيرذ البرنرامج... لنناقش الحالتين: ملاحظة//: سبق وان ذكرنا ان بالامكان أسناد الاعداد الصحيحة للمتغيرات من نوع الاعرداد الصرحيحة ،والقريم الحقيقيرة للمتغيررات مررن نروع الاعرداد الحقيقيرة ،والحررروف للمتغيرات من نوع الحروف وهكذا ..ولكن الحقيقة ان هذا القول ليب دقيقا وذلرك لان لغة C++تحول بين الانواع أليا في بعض الحالات ،مثال: ;int number 81
C++من البداية إلى البرمجة الكيانية ;’number = ‘a ; cout << number <<endl النررررراتج هنرررررا سررررريكون ) (97وهرررررو الررررررقم الرررررذي يسرررررتخدم داخليرررررا فررررري لغرررررة ) )ASCII C++لتمثيرل الحررف ) ،( aولكرن مرن المناسرب اسرتخدام الاعرداد الصحيحة لمتغير الاعداد الصحيحة والحروف لمتغير الحروف ولا تحول بينهمرا الا اذا كان هنا سبب معقول. برنامج لتوضيح الحالات اعلا ،يستخدم المتغيررات واوامرر الطباعرة لطباعرة عبارة معينة وعدد يمثل العمر ،مع ملاحمة زيادة هذ الارقام وانقاصها. // Example 2.2 >#include <iostream ;using namespace std )(int main { int myAge = 39; // initialize two integers ;int yourAge = 39 ;\"cout << \"I am: \" << myAge << \" years old.\\n ;\"cout << \"You are: \" << yourAge << \" years old\\n myAge++; // postfix increment ++yourAge; // prefix increment ;\"cout << \"One year passes...\\n ;\"cout << \"I am: \" << myAge << \" years old.\\n ;\"cout << \"You are: \" << yourAge << \" years old\\n ;\"cout << \"Another year passes\\n ;\"cout << \"I am: \" << myAge++ << \" years old.\\n ;\"cout << \"You are: \" << ++yourAge << \" years old\\n 82
[email protected] . جامعة الكوفة/ نضال خضير العبادي.د cout << \"Let's print it again.\\n\"; cout << \"I am: \" << myAge << \" years old.\\n\"; cout << \"You are: \" << yourAge << \" years old\\n\"; return 0; } :1.1 مطرجا البرنامج I am 39 years old You are 39 years old One year passes I am 40 years old You are 40 years old Another year passes I am 40 years old You are 41 years old Let's print it again I am 41 years old You are 41 years old //:ملاحظة ( بردلا مرن ايعرازcerr<<) لغرر اخرراج رسرالة خطرأ فبالامكران اسرتخدام الايعراز وطبعا عليك ان تكتب ماهي الرسالة التي ترغب ان،(cout<<) الاخراج الاعتيادي ( سريكون محرددcerr<<) مرع ملاحمرة ان مايكترب بعرد،تمهرر عنرد وجرود خطرأ مثال.بحاصرة مزدوجة cerr<< \" Error, can't divide by zero \" ; 83
C++من البداية إلى البرمجة الكيانية * اسناد القي أثناء كتابة البرنامج: ويرتم ذلرك مرن خرلال اسرتخدام التعرابير ( ،)expressionويسرتخدم التعبيرر مرع معادلررررة (والمعادلررررة عبررررارة عررررن طرررررفين يفصررررل بينهمررررا علامررررة التخصرررريص ( )assignmentالطررف الأيمرن هرو عبرارة عرن تعبيرر او قيمرة ثابترة بينمرا الطررف الأيسرر يكرون متغيررا ومتغيرر واحرد فقرط ،لرذا فران المسراواة تسرتخدم لاسرناد قيمرة للمتغير) ،فمثلا تقول: ;x =5 هنا استخدمنا المساواة (=) وبذلك فران قيمرة المتغيرر ( )xسرتكون مسراوية الرى العدد الصحيح ( ،)5أو ممكن أن تكون المعادلة على شكل: ; x = 3 * 2 +5 هنرا قيمرة ( )xتسراوي ( ،)11وكرذلك ممكرن أن تحردد قيمرة للمتغيرر بالمسراواة ولكن في حقل الأعلان عن الثوابت. ملاحظة//: دائما عند وجود علامة المساواة (=) فان الضوابط التالية ستطبق: يجب أن يكون هنا طرفين تفصرل بينهمرا علامرة المسراواة ،وبرذلك ممكرن أن نطلق عليها تسمية المعادلة. الطرف الأيسر من المعادلة أي الذي يقع على الجانب الأيسر من المسراواة يكون متغيرا ومتغير واحد فقرط دائمرا ،ولا يجروز أن يكرون قيمرة ثابترة (مرثلا ،6 ..34.2 ،456ال ) ،ولا يجوز أن يكون رمز معررف ومعلرن عنره علرى أنره ثابرت، كذلك لا يجوز أن يحتوي على علاقات رياضية مثل ( .)x + 6 أما الطرف الأيمن فيمكن أن يكون قيمة رقميرة أو عدديرة واحردة أو علاقرة رياضية (تعبير) تحتروي علرى ( قريم عدديرة تفصرل بينهرا العلامرات الرياضرية ،أو علاقة رياضية تحتوي متغيرر واحرد ،متغيررات ،أو متغيررات وقريم عدديرة) .مرثلا العلاقات التالية مقبولة 84
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ; X = 89 ;X = 34 – 45 +3 ;X =y ; X = 3 * y +90 من الممكن أن يكون فري التعبيرر الواحرد أكثرر مرن مسراواة واحردة ( سرنأتي عليها في موضعها). عند تنفيذ البرنامج فأن المتررجم سريبدأ برالطرف الأيمرن مرن المعادلرة دائمرا ويتم فحص هذا الطرف فأذا كانت فيه متغيرات فسريبح المتررجم فري الخطروات السابقة للخطوة التي هو فيها ضمن البرنامج للتأكد من أن المتغير معلن عنه ( لره نروع) أولا ،ثرم يجرب أن تكرون لره قيمرة قبرل هرذ الخطروة ،وتجلرب هرذ القيمرة لتعررو عررن المتغيررر فرري المعادلررة ( ممكررن أن تتخيررل الطرررف الأيمررن عنرردها سيصبح عبارة عن مجموعة من القيم الثابترة بعرد ان يرتم تعرويض قريم المتغيررات داخليرا فري الحاسروب) ،بعردها تجررى العمليرات الحسرابية وتكرون مرن اليسرار ألرى اليمررين وحسررب أسرربقيات العمليررات الرياضررية ،فالأسرربقية الأعلررى تنفررذ أولا وأذا تساوت عمليتان بالاسبقية فتنفذ العملية الترى فري اليسرار اولا ،مرن ذلرك سرينتج لنرا قيمة واحدة ثابتة ،هذ القيمة ستؤول الى المتغير الذي في الطرف الأيسر (دائمرا القيمة تنتقل من الطرف الأيمن للمعادلة (التعبيرر) الرى المتغيرر الرذي فري الطررف الأيسرر اي تخرزن فري الرذاكرة فري الموقرع الرذي يشرير لره المتغيرر الرذي برالطرف الأيسر). يجب أن يكرون المتغيرر الرذي علرى يسرار المسراواة والمتغيرر أو المتغيررات على يمين المسراواة مرن نفرب النروع وأذا مرا اختلفرت الأنرواع فهنرا عمليرات مرن الممكن أن تجرى أليا لتحويل الأنواع سنأتي عليها لاحقا. * أسناد القي أثناء تنفي البرنامج: 85
C++من البداية إلى البرمجة الكيانية وتتم عملية اسناد (ادخرال) قيمرة للمتغيرر أثنراء تنفيرذ البرنرامج وذلرك باسرتخدام أمر القراءة (>> )cinوهي تعني (أقرأ القيمة المطبوعة على شاشرة التنفيرذ واخزنهرا في موقع الذاكرة الذي يشار اليه بواسطة المتغير الموجود بعد العلامة (<<). * برنوووامج لادخووووال قيمتوووين لمتغيوووورين اثنوووواء تنفيووو البرنووووامج وايجوووواد مجموعهما. // Example 2.3 مطرجا البرنامج : 1.3 >#include <iostream ;using namespace std main() // no semicolon { ; int num1 َnum2 َsum ;\"cout<< \"input number 1 : ;cin>> num1 ;\"cout<< \"input number 2 : ;cin>> num2 sum = num1 + num2; //addition ; cout<<sum ;return 0 } input number 1: 20 // Press enter 86
د .نضال خضير العبادي /جامعة الكوفة [email protected] . input number 2: 15 // Press enter 35 ملاحظة//: فري كرل تطبيرق يجرب أن يتأكرد المبررمج مرن أن الكيران أو المتغيرر الموجرود فري البرنامج له قيمة قبرل أن يرتم اسرتخدامة لأول مررة فري البرنرامج ،فري خرلاف ذلرك فرأن المتررجم سيسرتخدم متغيررا لريب لره قيمرة محرددة مرن المبررمج او المسرتخدم، لذلك فان المترجم سيستخدم القيمة الموجرودة فري موقرع الرذاكرة الرذي يشرير عليره المتغيرر ودائمرا تكرون قريم مرن بررامج سرابقة لريب لهرا علاقرة ببرنامجرك وبالترالي فستحصل على نتائج خاطئة او ربما تكون قيمتة صفرا اذا لم يتم استخدامة سرابقا ( اي خالي من القيم ). شر البرنامج //:2.3 أولا //:ترم اسرتخدام المتغيررات ( )sum ،num2 ،num1وهري جميعرا مرن نروع الأعداد الصحيحة لأن هذا البرنامج صمم للتعامل مع الأعداد الصحيحة (يقوم بجمع عددين صحيحين وأظهار النتيجة). مانيا //:يمكن الأعلان عن كل متغير بسرطر منفصرل ،ويمكرن وضرعها جميعرا بسطر واحد كما فري هرذا البرنرامج علرى شررط أن تكرون جميرع المتغيررات مرن نفرب النوع (هنا جميعها أعرداد صرحيحة) وذلرك لغرر تقليرل المسراحة التري يكترب عليهرا البرنامج ،على ان يتم الفصل بين متغير وأخر بفارزة .وطبعرا العبرارة تنتهري بفرارزة منقوطة. مالثا //:بعد الدالرة ()( )mainلاحرظ العبرارة التاليرة (} ){ no semicolonوهري تعني لا تستخدم فارزة منقوطة ،وبما أنهرا وضرعت بعرد العلامرة ( )//فرأن ذلرك يعنري أنهرا ملاحمرة أو تعليرق ( )Commentللمسرتخدم أو القراريء بعردم اسرتخدام الفرارزة المنقوطة بعد كلمرة () ))mainهرذ العبرارة التري أعتبررت تعليقرا كتبرت ووضرعت بعرد 87
C++من البداية إلى البرمجة الكيانية العلامة ( ،)//وسوف لا يكون لها تأثير على تنفيذ البرنامج (أي أنها تهمل أثناء تنفيذ البرنررامج) ،عليرره فسرريكون عنررد قاعرردة وهرري \" أن أي عبررارة تسررتخدم لغررر التوضيح أو التعليق ممكن كتابتهرا داخرل البرنرامج وحسرب القواعرد التري ترم التطررق لها في الفصل الأول ،وسوف لا تكون جزء من البرنامج أثناء التنفيذ (تهمل)\". ملاحظة//: التعليقات أو الملاحمات تستخدم لأيضراا عمرل بعرض الردوال والأجرراءات التري تكرون معروفرة لردى المبررمج وغيرر معروفرة للمسرتخدمين ،أيضرا تسرتخدم لكتابرة بعض المعلومات حرول البرنرامج ( كوقرت انشرائة أو تحديثرة ) أو معلومرات حرول المبرمج نفسه ( مثلا الأسم ،العنوان الالكتروني). التعليقات ممكن أن توضع في أي مكان في برنامج ،C++ولكن يفضرل أن تكترب في بداية البرنامج ( في حالة كرون المعلومرات عرن وظيفرة البرنرامج أو معلومرات عن المبرمج ) ،أو تكتب بجانب الأوامر التي تحتاج الى توضيح . رابعا //:كما سبك وأن ذكرنا أن تنفي البرنامج يت بالتسلسل من الأعلوى الوى الأسوفل فيبودأ مون الموجهوة ( )#includeثو العبوارة ( )( ،)mainوبعودها أمور بدايوة البرنوامج (}) (والتي تعني أن ما بعدها هي أوامر برمجة مطلوأ من الحاسوأ تنفيو ها ،يلوي ذل قراءة المتغيرات ،بعدها ينف أمور الطباعوة (لاحو الموجوود بعود العلاموة (>>) فوي أمور الطباعوة هوو محصوور بوين علامتوي أقتبواس لو ا فأنوه يطبوع كموا هوو) هو ه العبارة ستظهر على شاشة التنفي وهي تخبر المسوتخدم موايلي (أدخول الورق الأول: )input number1وهوي بشوكل عوام يمكون الأسوتغناء عنهوا دون أن يتوأثر البرنوامج.. ولكنها مفيدة حيث تخبر المستخدم عن الخطوة أو الخطوات الواجب أتباعهوا لأنجواز تنفي البرنامج( ،يمكن ملاحظوة مثول ذلو فوي البورامج التوي تعملوون عليهوا موثلا فوي برنوامج للعبوة ( )gameمعينوة فوأن هنواك ملاحظوات سوتظهر علوى الشاشوة لأرشواد 88
د .نضال خضير العبادي /جامعة الكوفة [email protected] . المسوووتخدم عووون الخطووووات الواجوووب أتباعهوووا لتشوووغيل اللعبوووة أو أختيوووار درجوووة الصعوبة وغيرها). خامسببا //:هنووا تبوودأ عمليووة أسووناد قيمووة للمتغيوور ( )num1وذلوو باسووتخدام الأموور (>> ،)cinعنوود الووووول الووى هوو ه الخطوووة فووأن شاشووة التنفيوو (الشاشووة السوووداء) ستظهر ويكون هناك مؤشر وغير على شكل شارحة ( ــ) يظهر ويختفوي (ينوبض) في موقع على الجانب الأيسر من شاشوة التنفيو ،هو ا المؤشور يحفوز المسوتخدم علوى باعوة قيموة علوى الشاشوة ( باعوة قيموة معينوة باسوتخدام لوحوة المفواتي ) ،وبعود أن تطبع ه ه القيموة يوت أعولام (المعوالج) بأنجواز العمول وذلو مون خولال الضوغط علوى الزر ( ،)Enterفي ه ه الحالة سيت قوراءة القيموة التوي بعوت علوى الشاشوة وخزنهوا في الموقع ال ي يؤشور عليوه المتغيور الموجوود بعود الأمور (>> )cinوبو ل تكوون قود أسندت قيمة للمتغيور (( )num1خوزن قيموة) فوي الموقوع الو ي يؤشورعليه المتغيرفوي ال اكرة بعد ه ه الخطوة ،وه ا موا أسومية الأسوناد الو ي يوت بواسوطة المسوتخدم أثنواء تنفي البرنامج. سادسا //:الأمران اللاحقان هما مشابهان للخطوتين الرابعة والخامسة. سبابعا //:التعبيور ( ،)sum = num1 + num2عنود الوووول الوى هو ا التعبيور فوأن المترج سيبدأ بوالطرف الأيمون مون التعبيور ويعووض عون المتغيورات الموجوودة بموا يسووواويها مووون قوووي (هووو ه القوووي تووو اسووونادها الوووى المتغيووورات مووون خووولال الامووور >> cinوال ي اشرنا لوه) ،بعودها يوت أجوراء عمليوة الجموع علوى هو ه القوي لينوتج عون ذل قيمة واحدة في الطرف الأيمن ،هو ه القيموة ستوضوع (تخوزن) فوي الموقوع الو ي يؤشر عليه المتغير الموجود في الطرف الأيسر ،وب ل فوان المتغيور ( )sumستسوند له قيمة (تخزن في الموقع ال ي يؤشر عليه في ال اكرة) من خلال المعادلة ،وه ا ما أسوميه أسوناد قيموة اثنواء كتابوة البرنوامج ( أي أن المسوتخدم لا يتودخل فوي ذلو أثنواء تنفي البرنامج). ثامنا //:بعد أنجاز العمل المطلوأ من البرنامج فلا بد من أعولام المسوتخدم بالنتيجوة المتحصولة مون أنجواز أو تنفيو هو ا البرنوامج ،ويوت ذلو مون خولال باعوة القيموة 89
C++من البداية إلى البرمجة الكيانية المتحصلة والتي هي الأن موجودة في المتغير( ،)sumلو ا تو اسوتخدام أمور الطباعوة ليطبع ما موجود بعد العلامة (>>) ولما كان ما موجود بعد ه ا العامل غير محودد بعلامتي أقتبواس لو ا فوان القيموة المخزونوة فوي الو اكرة فوي الموقوع الو ي يشوير عليوه المتغير( )sumهي التي تظهر على شاشة التنفيو (اي ان المتورج يعووض اولا قيموة المتغير sumفي امر الاخراج وبعدها تت باعة القيمة). تاسعا //:الأمر الأخير هو (}) ال ي يمثل نهاية البرنامج. ملاحظة//: بشكل عام فان استخدام القروس المتوسرط المفتروا ( } ) والرذي يشرير الرى البدايرة يجرب أن يقابلرة قروس متوسرط مغلرق يشرير الرى النهايرة ( { ) ،عليره فرأن عردد الأقواس المتوسطة المفتوحة في البرنامج الواحد تساوي عدد الأقواس المتوسطة المغلقة في ذات البرنامج ،أما الأستثناءات فسنشير لها في موضعها . ملاحظة//: في أدنا بعض القواعد التي يجب أن تلاحظ عند أدخال البيانات المطلوبة : يجب أن يتطابق نوع القيمة المدخلة لمتغير معين مع النوع المعلن لهذا المتغير . أذا كانت هنا رغبة في أسناد قيم لأكثر من متغير في أيعاز قراءة واحردة فيجرب أن يفصل بين متغير وأخر بواسطة العامل ( << ). يجب أن يتطابق عدد البيانرات التري يرتم أدخالهرا مرع عردد المتغيررات المدونرة بعرد العامل ( << ) في أيعاز القراءة. اذا كران أكثرر مرن متغيرر واحرد فري ايعراز قرراءة واحرد فريمكن أدخالهرا جميعرا ثرم ضرغط الرزر ) ( Enterعلرى أن يفصرل برين قيمرة وأخررى فررا ،أو تردخل القريم واحدة بعد الأخرى على أن تضغط الزر ) ( Enterبعد أدخال كل قيمة . لا يجوز أن تكون القيم المدخلة صيغ رياضية ( أي قيم بينها علامات رياضية) 91
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ملاحظة//: من الممكن اسرتخدام العوامرل ) << ( (>> ) ،بشركل متكررر مرع عبرارات الادخرال والاخراج ) ( cout OR cinلتفيد تكرار أمر الادخال والاخراج .مثال ; cout << x << y << z ; cin >> x >> y >> z 1.4بعوووض الصوووي المهموووة فوووي عمليوووات الأدخوووال والأخوووراج Formatted Consol for I/O Operations دعم C++عردد مرن الصرفات التري مرن الممكرن ان تسرتخدم لصرياغة او تنمريم طريقرة ظهررور المخرجرات والموضررحة بالجردول ( ،)2.1هررذ الرـدوال تسررتخدم مررع الموجة ( )iostreamاو مايكافئهرا مرع ( )iomanipوهري تسرتخدم برالترافق مرع الأمرر ( ،)coutوالصيغة العامة لها هي: cout.function لاحظ هنا تم استخدام النقطة (( ).بدلا من <<). جدول ( :)1.1بعض الصفات المهمة التي تستخدم لصياغة او تنظيم المخرجات وضيفة الدالة دوال مع الموجة دوال مع الموجة >#include<iomanip> #include<iostream تحدد حجم الحقل المطلوب ) ( setw ) ( width لعر قيم المخرجات تحدد عدد المراتب بعد الفارزة عند ) ( setprecision ) ( precision عر القيم الحقيقية تحدد نوع الرمز الذي سيستخدم لم الجزء غير المستخدم في ) ( setfill ) ( fill الحقل المحدد لعر قيمة معينة 91
C++من البداية إلى البرمجة الكيانية تحدد اشارة للمسيطر لتحدد ) ( setiosflags ) ( setf نوع الصياغة المطلوبة (مثل ) ( setiosflags طباعة القيمة من اليمين او ) ( unsetf اليسار,م السطور) مثال: تستخدم لألغاء الصياغة المحددة بالأيعاز السابق ; )cout.width (5 ; cout << 345 المخرجات ستكون كما يأتي: 345 اي ان المترجم سيحدد خمب مواقع لطباعة القيمة ،ويبدأ الطباعة من اليمرين، لذلك سيكون هنا فراغين في اليسار. ملاحظة//: تأثير الدالة )( widthيستمر لأمرر طباعرة واحرد فقرط ،فراذا كران هنرا اكثرر مرن امر طباعة فنستخدم ))( ( widthمع كل امر طباعة.. ملاحظة//: يسرتخدم الأمرر ))( ( fillلمرلا الفراغرات ،ويجرب ان تضرع برين قوسري الأمرر )(fill الرمز المطلوب طباعتة ( بما انه رمرز فيجرب ان يحردد بحاصررات مفرردة ) .امرا أذا لم يحدد ماهية الرمز المطلوب طباعتة في الحقول الفارغة ( عند تحديرد حجرم الحقل لطباعة قيمة معينة ) فأن المترجم سيتركها فارغة كما فري المثرال السرابق . مثال ; ) ' * ' ( cout.fill 92
د .نضال خضير العبادي /جامعة الكوفة [email protected] . ; ) cout.width ( 7 ; cout << 345 في هذ الحالة فان الحقول الفارغة ستم بالعلامة ( * ) وستكون النتيجة: ****345 ملاحظة//: في حالة تحديد عدد المراتب بعد الفارزة فأن تأثير الدالرة سيسرتمر علرى كرل القريم اللاحقة لحين الغاء أو أعادة التحديد .مثال ; ) cout.precision ( 10 هذا يعني ان كل الأرقام الحقيقية اللاحقة سيحدد لها عشر مراتب بعد الفارزة . ملاحظة//: أذا لررم يحرردد عرردد المراتررب الترري بعررد الفررارزة ل رقررام الحقيقيررة فررأن المترررجم سيفرضها ست مراتب . ملاحظة//: من الملاحظ في جميع الأمثلة أعلاة أن الطباعة تبدأ من اليمرين الرى اليسرار وهري الحالة الأفتراضية ) ( defaultللحاسوب ،أما أذا كران المطلروب غيرر ذلرك فهنرا دالة خاصة لهذا الغر سنأتي عليها )) ( ،( setfوالتي لها استخدامات مختلفة . * الدالة ()( )setfتعمل مع الأمر ( )coutكما بينرا ولكنهرا تختلرف بعرض الشر عن الدوال الأخرى المشار اليها أعلا حي أنهرا مرن الممكرن أن تأخرذ معامرل واحرد أو معاملين (وسيط او اثنين) ،ووفقا لهذ المعاملات سيحدد واجبها وكمايأتي: .2الدالة مع وسيطين وتكوت الصيغة العامة لها كما يأتي: 93
C++من البداية إلى البرمجة الكيانية ; )cout.setf (arg1 ،arg2 ويكون استخدام هذ الدالة وفقا لما موضح في الجدول (.)2.2 جدول ( :)1.1يبين وظيفة الدالة ))( (setfمع استخدام اثنين من الوسائط قيمة الوسيط قيمة الوسيط الثاني وظيفة الـــــــــدالة الأول)bit-field (arg2) )flagarg1 ios::adjustifield ios::left م السطور من اليسار ios::adjustifield ios::right م السطور من اليمين ios::adjustifield ios::internal اظهار العلامات الرياضية (الاشارة الموجبة والسالبة) ios::floatfield ios::scientific العلامة العلمية ios::floatfield ios::fixed علامة النقطة الثابتة ios::basefield ios::dec الأساس العشري ios::basefield ios::oct ios::basefield ios::hex الأساس الثماني الأساس السادس عشر مثال//: ; )'@'( cout.fill ; )cout.precision (3 ; )cout.setf( ios::internal ،ios::adjustifield ;)cout.setf (ios:: scientific ،ios::floatfield ; )cout.width (15 ; \"cout << -12.34567 <<\"\\n نتيجة هذا المثال هي: 94
د .نضال خضير العبادي /جامعة الكوفة [email protected] . -@@@@@1.235e+11 تلاحررظ ان الأيعرراز الأول هررو لمرر الفراغررات بررالرمز)@( ،امررا الايعرراز فرري السرطر الثراني فهرو يمثرل عردد المراترب بعرد الفرارزة للررقم الحقيقري وهري هنرا (،)3 الايعاز الثال فهو يستخدم معاملين او وسيطين لاظهرار العلامرة الرياضرية ،الايعراز في السطر الرابع يسرتخدم لأظهرار العلامرة العلميرة ،ثرم ترم تحديرد عردد المواقرع التري سرتطبع بهرا القيمرة والتري حرددت ( 15موقرع) ..واخيررا ترم ادخرال القيمرة المطلروب طباعتها (لاحظ النتيجة). .1استخدام وسيط واحد مع الدالة ()( )setfوالصيغة العامة لها هي: ; )cout.setf (arg واعتمادا على قيمة الوسيط تقوم الدالة بعملها. الجدول ( )2.3يبين وظيفة الدالرة ))( (setfعنرد اسرتخدامها وسريط واحرد ووفقرا لقيمة الوسيط المقابل لها جدول ( :)1.3وظيفة الدالة ()( )setfعند استخدام وسيط واحد قيمة المعامل ()flag وظيفة الــــــــــدالة ios::showbase تستخدم base indicatorفي المخرجات ios::showpos تطبع العلامة الموجبة ( )+قبل الأرقام الموجبة ios::showpoint تمهر الفارزة والأصفار ios::uppercase تستخدم الحروف الكبيرة في المخرجات الممثلة بالنمام السادس عشري ios::skipus حذف الفراغات ( )white spaceفي المخرجات ios::unitbuf تدفق كل ( )streamبعد الحشر ios::stdio تدفق ( )stdout and stderrبعد الحشر * برنامج لايجاد الجذر التربيعي للرقم 5مع تنميم المخرجات ،وكذلك الجذر التربيعي للرقم 111باستخدام العلامة العلمية. 95
من البداية إلى البرمجة الكيانيةC++ // Example 2.4 #include <iostream> using namespace std; #include <math> main() { cout.fill('*') ; cout.setf(ios::left َios::adjustifield ); cout.width(10); cout << \"value\"; cout.setf(ios::right َios::adjustfield); cout.width(15); cout<<\"sqrt of value\"<<\"\\n\"; cout.fill('.'); cout.precision(4); cout.setf(ios::showpoint); cout.setf(ios::showpos); cout.setf(ios::fixed َios::floatfield); cout.setf(ios::internal َios::adjustfield); cout.width(5); cout<<5; cout.setf(ios::right َios::adjustfield); cout.width(20); cout<<sqrt(5)<<\"\\n\"; } cout.setf(ios::scientific َios::floatfield); cout<<\"\\nsqrt(100)=\"<<sqrt(100)<<\"\\n\"; return 0; } 96
د .نضال خضير العبادي /جامعة الكوفة [email protected] . مطرجا البرنامج //:1.4 value * * * * * * sqrt of value + . . . . 5 . . . . . . . . . . . . . +2.2361 sqrt ( 100 ) = +10000e+01 سيتم شرا ايعاز التكرار الوارد في المثال ( (2.4في الفصل الرابع. ملاحظة//: تستخدم )( setwمع الأعداد والسلاسل الرمزية. ملاحظة//: يستخدم الأيعاز ) ) ( cin.get(chلأسناد حرف للمتغير الحرفري ) ( chأثنراء تنفيرذ البرنامج حتى وأن كان فرا أو سطر جديد ،مثال ; cin >> m ; )cin .get (ch ; cin >> n الأن لتلاحظ ماهي المخرجات لحالات الأدخال المختلفة في أدناة : Input 1 : 25 w 34 // m is 25 ، ch is w ، n is 34 Input 2 : 33 41 // m is 33 ، ch is blank ، n is 41 Input 3 : 67 ( Enter ) 55 // m is 67 ،ch is newline (\\n) ،n is 55 ملاحظة//: الأرقرام تمثرل داخرل الرذاكرة بالصريغة الثنائيرة ) ( binaryوهري تحردد عردد البترات اللازمرة لتمثيرل ذلرك الررقم ،لرذلك يجرب ملاحمرة تعريرف المتغيرر بمرا يتناسرب وحجمة ،وفي خلاف ذلك فأن النتائج ستكون خاطئة. 97
C++من البداية إلى البرمجة الكيانية * لغررر أخررراج القرريم العدديررة الصررحيحة وفقررا لأسرراس يررتم اختيررار مثررل ( )hexadecimal ،octal ،decimalفران بامكانرك كتابرة المختصررات التاليرة مرع أمرر الأخراج لتحصل على قيمة عددية وفقا لذلك الاساس: dec = decimal oct = octal hex = hexadecimal * برنرامج لادخرال قيمرة عدديرة وطباعتهرا بالنمرام العشرري ،السرادس عشرر، والنمام الثماني. // Example 2.5 ># include<iostream ;using namespace std { ) (main ; int value ;cout<<\" Enter number \" << endl ; cin>>value ;cout<<”Decimal base =\" << dec<<value<<endl ; cout << \" Hexadecimal base =\" << hex<<value <<endl ; cout<<\" Octal base=\" << oct<<value << endl ;return 0 } مطرجا البرنامج : 1.5 Enter number 98
د .نضال خضير العبادي /جامعة الكوفة [email protected] . 10 Decimal base =10 Hexadecimal base = a Octal base = 12 لنفب الغرر اعرلا بالأمكران اسرتخدام الأيعراز ()( )setbaseوالرذي يسرتخدم لأخرراج القريم العدديرة الصرحيحة وفقرا ل سراس المحردد برين القوسرين لهرذا الأيعراز (بكلام أخر بالأمكان تحويل الاعداد من اساس الى أخر والمقصود بالاساس هنا هرو ان الاعررررداد العشرررررية ) (decimalاساسررررها ( ،)11والثمرررراني ( )octalاساسررررها (،)8 والسرادس عشرر ( )hexadecimalاساسرها ( .))16وهرذ الدالرة تسرتخدم مرع الموجرة (> )#include<iomanip * سنعيد كتابة المثال ( )2.5ولكن باستخدام الأيعاز ()()setbase // Example 2.6 ># include<iostream ># include<iomanip ;using namespace std { ) (main ;int value ; cout<<\" Enter number \" << endl ; cin>>value ; ) cout<<\" Decimal base = \" << setbase ( 10 ; cout << value << endl ; ) cout << \" Hexadecimal base =\" << setbase ( 16 ; cout << value <<endl ; ) cout<<\" Octal base=\" << setbase ( 8 ; cout<< value << endl 99
C++من البداية إلى البرمجة الكيانية ;return 0 } 1.5التعامل مع البتات Bit Manipulations تعلمنرا مرن المواضريع السرابقة عنردما نعلرن عرن متغيرر فران المتررجم يحجرز مساحة في الذاكرة لهذا المتغير وحسب نوعة .فري الحقيقرة ،وكمرا تعلمنرا مرن دراسرة البايتررات والكلمررات ،المتغيررر المعلررن عنرره يشررغل مسرراحة فرري الررذاكرة عبررارة عررن مجموعة من الصناديق الصغيرة .فحسب فهمنا الانسراني ،لريب مرن السرهل دائمرا ان نفهم كيف يتم خزن حرف مثل الحرف Bبثمانية صناديق صرغيرة عنردما نعررف ان الحررف Bهرو حررف واحرد .ان التعامرل مرع البترات تسرمح لرك للسريطرة علرى كيفيرة خزن القيم بالبتات .هذ ليسرت عمليرة تحتراج الرى انجازهرا كرل مررة ،خصوصرا لريب فري المراحرل المبكررة مرن رحلترك مرع .C++علرى الررغم مرن ذلرك ،عمليرات البترات (والعمليات المتطابقة ذات العلاقة) تقدم فري كرل بيئرات البرنرامج التطبيقري ،لرذا فانرك يجب ان تهتم بماذا تعمل وماذا تقدم .في ذلك الوقرت فانرك يجرب ان تهرتم بمراذا يعنري البرت ،البايرت ،الكلمرة .وقرد سربق وان وضرحنا فري الفصرل الاول العوامرل المنطقيرة والتري هري تسرتخدم مرع الشررط وسنسرتخدم هنرا مايشربة ذلرك قلريلا ولكرن تتعامرل مرع البتات. 1.5.2عمليات البتات :العامل ~ Bitwise Not واحدة من العمليات التي من الممكن ان تنجزها على البت تتمثل بعكب قيمتة. عليه فاذا كانت قيمة البرت واحرد فانهرا سرتتغير وتكرون صرفر وبرالعكب .هرذ العمليرة سوف يقوم بها العامل Notوالذي سيرمز له بالرمز (~) .ان العامرل Notهرو عامرل احادي اي يكون معه عامرل واحرد ويكرون هرذا العامرل علرى الجانرب الايسرر كمرا فري المثال: ~value 111
د .نضال خضير العبادي /جامعة الكوفة [email protected] . Bit ~Bit 10 01 لنفرر رقرم بحجرم بايرت مثرل الرررقم .248بالتاكيرد فانرك تعلرم كيرف تحررول الارقرام مرن نمرام الرى اخرر ،فمرثلا ان القيمرة الثنائيرة للررقم 248هري 10001111 (والقيمة بالنمام السادس عشر هي .)xF81فاذا نفذت العامرل Notعليره لعكرب قريم بتاتة ،فانك ستحصل على النتيجة التالية: Value 1 1 1 1 1 1 1 1 ~value 1 1 1 1 1 1 1 1 1.5.1عامول مقارنوة البتوات (و) Comparing Bits: The Bitwise AND & Operator Bit1 Bit2 Bit1 & Bit2 11 1 11 1 11 1 11 1 العامرل Andهرو عامرل ثنرائي اي يسرتخدم مرع اثنرين مرن المعراملات ويسرتخدم وفق الصيغة القواعدية التالية: Operand1 & Operand2 هذا العامل ياخذ قيمتين ويقارن البرت للقيمرة الاولرى مرع البرت الرذي يقابلرة فري القيمة الثانية ،والنتيجة ستكون وفقا لجدول الصدق المبين ادنا . تخيررل لرردينا قيمترران البايررت الاولررى 187والثانيررة .242اسررتنادا الررى دراسررتنا لانممرة الاعرداد فران القيمرة الثنائيرة للعردد العشرري 187هري ( 1111 1111وقيمترة 111
C++من البداية إلى البرمجة الكيانية بالنمام السادس عشر .))(0xBBالقيمة الثنائية للرقم العشرري 242هري 00101111 (وقيمتهرا بالنمرام السرادس عشرر هرو) ،(0xF2دعنرا نقرارن هراتين القيميترين برت برت، باستخدام عامل البتات :And ثنـــــــــائي عشري N1 1 1 1 1 1 1 1 1 187 N2 1 1 1 1 1 1 1 1 242 N1 & N2 1 1 1 1 1 1 1 1 178 في كثير مرن الاحيران تحتراج ان يقروم المتررجم بانجراز هرذ العمليرة واسرتخدام الناتج في البرنامج ،هذا يعني امكانية الحصول على النتيجرة لهرذ العمليرة وعرضرها على شاشة الحاسوب ،هذ العملية من الممكن ان نوضحها في المثال التالي. * برنامج لادخال قيمتين واجراء عملية (و) على بتاتهما. // Example 2.7 >#include <iostream ;using namespace std {)(main ;const int N1 = 187 ;const int N2 = 242 ;”cout<<N1<<”&”<<N2<<”=”<< (N1 & N2)<<”\\n\\n ;return 0 } 187 & 242 = 178 مطرجا البرنامج //: 1.7 112
د .نضال خضير العبادي /جامعة الكوفة [email protected] . 2.5.3عامل المقارنة او ) | ( Comparing Bit: Bitwise OR Operator مرن الممكرن ان تقروم بنروع اخرر مرن المقارنرة علرى البترات باسرتخدام عامرل مقارنة البتات ORوالذي يمثل بالعلامة ( | ) والصيغة القواعدية هي: Value1 | value2 مرة اخرى ،فان المترجم يقرارن البترات المتقابلرة فري القيمترين .فراذا كران علرى الاقرل واحرد مرن البترات يسراوي 1فرران نتيجرة المقارنرة سرتكون .1نتيجرة المقارنررة سرتكون صرفرا اذا كران البتران المقارنران قيمتيهمرا صرفرا .يمكرن ملاحمرة ذلرك فري الجدول ادنا : Bit1 Bit2 Bit1 | Bit2 11 1 11 1 11 1 11 1 مررة اخررى دعنررا نتعامرل مرع القيمتررين 187و 242ونقرارن بيرنهم باسررتخدام عامل مقارنة البتات OR الثنـــــــائي العشري N1 1 1 1 1 1 1 1 1 187 N2 1 1 1 1 1 1 1 1 242 N1 | N2 1 1 1 1 1 1 1 1 251 وكرذلك مرن الممكرن ان تردع المتررجم ينجرز هرذ العمليرة وتسرتخدم النراتج فري البرنامج. * برنامج لادخال عددين صحيحين واجراء عمليرة (او)علرى بتاتهمرا وطباعرة الناتج. 113
C++من البداية إلى البرمجة الكيانية //Example 2.8 >#include<iostream {)(main ;const int N1 = 187 ;const int N2 = 242 ;”cout<< N1 << “|” <<N2<<”=”<< ( N1 | N2 )<< “\\n\\n ;return o } مطرجا البرنامج //: 1.8 187 | 242 = 251 1.5.4مقارنة البتات باستخدام العامل XOR ) ^ ( Comparing Bits: The Bitwise-Exclusive XOR Operator مثرل العراملين السرابقين فران هرذا العامرل يقروم بمقارنرة كرل بترين متقرابلين فري القيمتين ،الصيغة القواعدية هي: value1 ^ value2 Bit1 Bit2 Bit1 ^ Bit2 11 1 11 1 11 1 11 1 114
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: