اصلاح برنامه
اين بخش ادامهدهنده معرفي برنامهنويسي
C++
با دو مثال است، كه نحوه اصلاح برنامه مطرح شده در شكل 1-2 را نشان ميدهند. در مثال اول، متن در يك خط با استفاده از چندين عبارت چاپ ميشود. در مثال دوم همان متن توسط يك عبارت و در چندين خط چاپ ميگردد.
چاپ متن در يك خط توسط چند عبارت
رشته
Welcome to C++!
ميتواند به چندين روش چاپ شود. براي مثال، در برنامه شكل 3-2 از دو عبارت براي وارد كردن جريان (خطوط
8-9
)استفاده شده است، تا همان خروجي برنامه شكل 1-2 توليد شود. خروجي برنامه دوم دقيقاٌ همانند برنامه اول است، چرا كه هر عبارت از مكاني كه عبارت قبلي به عمل چاپ پايان داده، شروع به چاپ ميكند. عبارت اول كلمه
Welcome
و بدنبال آن يك فاصله چاپ كرده و عبارت دوم هم كار چاپ را از همان خط و پس از فاصله چاپ شده دنبال ميكند. بطور كلي،
C++
به برنامهنويس امكان ميدهد تا عبارات را به روشهاي گوناگون بكار گيرد.
چاپ متن در چند خط توسط يك عبارت
همانند برنامه شكل 4-2 ميتوان يك عبارت را در چندين خط به نمايش در آورد. هر بار كه عبارت ارسالي به خروجي با كاراكتر توالي
\n
مواجه شود، كرسر به ابتداي خط بعدي منتقل خواهد شد. براي ايجاد يك خط خالي در خروجي، دو كاراكتر خط جديد را پشت سرهم، همانند خط
8
قرار دهيد.
1 // Fig. 2.3: fig02_03.cpp 2 // Printing a line of text with multiple statements.
3 #include <iostream> // allows program to output data to the screen
4
5 // function main begins program execution
6 int main()
7 {
8 std::cout << "Welcome ";
9 std::cout << "to C++!\n";
10
11 return 0; // indicate that program ended successfully
12
13 } // end function main
شكل 3-2 | چاپ متن در يك خط با چند عبارت.
1 // Fig. 2.4: fig02_04.cpp
2
// Printing multiple lines of text with a single statement.
3
#include <iostream> // allows program to output data to the screen
4
5
// function main begins program execution
6
int main()
7
{
8
std::cout << "Welcome\nto\n\nC++!\n";
9
10
return 0; // indicate that program ended successfully
11
12
} // end function main
شكل 4-2 | چاپ متن در چند خط با يك عبارت.
4-2 يك برنامه ساده ديگر: جمع اعداد صحيح
در برنامه بعدي از شي جريان ورودي
std::cin
و عملگر استخراج
>>
، براي بدست آوردن دو عدد صحيح تايپ شده از سوي كاربر از طريق صفحهكليد، جمع آنها و نمايش نتيجه بدست آمده با استفاده از
std::cout
ميپردازيم. برنامه شكل 5-2 عمل جمع و خروجي حاصل از اين برنامه را نشان ميدهد.
1
// Fig. 2.5: fig02_05.cpp
2
// Addition program that displays the sum of two numbers.
3
#include <iostream> // allows program to perform input and output
4
5
// function main begins program execution
6
int main()
7
{
8
// variable declarations
9
int number1; // first integer to add
10
int number2; // second integer to add
11
int sum; // sum of number1 and number2
12
13
std::cout << "Enter first integer: "; // prompt user for data
14
std::cin >> number1; // read first integer from user into number1
15
16
std::cout << "Enter second integer: "; // prompt user for data
17
std::cin >> number2; // read second integer from user into number2
18
19
sum = number1 + number2; // add the numbers; store result in sum
20
21
std::cout << "Sum is " <<sum <<std::endl; //display sum; end line
22
23
return 0; // indicate that program ended successfully
24
25
} // end function main
شكل 5-2 | برنامه جمع كه مجموع دو عدد صحيح دريافتي از صفحه كليد را محاسبه ميكند.
توضيحات موجود در خطوط
1
و
2
// Fig. 2.5: fig02_05.cpp
// Addition program that displays the sum of two numbers.
نشاندهنده نام فايل و هدف برنامه هستند. رهنمود پيشپردازنده
C++
#include <iostream> // allows program to perform input and output
در خط
3
حاوي محتويات سرآيند فايل
iostream
در برنامه است.
همانطوري كه قبلاٌ هم گفته شد، هر برنامهاي با اجراي تابع
main
آغاز ميشود(خط
6
). براكت سمت چپ (خط
7
) ابتدا و آغاز بدنه
main
و براكت متناظر سمت راست (خط
25
)، انتها و پايان بدنه را نشان ميدهد.
خطوط
9-11
int number1; // first integer to add
int number2; // second integer to add
int sum; // sum of number1 and number2
بخش اعلان ميباشند. كلمات
number1
،
number2
و
sum
اسامي متغيرها هستند.
متغيرها مكانهاي در حافظه كامپيوتر هستند كه ميتوان مقاديري را براي استفاده برنامه در آنها ذخيره كرد.
اين اعلانها مشخص ميكنند كه متغيرهاي
number1
،
number2
و
sum
از نوع داده
int
هستند، به اين معني كه اين متغيرها قادر به نگهداري مقادير صحيح همانند اعداد
7, -11, 0, 31914
و غيره ميباشند.
تمامي متغيرها بايستي داراي نام و يك نوع داده باشند تا بتوان از آنها در برنامه استفاده كرد. چندين متغير از يك نوع را ميتوان در خط يا چند خط مجزا از هم اعلان كرد. ميتوانيم هر سه متغير فوق را در يك خط و بصورت زير اعلان كنيم:
int number1, number2, sum;
با اين همه، در اين حالت خوانائي برنامه كاهش يافته و مانع ميشود تا توضيحات مناسب براي هر متغير و هدف از آن متغير در برنامه را وارد سازيم. اگر بخواهيم بيش از يك متغير در يك خط اعلان كنيم (همانند مورد بالا) بايد اسامي را با يك ويرگول
(,)
از يكديگر جدا كنيم. كه به اين حالت ليست جدا شده با ويرگول گفته ميشود.
برنامهنويسي ايدهال
پس از هر ويرگول(
,
) يك فاصله قرار دهيد تا خوانائي برنامه افزايش يابد.
برنامهنويسي ايدهال
برخي از برنامهنويسان ترجيح ميدهند تا هر متغير را در يك خط جداگانه اعلان كنند. در اين حالت قراردادن يك توضيح در كنار هر اعلان به آساني صورت ميگيرد.
بزودي در مورد نوع داده
double
(خاص اعداد حقيقي، اعداد با نقطه اعشار همانند
3.4
و
-11.19
) و نوع داده
char
(خاص داده كاراكتري، يك متغير از نوع
char
فقط ميتواند يك حرف كوچك، يك حرف بزرگ، يك رقم يا يك كاراكتر خاص همانند
$
يا
*
را در خود ذخيره سازد) صحبت خواهيم كرد.
غالباً به نوعهاي همانند
double
،
int
و
char
نوعهاي بنيادين، نوعهاي اصلي يا نوعهاي توكار
(built-in)
ميگويند. انواع نوعهاي بنيادين از جمله كلمات كليدي هستند و از اينرو بايد تماماً با حروف كوچك به نمايش درآيند.
نام يك متغير (همانند
number1
) ميتوانند هر شناسه معتبري كه يك كلمه كليدي نيست، باشد. يك شناسه متشكل از دنبالهاي از كاراكترها شامل حروف، ارقام و خط زيرين
( _ )
است. يك شناسه نميتواند با يك رقم آغاز شود. زبان
C++
از جمله زبانهاي حساس به موضوع است، به اين معني كه مابين حروف كوچك و بزرگ تفاوت قائل ميشود. از اينرو شناسههاي
a1
و
A1
با هم برابر نيستند.
قابليت حمل
زبان
C++
به شناسهها امكان مي دهد تا هر طولي داشته باشند، اما امكان دارد سيستم شما يا ساختار
C++
بكار رفته محدوديتهائي بر روي طول شناسهها اعمال كند. از اينرو براي حفظ سازگاري و قابليت حمل، از شناسههائي با طول
31
كاراكتر يا كمتر استفاده كنيد.
برنامهنويسي ايدهال
انتخاب اسامي با معني به برنامه كمك ميكند كه خود به عنوان توضيحي بر برنامه باشد
(self- documenting)
. در چنين حالتي اگر متن برنامه در اختيار ديگران قرار داده شود، بدون اينكه نيازي به راهنما و توضيحات اضافي باشد، عملكرد برنامه مشخص خواهد بود.
برنامهنويسي ايدهال
از اختصار يا كوتهسازي شناسهها اجتناب كنيد، تا خوانايي برنامه افزايش يابد.
برنامهنويسي ايدهال
از ايجاد شناسههاي كه با يك خط زيرين يا دو خط زيرين آغاز ميشوند اجتناب كنيد، چراكه امكان دارد كامپايلر
C++
از اسامي مشابهاي براي انجام مقاصد داخلي خود استفاده كرده باشد. در اينصورت از ايجاد تداخل مابين خود و كامپايلر جلوگيري خواهيد كرد.
اجتناب از خطا
زبانهاي همانند
C++
هميشه در حال بسط و گسترش هستند. امكان در زمان تكامل، كلمات كليدي جديدي به آنها افزوده شود. از كلمات مسئوليت آوري همانند
object
بعنوان شناسه اجتناب كنيد. حتي اگر امروز كلمه
object
جزء كلمات كليدي در
C++
نباشد، اما ميتواند روزي تبديل به كلمه كليدي گردد و در آينده برنامه شما در زمان كامپايل با خطاي جديدي مواجه شود كه قبلا چنين چيزي وجود نداشت.
تقريباٌ ميتوان اعلان متغيرها را در هر كجاي برنامه قرار داد، اما بايد قبل از اينكه توسط برنامه بكار گرفته شوند، اعلان گردند. براي مثال، در برنامه شكل 5-2، اعلان در خط
9
int number1; // first integer to add
ميتوانست بلافاصله قبل از خط
std::cin >> number1; // read first integer from user into number1
قرار داده شود. اعلان موجود در خط
10
int number2; // second integer to add
ميتوانست بلافاصله قبل از خط
17
std::cin >> number2; // read second integer from user into number2
و اعلان خط
11
int sum; // sum of number1 and number2
ميتوانست بلافاصله قبل از خط
19
sum = number1 + number2; // add the numbers; store result in sum
اعلان گردد.
برنامهنويسي ايدهال
بهتر است در ميان خطوط توضيحات از يك خط خالي استفاده شود. در اينصورت توضيحات از كد برنامه جدا شدة و خوانائي برنامه افزايش مييابد
.
برنامهنويسي ايدهال
اگر ترجيح ميدهيد كه اعلانها را در ابتداي يك تابع قرار دهيد، آنها را از بخش عبارات اجرائي موجود در داخل بدنه تابع و با استفاده از يك خط خالي جدا كنيد تا اين دو بخش از هم متمايز شوند.
خط
13
std::cout << "Enter first integer: "; // prompt user for data
مبادرت به چاپ رشته
Enter first integer
(بعنوان رشته ليترال نيز شناخته ميشود) بر روي صفحه نمايش ميكند. به چنين پيغامهاي
prompt
گفته ميشود، چراكه به كاربر ميگويند كه چه كاري بايد انجام دهد. خط
14
std::cin >> number1; // read first integer from user into number1
با استفاده از شي ورودي
cin
(از فضاي نامي
std
) و عملگر
>>
، مقداري از صفحهكليد دريافت ميكند. با استفاده از عملگر
>>
به همراه
std::cin
كاراكترها از يك ورودي استاندارد كه معمولا صفحهكليد است، دريافت ميشوند. در واقع ميتوان گفت كه
std::cin
مقداري براي
number1
دريافت ميكند.
هنگامي كه برنامه اجرا شده و به عبارت فوق ميرسد، منتظر ميماند تا كاربر مقداري براي متغير
number1
وارد سازد. كاربر با تايپ يك مقدار صحيح و سپس فشردن كليد
Enter
(گاهاٌ به اين كليد، كليد
Return
هم ميگويند) به برنامه پاسخ ميدهد. با اين عمل مقدار تايپ شده به كامپيوتر ارسال ميشود. سپس كامپيوتر كاراكترهاي دريافت شده را به يك عدد صحيح تبديل و اين عدد (يا مقدار) را به متغير
number1
نسبت ميدهد. از اين نقطه به بعد هر مراجعهاي به
number1
در اين برنامه مترادف با استفاده از اين مقدار خواهد بود.
شيهاي
std::cout
و
std::cin
تعامل مابين كاربر و كامپيوتر را تسهيل ميبخشند. بدليل اينكه اين تعامل بفرم يك گفتگو است، غالباٌ به اينحالت محاسبه تعاملي يا محاورهاي گفته ميشود.
خط
16
std::cout << "Enter second integer: "; // prompt user for data
مبادرت به چاپ
Enter second integer
بر روي صفحه نمايش ميكند. اين عبارت به كاربر اعلان مي كند كه چه كاري انجام دهد. خط
17
std::cin >> number2; // read second integer from user into number2
مقداري براي متغير
number2
از سوي كاربر بدست ميآورد.
عبارت تخصيص دهنده در خط
19
sum = number1 + number2; // add the numbers; store result in sum
مجموع متغيرهاي
number1
و
number2
را محاسبه و نتيجه آنرا به متغير
sum
تخصيص ميدهد. از عملگر تخصيص
=
به اين منظور استفاده شده است. مفهوم عبارت فوق به اين مضمون است "
sum
مقدار خود را از
number1 + number2
بدست ميآورد." اكثر محاسبات در بين عبارات تخصيصي صورت ميگيرند. به عملگر
=
و عملگر
+
، عملگرهاي باينري گفته ميشود چرا كه هر كداميك از آنها داراي دو عملوند هستند. در مورد عبارت فوق، عملگر
+
، داراي دو عملوند
number1
و
number2
است. همچنين عملگر
=
، داراي دو عملوند
sum
و مقدار بدست آمده از
number1 + number2
است.
برنامهنويسي ايدهال
در هر دو طرف يك عملگر باينري چند فاصله قرار دهيد. فاصلهها باعث متمايز شدن نقش عملگر شده و خوانائي عبارتا افزايش مييابد.
خط
21
std::cout << "Sum is " << sum << std::endl; // display sum; end line
مبادرت به چاپ
رشته كاراكتري
Sum is
و بدنبال آن مقدار عددي متغير
sum
توسط عبارت
std::endl
ميكند.
end1
كوتاه شده
“end line”
بوده و متعلق به فضاينامي
std
ميباشد. كنترل كننده جريان
std::endl
يك خط جديد به خروجي منتقل و سپس "بافر خروجي را خالي ميكند." به اين معني كه، در برخي از سيستمها خروجي در ماشين انباشته ميشود تا زمانيكه "ارزش" نمايش در صفحه نماش را پيدا كنند، عبارت
std::endl
خروجيهاي انباشته شده را مجبور ميكند تا در يكباره به نمايش در آيند.
دقت كند كه عبارت قبلي دو مقدار از انواع مختلف را خارج ميسازد. عملگر
<<
از نحوه ارسال هر نوع داده به خروجي مطلع است. به روش استفاده از چندين عملگر
<<
در يك عبارت، عمليات زنجير كردن، متصل كردن يا فرآيند آبشاري گفته ميشود. از اينرو، داشتن چندين عبارت خروجي براي خارج كردن چند داده متمايز ضروري نيست.
البته ميتوان محاسبات را در بين عبارات خروجي هم انجام داد. ميتوانيم عبارات موجود در خطوط
19
و
21
را در يك عبارت، بفرم زير داشته باشيم
std::cout << “Sum is “ << numbeer1 + number2 << std::endl;
بنابر اين ديگر نيازي به متغير
sum
نخواهد بود. براكت راست،
{
، به كامپيوتر اطلاع ميدهد كه به انتهاي تابع
main
رسيده است.
از جمله توانمنديهاي
C++
اين است كه به كاربران اجازه ميدهد تا نوع دادههاي مورد نياز و متعلق به خود را ايجاد كنند (در فصل سوم در اين مورد و در فصلهاي نهم و دهم نگاهي دقيق به اين موضوع خواهيم داشت). سپس با نحوه رسيدگي
C++
به هنگام كار با نوع دادههاي جديد با استفاده از عملگرهاي
>>
و
<<
بيشتر آشنا خواهيد شد .