PDA

View Full Version : سوال: ایجاد ساختار آرایه ای از آرایه ها



debugger
یک شنبه 11 دی 1390, 00:57 صبح
دوستان عزیز من میخوام یک آرایه داشته باشم که توش ارایه ذخیره کنم لطفا عکس ضمیمه را حتما نگاه کنید

خیلی جستجو کردم چیز به درد بخور نیست

arraylist هم به این شیوه ذخیره نمی کنه

امیدوارم مدیران این پست بنده را پاک نکنند که نهایت ناجوانمردی هست .

اولا که جستجو کردم

دوما کد هایی که قبلا نوشته شده تو سایت به فرم #S#F#$@#6#654 دیده میشود اگر شما سر در میارید ما را هم بی نصیب نگذارید

syntiberium
یک شنبه 11 دی 1390, 07:15 صبح
من هر چی فکر کردم جواب دیگه ای برای سوالتان پیدا نکردم :

List<int[]> array1 = new List<int[]>();

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 7; i++)
array1.Add(new int[5]);
}


یا

int[,] array2 = new int[7,5];

debugger
یک شنبه 11 دی 1390, 09:45 صبح
دوست عزیز متاسفانه کد شما فقط یک عنصر (از آرایه ی بنفش رنگ در شکل) را اضافه می کند به لیست . ارایه ما 5 تا عنصر دارد . یعنی در هریک از خانه های قرمز رنگ باید یک رایه باشد که حاوی 5 عنصر باشد

بنده این مساله را برای پیاده سازی الگوریتم ژنتیک می خوام

ما یک کروموزوم داریم (یعنی یک آرایه) که این کروموزوم تعدادی ژن دارد (عناصر ارایه) و یک جمعیت داریم مثلا به تعداد 100 . حال نسل اول ما حاوی 100 تا کروموزوم است.

بنده اومدم یک struct تعریف کردم به این شکل

79975

حال نمی دونم چطوری باید ازش استفاده کنم


http://barnamenevis.org/images/misc/pencil.png

syntiberium
یک شنبه 11 دی 1390, 13:06 عصر
chrome[] g = new chrome[100];
for (int i = 0; i < 100; i++)
g[0].ch = new int[5];
g[0].ch[0] = 1;
g[0].ch[1] = 3;
g[0].ch[2] = 2;
g[0].ch[3] = 0;

debugger
یک شنبه 11 دی 1390, 20:25 عصر
دوست عزیز تشکر از کدتون میشه بگین چرا مسیج باکس ها مقدار صحیح را بر نمی گردونن ؟ (در کد زیر)


Random zhen=new Random();
chrome[] g = new chrome[int.Parse(txtpopular.Text.ToString())];

for (int i = 0; i < int.Parse(txtpopular.Text.ToString()); i++)
{
for (int j = 0; j < Fitness.Nqueen; j++)
{
g[i].ch = new int[Fitness.Nqueen];
g[i].ch[j] = zhen.Next(0, Fitness.Nqueen - 1);;
listBox1.Items.Add("g["+i+"].ch["+j+"] = " + g[i].ch[j].ToString());
}
listBox1.Items.Add("==========");
}
MessageBox.Show(g[0].ch[1].ToString());
MessageBox.Show(g[0].ch[2].ToString());
MessageBox.Show(g[0].ch[3].ToString());
MessageBox.Show(g[0].ch[4].ToString());

اسماعیل ابراهیمی
یک شنبه 11 دی 1390, 21:05 عصر
شما می توانید از آرایه های دندانه دار یا JaggedArray استفاده کنید

اینم یه نمونه کد :

