PDA

View Full Version : مبتدی: توضیح درباره عملگر باقیمانده یا %



ProgramYL
پنج شنبه 09 مرداد 1393, 18:32 عصر
متوجه این خط از کد نمی شم. یعنی نمی تونم این خط رو بصورت فارسی بخونم (توضیح بدم). ممنون می شم توضیح بدید که این خط چه کار می کنه:

#include <iostream>
using namespace std;

int main ()
{
int c=1;
while (c<=6)
{
cout << (c%2 ? "****" : "+++++++") << endl;
++c;
};

}


ممنون می شم اگر این خط 9 (cout) رو به فارسی توضیح بدید.

parvizwpf
پنج شنبه 09 مرداد 1393, 18:40 عصر
در واقع این خط 9 یا 0 برمیگردونه یا .1 یعنی باقیمانده غیز از این دو حالت نیست. اگر 1 باشه اون ستاره ها چاپ میشه و 0 باشه اون مثبت ها. همین .این کد نوعی if هست به این صورت
(shart ? true : false)

ProgramYL
پنج شنبه 09 مرداد 1393, 18:56 عصر
بله. این شرط همون if هست، که بهش میگن شرطی سه سه ای یا سه تایی. اما من در مثال کتاب اینطور خونده بودم که مثلا اگر

