مفاهيم حافظه
اسامي متغيرها، همانند
number1
،
number2
و
sum
مطابق با مكانهاي واقعي در حافظه كامپيوتر هستند. هر متغير داراي يك نام، نوع، سايز و مقدار است. در برنامه جمع
5-2
زمانيكه عبارت
در خط
14
اجرا ميشود، كاراكترهاي تايپ شده توسط كاربر به يك عدد صحيح تبديل ميشود و در مكاني از حافظه با نام
number1
و با كمك كامپايلر
C++
قرار داده ميشود. فرض كنيد كه كاربر عدد
45
را به عنوان مقداري براي
number1
وارد كند. كامپيوتر
45
را دريافت و در مكان
number1
همانند شكل 6-2 قرار ميدهد.
زمانيكه مقداري در يك مكان حافظه قرار ميگيرد، مقدار جديد بر روي مقدار قبلي بازنويسي ميشود. مجدداٌ به سراغ برنامه جمع ميرويم، هنگامي كه عبارت
در خط
17
اجرا شود، فرض كنيد كاربر مقدار
72
را وارد سازد، اين مقدار وارد مكان
number2
، شده و تصوير حافظه همانند شكل 7-2 خواهد شد. دقت كنيد كه اين مكانهاي حافظه ضرورتا، نبايستي در كنار هم قرار داشته باشند.
پس از اينكه برنامه مقادير
number1
و
number2
را بدست آورد، اين مقادير را با هم جمع كرده و مجموع را در درون متغير
sum
قرار ميدهد. عبارت
علاوه بر آنكه عمل جمع را انجام ميدهد، مقدار حاصله را هم در
sum
ذخيره ميسازد. اين عمل زماني رخ ميدهد كه مجموع دو متغير
number1
و
number2
محاسبه شدهاند و در مكان
sum
ذخيره ميشود. پس از اينكه
sum
محاسبه شد، حافظه بفرم شكل 8-2 تبديل خواهد شد. توجه نمائيد كه مقادير
number1
و
number2
پس از انجام محاسبه
sum
همچنان بدون تغيير باقي ميماند. با اينكه از اين مقادير استفاده شده است، اما مقادير اوليه آنها با انجام عمل محاسباتي از بين نميرود.
شكل 6-2 | مكان حافظه در حال نمايش نام و مقدار متغير
number1
.
شكل 7-2 | مكانهاي حافظه پس از ذخيرهسازي مقادير براي
number1
و
number2
.
شكل 8-2| مكانهاي حافظه پس از محاسبه
sum
با استفاده از
number1
و
number2
.
6-2 محاسبات
اكثر برنامهها
محاسبات رياضي
انجام ميدهند
. عملگرهاي رياضي در جدول شكل
9-2
ليست شدهاند. توجه كنيد كه تمام نمادهاي بكار رفته در جبر در
C++
بكار گرفته نميشوند. علامت ستاره
(*)
نشاندهنده ضرب و
علامت درصد
(%)
نشاندهنده
باقيمانده
است
. اكثر عملگرهاي حسابي (در جدول
9-2
) از نوع عملگرهاي باينري هستند چرا كه هر عملگر
ما
بين دو عملوند قرار ميگيرد. براي مثال، عبارت حسابي
number1 + number2
شامل عملگر باينري
+
و دو عملوند
number1
و
number2
ميباشد.
شكل 9-2 | عملگرهاي محاسباتي.
قوانين تقدم عملگر
C++
عملگرها را در عبارات محاسباتي با توالي كه قانون تقدم عملگرها تعيين ميكند بكار ميبرد. اين قوانين شبيه قوانين موجود در جبر هستند:
1-
عملگرهايي كه در درون جفت پرانتز قرار دارند داراي اولويت
اول
هستند. بنابر اين برنامهنويس با استفاده از پرانتز ميتواند ترتيب اجراي محاسبات را در دست بگيرد. پرانتزها داراي بالاترين سطح تقدم
ميباشند
. در مواردي كه پرانتزها به صورت تودرتو (آشيانهاي) قرار گرفتهباشند، عملگر پرانتزي كه در داخليترين سطح قرار دارد ابتدا انجام ميگيرد، همانند
عملگر قرار گرفته در جفت پرانتز داخلي ابتدا بكار گرفته ميشود.
2- عملگرهاي ضرب و تقسيم
و باقيمانده
در مرحله بعدي بكار گرفته ميشوند. اگر عبارتي شامل چندين عملگر ضرب
،
تقسيم
و باقيمانده ب
اشد، عملگرها از سمت چپ به راست اجرا خواهند شد. ضرب
، ت
قسيم
و باقيمانده
داراي اولويت هم سطح يا برابر هستند.
3- عملگرهاي جمع و تفريق در آخرين مرحله به كار ميروند. اگر عبارتي شامل چندين عملگر تفريق و جمع باشد، عملگرها به ترتيب از سمت چپ به راست اجرا خواهند شد. عملگرهاي جمع و تفريق داراي اولويت هم سطح هستند.
وجود قوانين تقدم عملگرها
،
زبان
C++
قادر ميسازد تا عملگرها را با ترتيب صحيح بكار گيرد. در جدول شكل
10-2
خلاصهاي از قوانين تقدم عملگرها آورده شده است. اين جدول با معرفي عملگرهاي ديگر
C++
در فصلهاي بعدي تكميلتر خواهد شد. جدول كامل تقدم عملگرها در پيوست كتاب موجود است.
شكل 10-2 | تقدم عملگرهاي محاسباتي.
عبارات ساده جبري و
C++
حال اجازه دهيد تا به چند عبارت محاسباتي نگاهي بياندازيم تا بخوبي با قوانين تقدم عملگرهاي محاسباتي آشنا شويد. در هر مثالي كه ذكر ميشود عبارت جبري و معادل
C++
آن عبارت نيز آورده شده است. مثال زير يك عبارت رياضي را نشان ميدهد كه منظور از آن به دست آوردن ميانگين پنج عدد است:
m = (a + b + c + d + e) / 5;: C++
وجود پرانتز در اين عبارت ضروري است چرا كه عملگر تقسيم تقدم بالاتري نسبت به عملگر جمع دارد، در نتيجه مقدار داخلي پرانتز بر
5
تقسيم ميشود. اگر پرانتز در اين عبارت حذف شود، منظور محاسبه
a + b + c + d + e / 5
خواهد بود كه معادل عبارت زير است:
عبارت زير نشاندهنده يك معادله است:
y = mx + b
y = m * x + b; : C++
وجود پرانتز در اين عبارت نياز نيست، چرا كه عملگر ضرب تقدم بالاتري نسبت به عملگر جمع دارد و در ابتدا انجام ميشود. عمل تخصيص در آخرين مرحله صورت ميگيرد چرا كه به نسبت عمل ضرب و جمع از اولويت پايينتري برخوردار است
.
مثالي كه در زير آورده شده حاوي عملگرهاي توان، ضرب، تقسيم اعشاري، جمع و تفريق است:
z = pr%q + w / x - y
: جبري
دايرههاي حاوي اعداد نشاندهنده ترتيب اجراي عملگرها هستند. عملگر
ضرب
در اولويت اول قرار دارد و عملگرهاي
باقيمانده
و تقسيم در اولويتهاي بعدي و به ترتيب از سمت چپ به راست اجرا ميشوند و پس از آنها عملگرهاي جمع و تفريق به ترتيب اجرا شده و در پايان عمل تخصيص صورت ميگيرد
.
توجه كنيد كه در اين جدول در مورد پرانتزهاي تودرتو مطالبي بيان شده است، اما تمام عبارات محاسباتي كه داراي چندين جفت پرانتز هستند، ممكن است حاوي پرانتزهاي تودرتو نباشد. براي مثال، اگر چه عبارت زير
a * (b + c) + c * (d + e)
شامل دو جفت پرانتز است، اما هيچ كداميك از آنها پرانتز تودرتو نميباشند. در چنين حالتي هر دو آنها داراي سطح يكسان ميباشند.
ارزيابي معادله درجه دوم
براي درك بهتر قوانين تقدم عملگرها به مثال زير كه يك چند جملهاي درجه دوم است توجه كنيد:
دايرههاي حاوي اعداد نشاندهنده ترتيب اجراي عملگرها هستند
.
در
C++
عملگر محاسباتي براي انجام عمل توان وجود ندارد، از اينرو عبارت
x2
را بصورت
x * x
نشان دادهايم. بزودي در مورد تابع استاندارد كتابخانهاي
pow
(توان) صحبت خواهيم كرد.
خطاي برنامهنويسي
برخي از زبانهاي برنامهنويسي از عملگرهاي
**
يا ^
براي نمايش توان استفاده ميكنند. در حاليكه زبان
C++
از اين عملگرها پشتيباني نميكند، و استفاده از آنها خطاي نحوي خواهد بود.
ح
ال فرض كنيد كه
a
،
b
،
c
و
x
بصورت
a = 2
،
b = 3
،
c = 7
و
x = 5
مقداردهي شده باشند. با توجه به شكل
11-2
تقدم عملگرها در اين چند جملهاي درجه دوم و نتيجه اجراي آنرا تعقيب ميكنيم.
برنامهنويسي ايدهال
در عمليات جبري استفاده از پرانتزهاي اضافي موجب ميشود كه عبارات از وضوح كافي برخوردار شوند (پرانتزهاي غيرضروري
redundant parentheses
يا پرانتزهاي افزونگي
نيز
نام
يده ميشوند
).
به كمك اين پرانتزها ميتوان عبارات بزرگ و پيچيده را دستهبندي كرده و سبب واضح شدن طريقه انجام محاسبات شد.