نقل قول: تحلیل الگوریتم یه برنامه
سلام ، اگه واقعا الگوریتم مورد نظر یک الگوریتم جامع و درستی باشه ، میتونه جالب و کاربردی بشه !!!
باید الگوریتم رو با یک سری ورودی های خاص تست کرد و از صحت آن اطمینان حاصل کرد !!!
نقل قول: تحلیل الگوریتم یه برنامه
کسی تونست الگوریتمشو تحلیل کنه؟
من که هرچی فکر کردم نفهمیدم چرا باقی مانده سال بر28
حساب شد و بقیه کاراش...
البته یقینا این 28 ریشه در محاسبات تاریخ شمسی داره (که 28 سال یه بار چی میشه که باید باقی موندش رو تو محاسبات استفاده کرد.)
البته سوال های های زیر هم برام پیش اومد:
)1ایا تغییرات سال کبیسه ای هم تو الگوریتمش حساب شده؟(حدس من:من میگم تغییرات سال کبیسه تو الگوریتم کلیش رفع شده چون تو کد های برنامش از چرخه ای خاص برای محاسبه تغییرات کبیسه استفاده نشده.نظر شما چیه؟)
2)ایا خطاهای سال شمسی توش حساب شده؟
راستی بچه ها کی یه منبع کامل در مورد خود تاریخ شمسی سراغ داره که خطاها و ویژگی های خاص اون رو توضیح داده باشه؟
این برنامه رو که گفتم یه اقا پسر گل سوم دبیرستانی برای تحقیق(پایان نامش)نوشته .که ادرس وبلاگشو تو اخبار 20:30 گفت.
پس الگوریتمش نباید خطا داشته باشه.
دوستان هنوز من مشتاقانه منتظر تحلیل شما هستم.... :متفکر::متفکر:
نقل قول: تحلیل الگوریتم یه برنامه
سلام
1) معادل #C اين الگوريتم اين ميشه:
string [] sWeekDay = {"شنبه","يک شنبه","دوشنبه","سه شنبه","چهار شنبه","پنج شنبه","جمعه",};
try
{
string [] sNum = textBox1.Text.Split(new char [] {'/','\\'});
int y,m,d;
y = int.Parse(sNum[0]);
m = int.Parse(sNum[1]);
d = int.Parse(sNum[2]);
int l, f, s, q;
l = y % 28;
f = ((l / 4) + l + 1) % 7;
if(m<7)
s = ((((m - 1) * 31) + d) % 7) + f - 1;
else
s = ((((m - 7) * 30) + d + 4) % 7) + f - 1;
q = (s + 7) % 7;
MessageBox.Show(string.Format("Y = {0},M = {1}, D = {2}\n{3}",y,m,d,sWeekDay[q]));
}
catch (Exception exc)
{
MessageBox.Show(exc.Message + "\n Input Date like 1386/1/1 in textBox"
,"Error",MessageBoxButtons.OK,MessageBoxIcon.Error );
}
2) اين الگوريتم ايراد هايي هم داره.مثلا فقط در بازه 1300/1/1 تا 1399/12/30 بيشترين جواب هاي درست رو مي ده و مهمتر اينکه جواب غلط هم داره (مثلا 1355/1/1 رو شنبه اعلام مي کنه در حالي که يک شنبه است).
3) سالها قبل (4 يا 5 سال پيش) مقاله اي به قلم استاد مرحوم احمد بيرشک خوندم.اين مقاله اصلش فرانسه بود (چون استاد براي آکادمي نجوم فرانسه نوشته بودند) ولي به فارسي بگردونده شده بود.الان لينکش يادم نيست ولي اگر پيدا کردم،مي گذارم (مقاله کاملي که در مورد ايراد هايي که هر چند هزار سال - البته با ذکر عدد و رقم- مي افتد همچنين اين موضوع که الگوريتم مورد استفاده فعلي تا بيش از 2000 سال ديگر هم قطعا جواب درست مي دهدو خيلي مباحث شيرين ديگه،بود).
موفق باشيد
نقل قول: تحلیل الگوریتم یه برنامه
سلام
من كدهاي برنامه چندشنبه را نوشته ام
ممنون از اينكه ايراد موجود در برنامه را به من متذكر شديد
من به محض اطلاع از اين موضوع، آن را بررسي كردم و اشكال را رفع كردم
لطفا يك بار ديگر از وبلاگ من ديدن فرماييد و در صورت وجود اشكال من را باخبر سازيد
با سپاس فراوان
فرشيد
نقل قول: تحلیل الگوریتم یه برنامه
با تشکر از اقا فرشید.
من یه سوالایی دارم میشه جواب بدی؟
1)الگوریتمو توضیح بده(اگه دوست داری)
2)ایا خودت ابتکاری نوشتی یا فرمول ریاضی شو داشتی.
میگن ساله سومی هستی ؟راسته؟
در پایان ازت تشکر میکنم و بهت تبریک میگم چون الگوریتمشو به خیلی ها دادم نتونستن تحلیلش کنن .پس دمت گرم.:تشویق::تشویق:
اینم میل منه خوشحال میشم بام در ارتباط باشی.
farshadnassiri@gmail.com
نقل قول: تحلیل الگوریتم یه برنامه
SMRAH1 جان.
اگه لینکو بدی خیلی ممنونت میشم.
نقل قول: تحلیل الگوریتم یه برنامه
SMRAH1 جان اگه لینکو بدی ممنون میشم
نقل قول: تحلیل الگوریتم یه برنامه
سلام
تبريک ميگه.با خوده تقويم فارسي دات نت تست کردم.کاملا درست عمل مي کرد.کد تست اين بود:
class TestData
{
System.Globalization.Calendar calendar = new System.Globalization.PersianCalendar();
string[] DayName = new string[] { "شنبه", "يکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنج شنبه", "جمعه" };
public void Run()
{
int y, m, d,wd1,wd2;
for(y=1;y<4000;y++)
{
for(m=1;m<13;m++)
{
for(d=1;d<31;d++)
{
wd1 = WeekDayDotNet(y,m,d);
if(wd1!=-1)
{
wd2 = WeekDayNew(y,m,d);
if(wd1!=wd2)
Console.WriteLine("{0}/{1:D2}/{2:D2} Correct = {3} , Spript = {4}",
y,m,d,wd1,wd2);
}
}
}
}
}
protected int WeekDayDotNet(int y, int m, int d)
{
try
{
DateTime dt = new DateTime(y, m, d, calendar);
return ((int)calendar.GetDayOfWeek(dt) + 1) % 7;
}
catch (Exception e)
{
}
return -1;
}
protected int WeekDayNew(int y, int m, int d)
{
int l,n,z,g,f,s,q;
l = (y+10) % 231;
n = l / 33;
z = (7 - n) % 7;
g = l % 33;
if(g==32)
f = ((g / 4) - 2 + g + z) % 7;
else
f = ((g / 4) - 1 + g + z) % 7;
if(m<7)
s = ((((m - 1) * 31) + d) % 7) + f - 1;
else
s = ((((m - 7) * 30) + d + 4) % 7) + f - 1;
q = (s + 7) % 7;
return q;
}
}
در ضمن پيشنهاد ميکنه موارد زير رو بهش اضافه کنيد تا يک کلاس کارآمد شود و در تمام زيانهاي برنامه نويسي قابل استفاده گردد.
1) محاسبه فاصله تاريخ جاري (مثلا 87/7/29) تا 1/1/1 شمسي به تعداد روز (با توجه به برنامه بالا خيلي کار ندارد) و بلاعکس (تبديل تعداد روز گذشته از 1/1/1 به تاريخ جاري)
2) با استفاه از متد کار شده در قسمت اول ،محاسبه اختلاف و جمع دو تاريخ (هر دو تبديل به اختلاف به روز اول از 1/1/1 شد و مشخص مي شود).
3) تبديل تاريخ شمسي به ميلادي و بلاعکس (با استفاده از همان متد معرفي شذه در 1 واينکه 1/1/1 معادل 19 ژانويه 622 است ، البته اگر اشتباه نکرده باشم) و استفاده از يافتن تفاوت در تقويم ميلادي (که در همه زبانها موجود است).
درضمن دنبال اون مقاله (استاد بیرشک) روی نت گشتم،پیدا نکردمش.توی فایل های ذخیره شده قدیمی خودم هم نبود.با این حال اگر دیدمش،براتون لینک میدم.
موفق باشيد