التعابير في C++

التعابير في C++

يطلق علي أي ترتيب توجد عليه المتغيرات والمؤثرات بما يمثل علاقة يطلب من البرنامج حساب ناتج مصطلح " تعبير expression " , فالعبارة alpha +12 والعبارة والفرق بين عبارات البرنامج وما تتضمنه من تعابير , أن العبارة هي أمر الجهاز بتنفيذ عمل ما , وتنتهي بفاصلة منقوطة , أما التعبير فعلاقة مطلوب حساب ناتج لها , يكون في الغالب قيمة حسابية . وقد تتضمن العبارة عدة تعابير , مما يثير مسألة التفاضل بينها في التنفيذ .

أسبقية التنفيذ

لحظ القوسين في التعبير التالي :

(ftemp -32) *5/4

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

الأعداد الكسرية

تكلمنا عن النوعين int, char وكلاهما يمثل بعدد صحيح , ولنتناول الأن نوعا أخر , هو الأعداد الكسرية والتي تعرف علي أنها من النوع ذو النقطة العائمة floating point iii .

ولدينا أكثر من نوع الأعداد الكسرية تتراوح في درجة الدقة , أبسطها ما يعرف علي أنه من النوع fioat , ثم يتلوه النوع double , وأخيرا المعرف بأنه من النوع long double .

والنوع float له دقة يمكن أن تصل إلي سبع خانات عشرية , ويحتل أربع بايت في الذاكرة , وبالتالي تتراوح القيم التي يمكن أن يعبر عنها من 3.4x10-38 إلي 3.4x1038 .

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

Variable of type float in memory

شكل تخزين المتغير float في الذاكرة

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

Circarea.ccp

 

circarea.cpp


 


// circarea.cpp


// demonstrates floating point variables


#include <iostream.h>                   // for cout, etc.


 


void main()


   {


   float rad;                           // variable of type float


   const float PI = 3.14159;            // type const float


 


   cout << "Enter radius of circle: ";  // prompt


   cin >> rad;                          // get radius


   float area = PI * rad * rad;         // find area


   cout << "Area is " << area << endl;  // display answer


   }




وإليك نموذج للخرج :



Enter radius of circle: 0.5



Area is 0.785398



الثوابت الكسرية



العدد 3.14159 في المثال السابق هو ثابت كسري , وهو مكتوب الصيغة العادية للكسور العشرية . ولكن الكسور يمكن أيضاً أن تكتب بالصيغة الآسية , فالعدد 1234.56 يمكن كتابته علي الصورة 1.23456E3 , وهو ما يقابل الصورة 1.23456x103 ويسمي العدد بعد العلامة العشرية " الدليل الأسي exponent " . ويمكن أن يكون موجبا ( كالحالة المبينة ) أو سالبا , مثل 6.53239E-5 وهو ما يقابل 0.0000653239 بالصورة العشرية المعتادة , وهو ما يقابل أيضا 6.53239x10-5 .



المميز const



يبين المثال أيضا دور المميز const ''qualifier , const , والذي يسبق تعريف النوع float , هو يبين أن هذا الكسر لن تتغير قيمته طوال البرنامج . ويجري العرف علي أن تكون تسمية مثل هذه الثوابت بالأحرف الكبيرة .



الموجه #define



يمكن أن تعرف الثوابت أيضا باستخدام الموجه #define , وذلك علي النحو التالي :



#define P1 3.14159



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



متحكمات الخرج



متحكمات الخرج manipulators هي مؤثرات توجه المترجم لإظهار المخرجات علي هيئة معينة , وتستخدم بالتالي مع المؤثر << , وأكثرها استخداما هما endl و setw , وسنبين فيما يلي استخدام كل نوع .



متحمكات الخرج endl



تلاحظ في السطر الأخير من البرنامج السابق وجود ذلك المتحكمة , وهي تعمل نفس أثر محرف الهروب n\ , والذي يتسبب في الانتقال إلي سطر جديد . وقد يفضل استخدام المتحكمة المذكورة لكونها مفهومة المعني , ] إذ هي اختصار لعبارة ''end line'' [ .



متحكمة الخرج setw



تقوم متحكمة الخرج المذكورة ] اختصار لكلمة ''set width'' [ بتحديد حقول للكلمات المخرجة , ويتضح لك ذلك من مقارنة البرنامجين التاليين :



البرنامج الأول يخرج جدولا بأسماء بعض المدن وتعداد سكانها :



Width.cpp




width1.cpp


 


// width1.cpp


// demonstrates need for setw manipulator


#include <iostream.h>


 


void main()


   {


   long pop1=2425785, pop2=47, pop3=9761;


 


   cout << "LOCATION " << "POP." << endl


    << "Portcity " << pop1 << endl


    << "Hightown " << pop2 << endl


    << "Lowville " << pop3 << endl;


   }




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



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



Width2.cpp




width2.cpp


 


// width2.cpp


// demonstrates setw manipulator


#include <iostream.h>


#include <iomanip.h>     // for setw


 


void main()


   {


   long pop1=2425785, pop2=47, pop3=9761;


 


   cout << setw(8) << "LOCATION" << setw(12)


                 << "POPULATION" << endl


    << setw(8) << "Portcity" << setw(12) << pop1 << endl


    << setw(8) << "Hightown" << setw(12) << pop2 << endl


    << setw(8) << "Lowville" << setw(12) << pop3 << endl;


   }




خرج البرنامج

















الملف التصديري iomanip.h



إن التعريف بالمتحكمات لا توجد في الملف التصديري iostream.h , بل في ملف تصديري أخر هو iomanip.h , ولذا يجب أن تصدر برنامجك بهذا الملف , أسوة بالملف iostream.h كما مبين في البرنامج الثاني .

التسميات: