نوشته شده توسط
Cplus77
خیلی خیلی ممنون از پاسخ شما، فقط یه سوال دیگه
تا زمانیکه شرط داخل حلقه برقرار باشد i افزایش پیدا میکند یعنی تا i برابر 5 میشه که شرط داخل حلقه برقرار هست، حالا چون انتهای حلقه سیمیکلون وجود داره بعد از اینکه شرط داخل حلقه نقض شد مگه نباید i ای که بعد از حلقه سیمیکلون دار در دستور cout چاپ میشه همون i ای باشه که حلقه به ازای اون i شرطش نقض میشه، آخه تو توضیحات حلقه for گفتن وقتی انتهای حلقه سیمیکلون داره و بعد دستور cout i چاپ i رو میخواهد، اون i ای باید چاپ بشه که به ازای اون i شرط داخل حلقه نقض میشود
خیلی ببخشید بخاطر سوالایه زیادی که پرسیدم
توضیحاتی که می دهید درسته، صرفا سعی می کنم با یک بیان دیگه ابهام رو برطرف کنم.
اول به حالت کلی for بپردازیم، قالب کلی for به صورت for (...) code ئه که (...) بخش تعریف کردن مقادیر اولیه، شرط حلقه و تغییر مقادیر ئه و code کدی است که باید داخل حلقه اجرا بشه.
code میتونه فقط یک ; باشه یعنی هیچ کاری داخل حلقه انجام نده :
for (...) ;
یا میتونه فقط یک عبارت باشه، مثلا ;++x که چون فقط یک دستور ئه نیازی به مشخص کردن بلوک کد با { } نداره :
for (...) x++;
یا میتونه چندین عبارت باشه که بصورت یک بلوک کد داخل { } نوشته بشه :
for (...)
{
x++;
y++;
z++;
}
در مثال شما هم بخش code خالیه و کاری برای اجرا شدن داخل حلقه وجود نداره.
حالا بیاییم اجرای کد رو از ابتدا بررسی کنیم، ورودی هم .abcde خواهد بود.
ابتدا ch با ;char ch تعریف میشه.
سپس کاراکتر a با ;cin >> ch داخل ch قرار میگیره.
سپس i با ;int i تعریف میشه.
حالا به حلقه for رسیده ایم، در ادامه مقدار اولیه i با ;i = 1 برابر 1 میشه.
سپس کاراکتر b با ()cin.get دریافت میشه.
و با '.'=! بررسی میشه که آیا کاراکتر دریافتی کاراکتر . نیست؟ که چون برابر نیست شرط حلقه برقرار ئه و اجرای حلقه ادامه پیدا می کنه.
و چون اجرای حلقه باید تکرار بشه با ++i مقدار i به 2 تغییر می کنه.
سپس کاراکتر c با ()cin.get دریافت میشه.
و با '.'=! بررسی میشه که آیا کاراکتر دریافتی کاراکتر . نیست؟ که چون برابر نیست شرط حلقه برقرار ئه و اجرای حلقه ادامه پیدا می کنه.
و چون اجرای حلقه باید تکرار بشه با ++i مقدار i به 3 تغییر می کنه.
سپس کاراکتر d با ()cin.get دریافت میشه.
و با '.'=! بررسی میشه که آیا کاراکتر دریافتی کاراکتر . نیست؟ که چون برابر نیست شرط حلقه برقرار ئه و اجرای حلقه ادامه پیدا می کنه.
و چون اجرای حلقه باید تکرار بشه با ++i مقدار i به 4 تغییر می کنه.
سپس کاراکتر e با ()cin.get دریافت میشه.
و با '.'=! بررسی میشه که آیا کاراکتر دریافتی کاراکتر . نیست؟ که چون برابر نیست شرط حلقه برقرار ئه و اجرای حلقه ادامه پیدا می کنه.
و چون اجرای حلقه باید تکرار بشه با ++i مقدار i به 5 تغییر می کنه.
سپس کاراکتر . با ()cin.get دریافت میشه.
و با '.'=! بررسی میشه که آیا کاراکتر دریافتی کاراکتر . نیست؟ که چون برابر هست شرط حلقه برقرار نیست و اجرای حلقه خاتمه پیدا می کنه.
مقدار فعلی i از آخرین افزایش 5 مونده، نقض شرط حلقه هم زمانی رخ داده که i مقدار 5 داشته، پس در ادامه با ;cout << i مقدار 5 نمایش داده میشه.
و البته اون = ch داخل حلقه هم اضافی است و هم مطمئن نیستم که استادتون خودش به این نکته توجه کرده باشه که '.'=!()ch = cin.get کاراکتر های دریافتی رو داخل ch قرار نمیده، مقدار حاصل از شرط (که 0 یا 1 ئه) رو داخل ch قرار میده. یعنی اول '.'=!()cin.get رو محاسبه می کنه که یا 0 ئه (false) یا 1 ئه (true) و بعد اون 0 یا 1 رو داخل ch قرار میده.
که اگر اینکار رو نمی کرد هم تاثیری نداشت، چون در ادامه استفاده ای از مقدار ch نمیشه.
char ch;
cin >> ch;
int i;
for (i=1; cin.get()!='.'; i++);
cout << i;