PDA

View Full Version : محدودیت در تعریف حلقه



ahmads
چهارشنبه 16 تیر 1389, 03:31 صبح
سلام دوستان

به یه مشکلی برخوردم که نمیدونم ضعف از من هست یا از بیسیک !

نمیدونم چطور میتونم تعریف کنم که فرضا به تعداد کاراکترهای Text1 برنامه داخل خودش حلقه تعریف کنه . مثلا به این شکل :


For i = .......
for j = ............
for n = ........
...................

خیلی اوقات برام محدودیت ایجاد میکنه اما تو سایر زبان ها تا اونجایی که دیدم وجود نداشته

یا یه نمونه ملموس تر !

حل مسئله ی زیر رو ببینید :

http://www.barnamenevis.org/forum/showthread.php?t=229429

دوست عزیزی که مسئله رو حل کرده مجبور بوده برای هر عدد یک حلقه ی جدا تعریف کنه در صورتی که میشد تعریف کرد برنامه به تعداد اعداد، خودش حقله تعریف کنه .


ممنون میشم راهنمایی کنید

voodoo01
چهارشنبه 16 تیر 1389, 04:39 صبح
دوست عزیز من احساس می کنم هیچ کدام از دوستان از الگوریتم مناسب استفاده نکردن
باید دنبال راهکارهای بهتر گشت مثلا در لینک شما قرار دادید می توان به جای استفاده از چند حلقه از دو حلقه متداخل استفاده نمود و رقم سمت چپ را در هر بار تکرار یک بار شیفت به رراست نمود سپس چک نمایید که مقدار تولیدی با مقدار عدد اولیه مساوی نباشد و چاب کنید .
بدین شکل شما می توانید تا n رقم هم بسازید .


for i=1 to len(text)
for j=i to len(text)
<شیفت به راست رقم چپ >
اگر ntu<>texttemp
چاپ شود text
next
next


موفق باشد

ahmads
پنج شنبه 18 شهریور 1389, 18:27 عصر
ممنون از راهنماییتون دوست عزیز، روشی رو که گفته بودید امتحان کردم اما نتیجه نگرفتم، نمیدونم شاید نتونستم درست انجامش بدم

ممنون میشم اگه کسی از دوستان راهنمایی کنه

MEhdi Sobhani
پنج شنبه 18 شهریور 1389, 18:50 عصر
ممنون از راهنماییتون دوست عزیز، روشی رو که گفته بودید امتحان کردم اما نتیجه نگرفتم، نمیدونم شاید نتونستم درست انجامش بدم

ممنون میشم اگه کسی از دوستان راهنمایی کنه
سلام
من قبلا همچین چیزی نوشته بودم (در مورد مساله ای که لینکش رو دادید )
مثلا میخواید که تمام اعداد مثلا 20 رقمی رو با فرضا 5 تا عدد بسازیم .
برای این ار در واقع باید یک اعداد 20 رقمی در مبنای 5 رو بسازیم .
و بعد اعداد 0 تا 4 رو در اون عدد متناظر با 5 عدد موجودمون بکنیم .
مثل جمع کردن ساده توی حلقه هر بار به آخرین عدد یکی اضافه میکنیم اگر مساوی 5 شد صفر میکنیم و یکی به یه سلول بعد اضافه میکنیم . بعد اون سلول رو هم چک میکنیم اگر به 5 نرسیده بود که تمامه و میتونیم عدد بعدی رو تولید کنیم اما اگر 5 شده بود اینم 0 میشه و میریم بعدی و ...

ahmads
شنبه 20 شهریور 1389, 17:28 عصر
ببخشید دوست عزیز دقیقا منظورتون رو متوجه نشدم برای همین نتونستم برنامه رو صحیح بنویسم، کاش مرحلحه به مرحله ذکر میکردید،

دوستان کسی راه حل دیگه ای نداره ؟ واقعا ذهنم رو مشغول کرده :متفکر:

saeid5977
شنبه 20 شهریور 1389, 18:00 عصر
سلام
راه حلی که MEhdi Sobhani (http://www.barnamenevis.org/forum/member.php?u=161025) داده کاملا درسته و از این نکته در اون استفاده میشه که اگر شما در مبنای n تمام اعداد m رقمی رو بنویسی تمام حالات مختلف n عدد رو در رشته به طول m خواهی داشت.
راه حل دیگه اینطور مسایل استفاده از الگوریتمهای بازگشتیه.
موفق باشید

MEhdi Sobhani
شنبه 20 شهریور 1389, 23:18 عصر
ببخشید دوست عزیز دقیقا منظورتون رو متوجه نشدم برای همین نتونستم برنامه رو صحیح بنویسم، کاش مرحلحه به مرحله ذکر میکردید،

دوستان کسی راه حل دیگه ای نداره ؟ واقعا ذهنم رو مشغول کرده :متفکر:
سلام
ببین مثلا قراره تمام اعداد 5 رقمی رو با 4 و 6 و7 بنویسیم .
چون کلا 3 نوع عدد داریم (4 و 6 و7 ) پس در واقع باید تمام اعداد 5 رقمی مبنای 3 رو بنویسیم .
و بعد در هر عدد به جای 0 ، 4 -- به جای 1 --> 6 و به جای 2 ---> 7 رو بنویسیم .
اگر نوشتن الگوریتم این کار برات سخته میتونی یه عدد رو بگیری و هی بهش یک عدد اضافه کنی و بعد اون عدد رو در مبنای 3 نمایش بدی و بعد هم جایگزین کردن هر عدد در اون مبنا بر اساس خط بالا .
خیلی سادس .

ahmads
شنبه 20 شهریور 1389, 23:58 عصر
بله الگوریتم ایشون صحیح هست چون دربارش شنیدیم اما مسئله اینه که برای نوشتن یک الگوریتم برنامه نویس باید اونو اول بفهمه که نمیدونم توضیحات واضح نبوده یا ... :لبخند:

MEhdi Sobhani
یک شنبه 21 شهریور 1389, 00:24 صبح
بله الگوریتم ایشون صحیح هست چون دربارش شنیدیم اما مسئله اینه که برای نوشتن یک الگوریتم برنامه نویس باید اونو اول بفهمه که نمیدونم توضیحات واضح نبوده یا ... :لبخند:
اینم روش ساده تر بدون اینکه الگوریتم این کار رو بلد باشی
خودش هم تمام اعداد روبر میگردونه :




private void button3_Click(object sender, EventArgs e)
{
char[] Mychars1 = new char[] { '0', '1', '2' };
char[] Mychars2 = new char[] { '6', '5', '4' };
int Length = Mychars1.Length;
int Mabna = 3;
int Start =(int) Math.Pow (3,Length-1);
int End = (int)Math.Pow(3, Length)-1;
string BaseResult;
for (int IntNo = Start; IntNo <= End; IntNo++)
{
BaseResult = ChangeBase(IntNo, Mabna);
for (int i = 0; i < Mychars1.Length; i++)
{
BaseResult = BaseResult.Replace(Mychars1[i], Mychars2[i]);
}
MessageBox.Show(BaseResult);
}
}
public string ChangeBase(int IntNo, int IntBase)
{
string StrReturn="";
int Mande;
while (IntNo > 0)
{
Mande = IntNo % IntBase;
IntNo /= IntBase;
StrReturn = Mande + StrReturn;
}
return StrReturn;
}



تابع changebase مبنای عدد رو تغییر میده (البته برای مبناهای زیر 10 درست کار میکنه )
دو تا متغیر mychars رو به صورت آرایه ی چار تعریف میکنی و متغیر اول اعضاش باید به ترتیب 0 و 1 و 2 و 3 و 4 و ... باشه تا جایی که میخوای (مثلا برای به دست آوردن اعداد 5 رقمی تا 4 )
متغیر mychars دوم هم اعداد متناظر با اونها .
فقط باید دقت کنی اگر مثلا در اعدادی که قراره متناظر با اونها باشن 3 هست و در خود اینها هم 3 هست ، باید 3 رو متناظر با خود 3 بگیری .
بقیه کارهام که به کد دقت کنی مشخصه .
موفق باشی .