PDA

View Full Version : چرا این حلقه تا بی نهایت میره؟



hosseinam1370
پنج شنبه 12 تیر 1393, 22:03 عصر
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a =1 ;
for ( a= 1 ; a = 5 ; a++) {
cout << "$";
}
cin.get();
cin.get();
}



دوستان مگه این حلقه از a=1 تا a=5 نباید بچرخه؟
پس چرا تا بینهایت میره؟
ممنون

کامبیز اسدزاده
پنج شنبه 12 تیر 1393, 22:35 عصر
#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
int a =1 ;
for ( a= 1 ; a = 5 ; a++) {
cout << "$";
}
cin.get();
cin.get();
}



دوستان مگه این حلقه از a=1 تا a=5 نباید بچرخه؟
پس چرا تا بینهایت میره؟
ممنون

به این صورت اصلاح میشه :


#include <iostream>
using namespace std;
int main()
{
int a = 1;
for (a = 0; a < 5; a++) {
cout << "$";
}
cin.get();
}



اشکال شما در a = 1; a = 5 بود که باید بگید a = 0; a < 5 و درضمن cin.get(); رو دوبار نوشتین که نیازی نیست.

Arcsinos
پنج شنبه 12 تیر 1393, 22:55 عصر
ای برادر وقتی مینویسی a=1 در واقع a=1 میشه بعدش میره شرط رو چک میکنه و a=5 رو اجرا میکنه و a=5 میشه و شرط برقراره چون a!=0 هست و وقتی به پایان حلقه میرسه ++a میشه و میشه 6 و تا آخر همینطوری a=5 میشه و بعد ++a میشه. اگه بذاری a==5 همه چیز درست میشه.
یاعلی

مسعود اقدسی فام
پنج شنبه 12 تیر 1393, 23:43 عصر
ای برادر وقتی مینویسی a=1 در واقع a=1 میشه بعدش میره شرط رو چک میکنه و a=5 رو اجرا میکنه و a=5 میشه و شرط برقراره چون a!=0 هست و وقتی به پایان حلقه میرسه ++a میشه و میشه 6 و تا آخر همینطوری a=5 میشه و بعد ++a میشه. اگه بذاری a==5 همه چیز درست میشه.
یاعلی

برادر، اگه a==5 بنویسن حلقه اصلا احرا نمی‌شه! چون اون قسمت شرط ادامه‌ی حلقه رو مشخص می‌کنه که a < 5 یا a < = 5 مناسب هست. a == 5 یعنی اگه a برابر 5 بود ادامه بده که خب همون اول a برابر یک هست و اصلا وارد حلقه نمی‌شه.

hosseinam1370
جمعه 13 تیر 1393, 00:01 صبح
بردار، اگه a==5 بنویسن حلقه اصلا احرا نمی‌شه! چون اون قسمت شرط ادامه‌ی حلقه رو مشخص می‌کنه که a < 5 یا a < = 5 مناسب هست. a == 5 یعنی اگه a برابر 5 بود ادامه بده که خب همون اول a برابر یک هست و اصلا وارد حلقه نمی‌شه.

جالب اینجاست که،
for ( a= 1 ; a = 5 ; a++)
اگه a=5 شرط هست،پس چرا وقتی این حلقه اجرا میشه مقدار a رو تغییر میده به 5 ؟
مثلا چرا ویژال استدیو نمیفهمه که منظور من اینه که ،هروقت مقدار a مساوی با 5 شده ،تو بیا حلقه رو بیخیال شو.پ

ممنون دوستان.

مسعود اقدسی فام
جمعه 13 تیر 1393, 00:21 صبح
جالب اینجاست که،
for ( a= 1 ; a = 5 ; a++)
اگه a=5 شرط هست،پس چرا وقتی این حلقه اجرا میشه مقدار a رو تغییر میده به 5 ؟
مثلا چرا ویژال استدیو نمیفهمه که منظور من اینه که ،هروقت مقدار a مساوی با 5 شده ،تو بیا حلقه رو بیخیال شو.پ

ممنون دوستان.

درست و نادرست (شرط) از نظر کامپایلر ++C ناصفر و صفر بودن هستش. وقتی a = 5 رو می‌بینه مقدار a رو 5 می‌کنه و بعد هم که پنج صفر نیست و پس درست حساب می‌شه و وارد حلقه‌ی بی‌نهایت می‌شیم. شما هر سه قسمت حلقه‌ی for می‌تونید هر نوع دستوری که دوست دارید بنویسد. قسمت اول فقط یه بار اجرا می‌شه و قسمت آخر بعد از تموم شدن هر تکرار. قسمت وسط هر محاسبه‌ای هم که انجام بدید نهایتش به یه مقدار عددی تبدیل می‌شه (نه لزوما در ظاهر) و صفر و نا صفر بودنش ادامه‌ی حلقه رو مشخص می‌کنه.

عملگر = مقداردهی هست و == شرط تساوی. پس قطعا a = 5 را به حساب چک کردن شرط برابری a با 5 در نظر نمی‌گیره. اگر منظورتون هم این هست که چرا a == 5 را به عنوان شرط خاتمه در نظر نمی‌گیره یه بجث جداست.

