PDA

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



'برنامه نویس'
جمعه 26 مهر 1387, 09:50 صبح
سلام بچه ها .
برنامه زیر طوری عمل میکنه که با گرفتن سال و ماه و روز مورد نظر(شمسی)میگه که اون تاریخ چند شنبه است.البته برنامه به زبن ویبی اسکریپته ولی برای من مهم اینه که الگوریتم و نحوه کلی ان را بفهمم. لطفا اگه سر در اوردید ازش به ما هم بگید چه جوری کار میکنه.با تشکر.


<SCRIPT language=vbscript id=clientEventHandlersVBS>
<!--

Sub Button1_onclick
y=text1.value
m=text2.value
d=text3.value
l = y Mod 28
f = ((l \ 4) + l + 1) Mod 7
If m<7 Then
s = ((((m - 1) * 31) + d) Mod 7) + f - 1
Else
s = ((((m - 7) * 30) + d + 4) Mod 7) + f - 1
End If
q = (s + 7) Mod 7
if q=0 then
MsgBox "شنبه"
end if
if q=1 then
MsgBox "يك شنبه"
end if
if q=2 then
MsgBox "دو شنبه"
end if
if q=3 then
MsgBox "سه شنبه"
end if
if q=4 then
MsgBox "چهار شنبه"
end if
if q=5 then
MsgBox "پنج شنبه"
end if
if q=6 then
MsgBox "جمعه"
end if
End Sub

-->
</SCRIPT>

اینم وبلاگه اون اقاست:
http://chandshanbeh.blogfa.com

Salar Ashgi
جمعه 26 مهر 1387, 10:55 صبح
سلام ، اگه واقعا الگوریتم مورد نظر یک الگوریتم جامع و درستی باشه ، میتونه جالب و کاربردی بشه !!!

باید الگوریتم رو با یک سری ورودی های خاص تست کرد و از صحت آن اطمینان حاصل کرد !!!

'برنامه نویس'
جمعه 26 مهر 1387, 11:18 صبح
کسی تونست الگوریتمشو تحلیل کنه؟
من که هرچی فکر کردم نفهمیدم چرا باقی مانده سال بر28
حساب شد و بقیه کاراش...
البته یقینا این 28 ریشه در محاسبات تاریخ شمسی داره (که 28 سال یه بار چی میشه که باید باقی موندش رو تو محاسبات استفاده کرد.)
البته سوال های های زیر هم برام پیش اومد:
)1ایا تغییرات سال کبیسه ای هم تو الگوریتمش حساب شده؟(حدس من:من میگم تغییرات سال کبیسه تو الگوریتم کلیش رفع شده چون تو کد های برنامش از چرخه ای خاص برای محاسبه تغییرات کبیسه استفاده نشده.نظر شما چیه؟)
2)ایا خطاهای سال شمسی توش حساب شده؟

راستی بچه ها کی یه منبع کامل در مورد خود تاریخ شمسی سراغ داره که خطاها و ویژگی های خاص اون رو توضیح داده باشه؟

این برنامه رو که گفتم یه اقا پسر گل سوم دبیرستانی برای تحقیق(پایان نامش)نوشته .که ادرس وبلاگشو تو اخبار 20:30 گفت.
پس الگوریتمش نباید خطا داشته باشه.

دوستان هنوز من مشتاقانه منتظر تحلیل شما هستم.... :متفکر::متفکر:

SMRAH1
جمعه 26 مهر 1387, 21:13 عصر
سلام

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 سال ديگر هم قطعا جواب درست مي دهدو خيلي مباحث شيرين ديگه،بود).

موفق باشيد

farshidelf
یک شنبه 28 مهر 1387, 21:06 عصر
سلام
من كدهاي برنامه چندشنبه را نوشته ام
ممنون از اينكه ايراد موجود در برنامه را به من متذكر شديد
من به محض اطلاع از اين موضوع، آن را بررسي كردم و اشكال را رفع كردم
لطفا يك بار ديگر از وبلاگ من ديدن فرماييد و در صورت وجود اشكال من را باخبر سازيد
با سپاس فراوان
فرشيد

'برنامه نویس'
یک شنبه 28 مهر 1387, 21:36 عصر
با تشکر از اقا فرشید.
من یه سوالایی دارم میشه جواب بدی؟
1)الگوریتمو توضیح بده(اگه دوست داری)
2)ایا خودت ابتکاری نوشتی یا فرمول ریاضی شو داشتی.
میگن ساله سومی هستی ؟راسته؟
در پایان ازت تشکر میکنم و بهت تبریک میگم چون الگوریتمشو به خیلی ها دادم نتونستن تحلیلش کنن .پس دمت گرم.:تشویق::تشویق:
اینم میل منه خوشحال میشم بام در ارتباط باشی.
farshadnassiri@gmail.com

'برنامه نویس'
یک شنبه 28 مهر 1387, 21:39 عصر
SMRAH1 (http://barnamenevis.org/forum/member.php?u=44567) جان.
اگه لینکو بدی خیلی ممنونت میشم.

'برنامه نویس'
یک شنبه 28 مهر 1387, 21:39 عصر
SMRAH1 (http://barnamenevis.org/forum/member.php?u=44567) جان اگه لینکو بدی ممنون میشم

SMRAH1
دوشنبه 29 مهر 1387, 11:11 صبح
سلام

تبريک ميگه.با خوده تقويم فارسي دات نت تست کردم.کاملا درست عمل مي کرد.کد تست اين بود:


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 است ، البته اگر اشتباه نکرده باشم) و استفاده از يافتن تفاوت در تقويم ميلادي (که در همه زبانها موجود است).

درضمن دنبال اون مقاله (استاد بیرشک) روی نت گشتم،پیدا نکردمش.توی فایل های ذخیره شده قدیمی خودم هم نبود.با این حال اگر دیدمش،براتون لینک میدم.


موفق باشيد