-
فرشید پوشنده
1405/05/24
-
25 مرداد 1405
بازگشت به: آموزش برنامه نویسی c++ سی پلاس پلاس
۱.۱ — دستورات (Statements) و ساختار برنامه
معرفی فصل
به اولین فصل اصلی از این آموزشهای C++ خوش آمدید!
در این فصل، نگاه اولیهای به تعدادی از مباحثی خواهیم داشت که برای هر برنامه C++ ضروری هستند. از آنجایی که مباحث زیادی برای پوشش دادن وجود دارد، اکثر آنها را در سطح نسبتاً سطحی (فقط به اندازهای که بتوانید کار کنید) پوشش خواهیم داد. هدف این فصل کمک به شما برای درک نحوه ساختار برنامههای پایه C++ است. تا پایان فصل، قادر خواهید بود برنامههای ساده خود را بنویسید.
در فصلهای آینده، اکثر این مباحث را دوباره بررسی کرده و آنها را با جزئیات بیشتر کاوش خواهیم کرد. همچنین مفاهیم جدیدی را معرفی خواهیم کرد که بر اساس این مباحث ساخته میشوند.
برای اینکه طول درسها قابل مدیریت باشد، ممکن است مباحث در چندین درس متوالی تقسیم شوند. اگر احساس میکنید که مفهوم مهمی در یک درس پوشش داده نشده است، یا سوالی دارید که در درس فعلی پاسخ داده نشده است، ممکن است در درس بعدی پوشش داده شده باشد.
دستورات (Statements)
یک برنامه کامپیوتری دنبالهای از دستورات است که به کامپیوتر میگوید چه کاری انجام دهد. یک دستور (Statement) نوعی از دستورالعمل است که باعث میشود برنامه یک عمل خاص را انجام دهد.
دستورات به مراتب رایجترین نوع دستورالعمل در یک برنامه C++ هستند. زیرا آنها کوچکترین واحد مستقل محاسباتی در زبان C++ هستند. از این نظر، آنها مانند جملات در زبان طبیعی عمل میکنند. وقتی میخواهیم ایدهای را به شخص دیگری منتقل کنیم، معمولاً به صورت جمله مینویسیم یا صحبت میکنیم (نه با کلمات یا هجاهای تصادفی). در C++، وقتی میخواهیم برنامه ما کاری انجام دهد، معمولاً دستورات مینویسیم.
اکثر (اما نه همه) دستورات در C++ به سمیکالن (Semicolon) ختم میشوند. اگر خطی را مشاهده کردید که به سمیکالن ختم میشود، احتمالاً یک دستور است.
در یک زبان سطح بالا مانند C++، یک دستور واحد ممکن است به بسیاری از دستورات زبان ماشین کامپایل شود.
اگر می خوای حرفه ای برنامه نویسی یاد بگیری!
آموزش برنامه نویسی c++
«++C یکی از قدرتمندترین زبانهای برنامهنویسی دنیاست که هم سرعت و کارایی زبان C را دارد و هم امکانات پیشرفتهی شیگرایی را در اختیار میگذارد. با ++C میتوان از ساخت سیستمعاملها و نرمافزارهای سیستمی گرفته تا طراحی بازیهای سهبعدی و پروژههای پیچیدهی صنعتی را انجام داد. یادگیری این زبان مثل داشتن کلید ورود به دنیای عمیقتر کامپیوتر است؛ جایی که میتوانی کنترل کامل روی حافظه، پردازش و ساختار برنامه داشته باشی و ایدههایت را با نهایت قدرت و سرعت به واقعیت تبدیل کنی.»
برای خوانندگان پیشرفته
انواع مختلفی از دستورات در C++ وجود دارد:
دستورات اعلان (Declaration statements)
دستورات پرش (Jump statements)
دستورات عبارت (Expression statements)
دستورات مرکب (Compound statements)
دستورات انتخاب (شرطیها) (Selection statements)
دستورات تکرار (حلقهها) (Iteration statements)
بلوکهای try (Try blocks)
تا زمانی که این مجموعه آموزشی را به پایان برسانید، خواهید فهمید که همه اینها چه هستند!
توابع (Functions) و تابع main
در C++، دستورات معمولاً در واحدهایی به نام تابع (Function) گروهبندی میشوند. یک تابع، مجموعهای از دستورات است که بهصورت ترتیبی (Sequentially) (به ترتیب، از بالا به پایین) اجرا میشوند.
همانطور که یاد میگیرید برنامههای خود را بنویسید، میتوانید توابع خود را ایجاد کنید و دستورات را به هر شکلی که میخواهید ترکیب و مطابقت دهید (نحوه انجام این کار را در یک درس آینده نشان خواهیم داد).
قانون
هر برنامه C++ باید یک تابع خاص به نام main (تمام حروف کوچک) داشته باشد.
هنگامی که برنامه اجرا میشود، دستورات داخل تابع main به ترتیب (Sequential Order) اجرا میشوند.
برنامهها معمولاً پس از اجرای آخرین دستور داخل تابع main پایان مییابند (هرچند برنامهها ممکن است در برخی شرایط زودتر از موعد خاتمه یابند، یا پس از آن برخی پاکسازیها را انجام دهند).
توابع معمولاً برای انجام یک کار خاص یا انجام یک عمل مفید نوشته میشوند. برای مثال، یک تابع به نام max ممکن است شامل دستوراتی باشد که تشخیص میدهد کدام یک از دو عدد بزرگتر است. یک تابع به نام calculateGrade ممکن است نمره یک دانشآموز را از مجموعهای از نمرات آزمون محاسبه کند. یک تابع به نام printEmployee ممکن است اطلاعات یک کارمند را در کنسول چاپ کند. به زودی مطالب بیشتری درباره توابع صحبت خواهیم کرد، زیرا آنها رایجترین ابزار سازماندهی در یک برنامه هستند.
نامگذاری (Nomenclature)
هنگام صحبت درباره توابع، معمول است که بهصورت اختصاری یک جفت پرانتز به انتهای نام تابع اضافه شود. برای مثال، اگر عبارت main() یا doSomething() را مشاهده کنید، این بهصورت اختصاری برای توابعی به نامهای main یا doSomething است. این کار به تشخیص توابع از سایر چیزهای دارای نام (مانند متغیرها) کمک میکند، بدون اینکه هر بار نیاز به نوشتن کلمه “تابع” باشد.
کاراکترها و متن
قدیمیترین کامپیوترها عمدتاً برای محاسبات ریاضی و پردازش داده طراحی شده بودند. با بهبود سختافزار، دسترسی به شبکه امکانپذیر شد و نرمافزارهای مصرفکننده تکامل یافتند، کامپیوترها همچنین به ابزارهای ارزشمندی برای ارتباط نوشتاری تبدیل شدند.
در زبان نوشتاری، اساسیترین واحد ارتباط، کاراکتر (Character) است. برای سادهسازی، یک کاراکتر یک نماد یا علامت نوشتاری است، مانند یک حرف، رقم، علامت نگارشی یا نماد ریاضی. وقتی یک کلید الفبایی یا عددی را روی صفحهکلید خود فشار میدهیم، یک کاراکتر تولید میشود که سپس میتواند روی صفحه نمایش داده شود. موارد زیر همه کاراکتر هستند: a، 2، $ و =.
در بسیاری از موارد، مانند زمانی که کلمات یا جملات را مینویسیم، میخواهیم از بیش از یک کاراکتر استفاده کنیم. یک دنباله از کاراکترها متن (Text) نامیده میشود (که در زمینه برنامهنویسی رشته (String) نیز نامیده میشود).
نامگذاری (Nomenclature)
هنگام صحبت درباره توابع، معمول است که بهصورت اختصاری یک جفت پرانتز به انتهای نام تابع اضافه شود. برای مثال، اگر عبارت main() یا doSomething() را مشاهده کنید، این بهصورت اختصاری برای توابعی به نامهای main یا doSomething است. این کار به تشخیص توابع از سایر چیزهای دارای نام (مانند متغیرها) کمک میکند، بدون اینکه هر بار نیاز به نوشتن کلمه “تابع” باشد.
برای خوانندگان پیشرفته
کامپیوترها نوع دیگری از کاراکترها دارند که “کاراکتر کنترل (Control Character)” نامیده میشوند. اینها کاراکترهایی هستند که برای سیستم کامپیوتری معنای خاصی دارند، اما یا برای نمایش در نظر گرفته نشدهاند، یا به صورت چیزی غیر از یک نماد قابل مشاهده نمایش داده میشوند. نمونههای معروف کاراکترهای کنترل عبارتند از: “escape” (که چیزی نمایش نمیدهد)، “tab” (که به صورت تعدادی فاصله نمایش داده میشود) و “backspace” (که کاراکتر قبلی را پاک میکند).
مطلب مرتبط
ما در مورد خروجی کاراکترها و متن در درس ۱.۵ — آشنایی با iostream: cout، cin و endl بحث میکنیم.
ما در مورد کاراکترها (از جمله کاراکترهای کنترل) با جزئیات بیشتر در درس ۴.۱۱ — کاراکترها (Chars) بحث میکنیم.
تشریح برنامه Hello World!
حالا که درک مختصری از چیستی دستورات (Statements) و توابع (Functions) دارید، بیایید به برنامه “Hello World” خود بازگردیم و نگاهی سطح بالا به عملکرد هر خط با جزئیات بیشتر بیندازیم.
1 #include <iostream>
2
3 int main()
4 {
5 std::cout << "Hello world!";
6 return 0;
7 }
خط ۱ نوع خاصی از خط است که دستور پیشپردازنده (Preprocessor Directive) نامیده میشود. این دستور پیشپردازنده #include نشان میدهد که ما میخواهیم از محتویات کتابخانه iostream استفاده کنیم، که بخشی از کتابخانه استاندارد C++ است که به ما امکان میدهد متن را از/به کنسول بخوانیم و بنویسیم. ما برای استفاده از std::cout در خط ۵ به این خط نیاز داریم. حذف این خط منجر به خطای کامپایل در خط ۵ میشود، زیرا در غیر این صورت کامپایلر نمیداند std::cout چیست.
خط ۲ خالی است و توسط کامپایلر نادیده گرفته میشود. این خط فقط برای کمک به خوانایی بیشتر برنامه برای انسانها وجود دارد (با جدا کردن دستور پیشپردازنده #include و بخشهای بعدی برنامه).
خط ۳ به کامپایلر میگوید که ما قصد داریم یک تابع بنویسیم (تعریف کنیم) که نام (شناسه) آن main است. همانطور که در بالا یاد گرفتید، هر برنامه C++ باید یک تابع main داشته باشد وگرنه در لینک کردن با شکست مواجه میشود. این تابع مقداری تولید میکند که نوع آن int (عدد صحیح) است.
خطوط ۴ و ۷ به کامپایلر میگویند که کدام خطوط بخشی از تابع main هستند. هر چیزی که بین آکولاد باز در خط ۴ و آکولاد بسته در خط ۷ قرار دارد، بخشی از تابع main محسوب میشود. به این قسمت بدنه تابع (Function Body) گفته میشود.
خط ۵ اولین دستور درون تابع main است و اولین دستوری است که هنگام اجرای برنامه ما اجرا میشود. std::cout (که مخفف “character output” یعنی خروجی کاراکتر است) و عملگر << به ما امکان میدهند اطلاعاتی را روی کنسول نمایش دهیم. در این مورد، ما متن Hello world! را نمایش میدهیم. این دستور خروجی قابل مشاهده برنامه را ایجاد میکند.
خط ۶ یک دستور بازگشت (Return Statement) است. وقتی یک برنامه اجرایی پایان مییابد، برنامه یک مقدار را به سیستمعامل برمیگرداند تا نشان دهد که آیا با موفقیت اجرا شده است یا خیر. این دستور بازگشت خاص، مقدار صحیح ۰ را به سیستمعامل برمیگرداند که به معنای “همه چیز خوب پیش رفت!” است. این آخرین دستوری است که در برنامه اجرا میشود.
همه برنامههایی که مینویسیم، از این الگوی کلی یا تغییراتی بر روی آن پیروی خواهند کرد.
یادداشت نویسنده
اگر بخشهایی (یا همه) از توضیحات بالا گیجکننده هستند، در این مرحله قابل انتظار است. این فقط برای ارائه یک نمای کلی سریع بود. درسهای بعدی به تمام مباحث فوق با توضیحات و مثالهای اضافی خواهند پرداخت.
شما میتوانید این برنامه را خودتان کامپایل و اجرا کنید و خواهید دید که خروجی زیر را در کنسول نمایش میدهد:
Hello world!
اگر در کامپایل یا اجرای این برنامه با مشکل مواجه شدید، به درس ۰.۸ — چند مشکل رایج در C++ مراجعه کنید.
نحو (Syntax) و خطاهای نحوی (Syntax Errors)
در زبان انگلیسی، جملات بر اساس قواعد دستوری خاصی ساخته میشوند که احتمالاً در کلاس انگلیسی در مدرسه یاد گرفتهاید. برای مثال، در نوشتار، جملات عادی با نقطه پایان مییابند. مجموعه قواعدی که نحوه چیدمان کلمات خاص (و علائم نگارشی) را برای تشکیل جملات معتبر در یک زبان توصیف میکنند، نحو (Syntax) نامیده میشوند. برای مثال، “My house painted is blue” یک خطای نحوی است، زیرا ترتیب کلمات غیرمتعارف است. “All your base are belong to us!” نمونه قابل توجه دیگری است.
زبان برنامهنویسی C++ نیز دارای یک نحو است که نحوه نوشتن و چیدمان عناصر برنامه شما را برای معتبر بودن برنامه توصیف میکند. وقتی برنامه خود را کامپایل میکنید، کامپایلر مسئول اطمینان از پیروی برنامه شما از این قواعد نحوی است. اگر برنامه شما کاری انجام دهد که از نحو زبان منحرف شود، کامپایلر کامپایل را متوقف کرده و یک خطای نحوی (Syntax Error) صادر میکند.
برخلاف زبان انگلیسی که ابهامات زیادی را مجاز میداند، قواعد نحوی C++ به طور دقیق تعریف و اجرا میشوند. خطاهای نحوی رایج هستند. خوشبختانه، چنین خطاهایی معمولاً به راحتی پیدا و برطرف میشوند، زیرا کامپایلر معمولاً شما را مستقیماً به آنها راهنمایی میکند. کامپایل یک برنامه تنها پس از رفع تمام خطاهای نحوی کامل میشود.
از آنجایی که نحو اکثر دستورات ایجاب میکند که آن دستورات به سمیکالن ختم شوند، بیایید ببینیم اگر سمیکالن را در خط ۵ برنامه “Hello World” حذف کنیم، چه اتفاقی میافتد، مانند این:
1 #include <iostream>
2
3 int main()
4 {
5 std::cout << "Hello world!"
6 return 0;
7 }
با خیال راحت این برنامه نادرست (Ill-Formed) را خودتان کامپایل کنید.
وقتی با استفاده از Clang کامپایل میشود، پیام خطای زیر تولید میشود:
prog.cc:5:31: error: expected ';' after expressionClang به ما میگوید که در خط ۵ در کاراکتر ۳۱، قواعد نحو نیاز به سمیکالن دارند، اما ما یکی ارائه ندادیم. بنابراین، کامپایل با یک خطا متوقف شد.
وقتی به جای آن با Visual Studio کامپایل میشود، کامپایلر این خطای کامپایل را تولید میکند:
c:\vcprojects\hello.cpp(6): error C2143: syntax error : missing ';' before 'return'توجه کنید که Visual Studio میگوید خطا در خط ۶ (به جای خط ۵) مواجه شده است. پس کدام یک درست میگویند؟ هر دو، به نوعی.
Clang میداند که ما بهطور قراردادی سمیکالن را در انتهای دستورات قرار میدهیم، بنابراین بر اساس این فرض که ما این کار را انجام میدهیم، گزارش میدهد که خطا در خط ۵ است. Visual Studio تصمیم میگیرد خطی را که هنگام تشخیص وقوع خطا در حال کامپایل آن بوده است (در خط ۶، زمانی که به جای سمیکالن مورد انتظار با return مواجه شده است) گزارش دهد.
نکته کلیدی
کامپایلرها گاهی اوقات گزارش میدهند که یک خطا در خط بعد از خطی رخ داده است که ما معمولاً مشکل را در آن برطرف میکنیم. اگر نمیتوانید خطا را در خط مشخصشده پیدا کنید، خط قبلی را بررسی کنید.
برای دیدن پیامهای خطای مختلف دیگر، با حذف کاراکترها یا حتی کل خطوط از برنامه “Hello world” آزمایش کنید. همچنین سعی کنید سمیکالن از دست رفته را در انتهای خط ۵ بازیابی کنید، و سپس خطوط ۱، ۳ یا ۴ را حذف کنید تا ببینید چه اتفاقی میافتد.