PDA

View Full Version : سوال: مشکل در سورس برنامه



engare
پنج شنبه 27 فروردین 1388, 16:08 عصر
سلام من برنامه ی 8 وزیر رو با استفاده از الگوریتم عقبگرد که در همین جا الگوریتم و برنامشو به زبان پاسکال گذاشته بودن نوشتم.
تقریبا شبیه کد پاسکالشه ولی خطای زمان اجرا داره و خطاش مربوط به ارایشه که میگه
Index was outside the bounds of the array.و هر جا که من ارایه رو به کار بردم این خطا رو داره.میشه دوستان کمکم کنند و بگن مشکل من چیه؟

for (q = 0; q < 8; q++)
Queense[q] = 0;
numpos=0;
q=1;
while ((q!=0)&&(Queense[0]!=7))
{
safepos=false;
while((Queense[q]<7)&&(!safepos))
{
Queense[q]++;
safepos=true;
n=1;
while((n<q)&&(safepos=true))
{
safepos=((Queense[n]!=Queense[q])||((Queense[n]-Queense[q])!=(n-q)));
n++;
}
}
if (safepos == true)
{
if (q == 8)
{
numpos++;
for (n = 0; n < 8; n++)
label1.Text = Queense[n].ToString()+" ";
}
else q++;
}
else
{
Queense[q] = 0;
q = q - 1;
}
}
}

seven7777777
پنج شنبه 27 فروردین 1388, 18:52 عصر
دوست خوبم تعریف آرایتو چک کردی ؟
کاش می گفتی ارور رو در کدوم مرحله میده . حتما خودت متوجه شدی که ارور میگه اندیس آرایت خارج از محدوده است .
بهترین راه در این جور مواقع trace برنامه است . ای جوری مچ خط خطا دار رو می گیری ولی اگه متوجه نشدی خطاشو ، تعریف آرایتم بذار ببینیم چی میشه !!!

cups_of_java
پنج شنبه 27 فروردین 1388, 18:53 عصر
برنامتون رو debug کنید ببینید کجا متغیر هایی که برای اندیس آرایتون استفاده کردین مقدارشون داره منفی می شه و یا از اندازه آرایه بیشتر شده!

engare
پنج شنبه 27 فروردین 1388, 19:30 عصر
برنامتون رو debug کنید ببینید کجا متغیر هایی که برای اندیس آرایتون استفاده کردین مقدارشون داره منفی می شه و یا از اندازه آرایه بیشتر شده!
میشه بیشتر توضیح بدید:لبخندساده:
اینم سورس کامل


int[] Queense=new int[8];
int numpos, q, n;
bool safepos;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
for (q = 0; q < 8; q++)
Queense[q] = 0;//aval makane har vaziri ra sefr mikonad
numpos=0;
q=1;
while ((q!=0)&&(Queense[0]!=8))
{
safepos=false;
while((Queense[q]<8)&&(!safepos))
{
Queense[q]++;
safepos=true;
n=1;
while((n<q)&&(safepos=true))
{
safepos=((Queense[n]!=Queense[q])||((Queense[n]-Queense[q])!=(n-q)));
n++;
}
}
if (safepos == true)
{
if (q == 8)
{
numpos++;//yek marhale anjam shod
for (n = 0; n < 8; n++)
label1.Text = Queense[n].ToString()+" ";
}
else q++;//mirim vazire badi ro baresi mikonim
}
else
{
Queense[q] = 0;
q = q - 1;
}
}
}

khaste_007
پنج شنبه 27 فروردین 1388, 20:33 عصر
سورس شما رو چک کردم مشکل در خط
while ((Queense[q] < 8) && (!safepos)) ایجاد میشه که q مقدار 8 رو گرفته که آخرین اندیس آرایه شما 7 هست و خطا میدهد آرایه رو بزرگ کردم ولی الگوریتم جواب نمی دهد پس احتمالا اشکالات بیشتری در پیاده سازی شما از لحاظ مفهومی وجود دارد که من الگوریتمی که شما از اون استفاده کردید رو نمی دونم در اینجا یک پیاده سازی از الگوریتم ان وزیر براتون میزارم که از روی الگوریتم کتاب طراحی الگوریتم ترجمه جعفر نژاد پیاده سازی کردم

using System;

public class nqueens
{
int count = 0;
static int n;
static int[] col;

public void queens(int i)
{
int j;
if (promising(i))
if (i == n)
{
count++;
Console.WriteLine("hale{0}:",count);
for (int c = 1; c <= n; c++)
{
Console.WriteLine("satre {0} ,sotone {1}", c, col[c]);
}
Console.WriteLine("");
}
else

for (j = 1; j <= n; j++)//see if queen in (i+1)st row
{ //can be positioned in each of the n columns
col[i + 1] = j;
queens(i + 1);
}
}

private bool promising(int i)
{
int k = 1;
bool flag = true;//check if any queen threatens
while (k < i && flag)//queen in the ith row
{
if (col[i] == col[k] || Math.Abs(col[i] - col[k]) == i - k)
flag = false;
k++;
}
return flag;
}

public static void Main(string[] args)
{
n = 8;
col = new int[n + 1];
nqueens MyClass = new nqueens();
MyClass.queens(0);
Console.ReadLine();
}
}برای تغییر در تعداد وزیر متغییر n را در تابع Main مقدار دهید.

engare
شنبه 29 فروردین 1388, 18:33 عصر
مرسی از کمکتون