PDA

View Full Version : سوال: يافتن ماكزيمم بين 5 عدد



علی خسروجردی
شنبه 04 خرداد 1387, 23:05 عصر
ببخشید چطوری میشه در برنامه ای که می نویسیم بفهمونیم که از بین 5 تا عددی که وارد میکنیم بزرگترین رو نمایش بده؟

Sajjad.Aghapour
شنبه 04 خرداد 1387, 23:32 عصر
دوست عزیز سلام....
این جور سوالها در حیطه الگوریتمه..........
اگه داخل آرایه ذخیره کرده باشین..........


int max = array[0];
for(int i=1; i<array.Length; i++)
{
if(array[i]>max)
max = array[i];
}

ali_habibi1384
یک شنبه 05 خرداد 1387, 05:52 صبح
عضویتتونو در این سایت تبریک می گم.
البته اگر اعدادتون رو از نوع اعشاری تعریف کرده باشید باید آریه و متغیر max رو از نوع float تعریف کنید.

ASKaffash
یک شنبه 05 خرداد 1387, 08:43 صبح
سلام
برایت یک متد قرار میدهم که باهرتا بزرگترین را باز میگرداند:


public static decimal MinNumbers(params object[] Number)
{
decimal RtnValue = Convert.ToDecimal(Number[0]);
for (int i = 1; i < Number.Length; i++)
if (RtnValue > Convert.ToDecimal(Number[i])) RtnValue = Convert.ToDecimal(Number[i]);
return RtnValue;
}



public static decimal MaxNumbers(params object[] Number)
{
decimal RtnValue = Convert.ToDecimal(Number[0]);
for (int i = 1; i < Number.Length; i++)
if (RtnValue < Convert.ToDecimal(Number[i])) RtnValue = Convert.ToDecimal(Number[i]);
return RtnValue;
}

agtabesh
دوشنبه 10 تیر 1387, 02:10 صبح
using System;
class program
{
int a,x;
a=Convert.ToInt32(Console.ReadLine());
for(int i=0;i<4;i++)
{
x=Convert.ToInt32(Console.ReadLine());
if(x>a)
{
a=x;
}
}
Console.WriteLine(a);
}

اَرژنگ
دوشنبه 10 تیر 1387, 09:15 صبح
using System;
class program
{
int a,x;
a=Convert.ToInt32(Console.ReadLine());
for(int i=0;i<4;i++)
{
x=Convert.ToInt32(Console.ReadLine());
if(x>a)
{
a=x;
}
}
Console.WriteLine(a);
}

با اینکه برانمه‌تان کاملا درست است ، بهتر است که به جایه یک برنامه که خیلی منحصر به فرده یک روش بهتر که برایه اینکار بیشتر به کار میاد پیدا کرد.

اَرژنگ
دوشنبه 10 تیر 1387, 09:46 صبح
دوست عزیز سلام....
این جور سوالها در حیطه الگوریتمه..........
اگه داخل آرایه ذخیره کرده باشین..........


int max = array[0];
for(int i=1; i<array.Length; i++)
{
if(array[i]>max)
max = array[i];
}

جواب شما از نظر الگریتمی درسته ولی اگر در داخل فریم ورک مضایایه لازم پیاده شده چرا آدم کار سخت کند؟



int[] integers = {3,6,2,1,5,67,4};
Array.Sort(integers);
int Min = integers[(integers.GetLowerBound(0))];
int Max = integers[(integers.GetUpperBound(0))];

اَرژنگ
دوشنبه 10 تیر 1387, 20:16 عصر
بارها شما بجای قرار دادن کد برای دوستان در بهترین شرایط از کد دیگران استفاده میکنید
این کد را که خودم نوشتم


int[] integers = {3,6,2,1,5,67,4};
Array.Sort(integers);
int Min = integers[(integers.GetLowerBound(0))];
int Max = integers[(integers.GetUpperBound(0))];
اگر میدانستم کسی دیگری کد بهتری دارد به کدشان ارجاع میکردم، در ثانی کد ، کد من و تو و کس دیگر ندارد، کد سطح پائین را باید اشکالش را گرفت، هر وقت هر کی از کد من اشکال گرفت ازش تشکرهم کردم و یک چیزی یاد گرفتم، اینجا جایه یاد گیریست، هر کی که جرعت دارد که به کدش اشکال بگیرند یاد میگرد و از ما هم بهتر پیشرفت میکند، هر کی هم که نمیخواهد از کدش بد بگند، از برنامه نویسی باید بیاد بیرون یک کاری پیدا کند که ازش فقط تعریف کنند.

