# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > الگوریتم، کامپایلر، هوش مصنوعی و ساختمان داده ها >  کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟

## فارسی ساز

با عرض سلام خدمت همه برنامه نویس ها
آیا کسی الگوریتم تبدیل تاریخ (میلادی به شمسی)  یا (قمری به شمسی) را دارد ؟
اگر هم سورس برنامه ای دارید خواهش می کنم همراه با توضیح باشد .

با تشکر

----------


## Kambiz

اگر متن پاسکال به دردت می‌خوره این متن زیر رایگان هست.
http://delphiarea.com/products/misc/solar.zip

----------


## shaniaki

با عرض ادب:
در قسمت جاوا همین سایت هم نسخه جاوای این تبدیل موجود است.

یه عشق برنامه نویسی خفن

----------


## ناصرقلی

سلام رفقا
قابل توجه تمام کسانی که می خواهند مبدل تاریخ درست و حسابی بنویسند (یعنی تبدیل تاریخ کامل نه برای 10 و 15 سال)
1.طبق قانون هیچ روش معینی برای محاسبه کبیسه ها در تقویم جلالی وجود ندارد!
2.طبق نظر علمای گاهشماری ایران حد اقل سه روش برای گاهشماری جلالی وجود دارد
     روش آقای ایرج ملکپور
     روش استاد دکتر بیرجندی 
    روش استفاده از طول متوسط سال
خوب متاسفانه روش آقای ملکپور مبتنی بر رصد است !
روش دکتر بیرجندی بسیار نزدیک به روش سوم است ولی با کمی اختلاف در کبیسه های پنج ساله
روش استفاده از طول سال متوسط هم که قابل استفاده در برنامه سازی است توسط نویسنده کتاب "گاهشماری ایرانی"(اکرمی، موسی) پیشنهاد شده که نمونه پیاده سازی آن در بخش جاوا وجود دارد.
نکته مهم اینست که این سه روش نتایج متفاوتی را ایجاد می کنند در نتیجه هیچ برنامه نویسی نمی تواند ادعا کند که مبدل درستی نوشته چون اصولا بر طبق ملاک قانونی هیچ روش قابل محاسبه ای تعیین نشده است.

----------


## NiLoOfAr

با پوزش فراوان بابت تاخیر در ارسال :oops: 

Public Function FDate&#40; &#41; As Long
   On Error Resume Next
   Dim YearEqual&#40;2,2&#41; As Integer 
   Dim AddOneDay As Boolean
   Dim AddFarDay As Boolean
   Dim AddToDays As Byte,FarDay As Byte
   Dim ThisDay As Byte
   Dim ThisMonth As Byte
   Dim ThisYear As Integer
   Dim YearDif1 As Integer , YearDif2 As Integer
   Dim TestRange1 As Integer , TestRange2 As Integer
   Dim p As Integer 
   Dim CurM As String , CurD As String 
   Dim sYear As As Variant , sMonth As Variant , sDay As Variant
   Rem --------
   YearEqual&#40;1,1&#41; = 1997
   YearEqual&#40;1,2&#41; = 1998
   YearEqual&#40;2,1&#41; = 1376
   YearEqual&#40;2,2&#41; = 1377
   ThisDay = Day&#40;Date&#41;
   ThisMonth = Month&#40;Date&#41;
   ThisYear = Year&#40;Date&#41;
   YearDif1 = ThisYear - 1997
   YearDif2 = ThisYear - 1998 
   TestRange1 = 1996 - &#40;100 * 4&#41;
   TestRange2 = 1996 + &#40;100 * 4&#41;
   FarsiRange1 = 1375 - &#40;100 * 4&#41;
   FarsiRange2 = 1375 + &#40;100 * 4&#41;
   AddOneDay = False 
   Rem -----------
   For p = TestRange1 To TestRange2 Step 4
      If ThisYear = p Then
          AddOneDay = True
          Exit For
      End If
   Next
      If AddOneDay Then AddToDays = 1 Else 
   AddToDays = 0 
   Rem ------------
      If &#40;&#40;ThisMonth = 3 And ThisDay &lt; 20 + AddToDays&#41; Or &#40;ThisMonth &lt; 3&#41;&#41; Then 
      YearDif1 = YearDif1 - 1
      End If 
   Rem ------------
      If &#40;ThisYear Mod 2 &lt;> 0 And &#40;&#40;ThisMonth = 3 And ThisDay > &#40;20 - AddToDays&#41;&#41; Or         &#40;ThisMonth > 4&#41;&#41;&#41; Then      
       CurrentYear = YearEqual&#40;2,1&#41; + YearDif1
      Else
       CurrentYear = YearEqual&#40;2,1&#41; + YearDif2
       For p = FarsiRange1 To FarsiRange2 Step 4
          If CurrentYear = p Then AddFarDay = True &#58; 
       Exit For 
          Next p
          If AddFarDay Then FarDay = 1 Else FarDay = 0 
            If &#40;&#40; ThisMonth = 3 And ThisDay > 20 - &#40;AddToDays&#41; + FarDay&#41; Or ThisMonth > 3&#41;          
             Then CurrentYear = CurrentYear + 1
            End If
         End If
         If AddToDays = 1 Then FarDay = 0
   Rem ------------
         Select Case ThisMonth 
            Case 1
                If ThisDay &lt; &#40;21 - FarDay&#41; Then 
                   CurrentMonth = 10 
                   CurrentDay = &#40;ThisDay + 10&#41; + FarDay 
                Else
                   CurrentMonth = 11
                   CurrentDay = &#40;ThisDay - 20&#41; + FarDay
                End If
            Case 2
                If ThisDay &lt; &#40;20 - FarDay&#41; Then 
                    CurrentMonth = 11 
                    CurrentDay = &#40;ThisDay + 11&#41; FarDay
                Else 
                    CurrentMonth = 12 
                    CurrentDay = &#40;ThisDay - 19&#41; + FarDay 
                End If
            Case 3
                If ThisDay &lt; &#40;21 - AddToDays&#41; Then 
                    CurrentMonth = 12
                    CurrentDay = &#40;ThisDay + 9&#41; + AddToDays + FarDay
                Else 
                     CurrentMobth = 1
                     CurrentDay = &#40;ThisDay - 20&#41; + AddToDays 
                 End If           
            Case 4 
                If ThisDay &lt; &#40;21 - AddToDays&#41; Then
                    CurrentMonth = 1 
                    CurrentDay = &#40;thisDay + 11&#41; + AddToDays 
                Else 
                    CurrentMonth = 2 
                    CurrentDay = &#40;ThisDay - 20&#41; + AddToDays
                End If
             Case 5 
                 If ThisDay &lt; &#40;22 - AddtoDays&#41; then 
                    CurrentMonth = 2
                    CurrentDay = &#40;ThisDay + 10&#41; + AddToDays 
                 Else
                    CurrentMonth = 3
                    CurrentDay = &#40;ThisDay - 21&#41; + AddToDays
                End If
             Case 6
                  If ThisDay &lt; &#40;22 - AddToDays&#41; Then 
                     CurrentMonth = 3
                     CurrentDay = &#40;ThisDay + 10&#41; + AddToDays 
                  Else 
                     CurrentMonth = 4
                     CurrentDay = &#40;ThisDay - 21&#41; + AddToDays
                  End If
             Case 7
                   If ThisDay &lt; &#40;23 - AddToDays&#41; Then
                      CurrentMonth = 4
                      CurrentDay = &#40;ThisDay + 9&#41; + AddToDays
                   Else
                      CurrentMonth = 5
                      CurrentDay = &#40;ThisDay - 22&#41; + AddToDays
                   End If
              Case 8  
                   If ThisDay &lt; &#40;23 - AddToDays&#41; Then 
                       CurrentMonth = 5
                       CurrentDay = &#40;ThisDay + 9&#41; + AddToDays
                   Else
                       CurrentMonth = 6
                       CurrentDay = &#40;Thisday - 22&#41; + AddToDays
                   End If
               Case 9 
                    If ThisDay &lt; &#40;23 - AddToDays&#41; Then
                        CurrentMonth = 6
                        CurrentDay = &#40;ThisDay - 22&#41; + AddTodays 
                    Else
                         CurrentMonth=7
                         CurrentDay=&#40;ThisDay-22&#41;+AddToDays
                   End If
               Case 10
                    If ThisDay &lt; &#40;23 - AddToDays&#41; Then
                        CurrentMonth = 7
                        Currentday = &#40;ThisDay +8 &#41; + AddToDays 
                    Else
                         CurrentMonth = 8
                         CurrentDay = &#40;ThisDay - 22&#41; + AddToDays
                    End If
                Case 11
                     If ThisDay &lt; &#40;22 - AddToDays&#41; Then
                         CurrentMonth = 8
                         CurrentDay = &#40;ThisDay + 9&#41; + AddtoDays
                     Else
                         CurrentMonth = 9
                         CurrentDay = &#40;ThisDay - 21&#41; + AddToDays
                     End If
                Case 12
                    If ThisDay &lt; &#40;22 - AddToDays&#41; Then
                         CurrentMonth = 9 
                         CurrentDay = &#40;ThisDay + 9&#41; + AddToDays
                    Else
                          CurrentMonth = 10 
                          CurrentDay = &#40;ThisDay - 21&#41; + AddToDays
                    End If
            End Select 
   Rem ------------
       CurM = Trim&#40;Str&#40;CurrentMonth&#41;&#41;
       CurD = Trim&#40;Str&#40;CurrentDay&#41;&#41;
   Rem ------------
       If CurrentMonth &lt; 10 Then CurM = "0" &amp; Trim&#40;Str&#40;CurrentMonth&#41;&#41;
       If CurrentDay &lt; 10 Then CurD = "0" &amp; Trim&#40;Str&#40;CurrentDay&#41;&#41;
       FDate = Val&#40;Trim&#40;Str&#40;&#40;CurrentYear&#41;&#41  ; &amp; CurM &amp; CurD&#41;
End Function

----------


## SSP_Software_team

اینم نسخه ی #C
http://www.barnamenevis.org/viewtopic.php?t=2211

----------


## N_D

ببینید کار میکنه یا نه اخه سریع نوشتم لطفا کامل تست کنید- کد کامل دلفی

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class&#40;TForm&#41;
    Button1&#58; TButton;
    Edit1&#58; TEdit;
    Edit2&#58; TEdit;
    Edit3&#58; TEdit;
    Edit4&#58; TEdit;
    ListBox1&#58; TListBox;
    procedure Button1Click&#40;Sender&#58; TObject&#41;;
  private
    &#123; Private declarations &#125;
  public
    &#123; Public declarations &#125;
  end;

var
  Form1&#58; TForm1;
 monthDays&#58; array&#91;1..12&#93; of integer=
 &#40;30,30,29,31,31,31,31,31,31,30,30,30&#41;;
 monthNames&#58; array&#91;1..13&#93; of string=
 &#40;'dey','bahman','esfand','farvardin','ordibehe  st','khordad','tir','mordad','shahrivar','mehr','a  ban','azar','dey'&#41;;

 procedure printdate&#40;yr,dy&#58; integer&#41;;

implementation

uses DateUtils;

&#123;$R *.dfm&#125;

procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
var
    td&#58; TDate;
 yr,dy&#58; word;
begin

 td&#58;= StrToDate&#40;Edit1.Text&#41;;
 DecodeDateDay&#40;td,yr,dy&#41;;
 printdate&#40;yr,dy&#41;;

end;

procedure printdate&#40;yr,dy&#58; integer&#41;;
var
s,days,i, Base&#58; integer;
sal,mah,roz&#58; string;
begin
 Base&#58;=10;
 monthDays&#91;3&#93;&#58;=29;
 s&#58;=yr-622;
 if yr mod 4 = 1 then inc&#40;Base&#41;;
 if  s mod 4 = 3 then monthDays&#91;3&#93;&#58;=30;
 days&#58;= dy+Base;

 for i&#58;=1 to 12 do
 begin
   if days&lt;= monthDays&#91;i&#93; then break;
   days&#58;=days-monthdays&#91;i&#93;;
 end;

   mah&#58;=monthNames&#91;i&#93;;
   roz&#58;=variant&#40;days&#41;;
 if i>3 then inc&#40;s&#41;;
 sal&#58;=variant&#40;s&#41;;
 Form1.ListBox1.Items.Add&#40;sal+' '+mah+' '+roz&#41;;
end;

end.

----------


## problem

سورسی که در این کنترل دات نت وجود داره هم دقیقه. الگوریتم کلی، مربوط به محاسبهٔ دوره‌های سی و چندساله و صد و چندساله‌ای هست که کبیسهٔ ما به‌جای ۴ سال یکبار، می‌شه ۵ سال یکبار. کتابی هم در این زمینه دارم، اگر مایلید معرفی کنم.

----------


## problem

عنوان = گاهنامهٔ تطبیقی سه هزار ساله
مولف = احمد بیرشک (که احتمالاً معرف حضور هستند این استاد!)
ناشر = بنیاد دانشنامهٔ بزرگ فارسی
چاپ دوم سال ۱۳۷۳

از جمله صحبت‌های جالبی که در این کتاب می‌خوانید:
 - مفاهیمی مثل کبیسه ۱۲۸ ساله و ...
 - فرمول و جداول لازم برای تبدیل تاریخ ۱۲۶۰ تا ۲۰۰۰ ایرانی و ۱- تا ۲۰۶۲ قمری و ۶۳۹- تا ۲۶۲۱ میلادی به هم‌دیگر!
 - اندکی درباره آن ۱۰ روزی که از تقویم میلادی حذف شد و هیچ معادلی در تاریخ شمسی و قمری ندارد!!
 - این که چرا تقویم ایرانی (جلالی) دقیق‌ترین تقویم است، و با این وجود، هر ۱۴۱۰۰۰ سال یک روز با واقعیت اختلاف پیدا می‌کند!

----------


## tthenry14plus

الگوریتمش زیاد پیچیده نیست 
الگوریتمو بدونی راحت می تونی بنویسیش 
هم کد و هم قطعه برنامه رو می ذارم اگر هم سوالی داشتی به ایمیلم بزن 
mostafa.bita@gmail.com

bool MiladiIsLeap(int miladiYear)
{
if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))
returntrue;
else
returnfalse;
}
//***************************************
void MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear)
{
 
int shamsiDay, shamsiMonth, shamsiYear;
int dayCount, farvardinDayDiff, deyDayDiff;
int[] sumDayMiladiMonth = newint[]{0,31,59,90,120,151,181,212,243,273,304,334};
int[] sumDayMiladiMonthLeap=newint[]{0,31,60,91,121,152,182,213,244,274,305,335};
 
 
farvardinDayDiff=79;
if (MiladiIsLeap(iMiladiYear))
{
dayCount = sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay; 
}
else
{
dayCount = sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay; 
}
if((MiladiIsLeap(iMiladiYear - 1)))
{
deyDayDiff = 11;
}
else
{
deyDayDiff = 10;
}
if (dayCount > farvardinDayDiff) 
{
dayCount = dayCount - farvardinDayDiff;
if (dayCount <= 186)
{
switch (dayCount%31)
{
case 0:
shamsiMonth = dayCount / 31;
shamsiDay = 31;
break;
default:
shamsiMonth = (dayCount / 31) + 1; 
shamsiDay = (dayCount%31);
break;
}
shamsiYear = iMiladiYear - 621;
}
else
{
dayCount = dayCount - 186;
switch (dayCount%30)
{
case 0:
shamsiMonth = (dayCount / 30) + 6;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 7;
shamsiDay = (dayCount%30);
break;
}
shamsiYear = iMiladiYear - 621;
}
}
else
{
dayCount = dayCount + deyDayDiff;
 
switch (dayCount%30)
{
case 0 :
shamsiMonth = (dayCount / 30) + 9;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 10;
shamsiDay = (dayCount%30);
break;
}
shamsiYear = iMiladiYear - 622;
 
}

----------


## tthenry14plus

*اینم از الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی :* 
تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است. 

برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "79" روز است.

برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.

دو حالت پیش می آید:

روزی که در آن قرار داریم از 79 بیشتر است 
به این معنی است که در ماههای بعد از فروردین قرار داریم.
حال باید مشخص کنیم که در 6 ماه اول سال شمسی قرار داریم یا در 6 ماه دوم سال قرار داریم،
برای اینکار ابتدا 79 روز از تعداد روزها کم می کنیم تا در اول فروردین قرار بگیریم حال اگر تعداد روزها از "186"(31*6) کمتر باشد یعنی در 6 ماه اول سال شمسی قرار داریم در غیر اینصورت در 6 ماه دوم قرار داریم. 

اگر در 6 ماه اول سال قرار گرفته باشیم :تعداد روزها را بر "31" تقسیم می کنیم(6 ماه اول در سال شمسی 31 روزه است.)
اگر باقیمانده این تقسیم صفر شد خارج قسمت تقسیم برابر با ماه شمسی می شود و روز شمسی برابر با 31 می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه یک می شود و روز شمسی همان باقیمانده است. 

اگر در 6 ماه دوم سال قرار گرفته باشیم : "186" روز از تعداد روزها کم می کنیم و آن را بر "30" تقسیم می کنیم .
اگرباقیمانده این تقسیم صفر شد خارج قسمت تقسیم باضافه"6" برابر با ماه شمسی می شودو روز شمسی برابر با30 می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"7" می شودو روز شمسی همان باقیمانده است. 

سال شمسی از تفاضل سال میلادی با"621" بدست می آید.

روزی که در آن قرار داریم کمتر از"79"است 

که این به این معنی است که درروزهایی بین اولین روزسال میلادی تا اولین روز شمسی (ماههای دی ،بهمن و اسفند)قرار داریم. 
اختلاف روز بین اولین روز سال میلادی داده شده و اولین روز دی ماه در سال شمسی را در نظر می گیریم که این اختلاف برای سال کبیسه"11" و برای غیر کبیسه "10" است.*دقت کنید که در این الگوریتم برای مشخص کردن این اختلاف باید سال قبل از سال داده شده را در نظر بگیریم زیرا سال قبل بر روی اولین روز سال میلادی تاثیر می گزارد.* 

اختلاف روز با تعداد روز محاسبه شده جمع می کنیم ، آن را بر"30" تقسیم می کنیم(3 ماه آخر سال شمسی 30 روزه است.).
اگر باقیمانده این تقسیم صفر شود خارج قسمت تقسیم باضافه"9" برابر با ماه شمسی می شودو روز شمسی برابر با"30" می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"10"می شودو روز شمسی همان باقیمانده است.

در این حالت سال شمسی از تفاضل سال میلادی با"622" بدست می آید.(زیرا در سال قبل قرار داریم.)

----------


## reza6384

> برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
> اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
> با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.


 
هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه. 
البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.

----------


## ahmadkiani

سلام
اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید . 
من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .

----------


## whitehat

> اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید . 
> من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .


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

----------


## ahmadkiani

کد تبدیل با C :


#include <stdio.h>
#include <conio.h>
#include <dos.h>
main()
{
//start/variables
 int m_day_mon[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
   int s_day_mon[12] = {31,31,31,31,31,31,30,30,30,30,30,30};
   
 int m_year , s_year;
   int m_month , s_month;
   int m_day , s_day;
   int m_day_sum , s_day_sum;
//end/variables
 struct date d;
   getdate(&d);
   m_year = d.da_year;
   m_month = d.da_mon;
   m_day = d.da_day;
// number of past day from m_year
 if(m_year % 4 == 0)
    m_day_mon[1] = 29;
   else m_day_mon[1] = 28;
   for(int i = 1 ; i <m_month ; i++)
    m_day_sum += m_day_mon[i - 1];
   m_day_sum +=  m_day;
// convert m_date to s_date
 if(m_day_sum > 79)
   {
    s_day_sum = m_day_sum - 79;
      s_year = m_year - 621;       //s_year
  if((s_year + 1) % 4 == 0)
       s_day_mon[11] = 30;
      else s_day_mon[11] = 29;
      if (s_day_sum > 186)
      {
       s_month = ((s_day_sum - 187) / 30) + 7;
         s_day = (s_day_sum - 186) % 30;
         if(s_day == 0) s_day = 30;
      }
      else
      {
       s_month = ((s_day_sum - 1) /31) + 1;
         if(s_month == 0) s_month = 1;
         s_day = s_day_sum % 31;
         if(s_day == 0) s_day = 31;
      }
   }
   else
   {
    s_year = m_year - 622;
      if((s_year + 1) % 4 == 0)
      {
       s_day_mon[11] = 30;
         s_day_sum = m_day_sum + 287;
      }
      else
      {
       s_day_mon[11] = 29;
         s_day_sum = m_day_sum + 286;
      }
      s_month = ((s_day_sum -187) / 30) + 7;
      s_day = (s_day_sum - 186) % 30;
      if(s_day == 0) s_day = 30;
   }
   printf("TODAY IN GREGORIAN CALENDAR IS : %d/%d/%d\n" , m_year,m_month,m_day);
   if((m_month == 1) && (m_day == 1))
    printf("HAPPY NEW GREGORIAN YEAR\n");
   printf("\nTODAY IN PERSIAN CALENDAR IS : %d/%d/%d\n" , s_year,s_month,s_day);
   if((s_month == 1) && (s_day == 1))
    printf("HAPPY NEW PERSIAN YEAR");
   getch();
}

----------


## cyber_world

> هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه. 
> البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.


سلام. 
اين روشي كه شما فرموديد، درست كار نمي كنه، چون سال 1379 كبيسه هست ولي باقيمانده آن به 33 برابر است با : 26  كه اين عدد جز باقيمانده هاي بالا نيست!! 
راه ديگه اينه كه يك سال کبیسه  رو به عنوان سال  مبنا قرار بدي ، مثلا 1387، و بعد اگر اختلاف هر سال دلخواهي با اين سال  مبنا ، بر 4 بخش پذير بود، اون سال کبیسه خواهد بود.
*نكته مهم اين كه اين ايده ي دوست عزيزم ، montazer_mosleh* *هست*. كه كاملا درست جواب مي ده.

----------


## R E Z A P

> کد تبدیل با C :
> 
> 
> #include <stdio.h>
> #include <conio.h>
> #include <dos.h>
> main()
> {
> //start/variables
> ...


سلام به همه ی اساتید
کسی کد تبدیل به قمری رو نداره c مثل بالا دقیقا
ممنون

----------


## R E Z A P

كسي نيست جواب مارو بده؟

----------


## maxmas

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `gday`(x int) RETURNS int(11)
begin
  declare y int;
  case x
    when 0  then set y = 31;
    when 1  then set y = 28;
    when 2  then set y = 31;
    when 3  then set y = 30;
    when 4  then set y = 31;
    when 5  then set y = 30;
    when 6  then set y = 31;
    when 7  then set y = 31;
    when 8  then set y = 30;
    when 9  then set y = 31;
    when 10 then set y = 30;
    when 11 then set y = 31;
    else         set y = 0;
  end case;
  return y;
end;;
DELIMITER ;

-- ----------------------------
-- Function structure for GeoToJal
-- ----------------------------
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `GeoToJal`(jdate datetime) RETURNS varchar(32) CHARSET utf8
begin
  declare g_y int;
  declare g_m int;
  declare g_d int;
  declare gy int;
  declare gm int;
  declare gd int;
  declare jy int;
  declare jm int;
  declare jd int;
  declare g_day_no int;
  declare j_day_no int;
  declare j_np int;
  declare i int;

  set g_y = year(jdate);
  set g_m = month(jdate);
  set g_d = day(jdate);

  if g_y = 0 || g_m = 0 || g_d = 0 then
    return null;
  end if;

  set gy = g_y - 1600;
  set gm = g_m - 1;
  set gd = g_d - 1;

  set g_day_no = 365*gy+((gy+3) div 4)-((gy+99) div 100)+((gy+399) div 400);

  set i = 0;
  _loop1: LOOP
    set g_day_no = g_day_no + gday(i);

    set i = i + 1;
    if i = gm then
      leave _loop1;
    end if;
  end LOOP _loop1;

  if gm>1 && ((mod(gy,4)=0 && not (mod(gy,100)=0)) || (mod(gy,400)=0)) then
    set g_day_no = g_day_no + 1;
  end if;

  set g_day_no = g_day_no + gd;
  set j_day_no = g_day_no - 79;
  set j_np = j_day_no div 12053;
  set j_day_no = mod(j_day_no, 12053);
  set jy = 979 + 33 * j_np + 4 * (j_day_no div 1461);
  set j_day_no = mod(j_day_no, 1461);

  if j_day_no >= 366 then
    set jy = jy + ((j_day_no-1) div 365);
    set j_day_no = mod((j_day_no-1), 365);
  end if;

  set i = 0;
  _loop2: LOOP
    set j_day_no = j_day_no - jday(i);

    set i = i + 1;
    if i >= 11 || j_day_no < jday(i) then
      leave _loop2;
    end if;
  end LOOP _loop2;

  set jm = i + 1;
  set jd = j_day_no + 1;

  return concat(jy, "/", jm, "/", jd, " ", time(jdate));
end;;
DELIMITER ;

-- ----------------------------
-- Function structure for jday
-- ----------------------------
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `jday`(x int) RETURNS int(11)
begin
  declare y int;
  case x
    when 0  then set y = 31;
    when 1  then set y = 31;
    when 2  then set y = 31;
    when 3  then set y = 31;
    when 4  then set y = 31;
    when 5  then set y = 31;
    when 6  then set y = 30;
    when 7  then set y = 30;
    when 8  then set y = 30;
    when 9  then set y = 30;
    when 10 then set y = 30;
    when 11 then set y = 29;
    else         set y = 0;
  end case;
  return y;
end;;
DELIMITER  ;
#END


 :چشمک:

----------


## saya joon

> سلام
> اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید . 
> من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .


با سلام.دوست خوب میشه همون کد c گذاشتین اینجا  توضیح بدی من مبتدی هستم متوجه نشدم چی به چی هست؟ کد را کامل توضیح بدین ممنون میشم.

----------


## logofun

برای نوشتن فلوچارتش باید چه کرد  میشه قدم به قدم بگید :خجالت:

----------