class ArrayTest
{
static void Main()
{
// Declare the array of two elements:
int[][] arr = new int[2][];

// Initialize the elements:
arr[0] = new int[5] { 1, 3, 5, 7, 9 };
arr[1] = new int[4] { 2, 4, 6, 8 };

// Display the array elements:
for (int i = 0; i < arr.Length; i++)
{
System.Console.Write("Element({0}): ", i);

for (int j = 0; j < arr[i].Length; j++)
{
System.Console.Write("{0}{1}", arr[i][j], j == (arr[i].Length - 1) ? "" : " ");
}
System.Console.WriteLine();
}
// Keep the console window open in debug mode.
System.Console.WriteLine("Press any key to exit.");
System.Console.ReadKey();
}
}
/* Output:
Element(0): 1 3 5 7 9
Element(1): 2 4 6 8
*/

syntiberium
دوشنبه 12 دی 1390, 06:36 صبح
مکان خط زیر اشتباه است در کد زیر درستش رو نوشتم :
g[i].ch = newint[Fitness.Nqueen];

Random zhen=newRandom();
chrome[] g = newchrome[int.Parse(txtpopular.Text.ToString())];

for (int i = 0; i < int.Parse(txtpopular.Text.ToString()); i++)
{
g[i].ch = newint[Fitness.Nqueen];// مکان درست

for (int j = 0; j < Fitness.Nqueen; j++)
{
g[i].ch[j] = zhen.Next(0, Fitness.Nqueen - 1);
listBox1.Items.Add("g["+i+"].ch["+j+"] = " + g[i].ch[j].ToString());
}
listBox1.Items.Add("==========");
}
MessageBox.Show(g[0].ch[1].ToString());
MessageBox.Show(g[0].ch[2].ToString());
MessageBox.Show(g[0].ch[3].ToString());
MessageBox.Show(g[0].ch[4].ToString());


در کد شما در حلقه ی j در هر بار تکرار خانه های ch ساخته شده از بین می روند و جدید ساخته می شوند و تنها خانه ای از ch که مقدار می گیرد خانه ی آخر است اما اگر مثل من آن خط را قبل از حلقه ی j قرار بدید مشکل حل می شه .

debugger
دوشنبه 12 دی 1390, 10:30 صبح
دوست عزیز بی نهایت سپاس

اگر در ساختار struct دقت کنید ما یک public int fithness داریم این عدد نماینده هر یک از آرایه های [0]g تا g

n ام است . در دستور بالا ما اومدیم ارایه از struct ایجاد کردیم و بعد فرضا 100 تا ارایه درون آن را مقدار دهی کردیم . حالا من برای تمامی ارایه های struct عدد fithness را به دست آوردم .

حال باید این ارایه ها را که با کد شما مقدار دهی کردیم بر اساس fithness به صورت صعودی مرتب کنیم

تابع باید by refrence باشد . من تابع را به صورت زیر نوشتم ولی نمی دونم چطوری ارایه هامو بهش بفرستم و خروجی را چطور مرتب کنم . لطفا شما هم دیدگاه خود را بیان کنید . تا به کمک شما اساتید عزیز این مشکل هم برطرف شود


public void sort(ref chrome[] temp)
{
chrome temp1 = new chrome();
temp1.ch = new int[Form1.number];
for (int i = Form1.tour - 1; i >= 0; i--)
for (int j = 0; j < i; j++)
if (temp[j].fithness < temp[j + 1].fithness)
{
for (int k = 0; k < Form1.number; k++)
{
temp1.ch[k] = temp[j].ch[k];
temp[j].ch[k] = temp[j + 1].ch[k];
temp[j + 1].ch[k] = temp1.ch[k];
}
temp1.fithness = temp[j].fithness;
temp[j].fithness = temp[j + 1].fithness;
temp[j + 1].fithness = temp1.fithness;
}
}

syntiberium
دوشنبه 12 دی 1390, 12:20 عصر
راه حل داره اما من بلد نیستم برای همین من هر وقت می خوام یه آرایه را به یه تابع ارسال کنم یا خود آرایه را به صورت public و خارج از تابع ایجا می کنم یا اگر خود آرایه را داخل تابع تعریف کردم یه آرایه ی کمکی براش به صورت public و خارج از تابع ایجاد می کنم و مقادیر آرایه ی اصلی رو می ریزم داخل آرایه ی کمکی که از داخل تمام توابع قابل دسترسی باشه .