PDA

View Full Version : سوال: محاسبه میانگین چند تاریخ



ali reza mansoori 2
سه شنبه 01 آذر 1390, 10:00 صبح
سلام دوستان
چند تا تاریخ داخل لیست باکس اضافه کردم حالا میخوام با زدن یک دکمه میانگین این تاریخ ها محاسبه بشه
فرمت تاریخ ها به این شکل هستش 1390/08/29

linux
سه شنبه 01 آذر 1390, 11:25 صبح
لطف کنید میانگین گرفتن از تاریخ ها را شرح دهید والگوریتمش را بگویید.

ali reza mansoori 2
سه شنبه 01 آذر 1390, 15:27 عصر
من خودم دقیقا نمیدونم با چه الگوریتمی این کار رو میشه انجام داد اصلا من فکر میکردم این کار نشدنیه ولی داخل اکسل توسط تابع AVERAGE و چند تاریخ میلادی انجام دادم
حالا میخوام داخل سی شارپ و با تاریخ های شمسی این کار رو انجام بدم

Mahmoud Zaad
سه شنبه 01 آذر 1390, 15:38 عصر
سلام
به نظر من شما باید با استفاده از متد ToCharArray() یا Replace() کاراکتر / رو بیرون بکشید بعد میانگین اعداد به دست اومده رو حساب کنید. بعد دوباره فرمت رو به صورت تاریخ دربیارید فکر کنم از ToCharArray() استفاده کنی بهتره.

Himalaya
سه شنبه 01 آذر 1390, 17:33 عصر
سلام

من فکر میکردم این کار نشدنیه ولی داخل اکسل توسط تابع AVERAGE و چند تاریخ میلادی انجام دادم
حالا میخوام داخل سی شارپ و با تاریخ های شمسی این کار رو انجام بدم

اکسل تاریخ و زمان رو به صورت عدد میشناسه. عدد 1 معادل 1 ژانویه 1900 و عدد 2958465 معادل 31 دسامبر 9999
از قسمت اعشار هم برای ساعت استفاده میکنه. مثلا 0.589618 معادل ساعت 14:09:03 هستش. این اعشار چطوری بدت میاد؟ ساعت رو تبدیل به ثانیه کنید و اون رو تقسیم بر 24 * 3600 کنید
اما تو C# واسه بدست آوردن میانگین


private void btnComputeAverage_Click(object sender, EventArgs e)
{
var dates = new List<DateTime>
{
new DateTime(2008, 5, 20, 11, 49, 0),
new DateTime(2008, 5, 15, 11, 17, 0),
new DateTime(2008, 5, 10, 10, 36, 0)
};

var total = dates.Sum(dateTime => dateTime.Ticks);
var medium = new DateTime(total/dates.Count);
MessageBox.Show(medium.ToShortDateString());
}

ali reza mansoori 2
سه شنبه 01 آذر 1390, 20:12 عصر
خیلی ممنون از همه دوستان
جناب karaji333 واقعا نمیدونم چه جوری تشکر کنم اگر امکان داره درباره توابعی که استفاده کردید کمی توضیح بدید

linux
سه شنبه 01 آذر 1390, 20:44 عصر
سلام


اکسل تاریخ و زمان رو به صورت عدد میشناسه. عدد 1 معادل 1 ژانویه 1900 و عدد 2958465 معادل 31 دسامبر 9999
از قسمت اعشار هم برای ساعت استفاده میکنه. مثلا 0.589618 معادل ساعت 14:09:03 هستش. این اعشار چطوری بدت میاد؟ ساعت رو تبدیل به ثانیه کنید و اون رو تقسیم بر 24 * 3600 کنید
اما تو C# واسه بدست آوردن میانگین


private void btnComputeAverage_Click(object sender, EventArgs e)
{
var dates = new List<DateTime>
{
new DateTime(2008, 5, 20, 11, 49, 0),
new DateTime(2008, 5, 15, 11, 17, 0),
new DateTime(2008, 5, 10, 10, 36, 0)
};

var total = dates.Sum(dateTime => dateTime.Ticks);
var medium = new DateTime(total/dates.Count);
MessageBox.Show(medium.ToShortDateString());
}
خیلی از مقادیر را می شود به عدد تبدیل کرد و متوسط حساب کرد ولی مگر هر متوسط گرفتنی معنی هم دارد؟ برای مثال همین شماره تلفن، فرض کنید 10 تا شماره تلفن داشته باشید، متوسط شماره تلفن ها چه کاربردی می تواند داشته باشد؟ من برام جالب هست که بدانم کجا متوسط گرفتن از تاریخ ها کاربرد دارد؟

Himalaya
سه شنبه 01 آذر 1390, 22:01 عصر
سلام

خیلی از مقادیر را می شود به عدد تبدیل کرد و متوسط حساب کرد ولی مگر هر متوسط گرفتنی معنی هم دارد؟سوال در مورد این نبود که این کار معنی داره یا نه.

محاسبه میانگین چند تاریخ
این که این کار چه معنی میده رو باید دوستمون که پرسیدن، جواب بدن