variableX > variableY ? "LARG" : "SMALL"
اما سوال قبل رو متوجه نمیشم. مثلا، میگه چی؟ میگه اگر باقیمانده متغیر C%2 .... بقیشو نمی تونم بخونم :لبخند: . خوب نگفته اگه باقیمانده C%2 مثلا برابر 8 بود ستاره چاپ کن و اگر برابر 8 نبود + چاپ کن! مثلا به اینصورت نبوده:
cout << (c=8 ? "***" : "++++"(;

نتیجه دستور فوق نیمش ستاره و نیمش نماد مثبت چاپ میشه.

motherboard
پنج شنبه 09 مرداد 1393, 19:06 عصر
کد زیر دقیقا همون کار کد شما رو می کنه.هر وقت cout رو دیدی بلند بگو نمایش بده!!!!!!!!!!!!!!!! عبارت endl هم می گه برو به خط بعدی
بقیش هم که فکر می کنم بلد باشی.
اون علامت ? همون در واقع if اولی کد زیر هستش. و اون : در واقع همون else کد زیر هستش.

#include <iostream>
using namespace std;

int main ()
{
int c;
for(c=1;c<=6;c++)
{if(c%2)
cout << "****"<<endl;
else
cout<<"+++++++"<<endl;
};
}

amirtork
پنج شنبه 09 مرداد 1393, 19:08 عصر
بله. این شرط همون if هست، که بهش میگن شرطی سه سه ای یا سه تایی. اما من در مثال کتاب اینطور خونده بودم که مثلا اگر

variableX > variableY ? "LARG" : "SMALL"
اما سوال قبل رو متوجه نمیشم. مثلا، میگه چی؟ میگه اگر باقیمانده متغیر C%2 .... بقیشو نمی تونم بخونم :لبخند: . خوب نگفته اگه باقیمانده C%2 مثلا برابر 8 بود ستاره چاپ کن و اگر برابر 8 نبود + چاپ کن! مثلا به اینصورت نبوده:
cout << (c=8 ? "***" : "++++"(;

نتیجه دستور فوق نیمش ستاره و نیمش نماد مثبت چاپ میشه.

در واقع اون چیزی که من متوجه شدم این هست که اگر c زوج بود (یعنی c%2==0) بود میاد + چاپ میکنه. اما اگر فرد بود * چاپ میکنه.در واقع اینجا مقدار c%2 اگر برابر 0 بود بخشی که مربوط به false هست اجرا میشه، مقادیر غیر صفر هم true تلقی میشن...

motherboard
پنج شنبه 09 مرداد 1393, 19:30 عصر
اصلا برگردیم به کدی که فرد سوال کننده اورد.ببین زمانی که بنویسی c%2 و اصلا از == هم استفاده نکنی به طور پیش فرض برای باقی مانده های غیر صفر عمل می کنه .الان تو کد تو هم 1 تقسیم بر 2 باقی مانده غیر صفر داره پس جفت کوتیشن اولی رو نمایش میده.حالا میره سراغ عدد بعدی .عدد بعدی حاصل باقی ماندش صفر است پس جفت کوتیشن دومی رو نمایش میده.حالا همین طور برای اعداد بعدی.

ProgramYL
پنج شنبه 09 مرداد 1393, 20:09 عصر
در واقع اون چیزی که من متوجه شدم این هست که اگر c زوج بود (یعنی c%2==0) بود میاد + چاپ میکنه. اما اگر فرد بود * چاپ میکنه.در واقع اینجا مقدار c%2 اگر برابر 0 بود بخشی که مربوط به false هست اجرا میشه، مقادیر غیر صفر هم true تلقی میشن...

پاسخ بسیار مناسبی بود. متشکرم.
البته همه پاسخ ها درست بود، اما چون من خیلی مبتدی هستم با توضیح آقا امیر بیشتر متوجه شدم.

پس اگر نتیجه شرطی رو در هر دستور شرطی نیاوردیم، نتیجه بصورت true=1 یا false=0 در نظر گرفته میشه.
من در سوالم جای % رو به - (منفی (c-1)) تغییر دادم، نتیجه این شد که اولین خروجی + و باقی * شد.

متشکرم.

returnx
پنج شنبه 09 مرداد 1393, 22:59 عصر
کلا در C++ هر مقدرا غیر صفر در شرط برابر True منطقی در نظر گرفته میشه در غیر اینصورت False منطقی در نظر گرفته میشه و نتیجه شرط غلط میشه...
برای مثال :

int c=8;
cout<<(c%2 ? "*****" : "++++++")<<"\n";
در کد بالا از اونجایی که عملگر % باقیمانده تقسیم را بر میگرداند ، نتیجه ی باقیمانده ی تقسیم 8 بر 2 میشه 0 در نتیجه از نظر منطقی c%2 برای False میشه و عبارت دوم چاپ میشه...
حالا اگر کد بالا را به :

int c=1;
cout<<(c%2 ? "*****" : "++++++")<<"\n";
تغییر بدیم ، نتیجه باقیمانده تقسیم 1%2 میشه 0.5 و ما یک مقدار غیر صفر را داریم پس نتیجه شر درست در نظر گرفته میشه و عبارت اول چاپ میشه...
حالا این کد را در نظر بگیرید :

int c=-1;
cout<<(c ? "*****" : "++++++")<<"\n";
باز هم اینجا چون متغیر c برابر -1 هست و یک مقدار غیر صفر را داریم عبارت اول چاپ میشه...

کلا این مثال ها جزو مثال های کنکوری هست و میشه به شکل های مختلفی بررسی کرد مثل :
char c='0';
cout<<(c ? "*****" : "++++++")<<"\n";
در مثال بالا چون نوع Char در واقع همان int یک بایتی هست ، مقدار کد اسکی کارکتر 0 در c قرار می گیرد و چون این مقدار یک مقدار غیر صفر هست بازم عبارت اول چاپ میشه اما در مثال :

char c=0;
cout<<(c ? "*****" : "++++++")<<"\n";
چون متغیر c دقیقا با مقدار 0 مقدار دهی میشه ، نتیجه ی شرط ما False شده و عبارت دوم چاپ خواهد شد...
این نکات در کنکور خیلی به کار میاد!

ProgramYL
جمعه 10 مرداد 1393, 12:59 عصر
کلا در C++‎ هر مقدرا غیر صفر در شرط برابر True منطقی در نظر گرفته میشه در غیر اینصورت False منطقی در نظر گرفته میشه و نتیجه شرط غلط میشه...
برای مثال :

....
.....


عالی بود! متشکرم.