hosseinam1370
جمعه 13 تیر 1393, 00:47 صبح
عملگر = مقداردهی هست و == شرط تساوی. پس قطعا a = 5 را به حساب چک کردن شرط برابری a با 5 در نظر نمی‌گیره. اگر منظورتون هم این هست که چرا a == 5 را به عنوان شرط خاتمه در نظر نمی‌گیره یه بجث جداست.

ممنون دوسته عزیز،توضیحاتتون رو کاملا فهمیدم.
حالا منظورم همین هست که چرا a==5 رو نمیفهمه.به عنوان همون شرط خاتمه.

بازم ممنون

hosseinam1370
جمعه 13 تیر 1393, 01:19 صبح
جواب پیدا شد.

حلقه رو اگه بخوايم به زبون خودمون بخوني ميشه اين: اگر آ برابر 5 بود يکي زياد بشه و وارد حلقه بشه
بايد بگيم که اگه آ کوچکتر مساوي 5 بود يکي اضافه بشه و وارد حلقه بشه!

یا در هر صورت a=1 رو باید مساوی با 5 قرار بدیم ،تا شرط برقرار بشه و حلقه اجرا بشه.
for ( a= 5 ; a == 5 ; a++)




ممنون همه دوستان

مسعود اقدسی فام
جمعه 13 تیر 1393, 02:42 صبح
جواب پیدا شد.

حلقه رو اگه بخوايم به زبون خودمون بخوني ميشه اين: اگر آ برابر 5 بود يکي زياد بشه و وارد حلقه بشه
بايد بگيم که اگه آ کوچکتر مساوي 5 بود يکي اضافه بشه و وارد حلقه بشه!

یا در هر صورت a=1 رو باید مساوی با 5 قرار بدیم ،تا شرط برقرار بشه و حلقه اجرا بشه.
for ( a= 5 ; a == 5 ; a++)




ممنون همه دوستان

"یکی اضافه می‌شه و وارد حلقه می‌شه" درست نیست.

۱ - مقداردهی اولیه انجام می‌شه.

۲- شرط بررسی می‌شه و اگه درست بود وارد حلقه می‌شه (افزایش نداریم). اگه درست نبود از حلقه بیرون می‌ره.

۳- حلقه که تموم شد قسمت افزایش اجرا می‌شه و به مرحله‌ی دوم برمی‌گرده.

منظور اینکه به محض چک کردن شرط، بخش نمو (سوم) اجرا نمی‌شه. این لینک رو هم بخونید:


http://algorithmha.ir/post-%D8%AD%D9%84%D9%82%D9%87-%D9%87%D8%A7%DB%8C-%D8%AA%DA%A9%D8%B1%D8%A7%D8%B1-%D8%AF%D8%B1-%D8%B3%DB%8C-%D9%BE%D9%84%D8%A7%D8%B3-%D9%BE%D9%84%D8%A7%D8%B3.aspx



این کد شما داخل حلقه فقط یک بار انجام می‌شه. چون اول ۵ هست و شرط ادامه هم ۵ هست. داخل حلقه اگه مقدار a عوض نمی‌شه، صرفا با ++a بخش نمو یه واحد اضافه می‌شه و ۶ می‌شه که باعث می‌شه شرط a == 5 اشتباه بشه و وارد حلقه نشه.

Arcsinos
جمعه 13 تیر 1393, 04:03 صبح
:-) ، هدف خاتمه دادن به بی نهایت بودن حلقه بود، وگرنه همان پاسخ قبل از بنده نیز درست است به شرط جا به جایی (a<5 با a<=5) درست است ...

motherboard
جمعه 13 تیر 1393, 13:42 عصر
سلام.در تکمیل عرایض دوستان دیگه براتون چندتا مثال زدم تا جون مطلب رو بگیری.ما دو تا تکرار کننده معروف تو سی داریم.یکی ()while و اون یکی (;;)for هست.این تکرار کننده ها برای شمارش نیاز به گام هایی از نوع اعداد صحیح دارند.این دو تکرار کننده به صورت پیشفرض بی نهایت بار شمارش می کنند!!!

#include <iostream>
using namespace std;
int main()
{
for(;;)
cout <<"$";

}



#include <iostream>
using namespace std;
int main()
{
while(22)
cout <<"$";

}

حالا زمانی که شما میای هیچ محدوده ای رو برای تکرار تعیین نمی کنید.از کامپایلر بدبخت چه انتظاری دارید؟؟!!!!!شما باید تو for قشنگ بگید که فلانی از این جا تا انجا مثلا دو تا دو تا برو جلو و یا بیا عقب.!!!
حالا شما بیا اینجوری بنویس:!!!!
for(int a=1; a=5;a++)
یا اینجوری

for(int a=1; a<=5;)

و یا اینطوری

for(int a=1; ;a++)

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

محمد فدوی
جمعه 13 تیر 1393, 21:13 عصر
دوستان توجه داشته باشید که a=5 یک دستوره و نه یک شرط! وقتی کامپایلر a=5 رو میخونه اول مقدار a رو برابر 5 قرار میده و بعد میزان 5 رو بصورت منطقی اعتبار سنجی میکنه... اعدادی که صفر نباشن مقدارشون درست (TRUE) در نظر گرفته میشه. پس حلقه ای که دوستمون همون اول نوشت یه بار با مقدار 1 انجام میشه و بعد تا بی نهایت با مقدار 5! چون مقدارش رو خودمون برابر 5 گذاشتیم.