من فکر میکردم این کار نشدنیه ولی داخل اکسل توسط تابع AVERAGE و چند تاریخ میلادی انجام دادم
حالا میخوام داخل سی شارپ و با تاریخ های شمسی این کار رو انجام بدم

system32
سه شنبه 01 آذر 1390, 22:39 عصر
static void Main(string[] args)
{
//Initializes new List of DataTime Object.
List<DateTime> dates = new List<DateTime>();
//Fills the List of DateTime Object.
for (int i = 0; i < 5; i++)
{
dates.Add(DateTime.Now); //Adds new DataTime Object in the list of DateTime Object.
Thread.Sleep(1000);//stop filling dates for one second
}
//Prints the List of DataTime Object.
for (int i = 0; i < 5; i++)
{
Console.WriteLine(dates[i]);
}
//Calls the method to get the average DataTime Object.
GetAverageDateTime(dates);
}
static void GetAverageDateTime(List<DateTime> dates)
{
//Total number of Ticks
long totalTicks = 0;
//Average number of Ticks
long averageTicks = 0;
//Gets the total of the List of DateTime Object Ticks.
for (int i = 0; i < dates.Count; i++)
{
totalTicks += dates[i].Ticks;
}
//Gets the average of Ticks (Average is the total divided by the number :))
averageTicks = totalTicks / dates.Count;
//Initializes new DateTime Object by the AverageTick object.
DateTime averageDate = new DateTime(averageTicks);
//Prints it to the user
Console.WriteLine(string.Format("Average date {0}", averageDate));




راه حل دوم

private static DateTime AverageDateTime(params DateTime[] dateTimes)
{
long[] lngTicks = new long[dateTimes.Length];
long lngTotal = 0;

// Convert all DateTimes to ticks
for (int i = 0; i < dateTimes.Length; i++)
{
lngTicks[i] = dateTimes[i].Ticks;
lngTotal += lngTicks[i];
}

// Return the average as a DateTime
return new DateTime(lngTotal / lngTicks.Length);
}

ali reza mansoori 2
چهارشنبه 02 آذر 1390, 11:50 صبح
این که این کار چه معنی میده رو باید دوستمون که پرسیدن، جواب بدن
اشخاصی هستند که در تاریخ های مختلف مبالغ مختلفی رو پرداخت کردن حالا طرف گفته که میخوام این اشخاص رو به صورت صعودی بر اساس کل مبلغ دریافتی و تاریخ ها مرتب و امتیاز بندی کنم
من فکری که به ذهنم رسید اینه که تاریخ های پرداختی یک شخص رو میانگین بگیرم و مبالغ پرداختی ها رو جمع بزنم و اینها رو داخل دو ستون در جدول اضافه کنم و مرتبشون کنم
اگر فکر دیگه ای به ذهنتون میرسه ذکر کنید و بگید اصلا این کار من جواب میده و محاسبات درست هستش؟

Himalaya
چهارشنبه 02 آذر 1390, 15:59 عصر
سلام

اشخاصی هستند که در تاریخ های مختلف مبالغ مختلفی رو پرداخت کردن حالا طرف گفته که میخوام این اشخاص رو به صورت صعودی بر اساس کل مبلغ دریافتی و تاریخ ها مرتب و امتیاز بندی کنم
این چیزی که میخواید اصلا ربطی به میانگین تاریخ نداره. (هر شخصی 1 کل مبلغ پرداختی داره. حالا شما نمیتونید بگید که این مبلغ رو تو میانگین 5 تا تاریخ پرداخت کرده) با یه گروه بندی ساده و محاسبه جمع کل برای هر گروه (استفاده از تابع sum) و مرتب کردن نتیجه و نمایش اون تو گرید میتونید به این هدف برسید.
لازم نیست اون چیزی که به ذهنتون رسیده رو پیاده کنید :چشمک:
جوابی که تو پست 5 دادم، صرفا به خاطر تیتر سوال بود.

ali reza mansoori 2
چهارشنبه 02 آذر 1390, 18:21 عصر
دوست عزیز متوجه منظورتون نشدم اگر امکان داره کمی بیشتر توضیح بدید
من چند نمونه از رکورد های بانک رو می نویسم شاید به درک و حل مسئله بدرد بخوره
A-----100000-----1390/01/01
A-----200000-----1390/02/01
A-----300000-----1390/03/01
B-----100000-----1390/01/01
B-----200000-----1390/02/01
B-----100000-----1390/03/01
B-----200000-----1390/04/01
به رکورد های بالا دقت کنید آقای A بین 3 ماه 500000 تومان پرداخت کردن و آقای B بین 4 ماه 600000 تومان پرداخت کردن این دو نفر رو بر اساس تاریخ واریز مبلغ ها و کل مبلغ هاشون چه جوری مرتب کنم البته تعداد رکورد ها خیلی بالاست و موارد میگه هم داره مثلا طرف کل پول رو یکجا داده یا کل مبلغ رو تو 3 ماه داده یا .....

Himalaya
چهارشنبه 02 آذر 1390, 19:55 عصر
سوالت رو تو بخش sql مطرح کن