به هفتمین جلسه از آموزش برنامه نویسی ++C خوش آمدید. در این جلسه با مبحث توابع در ++C آشنا خواهیم شد.
توابع در ++C
در حالت کلی دو سبک برنامه نویسی وجود دارد:
- سبک برنامه نویسی ساخت یافته
- سبک برنامه نویسی شی گرا (با برنامه نویسی شی گرا در آینده آشنا خواهیم شد)
برنامه نویسی ساخت یافته توسط توابع در ++C انجام می شود. در این سبک برنامه نویسی، ما کارهای بزرگ را به کارهای کوچک شکسته و برای هر کدام از این کارهای کوچک یک تابع می نویسیم.
این کار مزایای زیادی دارد از جمله:
- امکان انجام کار گروهی (کار کردن چند نفر به صورت همزمان بر روی یک پروژه)
- سهولت در کدنویسی و یافتن منبع خطا
- کم شدن حجم کد و صرفه جویی در زمان
- و ..
انواع توابع در ++C
توابع در ++C دو دسته هستند:
- توابع کتابخانه ای
- توابع تعریف شده توسط کاربر
«توابع کتابخانه ای» دسته ای از توابع هستند که از قبل در زبان ++C وجود دارند و نیازی به تعریف آنها نیست. برای کار با توابع در ++C ابتدا باید آنها را تعریف کرده و سپس فراخوانی کرد (صدا زد). در مورد توابع کتابخانه ای نیازی به بخش اول یعنی تعریف کردن این توابع نیست. این کار قبلا انجام شده و ما تنها هر جا که به این توابع نیاز داشتیم آنها را صدا می زنیم.
دسته دوم از توابع یعنی «توابع تعریف شده توسط کاربر» از قبل در زبان ++C وجود نداشته و ما برای مقاصد خودمان آنها را تعریف و استفاده می کنیم. یعنی هر دو بخش تعریف کردن تابع و صدا زدن آن میبایست توسط خود برنامه نویس انجام شود.
توابع کتابخانه ای در ++C
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 |
#include<math.h> int main() { cout << "sqrt(25) = " << sqrt(25) << endl; cout << "abs(-10) = " << abs(-10) << endl; cout << "pow(2,3) = " << pow(2, 3) << endl; } |
در قطعه کد بالا سه نمونه از توابع کتابخانه ای زبان ++C را ملاحظه می کنید. در خط ۵ ما از تابع ()sqrt استفاده کرده ایم. این تابع یکی از توابع کتابخانه ای زبان ++C است و کار آن محاسبه جذر یک عدد است. در خط ۷ از تابع کتابخانه ای دیگری به نام ()abs استفاده شده است. کار این تابع نیز محاسبه قدر مطلق یک عدد است. در خط ۹ نیز از تابع ()pow استفاده شده که دو پارامتر ورودی دارد و عدد اول را به توان عدد دوم می رساند. برای استفاده از توابع ریاضی فوق، می بایست فایل math.h را به ابتدای برنامه ضمیمه کنیم (خط ۱).
در تمام موارد فوق ما تنها تابع را صدا می زنیم و از ساختار و کد نوشته شده در درون این توابع اطلاعی نداریم.
خروجی قطعه کد فوق بدین صورت است:
1 2 3 |
sqrt(25) = 5 abs(-10) = 10 pow(2,3) = 8 |
توابع تعریف شده توسط کاربر
برای اینکه خودمان یک تابع بنویسیم باید به این صورت عمل کنیم: تعریف تابع با مشخص کردن جنس مقدار بازگشتی تابع آغاز شده و در ادامه آن نام تابع قرار می گیرد. نشانه شناسایی یک تابع علامت ( ) است و دستورات بدنه تابع درون علامتهای { } قرار می گیرد. لازم به ذکر است که چنانچه تابع قرار نباشد مقداری را برگرداند، ما از عبارت void در ابتدای تعریف تابع استفاده می کنیم.
پس از تعریف تابع با استفاده از نام تابع میتوان آن را فراخوانی کرد ( صدا زد).
1 2 3 4 5 6 7 8 9 10 11 |
void show_message() { cout << "Hello World" << endl; } //---------- int main() { show_message(); } |
در قطعه کد فوق، تعریف تابع در خطوط ۱ تا ۴ آمده است. در خط ۱۰ نیز تابع فراخوانی شده است. این تابع عبارت «Hello World» را در خروجی چاپ می کند. دقت داشته باشید که تعریف تابع قبل از تابع main (برنامه اصلی) آمده و سپس این تابع، درون برنامه اصلی فراخوانی شده است.
برگشت مقدار توسط توابع در ++C
برگشت مقدار توسط تابع با استفاده از دستور return انجام می شود.
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
int calculate_sum() { int first = 10; int second = 15; int sum = first + second; return sum; } //---------- int main() { cout << "sum = " << calculate_sum() << endl; } |
در تابع calculate_sum در خطوط ۳ و ۴ دو متغیر first و second تعریف شده و حاصل جمع آنها در خط ۵ درون متغیر sum قرار گرفته است. در خط ۷ نیز با استفاده از دستور return نتیجه بازگشت داده شده است. خروجی قطعه کد فوق چاپ عدد ۲۵ در خروجی است.
توابع دارای پارامتر
برنامه قبل حالت ثابت داشته و همواره حاصل جمع دو عدد ۱۰ و ۱۵ را حساب می کند. برای بهتر و کاربردی تر شدن قطعه کد فوق، دو پارامتر را برای این تابع در نظر می گیریم. پارامترها مقادیری هستند که در زمان تعریف تابع، بین دو علامت ( ) قرار می گیرند.
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int calculate_sum_2(int first, int second) { int sum = first + second; return sum; } //---------- int main() { cout << "sum(10,20) = " << calculate_sum_2(10,20) << endl; } |
در خط ۱ دو متغیر (پارامتر) first و second را بعنوان پارامترهای ورودی تابع calculate_sum_2 در نظر گرفته ایم. بدین صورت تابع به جای محاسبه ثابت و از قبل پیش بینی شده، همواره حاصل جمع دو عددی را محاسبه می کند که ما به عنوان پارامتر برای آن ارسال کرده ایم. خروجی این قطعه کد مشابه قبل است (چاپ عدد ۳۰).
پارامترهای اختیاری و مقادیر پیش فرض
گاهی اوقات در برخی کاربردها می توانیم برای پارامترهای ارسالی به تابع، مقادیر پیش فرض در نظر بگیریم. در این صورت چنانچه در زمان فراخوانی تابع، پارامتر موردنظر را به تابع ارسال کنیم، مقدار ارسالی ما در محاسبات مورد استفاده قرار می گیرد. ولی چنانچه پارامتری را ذکر نکنیم، تابع از مقدار پیش فرضی که برای آن پارامتر از قبل در نظر گرفته شده است، استفاده خواهد کرد.
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
int calculate_sum_3(int first = 3, int second = 5) { int sum = first + second; return sum; } //---------- int main() { cout << "sum(10,25) = " << calculate_sum_3(10,25) << endl; cout << "sum = " << calculate_sum_3() << endl; } |
در کد بالا در خط ۱ برای دو متغیر first و second به ترتیب مقادیر پیش فرض ۳ و ۵ در نظر گرفته شده است. بدین ترتیب چنانچه ما تابع را به صورت دارای پارامتر (خط ۱۲) فراخوانی کنیم، همان مقادیر مدنظر ما به تابع ارسال شده و خروجی عدد ۳۵ خواهد بود. اما چنانچه در زمان صدا زدن تابع پارامترهای موردنظر را مشخص نکنیم (خط ۱۳)، تابع از مقادیر پیش فرض در نظر گرفته شده استفاده کرده و حاصل برابر با ۸ خواهد بود.
دو روش ارسال پارامتر به تابع
به دو روش می توان پارامترهای یک تابع را به آن ارسال کرد:
- ارسال به طریق مقدار (call by value)
- ارسال به طریق ارجاع (call by reference)
در ارسال به طریق مقدار، مقادیر پارامترها (متغیرهای برنامه اصلی) در زمان صدا زدن تابع، به درون پارامترهای تابع کپی می شود. در این روش متغیرهای ارسالی به تابع (متغیرهای برنامه اصلی – خارج از تابع) از تغییرات صورت گرفته در توابع محافظت می شوند. به این معنی که اگر مقادیر این متغیرها در درون تابع تغییر کند، هیچ تاثیری بر مقدار متغیر در برنامه اصلی ندارد. البته این را هم باید در نظر داشت که در این روش حجم حافظه اشغالی دو برابر خواهد بود.
در نقطه مقابل، در ارسال به طریق ارجاع، متغیرهای ارسالی به تابع (متغیرهای برنامه اصلی) از تغییرات در توابع محافظت نمی شوند. یعنی اگر مقادیر این متغیرها در درون تابع تغییر کند، این تغییر بر روی متغیرهای برنامه اصلی نیز اعمال می شود. البته در این روش حجم حافظه مصرفی حداقل ممکن خواهد بود.
برای توضیحات بیشتر به ویدئوی ضمیمه آموزش مراجعه نمایید.
به قطعه کد زیر توجه کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void increment(int x, int y) { x++; y++; } //---------- int main() { int a = 3; int b = 6; cout << "a = " << a << " , " << "b = " << b << endl; increment(a, b); cout << "a = " << a << " , " << "b = " << b << endl; } |
در برنامه بالا در خطوط ۱۱ و ۱۲ دو متغیر با نام های a و b تعریف شده است. عملکرد تابع increment به این صورت است که به مقدار دو متغیر محلی x و y یک واحد اضافه می کند (خطوط ۱ تا ۵). قبل و بعد از صدا زدن تابع، مقادیر a و b دو بار چاپ شده است (خطوط ۱۴ و ۱۸).
خروجی قطعه کد فوق بدین صورت است:
1 2 |
a = 3 , b = 6 a = 3 , b = 6 |
مشخص است که تغییرات اعمال شده بر روی دو متغیر x و y در درون تابع، هیچ تاثیری بر روی مقادیر a و b نداشته است. این روش ارسال پارامتر به تابع (که بسیار متداول و عادی است)، ارسال به طریق مقدار نام دارد.
حال چنانچه قبل از اسامی پارامترها در زمان تعریف تابع، از کاراکتر & استفاده کنیم، به این صورت: (void increment(int &x, int &y در این صورت نحوه ارسال پارامترها به صورت ارجاعی خواهد بود (ارسال به طریق ارجاع). در این صورت تغییرات صورت گرفته بر روی دو متغیر x و y بر روی مقادیر a و b هم اعمال می شود.
با این تغییر خروجی به شکل زیر تغییر پیدا می کند:
1 2 |
a = 3 , b = 6 a = 4 , b = 7 |
توابع بازگشتی در ++C
در برخی از برنامه ها حالتی پیش می آید که تابع، خودش را فراخوانی می کند. نشانه ظاهری این امر این است که در درون کدهای تابع نام خود تابع نیز به چشم می خورد. به این گونه از توابع، توابع بازگشتی گفته می شود.
یکی از مثال های معروف برای توابع بازگشتی، محاسبه فاکتوریل یک عدد است. از قبل می دانیم که فاکتوریل عددی مانند ۵ به شکل زیر محاسبه می شود:
۱۲۰ = ۱ * ۲ * ۳ * ۴ * ۵ = !۵
تابع بازگشتی زیر مقدار فاکتوریل یک عدد داده شده را محاسبه می کند:
1 2 3 4 5 6 7 8 9 10 11 12 |
int factorial(int number) { if(number == 1) return 1; // 1! = 1 return number * factorial(number - 1); // 5! = 5 * 4! } //---------- int main() { cout << "factorial(5) = " << factorial(5) << endl; // 5! = 120 } |
خط ۳ حالت خاص این مسئله را نشان می دهد. زمانیکه فراخوانی های متوالی برای محاسبه فاکتوریل عدد موردنظر به عدد ۱ رسیده و می بایست تمام شود. عملیات اصلی در خط ۴ است که تابع خودش را مجددا فراخوانی کرده است. دلیل این امر این است که برای محاسبه !۵ نیاز به محاسبه !۴ است (!۴ * ۵ = !۵). و به همین صورت برای بقیه اعداد کوچکتر تا زمانیکه به ۱ برسیم و نیاز به فراخوانی مجدد تابع نباشد.
خروجی قطعه کد بالا مقدار !۵ یعنی عدد ۱۲۰ است.
به پایان این جلسه آموزشی رسیدیم (کار با توابع در ++C). در آینده با بخشهای دیگری از زبان ++C آشنا خواهیم شد. با ما همراه باشید…
58 دیدگاه. ارسال دیدگاه جدید
دم شما گرم واقعا عالی بود
دمتون گرم واقعا خفن بود. بهترین آموزشی بود که تا بحال دیدم.
سلام خسته نباشید. میخواستم بدونم اگه کسی در حد ابتدایی هم برنامه نویسی سی پلاس پلاس رو بلد نباشه با این دوره آموزشی توی سایت تون کامل حرفه ای یاد میگیره؟ یا در کنارش باید از کتاب یا ویدیو یا چیزهای دیگه ای هم استفاده کنه؟
با سلام
دوست عزیز پیش فرض شروع این دوره این هست که دوستان از ابتدا و از صفر برنامه نویسی رو شروع میکنن.
البته این دوره و هر دوره دیگه ای میتونه ادامه داشته باشه. برنامه نویسی با تمرین و تکراره که به ثمر میشینه.
اگر میخواین شروع کنین، از همین امروز شروع کنین، از همین امروز. جلوتر خودتون متوجه میشین که چیکار کنین
موفق باشین
درود و خسته نباشید
واقعا آموزشتون عالی هست و شما با آموزش هاتون به عاشقان برنامه نویسی با صرفه جویی در وقت و پولشون واقعا کمک بزرگی بهشون کردید
فقط مسئله ای که بود اگر که در سایت یا آخر ویدئوهاتون تکلیف هم قرار بدید تا بتونیم تکرار و تمرین کنیم عالی میشه چون بعضی از بخش ها رو کاراییشو رو نمیدونیم و خب سخت میشه
حق با شماست دوست عزیز، انشاا.. در آینده اینکار رو خواهم کرد.
سلام به استاد عزیز؛
عالی بود؛ درجه یک. واقعا لذت بردم
هم توضیح عالی، و هم بیان شیوا
سایتون مستدام
سلام یعنی واقعا دمت گرم ریز و درشت همه چیزو گفتی واقعا کیف کردم کارت بیست مهدی جان ممنون از آموزش عالیتون🙏🙏🌹🌹🌹
سلام استاد. واقعا بابت آموزش بی نظیرتون ممنونم. فقط من یک سوالی داشتم, الان وقتی توی تابع فاکتوریل ۵ ضرب در ۴ میشه عدد ۲۰ توی کدوم متغیر ذخیره میشه؟
دوست عزیز توی متغیر خاصی ذخیره نمیشه، هر بار بصورت متوالی از تابع برگشت داده میشه و مجددا بعنوان پارامتر ورودی در فراخوانی بعدی استفاده میشه.
با عرض سلام و خسته نباشید خدمت شما. خیلی عالی و کوتاه و مختصر با زبان ساده مسایل پیچیده رو بیان کردید خیلی عالی بود متشکرم.
با تشکر
سلام قبل از هر چیزی تشکر میکنم از آموزش بسیار خوبتون انشالله که سلامت و تندرست باشین
در مورد تعریف توابع فرعی در یک فایل جداگانه که اشاره فرمودین میخاستم بپرسم امکانش هست توضیح بدین
دوست عزیز برای اینکار باید تعریف توابع رو در یک فایل جداگانه بنویسید و مثلا با نام functions.h اون رو ذخیره کنید (به پسوند فایل یعنی h. دقت داشته باشید).
بعد کافیه که در فایل اصلی (فایلی که میخواید توابع رو در اون فراخوانی کنید) در بالای برنامه دستور “include “functions.h# رو اضافه کنید (دقت کنید نام فایل درون علامت گیومه یعنی “” قرار گرفته و نه <> مثل iostream)
بعد از اون هر جای برنامه که خواستید میتونید توابع موردنظر رو فراخوانی کنید.
با عرض سلام خدمت شما استاد عزیز
آموزش عالی بود
نوع توضیح دادن عالی بود و قابل فهم
واقعاااا عالی بود. من دانشجو هستم اصلا نفهمیدم استادم چی گفت ولی با این آموزش شما قشنگ و کامل متوجه شدم. ممنون از شما
سلام و درود بر شما
من ترم ۱ کامپیوتر هستم. واقعا تدریسی که شما دارید فوق العادس و خیلی کامل و جامع با تمام زوایا موضوع را برسی میکنید و توضیح میدهید.
انشالله همیشه موفق و سلامت باشید.
به جرات میگم این بهترین آموزش و توضیحی بود که درباره توابع در برنامه نویسی دیدم
عالی و مفهومی بود
با سلام خدمت شما
تشكر براى آموزش هاى فوق العاده و بى نظير.
واقعا مطالب را بدون نقص و دقيق توضيح مى دهيد .
در پناه خدا سلامت و موفق باشيد.
ممنونم دوست عزیز، لطف دارید.
دوست عزیز بنده یک تازه کارم که میخوام از زبان ++C شروع کنم
در یک فانکشن کلمه void از چه نظر کاربردیست؟
معنی اینکه نیازی نیست مقداری را بازگردانی کند چیست؟
ما زمانی از کلمه void استفاده میکنیم که تابع قرار باشه فقط یک کار خاصی رو خودش به تنهایی انجام بده. یعنی نیازی به برگشت نتیجه به برنامه اصلی (main) نیست.
اگر نیاز به برگشت مقدار باشه از کلمات int , float , double و یا بقیه انواع داده استفاده میکنیم.
سلام استاد. واقعا بخاطر آموزشهای برنامه نویسی از شما ممنونم.
سوالی که برای من پیش آمده اینه که چرا در تابع increment مقدار برگشتی وجود ندارد و از void استفاده شده، در صورتی که این تابع مقادیری را بعنوان ورودی میگیرد و عملیاتی بر روی آن انجام میدهد. ممنون میشم اگر منو راهنمایی کنید.
دوست عزیز اگر به بخش «برگشت مقدار توسط توابع» و مشخصا تابع ()calculate_sum مراجعه کنید، متوجه میشید که بحث بازگشت مقدار از توابع، مستقل از بحث پارامترهای ورودی و انجام عملیات بر روی پارامترها هست. بعضی از توابع نیاز به برگشت مقدار (به برنامه اصلی – تابع main) دارند و بعضی نیز خیر.
با عرض سلام و خسته نباشید
ببخشید اگر بخوایم برنامه تبدیل اعداد مبنای ۱۰ به ۲ رو با استفاده از توابع بازگشتی پیاده سازی کنیم به چه صورتیه؟
ممنون میشم راهنماییم کنید.
برنامه تبدیل اعداد مبنای ۱۰ به مبنای ۲ (با استفاده از توابع بازگشتی):
خیلی ممنون لطف کردید
خیلی ممنون زحمت کشیدید
سلام، خیلی ممنون از آموزش خوبتون، مطالب خیلی واضح توضیح داده شده بود.
یه سوالی داشتم در رابطه با همین ویدیوی آموزش کار با توابع
تو مثالی که ابتدای ویدیو گفتین که تابع ()calculate_sum دو تا عدد رو با هم جمع میکرد، اگر بخوایم اون دو تا عددی که داره با هم جمع میشه رو کاربر وارد کنه، کدش به چه صورتی هستش؟
کدش به این صورت هست دوست عزیز :
خیلی عالی و کامل توضیح دادید مطلب رو. ابهامی باقی نمی مونه.
تشکر میکنم.
من کل اینترنت را گشتم.
هیچ کس نمی تواند بهتر از شما تدریس کند.
انشا الله همیشه سربلند و سلامت باشید استاد عزیز. با آرزوی موفقیت
ممنونم دوست عزیز. این لطف شما رو میرسونه.
با سلام امیدوارم دارای صحت کامل باشید.
استاد بزرگوار، همیشه ویدیوهایتان را تعقیب میکنم و واقعا برایم کمک زیادی کردین با لهجه گیرا و تشریح خالص و شفاف
البته من از افغانستان هستم. ویدیوهای زیادی را به زبان های انگلیسی و فارسی دیدم ولی به درستی تشریح نمیتوانستن
اولین برنامه شما را که دیدم عاشق صدایتان شدم، واقعا کمک زیادی برایم کردین و دروس دانشگاه در بخش برنامه نویسی برایم بسیار ساده شده است
با کلمات نمیشه گپ قلب خوده راجع به شما استاد بزرگوار گفت ولی همیشه برایتان دعا میکنم تا همینطور موفق و سربلند بمانید و از دغدغه ها و پستی و بلندی های زندگی در امان باشید
قلم تان همیشه رسا باد استاد بزرگوار.
دوست عزیز بسیار از آشنایی با شما خوشبختم و خوشحالم از اینکه دوستان فهیمی چون شما رو در وبسایت خودم میزبانی می کنم.
بنده هم متقابلا برای شما آرزوی موفقیت، آرامش و سربلندی می کنم.
سلام.
من تازه برنامه نویسی رو شروع کردم و تقریبا تمام آموزشهای ++C رو در اینترنت دیدم و به جرات میتونم بگم آموزش و سبک آموزش شما عالیه، بطوریکه مطالب آموزشی شما اصلا فرار نیست و همراه فهم کامل هست.
ممنونم دوست عزیز، سپاسگزارم از لطفتون.
خواستم تشكر كنم از نحوه ى بيان و انتقال مفاهيمتون كه عالى انجام مى ديد، بى صبرانه منتظر آپلود جلسات بعدى هستم.
دوست عزیز از اظهار لطفتون سپاسگزارم.
عالی بود.
همیشه سربلند باشید.
همیشه بهترین آموزش ها را دارید استاد گرامی.
با سپاس. خیلی خیلی کمکم کردند.
ممنونم دوست عزیز لطف دارید.
موفق و سربلند باشید.
سلام استاد با تشکر از زحماتتون، یه سوال داشتم
شما توی قسمت call by value گفتید که توی این قسمت یکی از خوبیهایی که داره اینه که از متغیر در برابر تغییرات تابع محافظت میشه و تغییری روش اعمال نمیشه، اما سوالم اینه که ما اصلا برای چی میایم یه تابع رو فراخوانی میکنیم و توش متغیر میزاریم، اگر میخوایم تغییری روش اعمال نشه؟
در ضمن یه پیشنهاد، اگر آخر هر ویدیو یک مسئله کوچک (صرفا مثل یک تکلیف) بیان میکردید و جوابشو جلسه بعد یا توی توضیحات میگفتید دروس خیلی بهتر جا میافتاد. هرچند شما همین الان هم خیلی عالی هستید واقعا
دوست عزیز فلسفه وجودی تابع این نیست که در پارامترها (متغیرهای) ورودی به تابع تغییر ایجاد کنه. ما از تابع استفاده میکنیم چون میخوایم تقسیم کار کنیم و همه بار حل مسئله رو به دوش برنامه اصلی نندازیم.
پارامترهای یک تابع در واقع مثل ابزارها و وسایلی هستن که تابع برای اینکه کارش رو بتونه بدرستی انجام بده، به اونها نیاز داره. این مسئله کاملا مجزا و متفاوت از بحث تغییر/عدم تغییر پارامترهاست.
بعضی وقتها لازمه این اتفاق بیفته و برخی اوقات خیر. کاملا به مسئلهای که میخوایم حلش کنیم بستگی داره.
در مورد بحث تمرین و مثال هم باید خدمتتون عرض کنم که به تازگی مباحث اصلی و پایهای زبان ++C به اتمام رسیده و در ادامه (از جلسات ۱۵ به بعد) قراره مثالهای جذاب و کاربردی زیادی رو داشته باشیم، اونقدر که به تمام مفاهیم گفته شده قبلی تسلط پیدا کنیم.
استارت این کار در جلسه شانزدهم زده شده، که اگر هنوز فرصت دیدن اون رو پیدا نکردید، توصیه میکنم حتما از اون آموزش استفاده کنید.
باسلام خدمت استاد عزیز
کاملا متوجه شدم و درک کردم. به نظرم از همین فاکتوریل شروع کنم بهتره
ممنون استاد
خواهش میکنم دوست من، موفق باشید
سلام مهندس وقتتون بخیر
یه سوال در مورد تابع بازگشتی داشتم. شما تابع فاکتوریل رو به روش بازگشتی نوشتید و داخل تابع خود تابعی که هنوز کامل نیست رو فرا خوندید. من نمی فهمم تابعی که کامل نیست تا کجای بدنهی خودشو تو فراخونیه خودش تو دل خودش می تونه انجام بده؟؟؟
ممنونم از آموزشاتون و پاسخگوییهاتون
دوست عزیز تابع بازگشتی از جنس مباحثیه که هم شرحش برای من استاد و هم درکش برای دانشجویان یه کم سخته.
کلا ذات توابع بازگشتی به این صورته. فقط باید ایمان داشت و ازش استفاده کرد.
نتیجه درست در انتها، ثابت میکنه که تابع داره درست عمل میکنه.
شبیه غارهای تودرتویی میمونه که فقط باید واردشون شد تا به گنج رسید. گنج رو که پیدا کردی و از غار اومدی بیرون، دیگه اصلا یادت نیست که مسیر چقدر تودرتو و گیجکننده بود.
امیدوارم متوجه منظورم شده باشین.
من خودمم همین مشکل رو داشتم، زیاد سخت نگیریدش.
مثلا سه فاکتوریل رو در نظر بگیرید، تابع میگه خب به من گفته ۳ رو در فاکتوریل یکی کمترش ضرب کن یعنی !۲*۳
بعد دوباره احتمالا میره از اول شروع میکنه تا مقدار !۲ رو حساب کنه که دوباره یعنی !۱*۲ و یک فاکتوریل هم یعنی ۱
بنابراین جوابمون میشه: ۶=۱*۲*۳=!۳
آفرین دوست عزیز، دقیقا همینه 👏
شما فوق العاده اید. همه ی یوتیوب و گوگل رو زیرورو کردم هیچ جا معنی return رو نمیتونست اینقدر خوب به من بفهمونه. خیلی ساده و پرمفهومه توضیحاتتون.
خداخیرتون بده و خواهشا ادامه بدین آموزشای سی پلاس پلاس رو
لطفا لطفا لطفا
ممنونم دوست عزیز، به امید خدا آموزشها ادامه دار خواهد بود.
سلام استاد وقتتون بخیر
ببخشید من به یه مشکلی برخوردم. می خوام با تابع ()tolower برنامه ای بنویسم که کاراکتر بزرگ رو به کوچیک تبدیل کنه و این تابع باید کاراکتر برگردونه ولی تو کامپایلر من داره عدد برمی گردونه
به نظرتون مشکل چی می تونه باشه ؟؟؟ ممنون میشم کمکم کنید.
با تشکر از شما
دوست عزیز مقدار برگشتی تابع ()tolower یک عدد int هست که باید به معادل کاراکتری خودش تبدیل بشه
می تونید طبق قطعه کد زیر از تابع ()putchar برای به دست آوردن معادل کاراکتری عدد مربوطه استفاده کنید:
سلام واقعا ممنونم از شما کمک بزرگی به من کردین
سپاس فراوان
استاد گرامی جناب مهندس زعفری
بیان رسا و کلام شیوای جنابعالی در بحث آموزش، بسیار تاثیرگذار و مفید است. امیدوارم همیشه در نهایت صحت و سلامت و استغنای مادی و معنوی باشید. سایه تان مستدام.
دوست عزیز از اظهار لطفتون نسبت به بنده و آموزشهای وبسایت بسیار سپاسگزارم.
بنده هم برای شما آرزوی سلامتی، شادی و آرامش دارم.
با سلام و عرض ادب و احترام.
آموزش های شما با بیان روان و ساده جزء بهترین آموزش های ممکن هستند.
همیشه پیروز و سربلند باشید.
با تشکر
ممنونم دوست عزیز، لطف دارید.