کاربرد متغیر int و مفهوم void

سلام مهندس. وقت شما بخیر.
مهندس دو تا سوال داشتم:
۱- چجوری تشخیص بدیم که کجا متغیر ما int هست؟ string و boolean رو متوجه شدم اما int که بیشتر استفاده میکنین رو نمیدونم کجاها باید ازش استفاده بشه.
۲- مهندس void چی هست؟ هر روز void رو میبینم و شما هم هنگام ساختن function از void serialkhan استفاده کردین. من برنامه نوشتن و صدا زدن برنامه رو میفهمم اما اون void برام نامفهومه.
من دفعه اول هست دارم برنامه نویسی یاد میگیرم و آشنایی قبلی ندارم.
ممنون میشم پاسخ بدین.

دوست عزیز سلام. با اجازه از مهندس معین در مورد void ی توضیح میخوام بتون بدم. وقتی ی تابع خروجیش void هست یعنی یک خروجی داره که مثلا خود این خروجی میتونه توی ی شرط if استفاده بشه. تابعی که دارای خروجیه آخرش یک return داره که جلوی اون یک عبارتی رو می‌نویسیم. این یعنی تابع ی دستوری رو به ما برمیگردونه که میشه ازش جای دیگه استفاده کرد از خود این دستور. مثلا اگه تابع جمع کننده دو عدد باشه میتونیم sum = b + a رو برگردونیم یعنی خروجی از جنس int هست و میشه return sum. ی سری جاها ما نیاز داریم از این sum استفاده کنیم و اون رو به عنوان خروجی تابع موردنظر برمیگردونیم.
امیدوارم کمک کننده باشه

سلام مجدد و تشکر از پاسخ دوستان.
کلا مفهوم خروجی در توابع با چیزی که شما گفتید متفاوت هست. اینکه یک تابع، یک پایه خروجی رو روشن کنه، به معنی خروجی تابع نیست. بذارید مثال بزنم:
ما یک تابع داریم، این تابع، دو تا عدد رو میگیره و اونها رو در هم ضرب میکنه و مقدار رو برمیگردونه. اسم این تابع رو میذاریم zarbKonande.
خب این تابع، ورودی و خروجی هاش چیا هستن؟ دو تا عدد میگیره پس دو تا ورودی از نوع int داره و یک عدد رو برمیگردونه در جواب که اون هم از نوع عدد هست. پس خروجی تابع ما از نوع int هست و موقع تعریف اون تابع، قبل از اسمش، از int استفاده می کنیم که میشه:
int zarbkonande
بعد داخل کد، هرجا که لازم داشتید دو تا عدد رو در هم ضرب کنید، می تونید بنویسید a = zarbkonande(b,c) این دستور، اعداد b و c رو در هم ضرب می کنه و در متغیر a میریزه.
حالا فرض کنید که یک تابع دیگه داریم که این تابع میاد و دو تا عدد میگیره و به شما میگه که آیا عدد اول از دومی بزرگ هست یا نه؟ اسم این تابع رو میذاریم bozorgtarKuchiktar. پس این تابع دو تا ورودی از نوع عدد داره که میشه int و به عنوان خروجی به شما true یا false برمیگردونه که میشه bool. پس خروجی این تابع از نوع bool هست و موقع تعریف اون تابع، باید قبل از اسمش از bool استفاده کنیم که میشه:
bool bozorgtarKuchiktar
حالا داخل کد هرجا خواستیم دو تا عدد رو مقایسه کنیم، می تونید بنویسیم a = bozorgtarKuchiktar(b,c) این دستور، اعداد b و c رو مقایسه می کنه و جواب مقایسه که یا true هست و یا false رو در متغیر a میریزه و شما می تونید بعدا از a استفاده کنید.
حالا فرض کنید که یک تابع دیگه داریم که قراره یک چراغ رو روشن یا خاموش کنه. این تابع یک ورودی داره که میگه آیا چراغ رو روشن کنیم یا خاموش کنیم. اسم این تابع رو میذاریم roshanKhamushKon پس ورودی این تابع از نوع bool هست که اگه بهش true بدیم، روشن می کنه و اگه بهش false بدیم، خاموش میکنه. اما خروجی این تابع چی هست؟ آیا این تابع، بعد از اجرا، عددی به ما برمیگردونه؟‌ آیا قراره مقداری رو به ما برگردونه؟ خیر. این تابع قراره یک کاری رو انجام بده و بعد هم به صورت خالی return کنه. پس این تابع خروجی ای نداره.
پس اگر ما بنویسیم a = roshanKhamushKon(true( این دستور، چراغ رو روشن می کنه ولی مقدار متغیر a چند خواهد بود؟ اصلا مگر roshanKhamushKon چیزی برمیگردونه داخل کد؟ خیر. پس این تابع، از نوع void هست که مقداری رو در کد برنمی گردونه.
در واقع اینکه یک تابع در کد مقداری رو برمی گردونه یا نه ملاک این هست که void هست یا نه و اینکه در دنیای واقعی چراغی روشن می شه یا با سریال ارتباط برقرار می کنه و یا کار خاصی انجام میده، از جمله خروجی های سطح کد نیستن و اگر یک تابع در سطح کد، مقداری برنگردونه، از نوع void تعریف میشه.
امیدوارم جواب سوالتون رو گرفته باشید. ما به شما قول دادیم که در طول این آموزش کنارتون باشیم و سر قولمون هم هستیم. هر سوالی که براتون پیش میاد رو باید بیاید و اینجا بپرسید و ما با کمال میل پاسخش رو بهتون میدیم. همین مطلب هم اگر هنوز جا نیفتاده براتون، انقدر مثال میزنیم براتون که کامل جا بیفته.
امیدوارم همیشه موفق باشید.

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

متوجه نمیشم مهندس؛
چطور void خروجی ندارد؟ در تمام برنامه هایی که مینویسین دارین ازvoid loop خروجی میگیرین که.
در برنامه stringkamel تایپ میکنیم turn on و خروجی void loop به شکل روشن کردن led خروجی میده و به شکل پرینت کردنش هم خروجی میده(دو تا خروجی میده)و تازه void serialkhan هم حروف t،u،r،n o،n رو یکی یکی میگیره و خروجی اون turn on هست که میده به loop که led رو روشن کن و پرینت بگیره.
در برنامه distance هم loop مختصات رو میگیره و خروجیش فاصله هست.
مهندس در فیلم ها هم گفتین void خروجی نداره اما میبینیم که void خروجی داره. اگه میبینید سوال میپرسم بخاطر دیدن این تناقض هست نه به این خاطر که فیلم رو دقیق ندیده باشم یا گزیده خوانی کرده باشم. عقیده دارم این توهین به صاحب اثر است که حرفش رو کامل گوش نکنی و گزیده خوانی کنی و بعد بیای مطلبی رو که بنده خدا یک بار در فیلم توضیح داده دوباره بپرسی که مجبور بشه باز بیاد دوباره برات توضیح بده. اطمینان میدم این توضیحاتی که اینجا میدین دوباره کاری نیست فقط رفع بدفهمی ها هست.
ممنون(بخاطر اینکه تا حالا حتی یک سوالم رو هم بی جواب نذاشتین(اون هم جوابای مفصل و عالی))

سلام دوست عزیز، نگران اینکه دفعه اولتون هست که برنامه می نویسید نباشید. آموزش از ابتدا شروع کرده و اینجا هم هر سوالی که داشتید رو جواب میگیرید. فقط خواهشی که دارم این هست که گزیده خوانی نکنید و آموزش رو صد در صد از اول ببینید و مرحله مرحله با آموزش جلو برید. (این رو میگم چون داخل آموزش در مورد int و void توضیح دادم و احتمالا شما اون قسمت ها رو رد کردید.)
حالا جواب سوالتون:
۱- int به معنی integer هست و یعنی عدد صحیح. هرموقع که خواستید یک عدد رو ذخیره کنید، می تونید اون رو به صورت int نگهداری کنید. اگر این عدد علامت دار هست (یعنی منفی هم میتونه بشه)، از signed int استفاده کنید و اگر علامت دار نیست (قرار نیست منفی بشه)، از unsigned int استفاده کنید. دقت کنید که متغیر از نوع int، در میکرو های AVR (که آردوینو رو هم شامل میشه)، دو بایت رو اشغال می کنه و یعنی کلا میتونه از ۰ تا ۶۵۵۳۵ رو داخل خودش نگه داره. اگر علامت دار باشه یعنی signed int باشه، از -32,768 تا +32,767 رو میتونه داخل خودش نگه داره.
اگر این مقدار براش شما زیاد هست، و متغیر شما هیچوقت قرار نیست به اون مقدار برسه، می تونی به جای int از متغیر های یک بایتی استفاده کنید مثل char. متغیر از نوع unsigned char چون یک بایت هست، از ۰ تا ۲۵۵ رو نگه میداره و از نوع signed char از -۱۲۸ تا ۱۲۷ رو نگه میداره.
ولی معمولا چون برنامه ها انقدر فشرده نیستن که بخواید در حد یک بایت صرفه جویی کنید، بیشتر جاهایی که قرار هست یک متغیر عددی داشته باشیم، از int استفاده کردیم.

۲- در زبان c، همه توابع باید یک خروجی داشته باشن. یعنی شما هر تابعی رو که صدا می زنید، باید مشخص باشه دقیقا که این تابع ورودیش چیا هست و قرار هست چه خروجی ای داشته باشه. مثلا اگر قرار هست که این خروجی از نوع int باشه، هنگام تعریف اون تابع، قبل از اسم تابع از int استفاده می کنیم. حالا بعضی وقتا پیش میاد که تابع ما قرار نیست چیزی رو برگردونه وفقط قرار هست که یک کاری رو برای ما انجام بده. در این مواقع از void استفاده می کنید. void در زبان انگلیسی به معنی خالی،تهی و پوچ هست. یعنی خروجی این تابع تهی هست و قرار نیست خروجی ای داشته باشه. وقتی که خروجی تابع شما از نوع void تعریف شده، شما نمی تونید اون تابع رو صدا بزنید و جواب رو داخل متغیری بریزید (چون مقداری نداره) و باید به صورت تنها اون رو صدا کنید.