Sorry, no posts matched your criteria.

این سایت در ستاد ساماندهی ثبت شده و تابع قوانین جمهوری اسلامی میباشد

روش ارسال پارامترها به توابع

۱۷ مهر ۱۳۹۷
بدون نظر


وقتی تابعی توسط تابع دیگر و فراخوانی می‌شود، دستورات آن تابع  اجرا می شوند پس از اجرای دستورات تابع، کنترل اجرای برنامه به برنامه فراخوان برمی‌گردد. پس از برگشت از تابع فراخوان شده، اولین دستور بعد از فراخوانی تابع اجرا می‌شود. در این آموزش به روش ارسال پارامتر به توابع می پردازیم.

روش ارسال پارامترها به توابع

انواع روش های ارسال پارامتر ها به توابع

پارامترها را به چند طریق می توان از توابع فراخوان به توابع فراخوانی شده ارسال کرد.

  • ارسال پارامتر به توابع از طریق مقدار
  • ارسال پارامتر به توابع از طریق ارجاع

۱- ارسال پارامتر به توابع از طریق مقدار

در  روش ارسال پارامتر به توابع از طریق مقدار، حداکثر یک مقدار را میتوان به قسمتی که از آنجا تابع صدا زده شده است برگرداند هنگامیکـه تـابع صدا زده میشوند مقادیر در متغیرها کپی میشوند و هر گونه تغییر در پارامترها تاثیری بر آرگومانها ندارد. در فراخوانی توسط مقدار، آرگومانهای ارسالی توسط تابع فراخواننده، در پارامترهای متناظر تابع فراخوانی شده، کپی می گردند. بنابراین تابع فراخوانی شده عملیات خود را برروی یک کپی از آرگومانهای ارسالی انجام می دهد. درنتیجه، در صورت انجام هرگونه تغییری برروی این کپی توسط تابع فراخوانی شده، متغیر اصلی در تابع فراخواننده تغییر نخواهد کرد. مزیت این نوع فراخوانی در این است که می توان بدون هیچ نگرانی از تغییر ناخواسته متغیرها، آنها را به هر تابعی ارسال کرد، چرا که فقط یک کپی از آنها به تابع ارسال می شود.

نکته: در زبا ن C، در حالت عادی فراخوانی توسط مقدار صورت می پذیرد.



خروجی کد بالا:



همانگونه آه مشاهده می آنید، گرچه پارامترهای aو b در داخل تابع test تغییر آرده اند، اما پس از بازگشت به تابع فراخواننده یعنی ، main آرگومانهای  متناظر به آنها یعنی xو y همچنان همان مقادیر اولیه خود را دارا هستند. شکل زیر نحوه کار را نشان می دهد.

ارسال پارامتر به توابع از طریق مقدارهمانطور که گفته شد، این نحوه فراخوانی حالت پیش فرض در زبان C بوده ومعمولا نیز برنامه نویسان ترجیح می دهند از این روش برای ارسال آرگومانها به توابع استفاده نمایند، چرا که متغیرها را در برابر تغییرات ناخواسته در هنگام ارسال به توابع دیگر حفظ می کنند. اما گاهی لازم است که تابع فراخوانی شده بتواند مقدار متغیرهای دریافتی را تغییر دهد، و این تغییرات در متغیرهای اصلی ارسال شده از طرف تابع فراخواننده نیز اعمال شود. در اینصورت باید از روش فراخوانی توسط ارجاع استفاده نماییم.

در روش  فراخوانی با مقدار، تعداد مقادیری را که توابع فراخوانی شونده می تواند برگردانند مشخص می کند. در روش فراخوانی توابع با مقدار، دو دسته توابع می تواند وجود داشته باشد:

  • توابعی که هیچ مقداری را بر نمی گردانند.
  • توابعی که  فقط یک مقدار را بر می گردانند.

۱-۱- توابعی که هیچ مقداری را بر نمی گردانند.

ممکن است در برنامه، از توابعی استفاده کنیم که آن توابع، پس از فراخوانی، عملیات مورد نظر را انجام دهند و خروجی هایی مورد  انتظار را تولید و  چاپ نمایند و هیچ مقداری را به توابع فراخوان تحویل ندهند در بسیاری از مسئله‌ها که با کامپیوتر حل می‌شوند، این‌گونه توابع به چشم می‌خورند. در اینجا با ذکر یک مثال به این توابع را مورد بررسی قرار می دهیم.



خروجی کد بالا:




تابع sqr برای انجام عمل توان نوشته شده است که پارامتر آن x بوده و از نوع صحیح  است ( به چگونگی تعریف نوع پارامتر دقت شود ). پس از فراخوانی تابع sqr مقدار آرگومان t در پارامتر x کپی می شود و از این لحظه به بعد هیچ کاری با t نیست. در این تابع، نتیجه عمل در متغیر y قرار می گیرد و سپس توسط دستور return مقدار متغیر y به تابع فراخواننده برگردانده می شود. این مقدار در نام تابع sqr قرار می گیرد.

۱-۲- توابعی که مقداری را بر می گردانند.

در بسیاری از مسئله هایی که توسط کامپیوتر حل می‌شود، نیاز به نوشتن توابع است که یک مقدار را برگردانند. مثل تابع سینوس که یک زاویه را برمیگرداند. این‌گونه توابع کاربردهای فراوانی دارند. برای نوشتن اینگونه توابع، نوع آنها را باید در الگوی تابع و عنوان تابع مشخص کرد.

return (<عبارت>) ;
return <عبارت>  ;

تفاوتی بین دو روش کاربرد return وجود ندارد. مقداری که توسط دستور return برگشت داده می شود، در نام توابع قرار می‌گیرد. در توابع فراخواننده می‌توان نام تابع را به متغیری نسبت داد و از محتویات آن استفاده کرد. به عنوان مثال، اگر ()f1 یک تابع از نوع int و x متغیری از نوع int باشد، دستور زیر، تابع ()f1 را فراخوانی می‌کند. مقداری را که توسط دستور return در نام تابع ()f1 قرار می‌گیرد، در x قرار میدهد. در اینجا تابع ()f1 فاقد آرگومان می باشد.







۲- ارسال پارامتر به توابع از طریق ارجاع

در روش ارسال پارامتر به توابع به صورت ارجاع، خود آرگومانهای اصلی، به تابع فراخوانی شده ارسال می گردد. در نتیجه، هرگونه تغییری در پارامترهایی تابع فراخوانی شده، مقدار آرگومانهای اصلی در تابع فراخوانی کننده را نیز تغییر خواهد داد. در C اولیه، تنها راه فراخوانی توابع توسط ارجاع، استفاده از متغیرهای اشاره گر بود، اما در استاندارد جدید C ،می توان این کار را به روش ساده تری و با استفاده از متغیرهای ارجاعی انجام داد. یک متغیر ارجاعی، در حقیقت یک نام مترادف و یا یک جایگزین برای یک متغیر دیگر است. برای تعریف یک متغیر ارجاعی از علامت & پس از نوع متغیر مورد ارجاع استفاده می کنیم. بعنوان مثال به نمونه زیر توجه کنید:



خروجی کد بالا:



توضیح: مثال فوق نشان می دهد که در حقیقت a و r یک متغیر هستند و هرگونه تغییری در هریک از این دو، دیگری را نیز تغییر خواهد داد.
برای ارسال آرگومانها توسط ارجاع، کافی است پارامترهای تابع مورد نظر را بصورت متغیر ارجاعی تعریف نماییم. در اینصورت، این پارامترها در حقیقت یک ارجاع به آرگومانهای ارسالی خواهند بود و در نتیجه هرگونه تغییری در آنها، آرگومانهای اصلی در تابع فراخوانی آننده را نیز تغییر خواهد داد. بعبارت بهتر، در این روش بجای آنکه یک آپی از آرگومانها در پارامترها قرار گیرد، خود آرگومانها به تابع فراخوانی شده ارسال خواهند شد. بعنوان مثال، همان تابع قسمت قبلی را که بصورت فراخوانی توسط مقدار عمل می کرد، مجددا به روش فراخوانی با ارجاع باز نویسی می کنیم تا تفاوت این دو مشخص گردد:



خروجی کد بالا:



همانگونه که مشاهده می کنید، تغییر پارامترهای a و b در داخل تابع test باعث شده آه آرگومانهای متناظر آنها در تابع فراخواننده، یعنی x و y نیز تغییر نمایند. شکل زیر نحوه کار را نشان می دهد.

فراخوانی تابع با ارجاع

*برنامه ای که کاراکترهایی را از ورودی خوانده و تشخیص می دهد آیا کاراکتر وارد شده a ، b و یا غیر از این دو حرف بوده است. ضمنا این برنامه قبل از انجام عمل مقایسه، با استفاده از یک تابع کاراکترهای خوانده شده را به حروف کوچک تبدیل می کند (کد اسکی حروف بزرگ درباره ۶۵ و ۹۱ است که اگر به این بازه ۳۲ واحد اضافه شود کد اسکی حروف کوچک حاصل خواهد شد).



خروجی کد بالا:




تفاوت برنامه نویسی اندروید با سی شارپ

۱۶ مهر ۱۳۹۷
بدون نظر


یکی از سوالاتی که در این مدت کاربران از بخش نظرات سایت پرسیده بودند تفاوت برنامه نویسی اندروید با سی شارپ می باشد. در این مقاله می خواهم به صورت کامل ابتدا هر کدام از این مدل برنامه نویسی ها رو معرفی و توضیح دهم و در انتها تفاوت برنامه نویسی اندروید با سی شارپ را مورد بررسی قرار میدهیم. 

تفاوت برنامه نویسی اندروید با سی شارپ

قبل از اینکه تفاوت برنامه نویسی اندروید با سی شارپ را مورد بررسی قرار دهیم باید بدونیم هر یکی از این برنامه نویسی ها چی هستند و بعد در مورد تفاوتشون صحبت کنیم. 

برنامه نویسی اندروید

وقتی در مورد برنامه نویسی اندروید و اندروید صحبت می کنیم یعنی نوشتن برنامه و اپلیکیشن برای سیستم عامل اندروید، حال می خواهد این برنامه نویسی با اندروید استودیو باشید یا با هر کدام از زبان های برنامه نویسی اندروید. کلا به برنامه نویسی برای سیستم عامل اندروید رو برنامه نویسی اندروید گویند.

برنامه نویسی سی شارپ

