نمایش نتایج 1 تا 9 از 9

نام تاپیک: تحلیل الگوریتم یه برنامه

  1. #1
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    پست
    11

    Question تحلیل الگوریتم یه برنامه

    سلام بچه ها .
    برنامه زیر طوری عمل میکنه که با گرفتن سال و ماه و روز مورد نظر(شمسی)میگه که اون تاریخ چند شنبه است.البته برنامه به زبن ویبی اسکریپته ولی برای من مهم اینه که الگوریتم و نحوه کلی ان را بفهمم. لطفا اگه سر در اوردید ازش به ما هم بگید چه جوری کار میکنه.با تشکر.
    کد HTML:
    <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
    آخرین ویرایش به وسیله 'برنامه نویس' : جمعه 26 مهر 1387 در 09:52 صبح دلیل: تکمیل موضوع

  2. #2

    نقل قول: تحلیل الگوریتم یه برنامه

    سلام ، اگه واقعا الگوریتم مورد نظر یک الگوریتم جامع و درستی باشه ، میتونه جالب و کاربردی بشه !!!

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

  3. #3
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    پست
    11

    نقل قول: تحلیل الگوریتم یه برنامه

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

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

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

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

  4. #4
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884

    نقل قول: تحلیل الگوریتم یه برنامه

    سلام

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

    موفق باشيد

  5. #5

    نقل قول: تحلیل الگوریتم یه برنامه

    سلام
    من كدهاي برنامه چندشنبه را نوشته ام
    ممنون از اينكه ايراد موجود در برنامه را به من متذكر شديد
    من به محض اطلاع از اين موضوع، آن را بررسي كردم و اشكال را رفع كردم
    لطفا يك بار ديگر از وبلاگ من ديدن فرماييد و در صورت وجود اشكال من را باخبر سازيد
    با سپاس فراوان
    فرشيد

  6. #6
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    پست
    11

    نقل قول: تحلیل الگوریتم یه برنامه

    با تشکر از اقا فرشید.
    من یه سوالایی دارم میشه جواب بدی؟
    1)الگوریتمو توضیح بده(اگه دوست داری)
    2)ایا خودت ابتکاری نوشتی یا فرمول ریاضی شو داشتی.
    میگن ساله سومی هستی ؟راسته؟
    در پایان ازت تشکر میکنم و بهت تبریک میگم چون الگوریتمشو به خیلی ها دادم نتونستن تحلیلش کنن .پس دمت گرم.
    اینم میل منه خوشحال میشم بام در ارتباط باشی.
    farshadnassiri@gmail.com

  7. #7
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    پست
    11

    نقل قول: تحلیل الگوریتم یه برنامه

    SMRAH1 جان.
    اگه لینکو بدی خیلی ممنونت میشم.

  8. #8
    کاربر جدید
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    پست
    11

    نقل قول: تحلیل الگوریتم یه برنامه

    SMRAH1 جان اگه لینکو بدی ممنون میشم

  9. #9
    کاربر دائمی آواتار SMRAH1
    تاریخ عضویت
    مرداد 1386
    محل زندگی
    مشهد
    پست
    884

    نقل قول: تحلیل الگوریتم یه برنامه

    سلام

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

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

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


    موفق باشيد

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •