التعابير في 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 .
ويبين الشكل تخزين هذا النوع من المتغيرات في الذاكرة .
شكل تخزين المتغير 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 كما مبين في البرنامج الثاني .
تعليقات
إرسال تعليق