اَرژنگ
سه شنبه 11 تیر 1387, 02:41 صبح
واقعا فکر می کنید این بحث ها لازمه ؟!!!!!

برایه پیشرفت و یاد گرفتن همیشه بحث لازمه، منتها اگر برنامه نویسی در مورد اینه که یکی یک چیزی را سرهم بیاره و به جایه اینکه از کد بهتر یاد بگیره و یا بخواهد یاد بده، البته که لازم نیست!

اگر این بحث لازم نیست به جاش پیشنهاد میدید چکار کنیم؟

ASKaffash
سه شنبه 11 تیر 1387, 11:45 صبح
این کد را که خودم نوشتم


,... int[] integers = {3.1,6,2,1000,5.23,67,4};
Array.Sort(integers);
int Min = integers[(integers.GetLowerBound(0))];
int Max = integers[(integers.GetUpperBound(0))];
اگر میدانستم کسی دیگری کد بهتری دارد به کدشان ارجاع میکردم، در ثانی کد ، کد من و تو و کس دیگر ندارد، کد سطح پائین را باید اشکالش را گرفت، هر وقت هر کی از کد من اشکال گرفت ازش تشکرهم کردم و یک چیزی یاد گرفتم، اینجا جایه یاد گیریست، هر کی که جرعت دارد که به کدش اشکال بگیرند یاد میگرد و از ما هم بهتر پیشرفت میکند، هر کی هم که نمیخواهد از کدش بد بگند، از برنامه نویسی باید بیاد بیرون یک کاری پیدا کند که ازش فقط تعریف کنند.

سلام
لطفا شما این کد را به یک متد بهینه با تعداد پارامتر ورودی متغیر تبدیل کنید تا اینقدر استاتیک نباشد وهمیشه بتوان از آن استفاده کرد بعد روی سورس شما بحث فنی کنیم.

اَرژنگ
سه شنبه 11 تیر 1387, 13:49 عصر
سلام
لطفا شما این کد را به یک متد بهینه با تعداد پارامتر ورودی متغیر تبدیل کنید تا اینقدر استاتیک نباشد وهمیشه بتوان از آن استفاده کرد بعد روی سورس شما بحث فنی کنیم.
حالا بالاخره جالب شد، "متد بهینه" یعنی چی؟

ASKaffash
سه شنبه 11 تیر 1387, 14:13 عصر
با سلام
یعنی اینکه شما درون متدتان میخواهید برای تعیین ماکزیمم حتما به روش Sort کرد آرایه متصول شوید ؟ آیا برای تعداد زیاد داده های عددی از نوع های متفاوت OverLoading را انتخاب میکنید ؟ آیا جنریک را انتخاب میکنید؟ در نهایت اینکه آیا کدی که شما خواهید نوشت با سریعترین روش ممکن اجرا میگردد ؟ و خیلی نکات فنی دیگر که بنظرم به کد نوشته شده شما نیز وابسته است . متشکر میشوم اگر متد مورد نظر را قرار دهید.

اَرژنگ
جمعه 14 تیر 1387, 04:45 صبح
با سلام
یعنی اینکه شما درون متدتان میخواهید برای تعیین ماکزیمم حتما به روش Sort کرد آرایه متصول شوید ؟ آیا برای تعداد زیاد داده های عددی از نوع های متفاوت OverLoading را انتخاب میکنید ؟ آیا جنریک را انتخاب میکنید؟ در نهایت اینکه آیا کدی که شما خواهید نوشت با سریعترین روش ممکن اجرا میگردد ؟ و خیلی نکات فنی دیگر که بنظرم به کد نوشته شده شما نیز وابسته است . متشکر میشوم اگر متد مورد نظر را قرار دهید.
با سلام.
از شما برایه اینکه با سوالات محشرتان من وادار به تفکر کردید تشکر میکنم :)
بعد از کلی تفکر در مورد اینکه یک متد قابلیت ارضا کردن این شرایط را دارد و یا نه و بنا بر اصول برنامه نویسی به یک جواب رسیدم که خوشحال میشم مورد تحلیل و انتقاد قرار داده بشد:

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

سوال بعدی:
آیا برای تعداد زیاد داده های عددی از نوع های متفاوت OverLoading را انتخاب میکنید ؟
OverLoading را فقط برایه داشتن یک پلیمرفیک اینترفیس انتخواب میکنیم ولی به شرطی که یک کلاس اختصاصی کارش این باشد که در آرایه ها مختلف ماکزیمم را پیدا کند. ولی اینکار یکمی با اصول شئیگرائی نمیخواند. دلیلش هم این است که اگر با داتا استراکچر بخصوص برایه اینکار استفاده میکنیم انتظار خواهیم داست که خود استراکچر دارایه یک متد ماکزیمم که ماکزیمم را برمیگرداند باشد. ولی ماکزیمم باید از همان جنس عددهایه داخلی باشد، مثلا وقتی که همه اینتیجر هستند برگرداندن یک دسیمال درست نیست (این یکمقداری به سوال بعدی هم ربط‌دارد).

و سوال بعدی:
آیا جنریک را انتخاب میکنید؟
مهمترین قسمت در برنامه نویسی، سفت کد کردن نیست، بلکه داشتن قابلیت عوض کردن کدهای داخلی یک کلاس بدانه احتیاج به عوض کردنروشی که کدهایه دیگر ازش استفاده میکنند. اگر از جنریک استفاده کنیم و یا نکنیم این به شکل داخلی است. و دلیل استفاده کردن و یا نکردن جنریک دوباره به ابعاد مشکلی که داریم حل میکنیم دارد. در موردهایه معمولی که معمولا برنامه نویسها استفاده میکنند بله (برایه قشنگی کد) ولی در موارد اختصاصی از روشهایه دیگر که بر مقدار حافظه ، پروسسرها و اینکه متد چه مقدار صدا زده میشه و چه عوارض جانبی ایجاد میکند دارد.

در نهایت اینکه آیا کدی که شما خواهید نوشت با سریعترین روش ممکن اجرا میگردد ؟
آها! سریعترین وجود ندارد! سریعترینها وجود دارند. بستگی به محیطی که استفاده میشه همه چی ممکن است. مثلا کدی که برایه ۱۰۰ تا کلاینت خوب و سریِ اجرا میشد دلیل ندارد که برایه ۱۰۰۰۰ کلاینت بهترین باشد و برعکس. اگر در الگریتم نویسی به روشهای سورت نگاه انداخته باشیم میبینیم که بعضی از سورتها در شرائط مختلف از همدیگر بهترند و یک یک سورت که در همه لحاظ سریِ باشد وجود ندارد. حالا من نمیگم جواب این سوال مطمعنا به سورت ربط‌ دارد ولی میخواهم این را برسانم که در ساده ترین شکل یک جواب کلی وجود ندارد.

حالا بعد از تمام این حرفها من فقط این مسعله را از لحاض الگریتمی و کلی بازرسی کردیم.
اینجا تالار سی شارپ هستش و معمولا برنامه نویسیهایی که اینجا میپلکند با چیزهایه ساده سرو کار دارند و بهترین در این تالار معمولا مربوط به شکل نوشتن کد در سی شارپ است.
شکل نوشتن کد در این سطح با شکل نوشتن کد در سطح الگریتمی با هم هیچ ارتباطی نداردند. برایه همین کسانی که الگریتم مینویسند را ما تو یک اتاق تاریک قایم میکنیم و فقط ازشان یک متد که جواب برمیگرداند میخواهیم !

بنابر پاراگراف بالا، تمام جوابهایی که به سوال "يافتن ماكزيمم بين 5 عدد" (از جمله جواب من)
داده شد اشتباهند. اصلا نوع جواب به نوشتن چند کد خط نیست بلکه به طراحی ساده‌ترین برنامه در سی شارپ درست نیست.

جوابهایه درستی (که در این تالار) به این سوال میشد داد باید حداقل این خصوصیات را داشته باشند:
۱. استفاده از مفاهیم درست شئیگرائی در سی شارپ:
همینطوری چند خط‌کد هر جا که دستمان رسید بچاپنیم درست نیست، اگر در چند جا قرار است که ماکزیمم یک آرایه اینت را پیدا کنند، اشکال همینطوری کد ریختن خوب معلوم است.

۲.اگر یافتن ماکزیم به منطق برنامه ربط‌دارد، دوباره همینطوری نمیشه در هر جا کد ریخت. برنامه نویسی دیسیپلین و انضباط دارد، کمینطوری کد سرهم کردن در ظاهر ممکند که کار کند، ولی در شان یک برنامه نویس نیست.

۳. استفاده از خصوصیات سی شارپ برایه جواب به سوال در حالتی که شرائط ۱ و ۲ که بالا بهشان اشاره شد ارضا شده باشند. در این حالت چند جواب وجود دارند
۳.۱ - اگر این کمبودی است که به []int ربط دارد، از extension methods در دات نت ۳.۵ استفاده کنند.

۳.۲- اگر این مربوط منطق خود برنامه‌شان است از لیستهایه جنریک که بیزینس ابجکتها را نگهداری میکنند استفاده کنند و یک متد ماکزیمم درش تعریف کنند.

۳.۳ - اگر قرار است که در یک سری برنامه‌هایه مختلف استفاده بشد، از اینترفیس استفاده کنند، قبل از پیاده کردن یک الگریتم و یا یک روش بخصوص ،طراحی درست برنامه مهم است.

روشهایه دیگر هم وجود دارند ولی فعلا این ۳ روش را برایه داشته باشیم تا نوبت بقیه برسد.
در مورد فرستادن متد مورد نظر: به جایه یک متد که همینطوری بشد ریختش در کد بهتر است که به ۳.۱ ، ۳.۲ ، ۳.۳ نگاه انداخته بشد،ولی هر ۳ تا روش به انداز‌ه‌ای معمولی هستند که هر برنامه‌نویسی باید بتواند برایه تمرین بنوستشان.

mohammad272005
جمعه 14 تیر 1387, 05:02 صبح
چه قدر جالبه. به تعداد انسانها راه هست براي انجام اين كار. منم راه خودمو دارم. البته C# 3.0:

int[] /* */ array = new int[] { 5, 10, 7, 8, 11 };
int max = array.Max();

اَرژنگ
جمعه 14 تیر 1387, 05:05 صبح
چه قدر جالبه. به تعداد انسانها راه هست براي انجام اين كار. منم راه خودمو دارم. البته C# 3.0:

int[] /* */ array = newint[] { 5, 10, 7, 8, 11 };
int max = array.Max();


یک نیم اسپیسی را باید به این اضافکه کنیم؟ :چشمک:
یا اینکه دارید از اکستژن متدهایه خودتان استفاده میکنید؟

mohammad272005
جمعه 14 تیر 1387, 05:10 صبح
اينم C# 1.1 (كه من خوشم نمياد):

private static object GetMax(Array array)
{
IComparable max = (IComparable)array.GetValue(0);
foreach (IComparable item in array)
if (max.CompareTo(item) < 0)
max = item;
return max;
}

mohammad272005
جمعه 14 تیر 1387, 05:12 صبح
اينم C# 2.0 كه بد نيست:
private static T GetMax<T>(T[] array)
where T : IComparable
{
T max = array[0];
foreach (T item in array)
if (max.CompareTo(item) < 0)
max = item;
return max;
}

mohammad272005
جمعه 14 تیر 1387, 05:16 صبح
یک نیم اسپیسی را باید به این اضافکه کنیم؟ :چشمک:
یا اینکه دارید از اکستژن متدهایه خودتان استفاده میکنید؟
عرض كردم خدمتون اين C# 3.0 هست و System.Linq بصورت پيش فرض use شده.

اَرژنگ
جمعه 14 تیر 1387, 14:35 عصر
عرض كردم خدمتون اين C# 3.0 هست و System.Linq بصورت پيش فرض use شده.
یعنی اینکه در دات نت ۳.۰ احتیاجی به اضافه کردن این خط :

using System.Linq;نیست؟
در ضمن کدی که فرستادید در ۳.۵ هم کار میکند.

mohammad272005
شنبه 15 تیر 1387, 14:48 عصر
یعنی اینکه در دات نت ۳.۰ احتیاجی به اضافه کردن این خط :

کد:


using System.Linq;
نیست؟خير دوست من. بصورت پيش‏فرض وجود داره. (لااقل در مورد كدهايي كه من نوشتم بوده).

در ضمن کدی که فرستادید در ۳.۵ هم کار میکند.اين نسجه NET. هست كه 3 و 3.5 هست. در مورد هردو نشخه #C همون 3 هست.

azadcom
چهارشنبه 15 مهر 1388, 23:22 عصر
یه برنامه خیلی خیلی ساده میخوام که با سوکت در vb نوشته شده باشه