مطالب یافت شده برای دسته بندی : برنامه نویسی

سیستم مدیریت پایگاه داده چیست؟


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

سیستم مدیریت پایگاه داده چیست؟

قبل از اینکه بگیم سیستم مدیریت پایگاه داده چیست؟ باید پایگاه داده رو تعریف کنیم و بعد در مورد سیستم مدیریت آن صحبت کنیم. بانک اطلاعاتی یا پایگاه داده یا دیتابیس (data base) به مجموعه ای از اطلاعات با ساختار منظم گفته می شود. این پایگاه های اطلاعاتی معمولاً در قالبی که برای دستگاه ها و رایانه ها قابل خواندن و قابل دسترسی باشند ذخیره می شوند.

سیستم مدیریت پایگاه داده چیست؟

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

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

وظایف سیستم مدیریت پایگاه داده

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

  • اداره دکشنری دیتا (Meta Data)
  • اداره ذخیره دیتا
  • ایجاد دیتابیس
  • ایجاد جداول (Tables)
  • ایجاد ساختمان های کمکی
  • خواندن دیتا از یک دیتابیس
  • تغییر آوردن در دیتای یک دیتابیس
  • حفظ و نگهداری ساختمان های داخلی دیتابیس
  • اجراء اوامر
  • کنترول Concurrency
  • امنیت Security

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

انواع سیستم های مدیریت پایگاه داده

انواع سیستم های مدیریت پایگاه داده

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

سیستم مدیریت پایگاه داده توزیع شده (Distributed DataBase Management System)
سیستم های توزیع شده بر توزیع داده و همچنین همبستگی فعالیت ها و کنترل روی اجزای توزیع شده سیستم دلالت دارند. اکثر سیستم های توزیع شده برای تقسیم کردن بارکاری یا برای انتقال عملکردهای پردازش داده به نزدیکی محل انجام این وظایف است. در هردو حالت هدف نامحسوس بودن توزیع شدگی از دید کاربر است.

سیستم مدیریت پایگاه داده بلادرنگ (Real-Time DataBase Management System)
سیستم های بلادرنگ سیستم های سریع با سرعت پاسخگوئی بالا هستند که زمان انجام کلیه عملیات نقش مهمی در آنها دارد. سیستم بلادرنگ در تعامل با دنیای واقعی پاسخ قابل پیش بینی را در قاب زمان می دهد. ورودی، پردازش و پاسخ ها همگی از قبل تعریف شده هستند و حد زمانی مشخصی دارند و به نحوی بهینه می شوند که هر حالت ورودی یک حالت خروجی قابل پیش بینی دارد که همیشه در یک زمان و به یک روش اتفاق می افتد.

سیستم مدیریت پایگاه داده تحمل پذیر خطا (Fault Tolerance DataBase Management System)
سیستم تحمل پذیر خطا سرویس هائی را دارد که با ناتوانی های اجزای سخت افزاری و نرم افزاری برخورد می کند. برای رسیدن به این منظورباید کلیه نقاطی که احتمال نقصی در آنها وجود دارد از قبل بررسی شده، ابزارهائی برای تشخیص، اصلاح و یا ترمیم آنها به نحوی طراحی شود که کمترین تاثیر را روی برنامه های کاربردی بگذارند. مکانیسم های RAID، Shadow Memory و کپی از جمله روش هائی هستند که استفاده می شوند.

سیستم مدیریت پایگاه داده مطمئن (Secure DataBase Management System)
در یک سیستم مطمئن کلیه اعمالی که کاربران و برنامه های کاربردی اجازه دارند انجام دهند همچنین زمان و مقدار انجام آنها کنترل می شوند. به عنوان مثال یک سیستم پرسنلی ممکن است درنظرداشته باشد به کلیه کاربران اجازه دستیابی به سابقه پرسنلی خودشان و استخراج اطلاعات شغلی شان را بدهد اما دسترسی به سابقه کارمندان دیگر یا حتی برخی اطلاعات مربوط به خودشان امکان پذیر نباشد. برای دادن چنین سرویسی سیستم پایگاه داده باید قابلیـت تعریف حقوق دسترسی و رسیدگی به آنها را درقبال کاربرانی که به داده دسترسی دارند داشته باشد.

سیستم مدیریت پایگاه داده ناهمگون (Hetrogenouse DataBase Management System)
سیستم ناهمگون از DBMS های مختلف تشکیل شده است. برای مثال شعب یک شرکت هر کدام منحصرا نیازهای پردازشی خود را با سخت افزار و نرم افزارجداگانه برطرف می کنند. اگر نیاز باشد این سیستم ها با هم فعل و انفعال داشته باشند و از طریق شبکه به هم پیوند داده شوند یک HTDBMS ایجاد می شود تا پایگاه داده های مختلف با هم ارتباط برقرار کند.

سیستم مدیریت پایگاه داده چندرسانه ای (Multimedia DataBase Management System)
سیستم های محاسباتی چندرسانه ای انواع متنوعی از منابع داده ای گرافیکی، تصاویر ویدئویی، صوت و متن را استفاده و یا با هم ترکیب می کنند. این منابع داده ای پیچیده باید برای سیستم محاسباتی بسهولت قابل دسترس باشند. برای استفاده در برنامه های کاربردی interactive چنین سیستم هائی از ترکیب الزامات پایگاه داده های بلادرنگ با سیستم های گرافیکی تعاملی استفاده می کنند تا ارائه اطلاعات سنکرون شده و بلادرنگ حاصل شود.

سیستم مدیریت پایگاه داده متحد (Federated DataBase Management System)
نسل جدید سیستم های مدیریت پایگاه داده سعی دارند اطلاعات جمع آوری شده از سنسورها را مستقیما ذخیره کنند. این سیستم ها از پایگاه های دانش نیز حمایت می کنند.

برنامه های رایج مدیریت پایگاه داده

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

  • Microsoft SQL Server
  • Oracle
  • PostgreSQL
  • MySQL
  • Microsoft Access
  • DB2

آموزش توابع بازگشتی در زبان C


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

آموزش توابع بازگشتی در زبان C

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

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



در اینحالت کامپایلر تابع  main را بصورت زیر تغییر می دهد:



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

۲- توابع بازگشتی

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

  • توابع بازگشتی مستقیم : تابعی مانند ،Aخودش را فراخوانی نماید.
  • توابع بازگشتی غیر مستقیم : تابعی مانند A تابع دیگری مانند Bرا فراخوانی نماید و سپس B مجددا تابع A را فراخوانی نماید.

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

n! = 1 × ۲ × … × n
تابع مربوط به فاکتوریال نیز با استفاده از یک حلقه تکرار آه اعداد ۱تا nرا در یکدیگر ضرب می کرد، نوشته شد. اما اگر به تعریف فاکتوریال دقت آنیم، درمی یابیم که فاکتوریال عددی مانند ۵ را می توان از ضرب عدد ۵در فاکتوریال ۴ بدست آورد. بطور کلی می توان گفت:

facهمانطور که دیده می شود، حالت پایه در این مسئله، حالت  n=0 است؛ چرا که در این حالت حل مسئله بدیهی بوده و جواب برابر  یک است.
*تابع بازگشتی فاکتوریال بصورت زیر نوشته می شود:



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

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

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

*تابعی بنویسید که دو عدد را دریافت و بزرگترین مقسوم علیه مشترک آن دو را بازگرداند:



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

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

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


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

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

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

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

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

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

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

نکته: در زبا ن 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، همین باحث میشه در ابتدا خیلی سردرگم شوید.

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

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

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

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

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

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

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

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

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

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