جلسهي پنجاه و سوم
صفحهي اصلي رباتيك
جلسهي پنجاه و پنجم
با عرض سلام خدمت دوستان عزیز در جلسهی گذشته با مفهوم توابع در زبانهای برنامهنویسی، و کاربردهای آن، و همچنین مفهوم برنامهنویسی ساختیافته آشنا شدیم. در این جلسه با نحوهی تعریف توابع آشنا خواهیم شد. همانطور که در جلسهی گذشته هم اشاره شد، وقتی تابعی توسط تابع دیگری فراخوانی میشود، دستورات آن تابع اجرا میشود. پس از اجرای دستورات تابع، کنترل اجرای برنامه به برنامه فراخوان بر میگردد. پس از برگشت از تابع فراخوانی شده، اولین دستور بعد از فراخوانی تابع (در تابع فراخوان) اجرا میشود. بحث را با تعریف تابع دنبال خواهیم کرد. برای تعریف تابع باید اهداف تابع مشخص باشد. اینکه تابع باید دقیقاً چه بخش از مسولیتهای کل برنامه را انجام دهد و بر آن اساس چه ورودی و خروجیهایی دارد.
یک تابع در زبان C طبق الگوی زیر تعریف میشود:
<نوع خروجی تابع) نام تابع <ورودیهای تابع) { <دستور 1> <دستور 2> . . . n دستور }
الگوی تابع:خط اول هر تابع را، که متشکل از نام تابع، ورودیها و خروجیهای تابع است را الگو یا پروتوتایپ (Prototype) تابع میگویند.
نام تابع: نام تابع باید از قوانین Identifierها در زبان C پیروی کند، یعنی همان قوانینی که برای تعیین نام متغیرها و یا کلاً هر شناسهای که در زبان C ، باید رعایت شود. نام تابع را معمولاً متناسب با مسولیتی که آن تابع بر عهده دارد تعیین میکنند.
وردوی تابع ما میتوانیم در هنگام فراخوانی هر تابع، اطلاعاتی را به آن منتقل کنیم تا تابع بر اساس این اطلاعات رفتار مناسبی انجام دهد، در زبان C به این ورودیهای تابع، پارامتر میگویند. در حقیقت پارامترها وسیلهای برای تبادل اطلاعات بین تابع فراخوان و فراخوانی شونده هستند. یک پارامتر میتواند یکی از انواع داده در زبان C مثل int، char و ... باشد. همچنین برای هر پارامتر باید یک نام تعیین شود. تعریف پارامترهای یک تابع دقیقاً مانند تعریف متغیر است. مثلاً برای تعریف تابعی که فقط یک ورودی از جنس int دارد باید خط اول تابع به این شکل باشد: نام تابع نوع خروجی تابع (int temp) برای دسترسی به اطلاعات ورودی در داخل تابع، باید از نام پارامتر مربوطه استفاده کنیم. مثلاً اگر بخواهیم مقدار ورودی تابع بالا چک کنیم که آیا از عدد فرضی 100 بزرگتر است با خیر میتوانیم دستور زیر را در داخل تابع بنویسیم: نام تابع نوع خروجی تابع (int temp) { if (temp > 100) { دستورات } else { دستورات } } اگر بخواهیم بیش از یک ورودی داشته باشیم، باید در داخل پرانتز پارامترها را با کاما از یکدیگر جدا کنیم: <نام تابع <نوع خروجی تابع (int temp, int temp2) چگونه مقدار ورودی تابع را تعیین میکنیم؟ همانطور که گفتیم مقدار ورودی تابع در هنگام فراخوانی تابع تعیین میشود. در قسمت فرواخوانی تابع به این موضوع خواهیم پرداخت.
نام تابع نوع خروجی تابع (int temp)
نام تابع نوع خروجی تابع (int temp) { if (temp > 100) { دستورات } else { دستورات } }
<نام تابع <نوع خروجی تابع (int temp, int temp2)
خروجی تابع در تعریف بالا <نوع خروجی تابع> یکی از انواع موجود در C مثل int یا char یا ... است، که توسط کاربر تعریف میشود. تابع میتواند مقداری را بر اساس نوع خروجی تابع به تابع فراخواننده باز گرداند. در صورتی که تابع ما خروجی نداشته باشد، باید به جای نوع خروجی، کلمهی کلیدی «void» را بنویسیم. بر خلاف ورودیهای تابع، خروجی نیازی به نام ندارد. همچنین یک تابع نمیتواند بیش از یک خروجی داشته باشد. برای باز گرداندن یک مقدار به عنوان خروجی، باید آن مقدار را در جلوی کلمهی کلیدی «return» بعد از آخرین خط دستورات تابع بنویسیم. مثلاً فرض کنید تابعی که خروجی آن از جنس int تعریف شده است، میخواهد مقدار 100 را به عنوان خروجی بازگرداند، شکل کلی آن اینگونه خواهد بود: int ورودی تابع) نام تابع) { دستور1; دستور2; دستور3; ... return 100; } این مقدار ممکن است در داخل یک متغیر ذخیره شده باشد و شما بخواهید مقدار داخل متغیر را بهعنوان خروجی بازگردانید، برای این کار کافیست در جلوی return نام متغیر را بنویسید. بهعنوان مثال، خط زیر، مقدار داخل متغیر temp را که قبلاً از جنس int تعریف شده است را باز میگرداند. return temp; دقت کنید که دستور return حتماً باید در آخرین خط هر تابع نوشته شود، زیرا دستوراتی که بعد از این دستور نوشته شوند، اجرا نخواهند شد، و روند اجرای برنامه به تابع فراخواننده باز گردانده خواهد شد. استفاده از مقداری که به عنوان خروجی باز گردانده میشود مربوط فراخوانی تابع است که در آن بخش به آن اشاره خواهیم کرد. بحث در مورد فراخوانی توابع و نحوهی کار با ورودی و خروجیهای تابع را به جلسهی آینده موکول خواهیم کرد. حالا برای جمعبندی مطالب این جلسه، یک مثال کامل را مطرح میکنیم. یک تابع به نام move برای کنترل حرکت روبات تعریف خواهیم کرد. این تابع خروجی ندارد، اما یک ورودی از جنس کاراکتر دارد. این کاراکتر 4 مقدار متفاوت میتواند داشته باشد. اگر این ورودی حرف F باشد، روبات باید به سمت جلو حرکت کند. اگر B باشد، به سمت عقب. R باشد به سمت راست؛ و L باشد باید به سمت چپ حرکت کند. در این جلسه به تعریف این تابع خواهیم پرداخت و فراخوانی آن را به جلسهی آینده موکول خواهیم کرد. (void move char(dir { if (dir == ‘F’) {دستورات مربوط به جلو رفتن روبات را اینجا مینویسیم} else if (dir == ‘B’) {دستورات مربوط به عقب رفتن روبات را اینجا مینویسیم} else if (dir == ‘R’) {دستورات مربوط به راست رفتن روبات را اینجا مینویسیم} else if (dir == ‘L’) {دستورات مربوط به چپ رفتن روبات را اینجا مینویسیم} } همانطور که میدانید، نام تنها پارامتر این تابع، dir است که از جنس کاراکتر تعریف شده است. خروجی تابع هم Void تعریف شده است و به این معنی است که این تابع خروجی ندارد. منتظر سولات و نظرات دوستان خوبم هستم. پیروز باشید امیرغیاثوند
int ورودی تابع) نام تابع) { دستور1; دستور2; دستور3; ... return 100; }
return temp;
(void move char(dir { if (dir == ‘F’) {دستورات مربوط به جلو رفتن روبات را اینجا مینویسیم} else if (dir == ‘B’) {دستورات مربوط به عقب رفتن روبات را اینجا مینویسیم} else if (dir == ‘R’) {دستورات مربوط به راست رفتن روبات را اینجا مینویسیم} else if (dir == ‘L’) {دستورات مربوط به چپ رفتن روبات را اینجا مینویسیم} }