بعد از اینکه گفتیم برنامه نویسی اندروید چی هستش باید در مورد برنامه نویسی سی شارپ صحبت کنیم. اول از همه اینو بگم که سی شارپ برخلاف برنامه نویسی اندروید یک زبان برنامه نویسی است که برای نوشتن برنامه در انواع پلتفرم استفاده می شود. سی شارپ یک زبان برنامه نویسی چند منظوره است که می توان از آن برای نوشتن انواع برنامه و اپلیکیشن استفاده کرد. شما با سی شارپ  می توانید برای ویندوز برنامه نویسی کنید می توانید وبسایت طراحی کنید یا حتی برای سیستم عامل های اندروید و ios اپلیکیشن طراحی و کدنویسی کنید. 

سی شارپ (به انگلیسی: C#)، زبانی شیءگرا و سطح بالا از خانوادهٔ زبان‌های چارچوب دات‌نت شرکت مایکروسافت است. زبان سی شارپ، یک زبان برنامه‌نویسی چند الگویی و منظم شده مدل‌های تابعی، امری، عمومی، شیءگرا و جز گرا و در بستر دات نت می‌باشد. این زبان توسط مایکروسافت و جزئی از دات نت به وجود آمد و بعداً استانداردهای ECMA و ISO را نیز در بر گرفت. سی شارپ یکی از ۴۴ زبان برنامه‌نویسی است که توسط زمان اجرای زبان مشترک از چارچوب دات‌نت پشتیبانی می‌شوند و در همه جا به وسیله مایکروسافت ویژوال استودیو شناخته می‌شود.

زبان سی شارپ با قدرت و در عین حال سطح بالایی خود توانسته توجه بسیاری از برنامه نویسان را به خود جلب کند.

این زبان برپایه سادگی، مدرن بودن، همه منظوره و شیءگرا بودن ساخته شد. آندرس هجلزبرگ، طراح زبان برنامه‌نویسی دلفی، سرپرستی تیم طراحان زبان سی شارپ را بر عهده داشت. این زبان دارای دستوری شیءگرا مشابه ++C است و به شدت از زبان‌های جاوا و دلفی نیازمند مدرک تأثیر پذیرفته‌است. در ابتدا نام این زبان COOL بود که مخفف C like Object Oriented Language بود، هر چند در ژوئیه ۲۰۰۰، زمانی که مایکروسافت پروژه را عمومی اعلام کرد، اسم آن به سی شارپ تغییر پیدا کرد.

نکته مهم: با استفاده از تکنولوژی زامارین تحت سی شارپ می توانید برای سیستم عامل اندروید و ios اپلیکیشن طراحی و کدنویسی کنید.

تفاوت برنامه نویسی اندروید با سی شارپ

به نظرم با تعریف برنامه نویسی اندروید و زبان برنامه نویسی سی شارپ تا حدود زیادی متوجه تفاوت برنامه نویسی اندروید با سی شارپ شده اید. اولین و اصلی ترین تفاوت این است که سی شارپ یک زبان برنامه نویسی می باشد و برنامه نویسی اندروید یک مدل برنامه نویسی است که می توان توسط زبان های مختلفی صورت گیرد. شما می توانید از طریق همین زبان سی شارپ، برنامه نویسی اندروید انجام دهید. زبان ها و محیط های مختلفی برای برنامه نویسی اندروید وجود دارد از اندروید استودیو گرفته تا پایتون و همین سی شارپ، که می توانید بر اساس نیاز و علاقه خود یکی را انتخاب کنید. 

 اگر به دنبال منابع یادگیری و آموزش سی شارپ هستید مطالب زیادی در سایت منتشر شده است که می توانید از این منابع استفاده کنید. برای یادگیری سی شارپ پیشنهاد میکنم از لینک های زیر استفاده کنید.

جلسات رایگان دوره آموزش برنامه نویسی سی شارپ 

(بیش از ۵ ساعت فیلم آموزشی، کل دوره بیش از ۷۰ ساعت):
جلسه مقدمه | جلسه یک | جلسه دو | جلسه سه | جلسه چهار | جلسه پنج | جلسه شش | جلسه هفت | جلسه هشت


نحوه سربارگذاری توابع در زبان C

۱۵ مهر ۱۳۹۷
بدون نظر


در زبانهای برنامه نویسی، از جمله زبان برنامه نویسی C، از تکنیکی به نام پارامترهای پیش فرض استفاده می کند. این تکنیک به برنامه امکان می دهد تا با تعیین مقدار پیش فرض برای یک یا چند پارامتر تابع، آن ها را در هنگام مقدار دهی اختیار کند. این روش برای افزودن انعطاف پذیری به کد برنامه، بسیار کاربرد دارد. و در زبان برنامه نویسی C، میتوان برای یک پارامتر مقدار پیشفرضی را تعیین کرد که هنگام فراخوانی در صورت ندادن آرگومان مربوط به آن پارامتر با مقدار پیش‌فرض مقدار بگیرد. این مقدار پیشفرض برای ساده کردن فراخوانی توابع پیچیده و بعضی مواقع به عنوان یک شکل میانبر سربارگذاری تابع استفاده میشوند. در این مبحث در مورد مقادیر پیش فرض برای پارامترها و محدودیت پارامترهای پیش فرض در توابع و همچنین نحوه سربارگذاری توابع در زبان C، می پردازیم.

نحوه سربارگذاری توابع در زبان C

۱- مقادیر پیش فرض برای پارامترها

در بسیاری از موارد، توابعی داریم ک دارای تعداد زیادی پارامتر هستند که در هر بار فراخوانی باید آرگومانهای متناظر با هریک را به تابع ارسال کرد. چنانچه تعداد آرگومانهای ارسالی، با تعداد پارامترها یکسان نباشد (کمتر یا بیشتر)، یک خطای کامپایل ایجاد می گردد. اما در بعضی موارد، مقادیر بعضی از این پارامترها در اکثر موارد مشخص است و فقط در شرایط خاص تغییر می کند. بعنوان مثال فرض  کنید تابعی نوشته اید که یک پنجره را مکان مورد نظر ترسیم میکند. پارامترهای متداول برای چنین تابعی عبارتند از:
مختصات شروع، رنگ زمینه، رنگ متن، نوع حاشیه (یک خطی، دوخطی ) و … اما فرض کنیم پنجره های متداول در برنامه ما دارای رنگ زمینه آبی و رنگ متن سفید با حاشیه دو خطی هستند. در اینصورت در اکثر موارد بجز اطلاعات مربوط به مختصات پنجره، بقیه اطلاعات بصورت تکراری ارسال می گردند. در چنین مواردی می توان از پارامترهای پیش فرض استفاده نمود. چنانچه یک پارامتر از تابع دارای مقدار پیش فرض باشد، آنگاه تابع فراخواننده می تواند هیچ آرگومانی متناظر با این پارامتر ارسال ننماید. در اینصورت تابع فراخوانده شده از مقدار پیش فرض برای آن پارامتر استفاده می نماید. برای تعیین مقدار پیش فرض برای پارامتر، کافی است که در هنگام تعریف پارامتر با استفاده از عملگر نسبت دهی (=) مقدار پیش فرض را به پارامتر نسبت دهیم.



خروجی کد بالا:



همانطور که دیده می شود، در اولین فراخوانی، تابع sum با ۳ آرگومان فراخوانی شده و در نتیجه حاصل جمع آنها را بازگردانده است. اما در دومین فراخوانی فقط دو آرگومان ارسال شده و در نتیجه پارامتر سوم یعنی، c از مقدار پیش فرض خود یعنی صفر استفاده نموده است و حاصل جمع دو عدد بعنوان خروجی باز گردانده شده است. در فراخوانی سوم، تنها یک آرگومان ارسال شده و پارامترهای b و c از مقدار پیش فرض خود یعنی صفر، استفاده نموده اند و بنابراین تنها خود عدد ارسالی بعنوان خروجی بازگردانده شده است. بنابراین با توجه به تعریف فوق، می توان تابع sum را با سه، دو و یا یک آرگومان فراخوانی کرد.

۱-۱- محدودیت در نحوه استفاده از پارامترهای پیش فرض

 در نحوه استفاده از پارامترهای پیش فرض دو محدودیت وجود دارد:

  • تعریف پارامترهای پیش فرض حتما باید از سمت راست ترین پارامتر آغاز شده و به سمت چپ ادامه یابد. بعنوان نمونه در مثال فوق چنانچه پارامتر c مقدار پیش فرض نداشته باشد، پارامتر b نیز قادر به اعلام مقدار پیش فرض نیست. علاوه براین پارامتر a نیز فقط درصورتی می تواند مقدار پیش فرض داشته باشد که پارامترهای b و c هر دو دارای مقدار پیش فرض باشند. یعنی اعلان زیر خطا می باشد:



  • در هنگام فراخوانی یک تابع که دارای پارامترهای پیش فرض است، آرگومانهای ارسالی از چپ به راست به پارامترها اختصاص می یابند. یعنی در صورتیکه هنگام فراخوانی تابع sum دو آرگومان به آن ارسال شود، اولی به a و دومی به b تخصیص خواهد یافت. تحت هیچ شرایطی نمی توان بدون اینکه مقداری برای b ارسال شود، آرگومانی را برای c ارسال نمود.

۲- سربارگذاری توابع

در برخی موارد، تابعی داریم که یک وظیفه خاص را برای چندین نوع داده مختلف انجام می دهد. بعنوان مثال تابع max را درنظر بگیرید که دو داده را بعنوان ورودی دریافت و حداکثر آنها را باز می گرداند. چنانچه این تابع را برای دو ورودی از نوع عدد صحیح بنویسیم، آنگاه برای ورودی های اعشاری درست عمل نخواهد کرد. بنابراین ممکن است برنامه نویس ترجیح دهد دو نسخه از این تابع داشته باشد: یکی برای اعداد صحیح و یکی برای اعداد اعشاری. اما از آنجا که نمی توان دو شناسه همنام تعریف کرد، بنابراین ممکن است مجبور شویم از دو نام مجزا استفاده نماییم، مانند intMax برای اعداد صحیح و doubleMax برای اعداد اعشاری.
خوشبختانه با استفاده از سربارگذاری توابع، می توان این مشکل را حل کرد. با استفاده از سربارگذاری، می توان توابعی تعریف کرد که دارای نام یکسان باشند، ولی لیست پارامترهای ورودی آنها متفاوت باشد. در اینصورت در هنگام فراخوانی تابع، زبان برنامه نویسی C با توجه به نوع آرگومانهای ارسالی، تابع مناسب را انتخاب کرده و فراخوانی می نماید. تفاوت در لیست پارامترهای ورودی توابع سربارگذاری شده، می تواند شامل یک یا هر دو مورد زیر باشد:
– تفاوت در تعداد پارامترها
– تفاوت در نوع داده یک یا چند پارامتر
بعنوان مثال، می توانیم دو تابع  max داشته باشیم که اولی دو عدد صحیح و دومی دو عدد اعشاری دریافت نمایند. علاوه براین می توان تابع  max سومی نیز نوشت که ۳ عدد صحیح دریافت و حداکثر آ«ها را بازگرداند.



خروجی کد بالا:



توضیح مثال: همانگونه که در مثال دیده می شود،  ۳ تعریف مختلف از تابع max با ورودی های مختلف ارائه شده است. با فراخوانی تابع ، max خود زبان C بسته به نوع آرگومانهای ارسالی، تابع مناسب را تشخیص داده و آن را فراخوانی می نماید.



خروجی کد بالا:



به پایان مبحث  مقادیر پیش فرض برای پارامترها و نحوه سربارگذاری توابع در زبان C، رسیدیم.  به یاد داشته باشید، که سربارگذاری نمی تواند بر اساس نوع داده خروجی انجام شود. بعبارت دیگر چنانچه دو تابع همنام با لیست پارامترهای یکسان داشته باشیم که تنها نوع مقدار خروجی آن دو متفاوت باشد، یک خطای کامپایل مبنی بر استفاده از شناسه های یکسان دریافت خواهیم کرد.


متغیرهای سراسری و محلی در زبان C

۱۴ مهر ۱۳۹۷
بدون نظر


متغیرهای سراسری و محلی در زبان C

آموختیم که توابع چه هستند و همچنین در برنامه هایی که تاکنون نوشته شد، متغیرهای مورد نیاز هر تابع در داخل آن تابع تعریف شده‌اند. یکی از مسائل مهم در مورد متغیرهای مورد استفاده در تابع، حوزه شناخت متغیر است که تعین می نماید متغیر در چه قسمتهایی از برنامه شناخته شده است و در چه قسمتهایی قابل استفاده نیست. در همه زبان های برنامه نویسی هنگامی که نامی از متغیرها به میان می آید، در مورد طول عمر آن ها هم بحث میگردد، منظور از طول عمر یک متغیر، زمانی است که از تعریف متغیر تا از بین رفتن آن سپری می شود. پس لازمه آن شناخت، متغیرهای سراسری و محلی در زبان C می باشد. که در این مبحث به صورت کلی به انواع متغیرهای سراسری و محلی و همچنین رده های ذخیره سازی متغیر ها در زبان برنامه نویسی C، آشنا خواهید شد.

متغیرهای عمومی و محلی در زبان C۱- انواع متغیرها

 تا کنون هر چه فرا گرفته اید فقط، یک تابع داشت که آن هم تابع اصلی بود ولی وقتی که چندین تابع داشته باشیم موضوع متفاوت می باشد و باید بدانیم که چطور باید از متغیر ها استفاده کنیم. بطور کلی متغیرها به دو دسته تقسیم می شوند:

۱-۱- متغیرهای محلی (local variable)

متغیرهای محلی، متغیرهایی هستند که در داخل یک بلاک {} تعریف شده اند و فقط در محدوده همان بلاک شناخته شده هستند. نمونه این دسته از متغیرها، متغیرهای محلی توابع هستند که در داخل بلاک مربوط به تابع تعریف می شوند و فقط در همان تابع شناخته شده هستند. البته دو تابع مختلف می توانند دارای متغیرهای همنام باشند، که در اینصورت این دو متغیر مجزا بوده و هیچ ارتباطی به یکدیگر ندارند. لازم به ذکر است که پارامترهای یک تابع نیز جزو متغیرهای محلی آن تابع محسوب می گردند.

نکته: گرچه معمولا متغیرهای محلی در داخل تابع تعریف می شوند، اما هر بلوک دلخواه می تواند دارای متغیرهای محلی باشد. مثلا یک دستور if مرکب می تواند در داخل بلوک خود، متغیرهای محلی را تعریف کند که فقط در داخل همان بلوک شناخته شده باشند.

۱-۲- متغیرهای سراسری (global variable)

متغیرهای سراسری، متغیرهای هستند که در خارج کلیه بلوکها و توابع از جمله main تعریف شده اند و در کل توابع برنامه (در حقیقت کل فایل مربوط به برنامه) شناخته شده و قابل استفاده می باشند. از آنجا که کلیه توابع برنامه به این متغیرها دسترسی دارند، هرگونه تغییری در این متغیرها توسط یکی از توابع، در سایر توابع نیز قابل رویت خواهد بود. به مثال های زیر توجه کنید:



نکته: درصورتیکه یک تابع دارای یک متغیر محلی همنام با یک متغیر سراسری باشد، در اینصورت هرگونه ارجاع به این نام مشترک، به متغیر محلی رجوع خواهد کرد.

چه موقع از متغیر های سراسری استفاده کنیم؟

متغیرهای سراسری هنگامی مفید هستند که یک داده بین چندین تابع بصورت مشترک استفاده شود. در این حالت نیازی به ارسال متغیرهای مشترک از طریق پارامترها نمی باشد. اما متاسفانه از آنجا که متغیرهای سراسری در کلیه توابع در دسترس هستند، ممکن است بصورت ناخواسته دچار تغییر شوند. علاوه براین اشکال زدایی آنها نیز بسیار مشکل است، چرا که محل بروز خطا مشخص نیست و هریک از توابع ممکن است مقدار متغیر را تغییر داده باشند. بنابراین در  برنامه نویسی C، توصیه می گردد تا حد ممکن از متغیرهای سراسری استفاده نکنید.

۲- رده های ذخیره سازی

رده ذخیره سازی یک متغیر، مدت زمان حضور آن را در برنامه تعیین می نماید. بعبارت دیگر، رده ذخیره سازی تعیین می نماید یک متغیر چه موقع بوجود می آید و چه زمانی از بین می رود. در هنگام تعریف یک متغیر، باید به همراه نوع آن، رده ذخیره سازی آن را نیز مشخص کرد. چنانچه این کار صورت نپذیرد، کامپایلر از رده ذخیره سازی پیش فرض استفاده خواهد کرد. بطور کلی دو رده ذخیره سازی برای متغیرها وجود دارد:

۲-۱- رده ذخیره سازی اتوماتیک

متغیرهای متعلق به رده ذخیره سازی اتوماتیک، هنگام ورود به بلوکی که این متغیرها در آن اعلان شده اند، ایجاد شده و در طول اجرای این بلوک در حافظه وجود دارند؛ به محض خاتمه بلوک، این متغیرها نیز از بین رفته و حافظه آنها پس گرفته می شود. متغیرهای محلی(شامل پارامترهای توابع)، معمولا از این رده میباشند. بعنوان مثال، متغیرهای محلی یک تابع، به محض فراخوانی تابع ایجاد می شوند و در حین اجرای تابع در حافظه حضور دارند. با پایان یافتن اجرای تابع، این متغیرها نیز از بین می روند. این مسئله باعث می شود که صرفه جویی قابل توجهی در حافظه داشته باشیم. چرا که هرگاه به متغیری نیاز داریم ایجاد شده و با پایان یافتن کار نیز حافظه آن آزاد می شود. برای تعریف یک متغیر اتوماتیک، باید از کلمه کلیدی ،auto قبل از مشخصه نوع متغیر، استفاده نماییم.



در تابع فوق، متغیر i از رده ذخیره سازی اتوماتیک تعریف شده است. اما نکته مهم اینجاست که متغیرهای محلی، بطور پیش فرض متعلق به رده ذخیره سازی اتوماتیک هستند. بدین معنا که چنانچه رده ذخیره سازی آنها بطور صریح مشخص نشود (مانند متغیر kدر مثال فوق)، از رده اتوماتیک در نظر گرفته می شوند. بنابراین در مثال فوق نه تنها متغیر i، بلکه متغیرهای محلی a ،k و b نیز از رده اتوماتیک در نظر گرفته شوند. به همین دلیل معمولا برنامه نویسان از کلمه کلیدی auto استفاده نمی کنند.

۲-۲- رده ذخیره سازی ایستا

متغیرهای متعلق به رده ذخیره سازی ایستا، از ابتدای آغاز برنامه ایجاد می شوند و تا پایان برنامه نیز در حافظه حضور دارند. متغیرهای سراسری به این دسته متعلق هستند. با شروع اجرای برنامه به متغیرهای سراسری حافظه تخصیص داده می شود. پس از آن کلیه توابع قادر به دیدن و تغییر مقدار آنها هستند، اما نمی توانند حافظه تخصیص یافته به این متغیرها را بازپس بگیرند. در پایان و پس از خاتمه تابع، main حافظه تخصیص یافته به این متغیرها باز پس گرفته می شود.
اما علاوه بر متغیرهای سراسری، متغیرهای محلی نیز می توانند از رده ذخیره سازی ایستا تعریف شوند. اگر یک متغیر محلی، بصورت ایستا تعریف گردد، فقط یکبار و آن هم در شروع اجرای برنامه ایجاد شده و مقدار اولیه خواهد گرفت (البته درصورتیکه به آن مقدار اولیه داده باشیم). پس از آن، با هر بار اجرای تابع، قادر به دسترسی به این متغیر خواهیم بود (چرا که یک متغیر محلی است)، اما با خاتمه تابع این متغیر از بین نرفته و مقدار آن تا فراخوانی بعدی تابع حفظ خواهد شد. متغیرهای محلی ایستا هنگامی از بین می روند که برنامه اصلی خاتمه یابد. از این متغیرها هنگامی استفاده می شود که بخواهیم مقدار یک متغیر محلی در فراخوانیهایمتوالی یک تابع حفظ شود (البته بدون اینکه سایر توابع به آن دسترسی داشته باشند، درغیر اینصورت آن را بصورت سراسری تعریف می کردیم).
برای تعریف یک متغیر محلی از رده ذخیره سازی ایستا، از کلمه کلیدی static استفاده می شود. البته استفاده از این کلمه الزامی است، چرا که متغیرهای محلی بطور پیش فرض از رده ذخیره سازی اتوماتیک درنظر گرفته می شوند.

* مثال زیر تفاوت متغیرهای محلی اتوماتیک و ایستا را نشان می دهد.



خروجی کد بالا:



روش بکارگیری یک متغیر سراسری در توابع با چند فایل مختلف

نوع دیگری از رده ذخیره سازی ایستا، رده extern است. این رده هنگامی بکار می رود که برنامه در چندین فایل مختلف قرار داشته باشد. در برنامه های بزرگ که دارای توابع متعددی هستند، برای جلوگیری از بزرگ و پیچیده شدن بیش از حد فایل برنامه، آن را بطور منطقی به چندین فایل تقسیم می کنند. بدین صورت که کلیه توابع و داده های مرتبط با یکدیگر را در یک فایل قرار می دهند. سپس هر فایل بصورت مجزا کامپایل شده و درنهایت تمامی آنها با یکدیگر پیوند خورده و تشکیل فایل اجرایی نهایی را می دهند. این روش باعث مدیریت بهتر پروژه های بزرگ می شود.
اما مشکل هنگامی است که بخواهیم یک متغیر سراسری را در توابع موجود در چند فایل مختلف، مورد استفاده قرار دهیم. مسلما این متغیر سراسری باید در یکی از فایلها تعریف شود. اما در مورد سایر فایلها چه بایدبکنیم؟ متاسفانه هریک از دو راه زیر منجر به شکست می شود:

  •  اگر متغیر را در سایر فایلها بدون تعریف مجدد استفاده نماییم، کامپایلر اعلام خطا کرده و متغیر را نخواهد شناخت.
  •  اگر متغیر را در سایر فایلها نیز تعریف مجدد نماییم، کامپایلر اعلام خطا نخواهد کرد، اما پیوند زننده در هنگام ترکیب فایلها با هم متوجه تعریف چند متغیر با نام یکسان شده و اعلام خطا خواهد کرد.

    تنها راه حل آن است که این متغیر را در یک فایل تعریف کرده و سپس در سایر فایلها آن را بعنوان یک متغیر خارجی (extern) اعلان (و نه تعریف) نماییم. مشخصه  externبه کامپایلر اعلان می کند که این متغیر در جای دیگری (معمولا یک فایل دیگر) تعریف شده است و بنابراین می تواند بدون اعلان خطا از آن استفاده کند، اما این مشخصه باعث تعریف مجدد متغیر نمی گردد. برای تعریف متغیر به شکل خارجی بصورت زیر عمل می کنیم:




به مثال زیر توجه کنید:
روش بکارگیری یک متغیر سراسری در توابع با چند فایل مختلف

توضیح برنامه: برنامه دارای دوفایل به نامهای  File1.C و File2.C می باشد. توجه کنید که فقط یکی از این دو می تواند دارای تابع main باشد. متغیر سراسری k در فایل File1.C تعریف شده است بنابراین توسط توابع آن از جمله F1 قابل دسترسی است. اما این متغیر در فایل File2.C نیز بصورت خارجی تعریف شده است و بنابراین در توابع این فایل مانند تابع F2 نیز قابل دسترسی است. توجه کنید که متغیر k که توسط تابع F2 مورد دسترسی قرار گرفته است، همان متغیر سراسری تعریف شده در فایل File1.C است و در حقیقت هر دوفایل از یک متغیر k مشترک استفاده می کنند.

* در  مثال زیر انواع متغیرها و نحوه کار آنها بررسی شده است.



 خروجی کد بالا:



توضیح برنامه: در شروع برنامه، از آنجا که در تابع main متغیر  xوجود ندارد، در نتیجه مقدار متغیر سراسری یعنی ۱چاپ شده است.اما در هنگام فراخوانی تابع ،a از آنجا که متغیر x بصورت محلی تعریف شده است، هرگونه استفاده از این متغیر به نمونه محلی کن مراجعه می کند و از نمونه سراسری استفاده نمی شود. بنابراین مقدار متغیر محلی یعنی ۱۰چاپ شده و سپس مقدار آن یک واحد افزایش یافته است. همین مسئله در مورد تابع b نیز برقرار بوده و در نتیجه مقدار متغیر محلی یعنی ۲۰ چاپ شده و سپس یک واحد افزایش یافته است. اما بدلیل تعریف متغیر x بصورت ایستا، پس از پایان تابع، مقدار این متغیر حفظ خواهد شد. در فراخوانی تابع ، c از آنجا که متغیر محلی تعریف نشده است، در نتیجه از همان متغیر سراسری، x استفاده شده و مقدار کن یعنی ۱چاپ می شود و سپس یک واحد به آن اضافه شده است. پس از بازگشت به، main مجددا مقدار متغیر سراسری x چاپ شده است که برابر ۲ است. این مسئله نشان می دهدکه تغییر اعمال شده در تابع c برروی متغیر سراسری، x به تابع main نیز منتقل شده است.

فراخوانیهای بعدی این توابع نیز مشابه حالت قبلی است، تنها نکته جالب آن است که از آنجا که متغیر x در تابع a بصورت اتوماتیک تعریف شده، در فراخوانی دوم مجددا با ۱۰مقداردهی اولیه شده است و مقدار قبلی از بین رفته است. اما در تابع b که متغیر x بصورت ایستا تعریف شده است، در فراخوانی دوم مقدار قبلی یعنی ۲۱ حفظ شده است.


API چیست؟ و چه کاربردی دارد

۱۳ مهر ۱۳۹۷
بدون نظر


اگر بین برنامه نویس ها حضور پیدا کرده باشید می بیند اگر در زمینه برنامه نویسی صحبت کنند واژه API رو به شدت استفاده می کنند. اگر هم تازه وارد حوزه برنامه نویسی شده اید یکم درک و فهمیدن ماهیت API برای شما سخت و گنگ می باشد. در این مقاله می خواهم بگم API چیست؟ و چه کاربردی دارد و در انتها در مورد نحوه عملکرد APIها بیشتر صحبت کنم.

API مخفف واژگان Application Programming Interface به معنی «رابط های برنامه نویسی اپلیکیشن» می باشد.

API چیست؟

API چیست؟

اگر بخواهم به صورت خودمونی بگم API چیست؟ باید بگم API این امکان رو در اختیار برنامه نویس قرار می دهد تا به‌ برخی یا تمامی قابلیت‌های یک نرم‌افزار دیگر دسترسی پیدا کند.

مثال: فرض کنیم نرم‌افزاری تحت عنوان الف وجود دارد که شرکت توسعه‌دهنده اش، این امکان را برای سایر توسعه دهندگان فراهم آورده تا از API آن استفاده کنند. نرم افزاری را هم که توسعه می‌دهیم نرم‌افزار ب نام دارد. حال نرم‌افزار الف در چارچوب خاصی به نرم‌افزار ب اجازه می‌دهد تا از اطلاعات آن استفاده کند.

بعد از اینکه گفتیم API چیست باید هنگام استفاده از API موارد زیر رو رعایت کنید:

۱- APIها ارائه دهنده ی داده‌ها ساختار یافته هستند. به عبارت دیگر، درخواست از طرف نرم‌افزار ب به نرم‌افزار الف در چارچوب یک فرمت استاندارد صورت می گیرد.

۲- APIها قابل پیش‌بینی هستند. به عبارت دیگر، درخواست هایی که به نرم‌افزار الف ارسال می‌شوند از پیش تعیین شده بوده لذا پاسخ به چنین درخواست هایی همواره مشخص و قابل پیش‌بینی خواهند بود.

۳- APIها مستند هستند. با توجه به این که APIها توسط شرکت های بزرگ برای سرویس های جهانی ایجاد می شوند، این APIها می بایست صد در صد مستند بوده تا توسعه دهندگانی که قصد استفاده از آن‌ها را دارند، در استفاده از آن‌ها دچار حداقل سردرگمی شوند و به راحتی از جزئیات API سر در بیاروند.

۴- APIها دارای یک API Key هستند. برای آن که به راحتی مشخص شود که Request یا «درخواست» از طرف چه سایت یا نرم افزاری است، ای پی آی ها یکی API Key یا «شناسه ی ای پی آی» در اختیار توسعه دهندگان قرار می‌دهند که در هر درخواست، این شناسه هم برای شرکت الف ارسال می‌شود که آن طریق، ماهیت اپلیکیشن شما برای آن سیستم مشخص شده و بر اساس توافقاتی که برای استفاده از ای پی آی صورت گرفته، خدمات را در اختیار شما قرار می دهد. علاوه بر این، شناسه ای که در اختیار شما (به عنوان یک توسعه‌دهنده) قرار می گیرد، مشخص می‌کند که شما هر چند وقت یک بار خواهید توانست برای نرم‌افزار الف درخواست ارسال کنید. به طور مثال، این API ممکن است که صرفاً در بازه های زمانی نیم ساعته به درخواست ها پاسخ گوید و در صورتی که اپلیکیشنی هر ده دقیقه یک بار، یک درخواست ارسال کند، API Key مشخص کننده ارسال کننده ی درخواست بوده و درخواست شما اصطلاحاً Ignore شده یا «نادیده» گرفته می شود.

نکته مهم: طراحی API از پایه کار نسبتا دشواری است که مراحلی پیچیده و بسیار تخصصی دارا است. برای آن که یک تصویر کلی از API داشته باشیم، می توان API را این گونه توصیف نمود که API مجموعه ای از دستورات و توابع است که به دیگر نرم افزارها امکان دسترسی به سرویس ها یا اطلاعات عرضه شده توسط شما را می دهد. به زبان ساده تر، برای آن که یک نرم افزار بتواند به اطلاعات شما دسترسی داشته باشد، آن ها را تغییر دهد و غیره، به یک واسطه به نام API نیاز دارد. عموماً APIها با توجه به برخی الگوها و استانداردها ساخته می شوند تا تمامی توسعه دهندگان از سراسر دنیا بتوانند از آن ها استفاده کنند و با توجه به تشخیص سازنده می توانند رایگان و یا پولی باشند.

چرا به API نیاز داریم؟

چرا به API نیاز داریم؟

می توانیم جواب این سوال را با یک کلمه بدهیم : ارتباطات
شما ممکن است بپرسید چرا ارتباط بسیار مهم است. برای جواب به این سوال تصور کنید Notepad نمی توانست که نوشته ها از MS Word یا Google Chrome یا Firefox کپی و پیست (Copy & Paste) کند. تصور کنید باید برای هر نوع نیاز در هر زمانی تمامی متن را در نرم افزار دیگر تایپ می کردید. این فقط یک از مثال های مربوط به ارتباط بین نرم افزارها است و باید بدانیم که تمامی ارتباط ها از طریق API امکان پذیر است.

APIها بخش اصلی و مرکزی کمپانی هایی همچون گوگل، تلگرام، فیسبوک، توییتر و … هستند. تمامی این کمپانی ها، اطلاعات و سرویس های خود را توسط APIها در اختیار دیگر شرکت ها و توسعه دهندگان قرار می دهند تا در برنامه های آن ها مورد استفاده قرار گیرد. علاوه بر آن، بسته به میزان کیفیت و مقدار Access (اکسس یا دسترسی) که شما درخواست می دهید، قیمت آن APIها نیز متغیر خواهد بود.

به طور معمول پایین ترین سطح های اکسس با محدودترین امکانات به صورت رایگان عرضه می شوند. سازمان های دولتی در سراسر جهان، چه استانی و چه کشوری، اطلاعات خود را از طریق APIها در اختیار عموم قرار می دهند. البته برخی منتقدان درباره ی تأثیرگذاری و کاربرد این APIها و اطلاعات منتقل شده توسط آنان نظر چندان مثبتی ندارند، اما به هر حال این اقدام یک قدم کوچک در مسیری بزرگ محسوب می شود.

در یک نگاه کلی می‌توان گفت که APIها زمینه را برای توسعه‌ی Mashupها فراهم کرده‌اند. Mashupها برنامه‌ها یا سرویس‌های تحت وبی هستند که با استفاده از APIهای چند سرویس‌ مختلف (مثل گوگل، فیسبوک، توئیتر..) عملکرد تمامی آنها را در قالب یک برنامه یا یک سرویس وب ارائه می‌کنند. دسترسی گسترده‌ای که به واسطه‌ی وجود APIها برای سرویس‌های بزرگ حاصل شده است، تجربه‌ی جدیدی برای کاربران وب به ارمغان آورده است.

البته APIها همواره هم مفید نبوده‌اند! شرکت توئیتر از یک سال پیش محدودیت‌هایی برای اپلیکیشن‌های وابسته به APIهای این شرکت وضع کرده است. این تصمیم عملا برنامه‌های وابسته به توئیتر را بی‌استفاده می‌کند و کاربران فقط امکان استفاده از برنامه‌ها و وبسایت این شرکت را خواهند داشت و بدین ترتیب توئیتر می‌تواند مطمئن باشد که درآمدزایی مبتنی بر نمایش تبلیغات، به صورت موثر و متمرکزتری انجام می‌شود.

شرکت‌های مختلفی برای کسب سود بیشتر، سرویس‌های مختلف و APIهایی که اپلیکیشن‌های شما به آنها وابسته هستند را از دسترس خارج کرده‌اند. شرکت گوگل طی تصمیماتی سرویس‌هایی مانند Google Health و اخیرا Google Reader را که گمان می‌ر‌فت به سمت زیان‌ده بودن پیش می‌روند از دسترس خارج کرد و این سرویس‌ها هیچوقت دوباره راه اندازی نشدند. مسلما این تصمیمات برای کاربرانی که از اپلیکیشن‌های وابسته استفاده می‌کنند ناخوشایند خواهد بود.

با وجود این مشکلات، اشتیاق روز افزون توسعه‌دهندگان برای استفاده از قابلیت‌های APIها و محبوبیت اپلیکیشن‌های وابسته به سرویس‌های کاربردی درمیان کاربران بر کسی پوشیده نیست.

نکته مهم: چه بخواهید API خود را توسعه دهید و چه از سرویسی استفاده کنید که آن را برایتان بسازد، باید بدانید که طراحی و مدیریت APIها بر اساس استانداردهایی پیش می رود که باید آن ها را رعایت نمود. این استانداردها به گونه ای وضع شده اند که برای کسانی که از API استفاده می کنند، آسان و قابل فهم باشند و تا حد ممکن از بروز نکات منفی ذکر شده جلوگیری می کنند.

منابع استفاده شده: www.MakeUseOf.com و مقاله API چیست؟ از بهزاد مرادی


نوشتن تابع در زبان برنامه نویسی C

۱۲ مهر ۱۳۹۷
بدون نظر


برنامه‌هایی که تاکنون نوشته شده، فقط شامل یک تابع هستید به نام main بود. در برنامه های طولانی و پیپچیده که شامل چندین بخش منطقی و مستقل از هم هستند، بهتر است برای هر قسمت منطقی، برنامه جداگانه ای نوشت. برنامه‌ای که برای هر یک از بخش‌ها نوشته می‌شود، تابع نام دارد. در واقع تابع، واحدی از برنامه است که کار به خصوصی را انجام میدهند. در بعضی از توابع عملکرد خاصی دارند، مانند تابع printf. بعضی دیگر از توابع مقداری به برنامه بر می گردانند. برای مثال  strlen  طول یک رشته را بر میگرداند.
توابع، مارا از تکرار برنامه های یکسان بی نیاز می سازد. اگر عملی قرار است چندین بار در طول برنامه تکرار شود، یکبار تابع مناسب برای آن مینویسیم و بار دیگر که نیاز پیدا کردیم آن را صدا میزنیم. می توان یک تابع را در برنامه های گوناگون استفاده کنیم. برنامه نویس بر حسب ضرورت می‌تواند توابعی را بنویسد و در برنامه مورد استفاده قرار دهد. در این آموزش روش نوشتن توابع در زبان برنامه نویسی C، را مطرح خواهیم کرد. قبل از پرداختن به چگونگی نوشتن توابع، اهمیت توابع  در برنامه نویسی C، را مورد بررسی قرار می دهیم.

نوشتن تابع در زبان برنامه نویسی C

۱- اهمیت نوشتن توابع در زبان برنامه نویسی

استفاده از توابع در برنامه‌نویسی مزایایی دارد که برخی از آن‌ها به ترتیب زیر هستند:

  • خرد کردن برنامه به اجزای کوچک‌تر جهت ساده‌تر شدن حل مساله
  • طراحی، تست و اشکال زدایی اجزای برنامه به طور مستقل
  • امکان استفاده دوباره از برنامه به طور مستقل
  • انجام پروژه به صورت تیمی
  • افزایش خوانایی برنامه و درک راحت‌تر آن
  • ساده‌تر شدن اشکال یابی برنامه
  • کاهش حجم برنامه
  • صرفه جویی در وقت

نوشتن تابع در زبان برنامه نویسی C۲- نوشتن توابع
برای نوشتن تابع باید اهداف تابع مشخص باشد. تابع چه وظیفه ای برعهده دارد، ورودی های تابع چیست، و خروجی های تابع کدامند. با دانستن این موارد نوشتن تابع بسیار راحت خواهد بود. هر تابع دارای دو جنبه می باشد:
تعریف تابع: مجموعه ای از دستورات که عملکرد تابع را مشخص میکند.
فراخوانی تابع: دستوراتی که تابع را فراخوانی می کند. فراخوانی تابع با نام آن انجام می‌شود.

نکته: قانون نامگذاری برای توابع، از قانون نامگذاری برای متغیرها پیروی می‌کند.

۳- تعریف توابع

نوع تابع: یکی از انواع void ،char ،double ،float ،int. یکی از انواع تعریف شده توسط کاربر. (یکی از انواع موجود در زبان c یا انواع تعریف شده توسط کاربر است.  اگر تابع بخواهد مقداری را به تابع فراخوان برگرداند، آن مقدار در نام تابع قرار می گیرد. چون هر مقداری در زبان c دارای نوع است. لذا تابع نیز دارای نوع است. اگر تابع هیچ مقداری را به برنامه فراخوان برنگرداند، نوع تابع void خواهد بود.)
عنوان تابع: همانند قوانین نامگذاری متغیرها، وسیله ای برای دسترسی و استفاده از تابع.
پارامتر های تابع: متغیر هایی برای انتقال مقادیر از برنامه اصلی به یک تابع. (پارامتر ها اطلاعاتی هستند که بین تابع فراخوان و تابع فراخوانی شونده هستند. هنگام فراخوانی تابع ، پارامتر ها از برنامه فراخوان به تابع ارسال می شوند. اگر تعداد پارامتر ها بیش از یک عدد باشد با کاما از هم جدا شوند. در لیست پارامتر ها، نوع هر یک از پارامترها نیز مشخص می شود. پارامتر ها متغیر هایی هستند که هنگام تعریف تابع، جلوی نام تابع و در داخل پرانتز قرار گرفته و تعریف می شوند. پارامترها به عنوان متغیری در داخل تابع قابل استفاده هستند. اگر تابعی آرگومان است، به جایی لیست آرگومان ها، کلمه void را قرار دهید.)
بدنه تابع: مجموعه دستوراتی که عملیات مربوط به تابع را انجام می دهند.

نکته: تعریف تابع در داخل تابع دیگر مجاز نمی باشد.

نوشتن تابع در زبان برنامه نویسی C

۴- الگوی تابع

الگوی تابع مشخص می کند که تابع چگونه باید فراخوانی شود

;  (لیست پارامترها)   نام تابع   <نوع تابع>

  • برای بکار گیری تابع در برنامه، باید الگوی آن را در خارج از تابع ()main به کامپایلر اعلان کرد. به این کار اعلان الگوی تابع گفته می شود.
  • اگر تعریف توابع قبل از تابع ()main باشد، دیگر نیازی به اعلان تابع نیست.
  • اگر تابع بعد از تابع ()main تعریف شود، باید الگوی آن قبل از تابع ()main قرار داده شود.
  • بهتر است الگوی تمامی توابع را قبل از تابع ()main اعلان کنید. حتی می توانید در داخل تابع ()main نیز قبل از استفاده از تابع آن را اعلان کنید.

نکته: هیچ تابعی نمی تواند از متغیرهای سایر توابع استفاده کند، مگر اینکه از طریق پارامتر ها منتقل شوند.

۵- فراخوانی توابع

برای فراخوانی یک تابع باید از نام آن بعلاوه لیست آرگومانهای متناسب با پارامترهای تابع استفاده کرد. نکته مهم آنست که باید تعداد، ترتیب و نوع آرگومانهای ارسالی با پارامترهای متناظرشان در تعریف تابع، منطبق باشد. در غیراینصورت ممکن است خطای نحوی و یا حتی خطای منطقی رخ دهد. هنگامیکه یک تابع فراخوانی می گردد، اجرای تابع فراخواننده بطور موقت متوقف شده و کنترل اجرا به تابع فراخوانی شده منتقل می گردد. پس از اتمام تابع فراخوانی شده و اجرای دستور return توسط آن، کنترل اجرا به تابع فراخواننده بازگشته و اجرا را از دستور بعدی، از سر می گیرد. چنانچه تابع هیچ مقداری را بازنگرداند، می توان آن را بصورت یک دستور مستقل فراخوانی کرد.
فراخوانی تابع  به دوشکل تعریف می‌گردد:

  1. فراخوانی تابع با مقدار(call by value)
  2. فراخوانی تابع با ارجاع(call by reference)

در فراخوانی تابع با مقدار یک کپی از مقدار آرگومان‌های تابع روی پارامترهای آن نوشته می‌شود، بنابراین تغییر کردن آرگومان تاثیری روی مقدار پارامتر نمی‌گذارد.



 * در مثال بالا تابع tempconv تبدیل دما برحسب سانتیگراد به فارنهایت را انجام می دهد، و مقدار دما را بر می گرداند. اما حالت دیگری هم در زبان c وجود دارد که در آن بدنه تابع مستقیما دستری به آرگومان‌ها داشته باشد. این قابلیت مفیدی است که به آن فراخوانی با ارجاع می‌گویند. در این روش آدرس آرگومان روی پارامتر کپی می‌شود. در بدنه تابع از آدرس ارسال شده برای دسترسی به آرگومان استفاده می‌شود، به این ترتیب تغییرات ایجاد شده در متغیر پارامتر، روی آرگومان نیز تاثیر می‌گذارد. به مثال زیر توجه کنید.



نکته: در روش فراخوانی با مقدار، تابع می‌تواند یک یا چند ورودی و تنها یک خروجی داشته باشد؛ اما در بسیاری از کاربردها لازم است تابع چندین خروجی داشته باشد.

۵-۱- فراخوانی تابع با مقدار

در فراخوانی توسط مقدار، آرگومانهای ارسالی توسط تابع فراخواننده، در پارامترهای متناظر تابع فراخوانی شده، کپی می گردند. بنابراین تابع فراخوانی شده عملیات خود را برروی یک کپی از آرگومانهای ارسالی انجام می دهد. درنتیجه، در صورت انجام هرگونه تغییری برروی این کپی توسط تابع فراخوانی شده، متغیر اصلی در تابع فراخواننده تغییر نخواهد کرد. مزیت این نوع فراخوانی در این است که می توان بدون هیچ نگرانی از تغییر ناخواسته متغیرها، آنها را به هر تابعی ارسال کرد، چرا که فقط یک کپی از آنها به تابع ارسال می شود. در زبان C در حالت عادی فراخوانی تابع توسط مقدار صورت می پذیرد. برای روشن شدن موضوع به مثال زیر توجه کنید:



خروجی کد بالا:



همانطور که می بینید، گرچه پارامترهای aو b در داخل تابع test تغییر کرده اند، اما پس از بازگشت به تابع فراخواننده یعنی، main آرگومانهای متناظر به آنها یعنی xو  y همچنان همان مقادیر اولیه خود را دارا هستند. شکل زیر نحوه کار را نشان می دهد.
 فراخوانی تابع با مقدارهمانطور که گفته شد، این نحوه فراخوانی حالت پیش فرض در زبان C بوده ومعمولا نیز برنامه نویسان ترجیح می دهند از این روش برای ارسال آرگومانها به توابع استفاده نمایند، چرا که متغیرها را در برابر تغییرات ناخواسته در هنگام ارسال به توابع دیگر حفظ می کنند. اما گاهی لازم است که تابع فراخوانی شده بتواند مقدار متغیرهای دریافتی را تغییر دهد، و این تغییرات در متغیرهای اصلی ارسال شده از طرف تابع فراخواننده نیز اعمال شود. در اینصورت باید از روش فراخوانی توسط ارجاع استفاده نماییم.

۵-۲- فراخوانی تابع با ارجاع

در این روش فراخوانی، خود آرگومانهای اصلی، به تابع فراخوانی شده ارسال می گردد. در نتیجه، هرگونه تغییری در پارامترهایی تابع فراخوانی شده، مقدار آرگومانهای اصلی در تابع فراخوانی کننده را نیز تغییر خواهد داد. در C اولیه، تنها راه فراخوانی توابع توسط ارجاع، استفاده از متغیرهای اشاره گر بود، اما در استاندارد جدید C ،می توان این کار را به روش ساده تری و با استفاده از متغیرهای ارجاعی انجام داد. یک متغیر ارجاعی، در حقیقت یک نام مترادف و یا یک جایگزین برای یک متغیر دیگر است. برای تعریف یک متغیر ارجاعی از علامت & پس از نوع متغیر مورد ارجاع استفاده می کنیم. بعنوان مثال به نمونه زیر توجه کنید:
 



خروجی کد بالا:



مثال فوق نشان می دهد که در حقیقت a و r یک متغیر هستند و هرگونه تغییری در هریک از این دو، دیگری را نیز تغییر خواهد داد.
برای ارسال آرگومانها توسط ارجاع، کافی است پارامترهای تابع مورد نظر را بصورت متغیر ارجاعی تعریف نماییم. در اینصورت، این پارامترها در حقیقت یک ارجاع به آرگومانهای ارسالی خواهند بود و در نتیجه هرگونه تغییری در آنها، آرگومانهای اصلی در تابع فراخوانی آننده را نیز تغییر خواهد داد. بعبارت بهتر، در این روش بجای آنکه یک آپی از آرگومانها در پارامترها قرار گیرد، خود آرگومانها به تابع فراخوانی شده ارسال خواهند شد. بعنوان مثال، همان تابع قسمت قبلی را که بصورت فراخوانی توسط مقدار عمل می کرد، مجددا به روش فراخوانی با ارجاع باز نویسی می کنیم تا تفاوت این دو مشخص گردد:



خروجی کد بالا:



همانگونه که مشاهده می کنید، تغییر پارامترهای a و b در داخل تابع test باعث شده آه آرگومانهای متناظر آنها در تابع فراخواننده، یعنی x و y نیز تغییر نمایند. شکل زیر نحوه کار را نشان می دهد.

فراخوانی تابع با ارجاع

چه موقع از فراخوانی توسط ارجاع استفاده کنیم؟

فراخوانی توسط ارجاع در دو مورد کاربرد دارد، که هریک را با ذکر یک مثال توضیح می دهیم:

  •  می دانیم که هر تابع فقط می تواند یک مقدار را توسط دستور return باز گرداند. در مواردی که تابع باید بیش از یک مقدار را باز گرداند، تنها راه استفاده از فراخوانی توسط ارجاع است. بدین صورت که تعدادی پارامتر خروجی را بصورت ارجاعی به تابع ارسال می کنیم، و تابع پس از انجام محاسبات، خروجی را در این متغیرها قرار داده و باز می گرداند. از آنجا که پارامترها توسط ارجاع ارسال شده اند، تغییرات اعمال شده توسط تابع (قرار دادن مقدار خروجی در آنها) به تابع فراخواننده منتقل خواهد شد.

*برنامه ای بنویسید که ضرایب یک معادله درجه دوم را دریافت و ریشه های آن را محاسبه وچاپ نماید.



  • در مواردی که آرگومان ارسالی به تابع، همزمان نقش ورودی و خروجی را دارا باشد. یعنی آرگومان علاوه بر آنکه مقداری را به تابع ارسال می آند، ممکن است مقداری را به تابع فرا واننده نیز بازگرداند. مثال زیر این موضوع را روشن می کند.
    * برنامه ای که و عدد را از کاربر دریافت و با استفاده از یک تابع، مقدار آن دو را جابجا و چاپ کند.



خروجی کد بالا:



دقت کنید که در برنامه فوق، چنانچه آرگومانها بصورت مقدار به تابع swap ارسال می شد، پس از بازگشت از تابع، مقادیر متغیرهای x و y هیچ تغییری نکرده و همان مقادیر قبلی خود را دارا بودند.

نکته: چنانچه پارامتری بصورت فراخوانی توسط ارجاع تعریف شده باشد، تنها می توان یک متغیر را بعنوان آرگومان به آن ارسال کرد، و ارسال ثابت یا عبارت محاسباتی مجاز نیست.

بعنوان مثال فراخوانیهای زیر برای تابع swap مجاز نیستند.



در آخر به این نکته توجه کنید که، برای نحوه تهیه توابع بدین صورت عمل کنید:
ابتدا بدون توجه به جزئیات پیاده سازی توابع، آرگومان ها و نتیجه ای را که از توابع انتظار دارید، مشخص کنید. به عبارت دیگر، در قدم اول لازم نیست به جزئیات پیاده سازی تابع بپردازید. تنها مشخص کردن ورودی و خروجی تابع و چگونگی عملکرد آن اهمیت دارد. با توجه به فرضیات برنامه اصلی را بنویسید. پس از نوشتن برنامه اصلی، تعریف توابع دیگر را بنویسید. توابع را طوری طراحی و پیاده سازی کنید که هر تابع تنها به آنچه نیاز دارد دسترسی داشته باشد. برای ارتباط بین توابع از آرگومان ها و پارامترها استفاده کنید.


سختی های برنامه نویسی و راهکارهای عملی

۱۱ مهر ۱۳۹۷
بدون نظر


بعد از اینکه مقاله مشکلات شغل برنامه نویسی و نحوه رفع آنها در سایت منتشر کردیم بازخوردهای خوبی برای این مقاله دریافت کردیم حال می خواهیم در مورد سختی های برنامه نویسی کنیم و ببینیم کار کردن در حوزه برنامه نویسی چه سختی هایی دارد و ما باید چه سخت هایی رو تحمل کنیم. سعی می کنم از ابتدای یادگیری و آموزش برنامه نویسی بررسی کنیم تا ببینیم در ابتدا و در ادامه راه، چه سختی هایی رو باید به جون بخریم تا یک برنامه نویس حرفه ای و عالی شویم.

سختی های برنامه نویسی

سختی های برنامه نویسی

هر حوزه کاری یا رشته ای، سختی های خودش را دارد که باید پشت سر گذاشت. برنامه نویسیم از این قائده مستثنا نیست و سختی های خودش را دارد. بر اساس تحقیقات و تجربیات خودم ۸ سختی برنامه نویسی رو لیست کرده ام که در بخش پایین آورده ام که می توانید ببینید. در ادامه در مورد هر کدام از این سختی ها، توضیحاتی داده ام.

  • تشخیص شاخه کاری
  • انتخاب زبان برنامه نویسی
  • یادگیری اولیه برنامه نویسی
  • کم کار کردن
  • مداومت در کار
  • تعریف پروژه
  • بکار گیری دانسته ها در عمل
  • توهم تخصص و مهارت
  • کمبود منابع آموزشی در سطح بالا

۱- تشخیص شاخه کاری
اولین سختی که به نظرم در ابتدا، برای کسانی که می خواهند وارد برنامه نویسی شوند،  تشخیص زیر شاخه کاری است. به شخصه دیده ام که اکثرا نمی دونند وارد چه شاخه ای شوند. مثلا میگن برنامه نویسی موبایل کار کنیم یا به سمت برنامه نویسی وب بریم. راسیتش برای کسی که در ابتدای راه است یکی از سخت ترین انتخاب های ممکن است. بعد وقتی شاخه اصلی رو انتخاب می کنی بحث زیر شاخه میاد مثلا من برنامه نویسی موبایل رو انتخاب کردم حال نمیدونم برم سمت برنامه نویسی اندروید یا ios، همین باحث میشه در ابتدا خیلی سردرگم شوید.

اصلا جای نگرانی نیست چون کافیه وبینار نقشه راه یادگیری برنامه نویسی رو دانلود کنید و از این موضوع به راحتی بگذرید. برای دانلود وبینار نقشه راه کافیه از سمت چپ سایت ایمیلتون رو بدید تا فیلم وبینار برای شما ایمیل شود.

۲- انتخاب زبان برنامه نویسی
یکی از سختی های برنامه نویسی همین انتخاب زبان برنامه نویسی هستش، شاید روزی بالای ۱۰ نفر تو سایت و شبکه های اجتماعی در مورد انتخاب زبان برنامه نویسی سوال می پرسند. راسیتش در ابتدا واقعا سخت هستش چه زبانی رو انتخاب کنیم چون از هیچی سر در نمیاریم و نمیدونیم باید چه کنیم. اصلا جای نگرانی نیست چون قبلا در این زمینه مقالات زیادی رو در سایت منتشر کرده ایم که می توانید از این مقالات استفاده کنید.

پیشنهاد میکنم مقالات بهترین و کاملترین زبان برنامه نویسی، محبوب ترین زبان برنامه نویسی در ایران، بهترین زبان برنامه نویسی ۲۰۱۸ و پردرآمدترین زبان برنامه نویسی در ایران را مطالعه کنید.

۳- یادگیری اولیه برنامه نویسی
هر چیزی رو که می خواهید شروع کنید در ابتدا نمیدونید چی به چی هستش و یه ذره سردگم میشید. این موضوع برای برنامه نویسی هم وجود دارد. بعد از اینکه متوجه شدیم چه شاخه ای رو انتخاب کنیم و زبان برنامه نویسی رو مشخص شد سختی دیگری در راه است آن هم یادگیری مباحث اولیه می باشد. البته این موضوع واسه یادگیری همه چیز صادق است. برای سختی و مشکل باید متمرکز باشید و پشتکار داشته باشید تا از این سختی هم بگذرید.

۴- کم کار کردن
یکی از سختی های برنامه نویسی به نظر خودم اینه که این حس رو به بقیه القا می کند که با کم کار کردن و سطحی دانستن یک زبان برنامه نویسی همه چی تموم است و فکر می کنیم برنامه نویس شده ایم. اصلا اینطور نیست و باید برای برنامه نویس شدن بیشتر از اینها کار کرد.

۵- مداومت در کار
یکی دیگر از سخت های برنامه نویسی، مداومت در کار است. اگر می خواهید برنامه نویس شوید باید پشت سر هم یاد بگیرید و کد بنویسید تا بتوانید یک برنامه نویس حرفه ای شوید. تا به صورت پیوسته کار نکنید نمی توانید برنامه نویس شوید و باید ادامه دار باشد این یادگیری و تمرین کردن.

۶- تعریف پروژه و بکار گیری دانسته ها در عمل
یکی دیگر از سختی های برنامه نویسی که به نظرم برای افرادی که تازه وارد برنامه نویسی شده اند به شدت نمود پیدا می کند تعریف کردن پروژه هستش، یعنی طرف می خواد یک پروژه بنویسه ولی نمیدونه چطور از این دانسته های خود در عمل استفاده کند. بارها دیده ام طرف کدها رو بلد هستش ولی نمی تواند پروژه ای رو تعریف کند یا پروژه ای رو انجام دهد. واقعا در ابتدا این موضوع یکی از سخت ترین کارهای برنامه نویسی است که باید بیشتر در موردش کار کرد و مجموعه های پروژه محور رو دید تا با نحوه کار آشنا شد.

۷- توهم تخصص و مهارت
یکی دیگر از سختی های برنامه نویسی که به نظرم خیلی خیلی آدم رو اذیت می کند توهم تخصص و مهارت است. خیلی ها در ابتدا کار وقتی مقدار برنامه نویسی یاد میگیرند توهم تخصص و مهارت پیدا می کنند کلا برنامه نویسی این مدل حسی رو به آدم میده که باید تا می تونیم از آن دوری کنیم. به نظرم این توهم تخصص و مهارت که برنامه نویسی در ابتدا به ما میده کار رو خیلی سخت می کند.

۸- کمبود منابع آموزشی در سطح بالا
یکی از سختی های برنامه نویسی که به نظرم خیلی خیلی کاربران و برنامه نویس ها رو اذیت می کند نبود منابع آموزشی خوب در سطح بالای برنامه نویسی هستش. یعنی طرف میبینی روی یک پروژه خاص کار می کند و به مشکلی بر میخورد برای این مشکلات در منابع فارسی، آموزشی وجود ندارد و باید از منابع خارجی استفاده کنید.

به نظر شما سختی های برنامه نویسی چی هستند؟


حلقه های تکرار در زبان برنامه نویسی C

۱۰ مهر ۱۳۹۷
بدون نظر


در حالت عادی دستورات برنامه از اولین دستور به آخرین دستور اجرا می‌شود اگر بخواهیم بعضی از دستورات چندین بار اجرا شوند و بعضی تحت شرایط خاص اجرا شده و بعضی دیگر اجرا نشوند ساختارهای تکرار و تصمیم استفاده می کنیم. حلقه های تکرار، برای تکرار اجرای دستورات مورد استفاده قرار میگیرد. حلقه های تکرار تحت شرایط خاصی یک یا چند دستور را چندین بار اجرا می کند. به عنوان مثال اگر بخواهیم تعداد ۱۰۰ عدد را از ورودی بخوانیم و آنها را باهم جمع کنیم، باید عمل خواندن عدد را ۱۰۰ بار تکرار کنیم. ساختارهای تکرار در زبان های برنامه سازی مختلف به شکل های گوناگون مورد استفاده قرار می‌گیرد، که در این بخش، حلقه های تکرار  در زبان C را مورد بررسی قرار می‌دهیم.

حلقه های تکرار در زبان C

اصولا حلقه های تکرار در زبان C  را میتوان به دو دسته تقسیم کرد:

  • حلقه تکرار For  : در این حلقه ها تعداد تکرار دستورات داخل حلقه از قبل برای ما مشخص است.
  •  حلقه تکرار While : تعداد تکرار دستورات داخل حلقه برای ما مشخص نیست. تا زمانی که شرط حلقه نقض نگردد، دستورات داخل حلقه ادامه دارند.

حلقه تکرار For ۱- حلقه تکرار For 

ساختار تکرار FOR یکی از امکانات ایجاد حلقه است و معمولاً در حالتی که تعداد دفعات تکرار حلقه، از قبل مشخص باشد به کار می رود. در این ساختار متغیر ی وجود دارد که تعداد دفعات تکرار حلقه را کنترل می‌کند این متغیر را شمارنده یا اندیس حلقه تکرار می گوییم.
اندیس حلقه دارای یک مقدار اولیه  می باشد، و در هر بار اجرای دستورات حلقه، مقداری به آن اضافه می شود این مقدار را که پس از هر بار اجرای حلقه، به شمارنده اضافه می شود گام حرکت گفته می شود.

یکی دیگر از اجزای حلقه،شرط حلقه می باشد، که مشخص می کند که دستورات داخل حلقه تا کی باید اجرا شود. اگر این شرط دارای ارزش درستی باشد، دستورات داخل حلقه اجرا می شوند و گرنه کنترل برنامه از حلقه تکرار خارج می شود. اندیس حلقه میتواند عدد منفی ، یا مثبت، صحیح و یا اعشاری و کارکتری باشد.
به صورت خلاصه می توان گفت که یک حلقه for سه بخش دارد :

  • تنظیم
  • شرط خروج برای اینکه حلقه کی تمام شود.
  • بخشی که تکرار می شود که دستوراتی که باید تکرار شوند، هستند.

حلقه تکرار For زمانی از حلقه for استفاده می کنیم که تعداد دفعات تکرار حلقه رو از قبل بدانیم و شکل کلی این ساحتار به صورت زیر هست که مشاهده می کنید :



در این ساختار همان طور که مشاهده می کنید، حلقه for سه، مقدار دارد که با سیمیکالون از هم جدا شده اند، که اولین مقدار شمارنده یا اندیس حلقه نام دارد، که باید بهش مقدار اولیه داده شود ، در قسمت دوم شرط حلقه رو قرار می دهیم، در قسمت سوم  به وسیله یه عبارت محاسباتی مقدار شکارنده رو تعیین می کنیم.

۱-۱- نکات حلقه for در c :

  •  شمارنده حلقه میتواند از هر نوعی باشد.
  • حلقه for تازمانی اجرا میشود که شرط حلقه برقرار باشد.
  •  اگر در جلوی for سیمیکلون یا ; بگذاریم این دستور تا موقعی که شرط حلقه برقرار باشد اجرا میشود، و پـس از نقض شرط حلقه از حلقه خارج شده و دستورات بعد از اون اجرا میشوند.
  • اگر بعد از for یک دستور داشته باشیم نیازی به کلوشه { } نداریم.
  • ( ; ; )for برای ایجاد حلقه بی نهایت مورد استفاده قرار میگیرد. حلقه بی نهایت فاقد شرط پایان است پس هیچ وقت متوقف نخواهد شد. در چنین مواقعی توقف اجرای برنامه از کلید هایBreak + Ctrl مورد استفاده قرار می گیرند.



در این مثال چون {} نداریم پس فقط دستور اول بعد از for مربوط به حلقه و لوپ ما میشود.

پس خروجی ۰ تا ۲ را شمارش کرده و چاپ میکند، هر موقع از حلقه خارج شد به دستور پرینت ok خواهد رسید و و آنرا نیز چاپ خواهد کرد.
خروجی کد بالا:







خروجی: اعداد ۱۰ تا کوچکتر از ۲۰ را شمارش می کند.
خروجی کد بالا:



۱-۲- حلقه های تکرار تودرتو:

اگر حلقه تکراری داخل حلقه تکرار دیگری قرار بگیرد اصطلاحا، حلقه های تودرتو گفته می شود. قانونی که بر حلقه های تکرار تو در تو حاکم است این است که، به ازای هر بار اجرای حلقه تکرار خارجی، حلقه تکرار داخلی به طور کامل اجرا می شود. ضمناً، انتهای حلقه تکرار داخلی، زودتر از حلقه تکرار خارجی مشخص میشود
مثلا در دستور زیر حلقه تکرار با اندیس i حلقه خارجی است و حلقه تکرار با اندیس j حلقه تکرار داخلی می باشد.

 اگر حلقه های تکرار تو در تو، از یک جا شروع و به یک جا ختم شوند حلقه خارجی نیاز به آکولاد ندارد. به مثال زیر توجه کنید:



۱-۳– عملگر کاما , :

عملگر کاما انعطاف پذیری بیشتری به حلقه ی for می بخشد.با استفاده از این عملگر می توان در قسمت های مقدار اولیه و گام حرکت , دو یا چند عبارت را با هم ترکیب کرد.مثال:

در این حلقه تکرار اولین کاما، دو متغییر i و m را مقدار اولیه می دهد و دومین کاما، در هر تکرار، یک واحد به i و یک واحد به m اضافه می‌کند.

 

حلقه تکرار While ۲- حلقه تکرار While
ساختار تکرار while یکی دیگر از امکاناتی که برای تکرار اجرای دستورات به کار می رود. ساختار تکرار while به صورت زیر قابل استفاده می باشد:

حلقه while  در c

در مواردی که در ابتدای کار تعداد تکرار های دستورالعمل ها مشخص نمی باشد معمولا از این ساختار استفاده می شود. این ساختار به روش فوق مورد استفاده قرار می گیرد. در صورتی که دستورات تکرار شونده فقط یکی باشد نیازی به و نمی باشد.هنگام اجرای این دستور , اگر شرط حلقه ارزش درستی داشته باشد دستورات حلقه اجرا میشوند وگرنه کنترل برنامه از حلقه خارج می شود.برای اینکه حلقه خاتمه یابد , شرط حلقه باید داخل حلقه نقض شود.یعنی باید شرایطی در داخل حلقه ایجاد شود تا شرط حلقه بعد از مدتی ارزش نادرستی پیدا کرده و حلقه خاتمه یابد.اگر شرط حلقه همیشه درست باشد (هیچ گاه نقض نشود), حلقه تکرار بی نهایت ایجاد می شود.

خروجی کد بالا:



۳- حلقه تکرار do…while 
حلقه do…while، کاملا شبیه حلقه While است، با یک تفاوت کوچک. در حلقه  do…while شرط حلقه در انتهای آن بررسی می شود و این امر باعث می شود که همیشه کدهای داخل حلقه do…while  حداقل یک مرتبه اجرا شود.(حتی اگر شرط از اول غلط باشد). اگر شرط برقرار باشد، تکرار کدها ادامه پیدا می کند، اما اگر شرط برقرار نباشد برنامه از حلقه خارج می شود.
ساختار این حلقه به صورت زیر است :

حلقه تکرار do...while






  • دقیقا مانند مثال حلقه while است اما با یک تفاوت:
  • بار اول بدون بررسی شرط، یک بار دستورات حلقه اجرا می شوند.
  • در انتهای حلقه شرط بررسی می شود. اگر شرط برقرار بود دوباره حلقه تکرار می شود و این روال تا زمانی که شرط حلقه برقرار باشد تکرار خواهد شد.



تنها تفاوت استفاده ا زحلقه do while است. پس از کامپایل و اجرای برنامه بالا ، نتایج زیر حاصل می شود:
خروجی کد بالا:



از کدام حلقه تکرار استفاده کنیم ؟

حال که با دستورات و ساختار حلقه های تکرار در زبان C، آشنا شدیم این پرسش به وجود می آید که از کدام حلقه در چه موقع باید استفاده کرد؟

معمولا وقتی که تعداد حلقه تکرار مشخص، وگام حرکت نیز معین باشد، از حلقه FOR استفاده می شود. در موارد دیگر سعی کنید از حلقه های while و do…while استفاده کنید.اگر شرایطی وجود داشت که، چه شرط حلقه درست باشد و چه نادرست، دستورات حلقه حداقل یک بار باید اجرا شوند، از حلقه do…while  و گرنه از حلقه while استفاده کنید.


جملات شرطی در برنامه نویسی C

۹ مهر ۱۳۹۷
بدون نظر


جملات شرطی در برنامه نویسی C

به طور کلی در حالت عادی دستورات برنامه از اولین دستور به آخرین دستور اجرا می شوند. اگر بخواهیم تحت شرایطی، تعدادی از دستورات اجرا شوند و یا تعداد دیگر از دستورات اجرا نشوند، باید از ساختارهای تصمیم استفاده کنیم. این ساختارها شرطی را تست کرده در صورت درست بودن شرط، مجموعه ای از دستورات را انجام می دهند. توانایی ساخت دستورات شرطی کلی از مهم ترین کارهایی است که بایستی بتوان با زبان های برنامه نویسی انجام داد. در C، ساختار شرطی if بسیار ساده و کاربردی است. در زبان برنامه نویسی c چندین جملات شرطی  وجود دارد که در این جملات  کنترلی غنی و متنوع C مورد بررسی قرار می گیرد. در زبان C دو ساختار شرطی مهم به نام های if و switch وجود دارد که در ادامه با آن ها آشنا می شویم.

عبارت شرطی IF

۱-  عبارت شرطی IF
ساختار if که نام دیگرش، دستور انتقال کنترل شرطی است، شرطی را تست می‌کند و در صورتیکه آن شرط دارای ارزش درستی باشد، مجموعه ای از دستورات را اجرا میکند. این دستور به صورت زیر به کار میرود:



عبارت شرطی IF

۱-۱- شرطهای تو در تو :



در شرط های تو در تو هر else مربوط به نزدیکترین if است.

 اگر شرط موردنظر برقرار باشد، کدهای درون {  } در زیر if اجرا خواهند شد. اگر شرط موردنظر برقرار نباشد، کدهای درون { } در زیر else اجرا خواهند شد

*مثال زیر عددی را از ورودی دریافت می کند و زوج یا فرد بودن آنرا مشخص و درخروجی پیغام مناسب را چاپ کند.

 *در مثال زیر زوج یا فرد بودن عدد ورودی مورد بررسی قرار می گیرد.



خروجی کد بالا:



برنام مشخص کردن عدد اول در برنامه نویسی c*در مثال زیر بررسی می کند که آیا عدد اول می باشد یا خیر.



خروجی کد بالا:

۱-۲- کاربرد else در دستور IF چیست

اگرشرط روبروی if (چیزی که داخل پرانتز نوشته شده) برقرار باشد مجموعه ی دستورات داخل if اجرا میشود و اگر شرط برقرار نباشد مجموعه دستورات داخل else اجرا میشود.

نکته: اگر مجموعه دستورات if شامل فقط یک دستور باشه نیازی به { } نداریم.

۱-۳- انتقال کنترل غیر شرطی:

  • دستور کنترل شرطی if بعد از بررسی کردن شرط , با توجه به نتیجه شرط اقدام به اجرای دستورالعمل ها می کند.برخی دستورات دیگر بدون بررسی کردن هیچ شرطی قادر به انتقال کنترل برنامه از نقطه ای به نقطه دیگر هستند.(break ; continue ; goto).
  • دستور break موجب خروج از حلقه تکرار می شود.نحوه استفاده از این دستور به این صورت است : ;break . اگر چندین حلقه تودرتو وجود داشته باشد , این دستور موجب خروج از حلقه ای که در آن است می شود.برای خاتمه دادن به ساختار switch نیز از این دستور استفاده می شود.
  • دستور continue در حلقه تکرار موجب انتقال کنترل به ابتدای حلقه می شود.پس از انتقال کنترل به ابتدای حلقه , شرط حلقه مورد بررسی قرار می گیرد.چنانچه شرط درست باشد , اجرای دستورات حلقه ادامه می یابد وگرنه حلقه تکرار خاتمه می یابد.استفاده از این دستور به این صورت است: ;continue .
  • دستور goto سبب انتقال کنترل از نقطه به نقطه دیگر برنامه می شود.این دستور معمولا به ندرت مورد استفاده قرار می گیرد.چون استفاده از آن خوانایی برنامه را بسیار کاهش می دهد.نحوه استفاده از آن به این صورت است: ;<برچسب>goto  .برچسب دستور همانند متغیرها نامگذاری می شود و به ( ; ) ختم می شود.انتقال کنترل توسط goto فقط داخل یک تابع امکان پذیر است.

ساختار تصمیم  switch۲- ساختار تصمیم  switch
ساختار switch یکی از ساختارهای مهم و جالب در برنامه نویسی  است. از این ساختار برای تصمیم‌گیری‌های چندگانه بر اساس مقادیر مختلف یک عبارت، استفاده می شود. اگر چه ساختار شرطی if-else-if می تواند تست های چندگانه انجام دهد، با این حال مشکل ساز نیز می باشد. حتی نویسنده این ساختار بعدا نمی تواند گردش برنامه را ردیابی کند. به همین دلیل، در تمام تصمیم‌گیری‌هایی که بیش از سه اتخاب وجود داشته باشد، بهتر است از ساختار switch استفاده شود به عنوان مثال، فرض کنید یک متغیر به نام X تعریف می شود، و مقادیر ۱، ۳، ۷، ۹، ۱۵ از ورودی می پذیرد. مقرر است بسته به هر مقدار دستور خاصی اجرا شود. و اگر X مقداری غیر از این مقادیر داشته باشد دستور دیگری اجرا شود. این ساختار با switch  پیاده سازی می شود.

ساختار تصمیم  switch



این ساختار به صورت زیر مورد استفاده قرار می گیرد:

  • ابتدا عبارت مقابل switch به مقدار صحیح ارزیابی می شود و مقدار آن تعیین می شود.
  • اگر مقدار عبارت برابر با <مقدار ۱> باشد <دستورات ۱> اجرا می شوند و اجرای دستورات تا رسیدن به break ادامه خواهد یاقت.
  • دستور break اجرای برنامه را از ساختار switch خارج می سازد.
  • در صورتی که مقدار غبارت با <مقدار ۱> برابر نباشد با <مقدار ۲> مقایسه می شود و همین روند ادامه می یابد.
  • تا زمانی که مقدار عبارت برابر با یکی از مقادیر نباشد عمل مقایسه ادامه می یابد.
  • اگر مقدار عبارت با هیچ کدام از مقادیر برابر نباشد , دستورات بخش default به اجرا در می آید.






در ساختار switch به چند مورد باید توجه کرد:

  • ساختار switch می‌تواند بدون بخش default باشد، در این صورت اگر عبارت محاسبه شده با هیچ کدام از مقادیر مساوی نباشد، هیچ کدام از دستورات داخل switch اجرا نمی شود.
  • مقادیر موجود در case های switch نمی توانند با هم مساوی باشند. یعنی دستورات ۱، ۲ ،۳ و …n نباید مساوی باشند.
  • اگز ثوابت کاراکتری در ساختار switch مورد مقایسه قرار گیرند، به مقدار صحیح تبدیل می شوند.
  • اگر در یک case از دستور break استفاده نشود، با مقدار case بعدی or می شود. برای این که دو یا چند شرط را ساختار switch با هم or کنید، آنها را بدون break پشت سر هم قرار دهید.
  • یکی از تفاوت های if و switch در این است که در ساختار if می توان عبارت منطقی یا رابطه ای را مورد بررسی قرار داد ولی در ساختار switch فقط مساوی بودن مقادیر مورد بررسی قرار می گیرد.
  • چند ساختار switch را می توان به صورت تودرتو مورد استفاده قرار داد.

ساخت ماشین حساب ساده با دستورات switch...case*ساخت ماشین حساب ساده با دستورات switch…case



خروجی کد بالا: