PDA

View Full Version : مبتدی: ریست کردن حلقه FOR



HjSoft
یک شنبه 27 تیر 1389, 13:13 عصر
سلام .
من دو تا For تو در تو دارم . میخوایم تحت یک شرایطی حلقه های ریست بشن ، یعنی برگردن حالت اول و از 0 شروع کنند . توی C میتونستیم i و j ( متغیر های for ) رو 0 کنیم . اما #C رو نمی دونم . اگر لطف کنید و راهنمایی کنید ممنون میشم .

Mohandes2009
یک شنبه 27 تیر 1389, 13:32 عصر
با متغییر بولین استفاده کن و یه شرطی داخلش بزار



bool a=fales;
if(a)
{
// دستورات
آخر دستورات
a= true;
}

علیرضا مداح
یک شنبه 27 تیر 1389, 13:33 عصر
سلام،

توی C میتونستیم i و j ( متغیر های for ) رو 0 کنیم .
در C# هم می توانید این کار را انجام دهید، فقط مراقب باشید که دچار Infinite Loop نشوید،
در ضمن اگر بفرمایید برای چه منظوری قصد به کار گیری این روش را دارید، شاید بتوان روش بهتری ارائه داد،/

HjSoft
یک شنبه 27 تیر 1389, 14:17 عصر
فکر کنم دچار همین Infinite Loop شدم . چون برنامه هنگ می کنه .
در اصل من دارم نرم افزار شبیه ساز ربات های میکرو موس رو می نویسم در الگوریتمی به نام bellman باید ربات یا همین نرم افزار بیاد یک زمین 16 * 16 رو چک کنه و بیبنه اگر خونه ای بسته بود عدد مربوط به اون خونه رو تغییر بده باز دوباره بیاد از اول بررسی کنه و همینطوری ادامه بده تا هیچ خونه ای نمونده باشه که بسته باشه ( فکر نکنم متوجه شده باشید :لبخند: ) خلاصه فرض کنید یک table 16 * 16 رو باید بررسی کنید و در صورتی که یکی از خونه ها تغییر کرد دوباره از اول برگردید و سایر خونه ها رو چک کنید و همینطور ادامه داره . تا زمانی که دیگه هیچ خونه ای نمونه .
برنامه ش اینه :

dbg("update");
bool newc = false;

int i,j;
for (i = 0; i < 16; i++)
{
newc = false;

for (j = 0; j < 16; j++)
{
check_wall(i,j);
ui = i; uj = j;

if (rcells("right") < rcells("blup") && right == open)
{
continue;
}
if (rcells("down") < rcells("blup") && down == open)
{
continue;
}
if (rcells("up") < rcells("blup") && up == open)
{
continue;
}
if (rcells("left") < rcells("blup") && left == open)
{
continue;
}

dbg("plus");
rp[i][j].Text = (Convert.ToUInt16(rp[i][j].Text) + 1).ToString();
i = 0; j = 0;
}



}
Movement.Enabled = true;
dbg("updfinish");

amirh_karimifar
یک شنبه 27 تیر 1389, 15:16 عصر
سلام . به نظر من شما باید دستور i=0 رو از بدنه حلقه ی j خارج کنید .
اینجوری معلومه که در حلقه بی نهایت گیر می کنید .

amirh_karimifar
یک شنبه 27 تیر 1389, 15:19 عصر
در ضمن بودن i=0 در حلقه j باغث این میشه که برنامه شما فقط خانه های سطر اول رو بررسی کنه .

vandermond
یک شنبه 27 تیر 1389, 16:03 عصر
دوست عزيز
اگه شما ميخاي هميشه اين كار رو بكنه. يعني بدون وقفه كه خب همون حلقه بينهايت ميشه ديگه(:لبخند:)

ولي شما ميتوني يه تايمر بزاري تو برنامت و حلقه ت رو هم مثل قبلا بكني كه بينهايت نشه. حالا Interval تايمر رو ميزاري رو هر عددي كه ميخاي (به ميلي ثانيه) و اين حلقه رو هم ميزاري توي رويداد Tick اون. حالا بعد از هر مدتي كه تعيين كردي شروع ميكنه و چك ميكنه و باز دوباره بعد از اون مدت. البته يادت باشه پيشفرض تايمر Enabled ش فالسه . تو هر وقت خاستي راش بنداز و هر وقت خاستي باز فالسش كن.
نميدونم فهميدي يا نه. ميخاستم كد ننويسم ولي نوشتم طولاني تر شد.
اگه خاستي باز هم بگو كه كد بزارم.(البته حتما خودت ميتوني ديگه)

علیرضا مداح
یک شنبه 27 تیر 1389, 16:25 عصر
( فکر نکنم متوجه شده باشید :لبخند: ) نگران نباشید، متوجه شدم:)
نکته 1:
به این قطعه کد نگاهی کنید، شاید کمکتان کند:
Micromouse Online Forum - Simple floodfill source code (http://www.micromouseonline.com/forum/viewtopic.php?p=1420&sid=bc76c1b8458696ed89149ee1b8cf561C#%E2%80%8E%E2% 80%8Ep1420)
نکته 2:
قطعه کد شما واضح است که دچار Infinite Loop خواهد شد، چون بدون بررسی هیچ قید و شرطی در حال Reset کردن شمارنده ی حلقه هستید، پس بدیهیست که در یک Infinite Loop بیفتید،
به این کد دقت کنید:
void resetLoop()
{
bool mustReset = true;
int upperBound = 10;
for (int i = 0; i <= upperBound; i++)
{
if (mustReset && (i == upperBound))
{
i = 0;
mustReset = false;
}
}
}

فکر می کنم این Pattern، مناسب باشد، اگر باز هم مشکل داشتید، بفرمایید،/

HjSoft
پنج شنبه 31 تیر 1389, 12:59 عصر
خیلی ممنون از کمک هاتون . اما من از شرط استفاده کردم یعنی اگر
if (rcells("right") < rcells("blup") && right == open)
{
continue;
}
if (rcells("down") < rcells("blup") && down == open)
{
continue;
}
if (rcells("up") < rcells("blup") && up == open)
{
continue;
}
if (rcells("left") < rcells("blup") && left == open)
{
continue;
}
هیچ کدام برقرار نشد ، میادو به خونه ها یکی اضافه می کنه مثلا در خونه 2*2 هیچکدوم برقرار نمیشه میاد به این خونه یکی اضافه می کنه ، دوباره از اول بررسی میکنه ببینی با اضافه کردنش خونه دیگه ای بهم نریخته ، اگر بهم ریخته بود که یکی اضافه می کنه و اگر نه که حلقه ها و طبیعتا update به پایان میرسه .
در ضمن ممنون از لینکی که معرفی کردید ، مفید بود اما شبیه ساز من اون الگوریتم رو داره ، من می خوام چندین الگوریتم رو پیاده کنم این الگوریتمی که روش کار می کنم رو میگن bellman . در هر صورت به محض تموم شدن پروژه اونو رو سایت آپلود می کنم تا دوستان هم استفاده کنم چون راستش من کارم #C نیست ، با کمک دوستان تونستم بنویسمش و همشو مدیون این دوستانم . اگر کسی میتونه همین کمک رو هم بکنه ممنون میشم .

FastCode
پنج شنبه 31 تیر 1389, 16:26 عصر
شما باید قبل از هر if یک else قرار بدید.
و در اخر هم یک else.

golbafan
پنج شنبه 31 تیر 1389, 16:50 عصر
من جاي شما باشم به جاي استفاده از 4 از while استفاده ميكنم