PDA

View Full Version : سوال: طراحی برنامه ای برای این فرمول



moferferi
جمعه 23 بهمن 1388, 02:16 صبح
سلام.
من میخوام یه ليست باکسی ایجاد کنم که اعداد را به این روش برام به ترتیب اضافه كنه

1:1
2:2
3:2
4:3
5:3
6:4
7:4
8:4
9:5
10:5
11:5
12:6
13:6
14:6
15:6
16:7
17:7
18:7
19:7
و به همین ترتیب مثلا تا عدد 100.
حتما فرمولش را میدونید.عدد یک چون روبروی عدد 1 است یک بار تکرار میشود عدد2 چون روبروی عدد2 است 2 بار 3 هم روبروی 2 است پس 2 بار و 4 چون جلوی سه است 3 بار و ... ....تکرار میشود.
حالا کسی میدونه چطور میشه برنامه و یا فرمولی واسه این کار پیدا کرد.

debugger
جمعه 23 بهمن 1388, 10:57 صبح
اینو برای چه کاری میخوای ؟؟

سختیش فقط الگوریتمشه کدش چیزی نیست

Salar Ashgi
جمعه 23 بهمن 1388, 11:33 صبح
کاش همیشه چنین سوالهایی وجود داشته باشه تا همه چیز تبدیل به سوال در مورد Data Base نشه .

(دوستان ناراحت نشن ، فقط یه درد دل بود )

دوست عزیز با کمی دقت در نحوه چینش اعداد ، الگوریتمش بسادگی بدست میومد :



public string Find(int n)
{
string res = "";
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= (int)(Math.Floor(((double)(i)) / 2.0) + 1); j++)
{
res += i.ToString() + ",";
}
}
return res;
}


اجرا :



private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show(Find(7));
}


http://salarcpp.persiangig.com/2/res.png

توضیح الگوریتم : اگه به سری داده شده دقت کنید ، عدد i به تعداد 1+[i/2] ( [] علامت جزء صحیح) بار

تکرار میشه ، از این رو براحتی میشه پیاده سازیش کرد .

موفق باشید .

tefos666
جمعه 23 بهمن 1388, 13:00 عصر
دوست عزیز تو این مثال که من تو برنامه خودم استفاده کردم اطلاعات مثلا نام فرد رو از دیتابیس برگردوندم تو کمبوباکس نشون دادم کنار هرکدوم از اسم ها یک -- اضافه کردم و شماره به ترتیب 1 و 2 و 3 و .... شما میتونی برای خدوت تو لیست باکس استفاده کنی




