کـــــــاربر فــــعال
این جلسه هم سیستمهای مختلف خاموش کردن آتش را مورد بررسی قرار دهیم.
یکی از سادهترین و رایجترین روشهای خاموش کردن آتش پاشیدن آب یا مواد ضد اشتعال دیگر بر روی آتش است. برای مجهز کردن ربات به این سیستم، فقط نیاز به یک عدد پمپ آب و یک مخزن کوچک برای ذخیرهی آب و یک مدار راه اندازی مختصر داریم. این روش از نظر پیچیدگی از سایر روشهای رایج سادهتر است و پیچیدگی مکانیکی و الکترونیکی زیادی هم ندارد.
پمب آب :
برای پمپ آب از پمپ آب شیشه شوی خودروی پراید استفاده میکنیم. برای تهیهی این پمپ میتوانید به فروشگاههای قطعات یدکی پراید مراجعه کنید.
این تصویر یک عدد پمپ شیشه شوی پراید به همراه منبع ذخیرهی آب آن است.
نحوهی استفاده :
این پمپ با ولتاژ 12 ولت راه اندازی میشود. وقتی به دو سر موتور این پمپ ولتاژ 12 ولت با جریان مناسب اعمال شود، این پمپ از دریچهی 1 آب را به داخل میکشد و از دریچهی 2 آب را با فشار به بیرون میپاشد. در نتیجه دریچهی شماره 1 باید توسط یک شیلنگ به یک مخزن آب متصل شود و آب خروجی از دریچهی 2 نیز باید توسط یک شیلنگ به سمتی هدایت شود که ربات بتواند آن را به روی آتش بریزد.
برای راه اندازی آن ابتدا سوکتی که بر روی دو سیم موتور نصب شده است با سیم چین جدا کنید (نیازی به آن سوکت نیست). حالا باید این دو سیم خارج شده از پمپ را توسط یک مدار کنترلی ساده کنترل کنید تا در مواقع لزوم پمپ روشن و خاموش شود.
مدار راه اندازی:
این پمپ جریان نسبتاً زیادی برای راه اندازی نیاز دارد، ما در اینجا قصد طراحی مداری را داریم که در آن یک خروجی 0 یا 5 ولت از میکرو کنترلر دریافت میکنیم و آن را به یک رلهی 5 ولت میدهیم تا رله تحریک شود، رله هم در حالت تحریک شده یک باطری 12 ولت را به پمپ متصل میکند. اما جریان خروجی میکروکنترلر ممکن است برای راه اندازی رله نیز کافی نباشد، در نتیجه از یک تقویت ترانزیستوری ساده نیز برای تقویت جریان خروجی میکروکنترلر به رله استفاده میکنیم. در نهایت مدار زیر را خواهیم داشت:
دقت کنید در این مدار ما از 2 منبع تغذیه استفاده میکنیم. یکی 12 ولت، یکی 5 ولت. ولتاژ 5 ولت برای استفاده در مدار میکروکنترلر، کلکتور ترانزیستور و در نهایت تحریک رله، و 12 ولت برای فعال سازی پمپ آب. همانطور که در جلسات گذشته گفته شد، برای تحریک رلهی 5ولت باید به پایههای تحریک آن ولتاژ 5 ولت بدهیم. در مدار بالا نیز پس از تحریک رله، ولتاژ 12 ولت به پمپ منتقل میشود و باعث فعال شدن آن میشود.
اما بپردازیم به راههای دیگری که برای خاموش کردن آتش وجود دارد. یکی دیگر از مطرحترین روشها برای خاموش کردن آتش، روش خفه کردن آن است.
روش خفه کردن آتش :
در این روش با گذاشتن یک در پوش بر روی ظرفی که در آن آتش درست شده است، مانع رسیدن اکسیژن به آتش میشویم و به این طریق آتش به سرعت خاموش میشود.
این روش سرعت بسیار مناسبی دارد و اگر به درستی اجرا شود بسیار سریعتر از روش قبلی میتواند آتش را خاموش کند. اما پیاده سازی این سیستم بر روی روبات کمی پیچیده است. پیچیدگی مکانیکی این سیستم نسبتاً بیشتر از سیستم قبلی است و نیاز به طراحی مکانیکی دقیق و کمی تجربه در این زمینه دارد.
برای خاموش کردن آتش روشهای ابتکاری دیگری هم وجود دارد، از دوستان عزیز هم تقاضا میکنم اگر ایدهی خاصی برای خاموش کردن آتش به ذهنشون میرسه در بحث ما مشارکت کنند و ایدهی خوبشون را با بقیهی دوستان در میان بگذارند.
جلسهی آینده دوباره به سراغ برنامه نویسی زبان C میرویم و شما را با مبحث توابع در زبان C آشنا خواهیم کرد. در باب اهمیت این مبحث باید عرض کنم که مبحث توابع شاید بتوان گفت مهمترین و پر کاربردترین مبحث در زبان C و اصولاً پایهی برنامه نویسی درمتُد ساخت یافته است.
کـــــــاربر فــــعال
در این جلسه در مورد استفاده از توابع در برنامهنویسی به زبان C بحث خواهیم کرد. به طبع اکثر مطالبی که در این جلسه مطرح میشود، فقط مختص بحث روباتیک نیستند، بلکه مربوط به روش برنامه نویسی به زبان C هستند. از این منظر بحث این جلسه بسیار مهم و پرکاربرد است.
بدون مقدمهی بیشتر به بحث باز میگردیم. تا کنون روش برنامهنویسی ما به این صورت بوده که تمام دستوراتی که می خواهیم روبات آنها را اجرا کند، به ترتیب در قسمتی که نوشته شده است (“Place your code here”) مینویسیم، و میکروکنترلر هم آنها را به ترتیب مشخص شده اجرا میکند.
اما این روش در طراحی و نوشتن برنامههای بزرگتر برای رباتهای حرفهای تر ما را دچار مشکل خواهد کرد. مثلاً در نوشتن یک برنامهی پیشرفتهتر، ممکن است در چندین جای مختلف برنامه، یک سری دستورات خاص عیناً تکرار شود. مثلاً فرض کنید در یک روبات مین یاب، ممکن است در 10 جای مختلف برنامه نیاز باشد به موتورها فرمان توقف داده شود. این فرمان توقف برای 4 موتور، حداقل نیاز به 8 خط برنامه دارد. حالا فرض کنید این رویه برای ده ها فرمان دیگر نیز در برنامه تکرار میشود، که فرمان "توقف" شاید سادهترین و کوتاهترین آنها باشد!
این روش برنامهنویسی علاوه بر زمان بَر بودن و پیچیده بودن، مشکلات دیگری هم دارد، از جمله این که از خوانایی برنامه به شدت کاسته میشود و به جز شخصی که برنامه را نوشته است، افراد دیگر به سختی خواهند توانست برنامهی نوشته شده را بررسی کنند و در صورت لزوم تغییراتی در آن اعمال کنند یا بخشهایی به آن اضافه یا کم کنند. در نتیجه امکان انجام یک کار گروهی بر روی یک برنامه میسر نخواهد بود و بالاخره برنامه های بزرگ و حرفهایتر(مثل یک بازی کامپیوتری، یا یک سیستم اتوماسیون) شاید اصلاً امکان به وجود آمدن نداشته باشند.
همچنین در چنین برنامهای، به علت حجم بسیار زیاد برنامه، اشکال زدایی به شدت مشکل میشود و در صورت بروز هر گونه خطایی در سیستم، به سختی میتوان مشکل را در برنامه یافت و آن را اصلاح کرد.
این مشکلات و شاید بسیاری دیگر، متخصصان امر را وادار به تهیهی چارچوب و اصول دقیقی در روش نوشتن برنامهها کرد. این اصول در قالب متدهای مختلف برنامه نویسی در طول سالیان متمادی، از لحظهی شکل گیری کامپیوتر تا به امروز، توسط افراد و نهادهای مختلف بین المللی مربوطه عرضه و تکمیل شده است. و هدف آنها نیز صرفاً کشف راهکارهایی برای بهبود روشهای برنامه نویسی و به دنبال آن ایجاد برنامههایی کار آمدتر و مناسبتر، با هزینههای پایینتر بوده است.
نخستین متدی که مورد پذیرش اکثر نهادها و شرکتهای بزرگ بین المللی قرار گرفت ، متد "ساخت یافته" بود. این متد بسیاری از مشکلات شرکتهای بزرگ تولید نرم افزار و کاربران حرفهای را حل کرد و تا سالها به عنوان کاملترین متد مورد پذیرش و استفاده قرار گرفت. هر چند پس از آن متدهای دیگری هم ارایه شد که شاید کار آمدتر هم بودند، اما هنوز هم این متد، به دلیل سادگی نسبی، طرفداران بسیاری دارد.
زبان C یک زبان ساخت یافته است، یعنی در برنامهنویسی به این زبان، برنامهنویس موظف است اصول برنامهنویسی ساخت یافته را رعایت کند. به همین خاطر از این به بعد ما تلاش خواهیم کرد شما را هر چه بیشتر با این متد برنامه نویسی آشنا کنیم تا انشاالله بتوانید برنامههای حرفهای تری را برای رباتهای پیشرفتهتر بنویسید.
برنامهنویسی ساختیافته:
مبنای برنامه نویسی ساخت یافته بر استفاده از توابع است. در این متد، یک برنامهی بزرگ، به چندین زیر برنامهی کوچکتر تقسیم میشود که هر کدام از این زیر برنامهها بخش یا بخشهایی از وظایف برنامهی اصلی را انجام میدهند. این زیر برنامهها در مجموع برنامهی اصلی را تشکیل میدهند. هریک از این زیر برنامهها تابع نام دارند.
در حقیقت در متد ساخت یافته، هیچ قسمتی از برنامه خارج از این توابع نوشته نمیشود، بلکه برای هر بخش از برنامه، متناسب با عملی که آن بخش انجام میدهد، تابعی تعریف میشود.
برای نوشتن یک برنامهی ساخت یافته، ابتدا باید تمام اعمالی که قرار است توسط این برنامه انجام شود لیست شوند. مثلاً برای یک ربات، باید تمام فرمانهایی که قرار است به بخشهای مختلف ربات داده شود(مثل موتورها، LCD، سنسورها و ...) لیست شوند، سپس برای هر بخش، یک تابعی متناسب با آن تعریف شود تا اعمال مربوط به آن بخش توسط آن تابع اداره شود. مثلاً برای موتورها میتوان تابعی تعریف نمود که کنترل موتورها را انجام دهد و بنا بر شرایط فراخوانی تابع، ربات را به یک جهت مشخصی حرکت دهد.
بحث در مورد توابع را به صورت مفصل در جلسهی آینده ادامه خواهیم داد، اما لازم میدانم در اینجا به چند مورد از مهمترین فواید برنامه نویسی با متد ساخت یافته، به نقل از کتاب مهندس جعفر نژاد قمی اشاره کنم.
1نوشتن برنامههای ساخت یافته آسان است، زیرا برنامههای پیچیده به بخشهای کوچکتری تقسیم میشوند و هر بخش توسط تابعی نوشته میشود. دستورالعملها و دادههای موجود در تابع، مستقل از سایر بخشهای برنامه است.
2همکاری بین افراد تیم را فراهم میکند. به طوری که افراد مختلف میتوانند بخشهای مختلفی از برنامه را بنویسند.3اشکال زدایی برنامههای ساخت یافته سادهتر است. اگر برنامه اشکالی داشته باشد، بررسی تابعی که اشکال در آن به وجود آمده است، ساده است.4برنامه نویسی ساخت یافته موجب صرفه جویی در وقت میشود. بدین ترتیب که، اگر تابعی بنویسید که عملی را در برنامهای انجام دهد، میتوانید آن تابع را در برنامهی دیگری که به این عمل نیاز دارد، به کار ببرید. حتی اگر، با تغییر اندکی در توابع نوشته شده، بتوانید آنها را در برنامههای دیگر به کار ببرید، باز هم مقرون به صرفه است.
توابع:
توابع در زبان C از دو زاویه قابل بررسی هستند، نخست تعریف توابع؛ دوم، فراخوانی توابع.
تعریف تابع: از یک مجموعه دستورات برنامهنویسی تشکیل شده است که عملکرد و وظایف آن تابع را مشخص میسازد.
فراخوانی تابع: دستوراتی که در داخل آن تابع تعریف شده است را اجرا میکند.
فراخوانی هر تابع، توسط یک دستور صورت میگیرد، این دستور همان نام تابع است. یعنی در هر کجای برنامه که نام یک تابع نوشته شود، روند اجرای برنامه در آن خط متوقف میشود، و دستوراتی که در داخل آن تابع نوشته شده است، یکبار اجرا میشود. پس از اجرای دستورات داخل آن تابع، اجرای برنامه مجدداً از همان جایی که متوقف شده بود دنبال میشود.
منبع:http://www.roshd.ir
دوست جدید
سلام دوست عزیز من تازه می خوام شروع کنم به یادگیری روباتیک.واسه شروع راهنمایی نیاز دارم اگه کمکم کنید ممنون میشم![]()
دوست داشتن از عشق برتر استو من هرگز خود راتا سطح بلند ترین قله عشق های بلند ، پایین نخواهم آورد"دکتر شریعتی"
دوست آشنا
کاربر جدید
سلام دوست عزیز من هم مثل تو تازه شروع کردم ولی با استفاده از مطالب این تاپیک تا حد زیادی پیش رفتم اگه از اول همه مطالب را بخونی و یه کم پشتکار دا شته باشی میتونی رباتت را بسازی اگه باز هم به مشکلی بر خوردی می تونی با بچه ها تالار برق مشورت کنی
رو بچها حساب ویژه باز کن آخه خیلی گلن من و هم خیلی کمک کردن![]()
کاربر جدید
سلام یه سوال دارم اونم اینکه چرا تو انجمن های فارسی انقد سرعت پاینه و مباحثی که میتونن مثل این مبحث مفید باشن باید انقد طول بکشن اخرشم بی سرو ته رها شن![]()
امروز ما گذشته ی فردا است و فردا گذشته آینده مان و در آخرت اعمال گذشته ی ما را می سنجند پس بیاید از همین امروز بنده ی خوبی برای خدایمان باشیم
دوست آشنا
سلام
این الان بیشتر انتقاده تا سوال
ولی دوست عزیز در کمال احترام باید عرض کنم این حضور دوستان دیگس که به آدم انگیزه میده برای ادامه دادن وقتی دوستان کم لطفی کنن نتیجه اون بی نتیجه رها شدنه بحثه بعدشم واقعن به نظرت این تایپیک نیمه کاره رها شده؟
در مورد سرعت کمم متاسفانه کاری از دسته ما ساخته نیست چون سرعت تو ایران خیلی پایینه و ما هم یه فروم ایرانی هستیم![]()
کـــــــاربر فــــعال
این جلسه با نحوهی تعریف توابع آشنا خواهیم شد.
همانطور که در جلسهی گذشته هم اشاره شد، وقتی تابعی توسط تابع دیگری فراخوانی میشود، دستورات آن تابع اجرا میشود. پس از اجرای دستورات تابع، کنترل اجرای برنامه به برنامه فراخوان بر میگردد. پس از برگشت از تابع فراخوانی شده، اولین دستور بعد از فراخوانی تابع (در تابع فراخوان) اجرا میشود.
بحث را با تعریف تابع دنبال خواهیم کرد. برای تعریف تابع باید اهداف تابع مشخص باشد. اینکه تابع باید دقیقاً چه بخش از مسولیتهای کل برنامه را انجام دهد و بر آن اساس چه ورودی و خروجیهایی دارد.
تعریف توابع
یک تابع در زبان 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)
چگونه مقدار ورودی تابع را تعیین میکنیم؟
همانطور که گفتیم مقدار ورودی تابع در هنگام فراخوانی تابع تعیین میشود. در قسمت فرواخوانی تابع به این موضوع خواهیم پرداخت.
خروجی تابع
در تعریف بالا <نوع خروجی تابع> یکی از انواع موجود در 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 تعریف شده است و به این معنی است که این تابع خروجی ندارد.
کـــــــاربر فــــعال
جلسه گذشته در مورد تعریف توایع و نحوهی معرفی ورودی و خروجیهای توابع بحث کردیم. در این جلسه در مورد فراخوانی توابعی که تعریف شدهاند و نحوهی کار با ورودی و خروجیهای آنها بحث خواهیم کرد.
فراخوانی توابع
برای اجرای دستورات هر تابع، باید تابع فراخوانی شود. برای فراخوانی توابع، کافیست نام تابع را در هر قسمت از برنامه که به آن تابع نیاز هست، بنویسید. سپس مقادیری که باید به عنوان ورودی به تابع تحویل شود را در جلوی نام تابع در داخل یک پرانتز بنویسید. و در پایان هم ";" را فراموش نکنید. به عنوان مثال برای تابعی با نام move به شکل زیر عمل میکنیم:
move(مقادیر ورودی)
نحوهی تعیین ورودیهای تابع
به عنوان مثال تابع ()move را از جلسهی گذشته در نظر بگیرید. این تابع برای کنترل حرکت روبات نوشته شده است و باید یک کاراکتر را به عنوان ورودی دریافت کند.فرض کنید در قسمتی از برنامه میخواهیم به روبات دستور جلو رفتن بدهیم. برای این کار کافیست تابع ()move را با مقدار ورودی (‘F’)، فراخوانی کنیم. برای این کار، کافیست دستور زیر را بنویسید:
move(‘F')
اگر این تابع چند ورودی داشت، باید در هنگام فراخوانی مقادیر توسط کاما از یکدیگر جدا شوند. به عنوان مثال:
temp( ‘F’ , 200);
همانطور که میبینید تابع temp دو ورودی دارد که یکی از جنس حروف (Character) و دیگری از جنس عددی (Integer) است. دقت کنید که اگر جنس پارامتر از Char باشد، باید کاراکترهایی که به عنوان ورودی به تابع ارسال میشوند، در داخل ‘ ‘ قرار گیرند. اطلاعاتی که در هنگام فراخوانی تابع، در جلوی نام تابع (در داخل پرانتز) به عنوان مقادیر ورودی ظاهر می شوند، آرگومان تابع نام دارند. دقت داشته باشید پارامتر ها متغیرهایی هستند که هنگام تعریف تابع، در جلوی نام تابع و در داخل پرانتز قرار می گیرند، اما آرگومانها در هنگام فراخوانی در جلوی نام تابع درج میشوند.
نحوهی استفاده از خروجی تابع
همانطور که در جلسهی گذشته توضیح داده شد، هر تابع میتواند یک مقدار را به عنوان خروجی تابع به فراخواننده بازگرداند. این مقدار از طریق نام تابع قابل دسترسی خواهد بود. یعنی همانطور که مقداری که داخل هر متغیر ذخیره شده است از طریق نام آن متغیر قابل دسترسی است، مقداری که به عنوان خروجی تابع بازگردانده شده است هم، از طریق نام تابع قابل دسترسی است. به عنوان مثال تابع زیر را در نظر بگیرید:
int compass ()
{
دستورات مربوطه;
return degree;
}
این تابع برای خواندن مقدار سنسور قطبنمای الکتریکی نوشته شده است که این مقدار همان زاویهی قطب نما نسبت به قطبهای کرهی زمین است؛ و یک خروجی از جنس int دارد که حامل زاویهای است که قطب نمای الکتریکی نشان میدهد. حالا هر کجا که نام تابع نوشته شود، یکبار تابع فراخوانی میشود و خروجی تابع از طریق نام تابع قابل دسترسی خواهد بود. به عنوان مثال اگر بخواهیم خروجی تابع بالا را از طریق یک دستور شرطی چک کنیم، میتوان دستور زیر را نوشت.
if ( compass() > 128)
{ دستورات;}
همچنین میتوان مقدار خروجی را داخل یک متغیر کمکی ذخیره کرد، بهعنوان مثال:
Temp= compass();
دقت داشته باشید که اگر تابع، پارامتر ورودی هم نداشته باشد، باید پرانتزِ باز و بسته جلوی نام تابع درج شود.
همانطور که گفته شد، ما نمیتوانیم هیچ بخش از برنامه را خارج از توابع بنویسیم، یعنی هر خط از برنامهی ما، باید حتماً در یکی از توابع گنجانده شده باشد. اما سوال این جاست که تا کنون که ما کار با توابع را بلد نبودیم، دستوراتی که مینوشتیم چگونه اجرا میشدند؟
تابع main():
در هر برنامهای که در زبان C نوشته میشود، میبایست تابعی با نام ()mainوجود داشته باشد. روند اجرای برنامه از همین تابع شروع میشود، یعنی اولین تابعی که دستوراتش اجرا میشود همین تابع است. برای اجرای هر برنامهای که ما در زبان C مینویسیم، تابع ()main در برنامهیِ ما، توسط سیستم عامل فراخوانی میشود، و پس از اجرای تمام دستورات ()main، کنترل دوباره به سیستم عامل باز گردانده میشود. در حقیقت، تابع ()main تنها تابعی است که وجودش الزامی است و با اتمام کار این تابع، روند اجرای دستورات برنامه هم پایان میرسد.
در محیط CodeVision هم در همان ابتدا تابع ()main توسط CodeWizard تعریف میشود و دیگر نیازی نیست ما مجدداً این تابع را تعریف کنیم. با کمی دقت میتوانید الگوی تعریف تابع()main را در برنامه پیدا کنید. نکتهی مهم این که همانطور که در بالا گفته شد، پس از اجرای دستورات تابع ()main کار برنامه به اتمام میرسد و میکروکنترلر دیگر کاری انجام نمیدهد، به همین خاطر اگر میخواهیم برنامهای که نوشتهاید مکرراً اجرا شود باید آنها را در داخل یک حلقهای بنویسیم که دستوراتش بی نهایت بار تا زمانی که میکروکنترلر روشن است انجام شود. برای این کار میتوانید از حلقهی ()while به شکل زیر استفاده کنید:
while(1)
{
دستورات;
}
نوشتن عدد "1" به جای شرط حلقه، در داخل پرانتز، به این مفهوم است که شرط اجرای حلقه همواره برقرار است و دستورات داخل حلقه باید بینهایت بار انجام شوند. اما خوشبختانه CodeWizard این کار را هم برای ما انجام داده است و حلقهای به شکل بالا برای کار ما تعریف کرده است که ما دستوراتمان را در داخل آن حلقه بنویسیم. (برای یاد آوری رجوع شود به جلسهی 26).
نکتهی مهم در مورد تعریف توابع
توابع باید در کدام قسمت برنامه تعریف شوند؟ برای این که توابعی که تعریف میکنیم در همهی بخشهای برنامه قابل استفاده و فراخوانی باشند، باید آنها درست قبل از تابع()mainتعریف کنیم. یعنی ابتدا خطی که الگوی تابع()main نوشته شده است را پیدا کنید، سپس هر تابعی که میخواهید را قبل از آن تعریف کنید. البته بحث در مورد حوزهی استفاده و دسترسی به توابع بسیار مفصل است،اما این مطالب برای انجام کارهای ما کفایت میکنند. برای کسب اطلاعات بیشتر در این زمینه، میتوانید به بخش توابع از ک تاب مهندس جعفرنژاد قمی یا سایر کتابهای آموزش زبان C مراجعه کنید.
نکتهای مهم در مورد شروع برنامههای ساختیافته
ابتدا بدون پرداختن به جزئیات پیاده سازی توابع، ورودیها و خروجیهای تابع، بدنهی اصلی برنامه را بنویسید. به عبارت دیگر، در قدم اول لازم نیست تک تک دستورات داخل توابع را بنویسید، ابتدا فقط تعیین کنید هر تابع قرار است چه عملی را انجام دهد و از آن در قسمتهای مورد نیاز استفاده کنید.
کامپس چه جوری کارمی کنه؟
در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)
علاقه مندی ها (Bookmarks)