private void FillCombo()
{
toolStripComboBox1.ComboBox.SelectedIndex = -1;
try
{
string connstr = functions.strcon;
OleDbConnection conn = new OleDbConnection(connstr);
string query;
DataSet ds = new DataSet();
query = "SELECT * from tbl_index";
try
{
conn.Open();
}
catch (Exception x)
{
MessageBox.Show(x.Message);
}
OleDbDataAdapter adp = new OleDbDataAdapter(query, conn);
adp.Fill(ds, "tbl_index");
foreach (DataRow dr in ds.Tables[0].Rows)
{
toolStripComboBox1.ComboBox.Items.Add(dr[0].ToString() + " -- " +
dr[1].ToString());
toolStripComboBox1.ComboBox.ValueMember = dr[0].ToString();
}

conn.Close();
conn.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}




کدش هم خیلی سادست ضمنا اگر متوجه نشدی در مورد این تو گوگل اینجوری سرچ کن

sequential number in listbox C#‎ language

اين چندتا كد هم برات پيدا كردم ببين كارت رو راه ميندازه يا نه



string seq=listBox2.Items[0].ToString();
for(int i =0; i<=listBox2.Items.Count;i++)
{
if(i<listBox2.Items.Count-1)
{

if((Convert.ToInt32(listBox2.Items[i].ToString())) + 1 == (Convert.ToInt32(listBox2.Items[i+1].ToString())))
{
seq += " - " + listBox2.Items[i+1].ToString() ;
listBox1.Items.Add(seq);
seq="";

}
else
{

listBox1.Items.Add(listBox2.Items[i].ToString());

}


و يا اين يكي


private string[] GetRanges(int[] RawData){ List<string> reply = new List<string>(); for (int i = 1; i < RawData.Length; i++) { int start = RawData[i - 1]; while (RawData[i - 1] + 1== RawData[i]) { if (++i == RawData.Length) break; } int stop = RawData[i - 1]; if (start == stop) reply.Add(start.ToString()); else reply.Add(string.Concat(start," - ", stop)); } return reply.ToArray();}
و نهايتا اين كد


int[] arr = new int [listBox2.Items.Count];
//add the numbers to the list box
for(int i=0;i<listBox2.Items.Count-1;i++)
{
arr[i]=Convert.ToInt32(listBox2.Items[i]);
}
//create a string array to hold the returned items
string[] str = new string[listBox2.Items.Count];
//call the method
str= GetRanges(arr);
//loop thourgh the string array and add to the list box
for (int x = 0; x < str.Length; x++)
{
listBox1.Items.Add (str[x]);
}

debugger
جمعه 23 بهمن 1388, 13:44 عصر
با توجه به فرمایشات استاد salar_cpp_cs و کمی تغییرات توسط بنده (چون مساله برام جالب بود) کد را براتون نوشتم

http://y4shar.persiangig.com/image/screenshot.jpg

debugger
جمعه 23 بهمن 1388, 15:49 عصر
این کد را هم به رویداد ماوس کلیک لیست باکس 1 اضافه کنید تا در صورت زیاد بودن ارقام بدانید که کدام شماره به کدام شماره تعلق دارد



private void listBox1_MouseClick(object sender, MouseEventArgs e)
{
int b = int.Parse(listBox1.SelectedIndex.ToString());
listBox2.SetSelected(b,true);
}

khmahdi
شنبه 24 بهمن 1388, 00:13 صبح
حالا فرمول اینو فهمیدید ،چی شد
برو دنبال یه کاری که توش پول باشه ، اینقدر وقتتونو هدر نید!!!

moferferi
شنبه 24 بهمن 1388, 09:39 صبح
از همه ممنون.
چرا چنين سوال هايي اين قدر مسخره است؟

moferferi
شنبه 24 بهمن 1388, 10:05 صبح
با توجه به فرمایشات استاد salar_cpp_cs و کمی تغییرات توسط بنده (چون مساله برام جالب بود) کد را براتون نوشتم

http://y4shar.persiangig.com/image/screenshot.jpg


دوستان از همه ممنون
ولي متاسفانه فرمولي كه دوستمون اقاي salar_cpp_cs (http://barnamenevis.org/forum/member.php?u=70109) گفتند فقط تا عدد 7 درست كار ميكنه.چون كه عدد 8 در فرول ايشون 5 بار تكرار ميشه .در صورت اينكه جلوي عدد 8 عدد 4 اومده پس بايد 4 بار تكرار بشه نه 5 بار.
عدد 9 درسته 5 بار تكرار شده و لي عدد 10 و 11 هم بايد 5 بار تكرار بشه كه اين طور نيست و 6 بار تكرار شده.
البته درسته كه اين سوال واسه من و شما نون نميشه ولي لااقل جوابشا پيدا كنيم تا خيالمون راحت بشه.

Salar Ashgi
شنبه 24 بهمن 1388, 11:06 صبح
ولی متاسفانه فرمولی که دوستمون اقای salar_cpp_cs (http://barnamenevis.org/forum/member.php?u=70109) گفتند فقط تا عدد 7 درست کار میکنه.چون که عدد 8 در فرول ایشون 5 بار تکرار میشه .در صورت اینکه جلوی عدد 8 عدد 4 اومده پس باید 4 بار تکرار بشه نه 5 بار.
عدد 9 درسته 5 بار تکرار شده و لی عدد 10 و 11 هم باید 5 بار تکرار بشه که این طور نیست و 6 بار تکرار شده.


دوست عزیز مطمئنید که سری داده شده تان را درست ذکر کرده اید ، چون اگه حتی یه عدد کمتر بیشتر بشه

قانون سری به هم میریزه . با اون سری که شما گذاشته بودید ، فرمول من سازگار بود . با این حال جملات

بیشتری از سری را قرار دهید ، تا بیشتر بررسی شود .

Salar Ashgi
شنبه 24 بهمن 1388, 11:10 صبح
حالا فرمول اینو فهمیدید ،چی شد
برو دنبال یه کاری که توش پول باشه ، اینقدر وقتتونو هدر نید!!!

همیشه و همه چیز که پول نیست ، به قول یه نفر من یک تار موی چنین برنامه های الگوریتمی

را به 100 تا از برنامه های دیتابیسی نمی دهم .

لذت برنامه نویسی به همین برنامه هاست و به همین دلیل است تو که مسابقات ACM فقط

مساله جذاب و سخت الگوریتمیک مطرح میشود .

moferferi
شنبه 24 بهمن 1388, 11:45 صبح
پست قبلی را میخواستم ویرایش کنم و همینی که شما گفتید را انجام بدم که برق رفت.
ببینید اعداد این طور تکرا میشه:
1:1
2:2
3:2
4:3
5:3
6:4
7:4
8:4
9:5
10:5
11:5
12:6
13:6
14:6
15:6
16:7
17:7
18:7
19:7
20:8
21:8
22:8
23:8
24:9
25:9
26:9
27:9
28:9
30:10
31:10
32:10
33:10
34:10

امید وارم که متوجه سوالم شده باشید.
سمت چپ اعدا به ترتیب اضافه میشن.اما اعداد سمت راست:
در اینجا چون جلوی عدد 1 عدد یک است پس 1 یک بار تکرار میشه.
عدد بعدی عدد 2 است چون جلوش عدد 2 است 2 بار تکرار میشه
عدد بعدی سه است چوم جلوش سه است 3 بار تکرا میشه.
عدد بعدی 4 است چون جلوش سه است 3 بار تکرا میشه و .....
4سه بار
5 سه بار
6 و 7 و 8 چهار بار تکرا میشن
9 و 10 و 11 پنج بار
12 و 13 و 14 و 15 شش بار
16و17 و 18 و 19 هفت بار و الی اخر تکرار میشن.

moferferi
شنبه 24 بهمن 1388, 11:56 صبح
از چند تا مخ رياضي پرسيدم اونا هم فرمولي واسش پيدا نكردن.
ولي فكر كنم بشه با يه حلقه تو در تو اين كارا كرد.

اَرژنگ
شنبه 24 بهمن 1388, 16:47 عصر
از چند تا مخ ریاضی پرسیدم اونا هم فرمولی واسش پیدا نکردن.
ولی فکر کنم بشه با یه حلقه تو در تو این کارا کرد.

۱.مخ ریاضی؟ تعریف مخ ریاضیات اشخاصی مانند رامانوجان، اویلر ، گاس ، برنولی ، کانتور، ... هستند نه هرکی که بلد باشد جمع و تفریق کند.

یک روش خراب خروب که من سرهم کردم با اعدادی که تولید میکنه هم ایناها:


Numbers numbers = new Numbers(10);

List<int> result = numbers.GetNumbers();
for (int i = 0; i < result.Count; i++)
{
listBox1.Items.Add(string.Format("{0}:{1}", result.ElementAt(i), i+1));
}

public class Numbers
{
private Numbers() { }
public List<int> GetNumbers()
{
return _numbers;
}
private List<int> _numbers = new List<int>();
public Numbers(int lastNumber)
{
_numbers.Add(1);
_numbers.Add(2);
_numbers.Add(2);

for (int i = 3; i <= lastNumber; i++)
AddTermsFor(i);
}

private void AddTermsFor(int i)
{
for (int j = 1; j <= _numbers.ElementAt(i - 1); j++)
{
_numbers.Add(i);
}
}
}

1:1
2:2
2:3
3:4
3:5
4:6
4:7
4:8
5:9
5:10
5:11
6:12
6:13
6:14
6:15
7:16
7:17
7:18
7:19
8:20
8:21
8:22
8:23
9:24
9:25
9:26
9:27
9:28
10:29
10:30
10:31
10:32
10:33

اَرژنگ
شنبه 24 بهمن 1388, 17:10 عصر
از همه ممنون.
چرا چنین سوال هایی این قدر مسخره است؟
سوالها هیچ وقت مسخره نیستند، اینکه همه در مواردی همفکری نمیکنند را نباید به خود گرفت.

debugger
شنبه 24 بهمن 1388, 17:25 عصر
دوست عزیز تست کنید ببینید جواب استاد آرژنگ درست جواب میده ؟؟

اونوطوری که به نظر میاد درست جواب خواهد داد

moferferi
شنبه 24 بهمن 1388, 18:07 عصر
با تشكر از اقاي آر‍ژنگ.
بله راه حل اقاي ارژنگ درسته.و اون چيزيه كه من دنبالش بودم.
من تا با generic ها تا به حال كار نكردم.يه كم درك روش كارشون برام سخته.اگه لطف كنيد و توضيح بديد ممنون ميشم.

حالا دوستان اصل اينكه اين سوال را مطرح كردم اينه كه چند وقت پيش با يه نفر كه وي بي 6 كار ميكنه كل كل كردم.بعد اون گفت اگه خيلي برنامه نويسي اين مسئله را حل كن.من هم گفتم صد در صد ميتونم.اولش فكر نميكردم اين قدر سخت باشه .فكر ميكردم با يه حلقه for همه چي تمومه.اما وقتي اومدم پاي كامپيوتر كم اوردم.
در ضمن اون بهم گفت كه حل كردنش خيلي كار مهمي نيست.اين كه بتوني با تنها نوشتن 8 خط كد اين كارا بكني مهمه.چون خودش ميگه با فقط 8 خط كد نوشته.
در اصل تحليلش خيلي مهمه.
ايا اين مسئله راه حل هاي ديگه اي هم داره؟(البته با اجازه از اقاي ارژنگ ).

اَرژنگ
یک شنبه 25 بهمن 1388, 04:13 صبح
با تشکر از اقای آر‍ژنگ.
بله راه حل اقای ارژنگ درسته.و اون چیزیه که من دنبالش بودم.
من تا با generic ها تا به حال کار نکردم.یه کم درک روش کارشون برام سخته.اگه لطف کنید و توضیح بدید ممنون میشم.

حالا دوستان اصل اینکه این سوال را مطرح کردم اینه که چند وقت پیش با یه نفر که وی بی 6 کار میکنه کل کل کردم.بعد اون گفت اگه خیلی برنامه نویسی این مسئله را حل کن.من هم گفتم صد در صد میتونم.اولش فکر نمیکردم این قدر سخت باشه .فکر میکردم با یه حلقه for همه چی تمومه.اما وقتی اومدم پای کامپیوتر کم اوردم.
در ضمن اون بهم گفت که حل کردنش خیلی کار مهمی نیست.این که بتونی با تنها نوشتن 8 خط کد این کارا بکنی مهمه.چون خودش میگه با فقط 8 خط کد نوشته.
در اصل تحلیلش خیلی مهمه.
ایا این مسئله راه حل های دیگه ای هم داره؟(البته با اجازه از اقای ارژنگ ).


۰.آخرین مرحله نوشتن کد است، قبل از اینکه کد نویسی را شروع کرد اول با قلم و کاغد باید طراحی کرد، فقط وقتی که میدانید که چی طراحی کردید به پیاده کردنش میرسید وگرنه همینطوری نمیشه کد کرد.
اگرچه از روش بالابه‌پائین استفاده کنید به نظر میاد که به طراحی الزامی نیست ولی در واقعیت طراحی را با کد در یک زمان انجام میدید.
شما میتونستید همین را خودتان انجام بدید:
اول گفتید که هر عددی به تعداد عددی که جلوش نشان داده میشه تکرار میشه، ولی این قانون برایه ۱ و ۲ صادق نبود و اول میبایستی که ما ۱، ۲،۲ را داشته باشیم که جایی برایه شروع کردن عمل قانونی که گفته شد باشد.
اگر با یک چیزی مشکل دارید دلیل بر سخت بودنش نیست، شاید باید طرز نگاه را عوض کرد، من خواستم که آرایه‌ای که هیچ چی نداشت شروع کنم ولی طراحی جواب یکمقداری به نظر من بیخودی زیادی پیچیده میشد، دیدم که اگر آرایه شروع را از ۱،۲،۲ بگیرم خیلی راحتر میشه سوال را توضیح داد.
هر کی هر مسئله‌ای را با دید خودش میبینه، به جایه اینکه به جواب فکر کنید اول سوال را با دید خودتان درک کنید، وگرنه جوابهایه دیگران جواب شما نیست، جوابی است که با دید اونها برایشان معنی و مفهوم دارد.
توصیه من به شما این است که حالا که یک جواب برایه اینکار را دیدید، فراموششش کنید و جواب خودتان پیدا کنید، از جوابهایه دیگر به جایه پله و ایده برایه ساختن یک جواب بهتر (برایه خودتان) بهره‌گیری کنید.
هیچ کی از هیچ کی بهتر و یا بدتر نیست، هر کی زمانش را بزارد همه کار میتونه انجام بدهد، و در ضمن حل این مسئله به پیاده‌سازی برنامه‌هایه کاربری کمکی نمیکنه ولی به قابلیت رشد فکریتان کمک میکنه. از نظر بعضیها برنامه‌هایی که پول درمیارند بی‌معنی هستند ، از نظر بعضیها برنامه‌هایی که برایه تفریح و رشد فکری هستند بی‌معنی هستند، در حقیقت هیچ کدام از دیگری بهتر و یا بدتر نیست و این به نظر استفاده کننده است.
۱.استفاده از لیست ژنریک اینجا فقط برایه این بود که بهش اضافه کردن عضو راحت است، میشد همینکار را با آرایه هم پیاده کرد، اصلا به استفاده شدن و یا نشدن از لیست ژنریک در این موضوع توجه نکنید.
۲.کم خط نوشتن هنر نیست، اگر چه با دانستن اینکه از چه کلاسی به چه شکلی استفاده کرد مقدار کدی را باید پیاده سازی بشه کم میکنه ولی اگر همین رو میشد در ۵ خط نوشت باید پرسید که واضحیت کد از بین نره.
خوبه که کد جمع و جور باشد ولی نه در اضایه اینکه قابلیت درکش کمتر بشه، همیشه بین مقدار کد و واضحیت باید سعی بشه که بالانس ایجاد بشه.
همین کد را میشه کمترش کرد ولی به نظر من باید بیشتر بشه که توضیح کد خود همان کد باشد.
برایه تفریح قانون ساختن اعداد را یکمی تغییر بدید یا از آرایه‌ شروعی را عوض کنید و ببینید چی میشه، در برنامه‌نویس و یا هر کاری اینکه نمیشه A را انجام داد دلیل نمیشه که B را هم نشه انجام داد. اگر چیزی سخت است ببینید چطوری آسانش کنید.
برنامن‌نویس خوب هت لحظه را به تفکر در مورد برنامه‌نویس و مسائل مربوطه بهش میگزرانه، و وقتی که روشهایه جدید پیاد میکنه ازشان برایه بهبود کارهاش استفاده میکنه.
موفق باشید