سلام بر همراهان همیشگی


این تمرین C++ ، تبدیل تاریخ شمسی به میلادی و برعکس رو انجام میده به همراه امکان استفاده از تاریخ سیستم.

از تمارین مشخص شده توسط اساتید دانشگاه آزاد تهران برای پایان ترم هستش.

و در آخر این برنامه قابلیت محاسبه تاریخ کبیسه میلادی و شمسی رو هم داره.


سوال:

برنامه ای بنویسید که تاریخ میلادی و یا شمسی را به انتخاب کاربر دریافت و به یکدیگر تبدیل کند.


کد:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
void gregorian_to_jalali(int *j_y, int *j_m, int *j_d, int g_y, int g_m, int g_d);
void jalali_to_gregorian(int *g_y, int *g_m, int *g_d, int j_y, int j_m, int j_d);
void chek_date(int c_y, int c_m, int c_d, int c_type);

int g_days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int j_days_in_month[12] = {31, 31, 31, 31, 31, 31, 30, 30, 30, 30, 30, 29};

const char *j_month_name[13] = {"","Farvardin", "Ordibehesht", "Khordad","Tir", "Mordad", "Shahrivar","Mehr", "Aban", "Azar","Dey", "Bahman", "Esfand"};
const char *g_month_name[13] = {"","January", "February", "March","April", "May", "June","July", "August", "September","October", "November", "December"};

//میلادی به شمسی
void gregorian_to_jalali(int *j_y, int *j_m, int *j_d,
int g_y, int g_m, int g_d)
{
int gy, gm, gd;
int jy, jm, jd;
long g_day_no, j_day_no;
int j_np;

int i;

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

g_day_no = 365*gy+(gy+3)/4-(gy+99)/100+(gy+399)/400;
for (i=0;i<gm;++i)
g_day_no += g_days_in_month[i];
if (gm>1 && ((gy%4==0 && gy%100!=0) || (gy%400==0)))
++g_day_no;
g_day_no += gd;

j_day_no = g_day_no-79;

j_np = j_day_no / 12053;
j_day_no %= 12053;

jy = 979+33*j_np+4*(j_day_no/1461);
j_day_no %= 1461;

if (j_day_no >= 366) {
jy += (j_day_no-1)/365;
j_day_no = (j_day_no-1)%365;
}

for (i = 0; i < 11 && j_day_no >= j_days_in_month[i]; ++i) {
j_day_no -= j_days_in_month[i];
}
jm = i+1;
jd = j_day_no+1;
*j_y = jy;
*j_m = jm;
*j_d = jd;
}

//شمسی به میلادی
void jalali_to_gregorian(int *g_y, int *g_m, int *g_d,
int j_y, int j_m, int j_d)
{
int gy, gm, gd;
int jy, jm, jd;
long g_day_no, j_day_no;
int leap;

int i;

jy = j_y-979;
jm = j_m-1;
jd = j_d-1;

j_day_no = 365*jy + (jy/33)*8 + (jy%33+3)/4;
for (i=0; i < jm; ++i)
j_day_no += j_days_in_month[i];

j_day_no += jd;

g_day_no = j_day_no+79;

gy = 1600 + 400*(g_day_no/146097);
g_day_no = g_day_no % 146097;

leap = 1;
if (g_day_no >= 36525)
{
g_day_no--;
gy += 100*(g_day_no/36524);
g_day_no = g_day_no % 36524;

if (g_day_no >= 365)
g_day_no++;
else
leap = 0;
}

gy += 4*(g_day_no/1461);
g_day_no %= 1461;

if (g_day_no >= 366) {
leap = 0;

g_day_no--;
gy += g_day_no/365;
g_day_no = g_day_no % 365;
}

for (i = 0; g_day_no >= g_days_in_month[i] + (i == 1 && leap); i++)
g_day_no -= g_days_in_month[i] + (i == 1 && leap);
gm = i+1;
gd = g_day_no+1;

*g_y = gy;
*g_m = gm;
*g_d = gd;
}

//تشخیص صحت تاریخ
void chek_date(int c_y, int c_m, int c_d, int c_type){
bool is_ok=true , bLeapYear=false , kabise=false;
int temp;
if(c_type==1){

if(c_m<1 or c_m>12){
is_ok=false;
}
if(c_d<1 or c_d>j_days_in_month[c_m-1]){
is_ok=false;
}
temp=c_y % 33;
switch (temp){
case 1:
kabise=true;
break;
case 5:
kabise=true;
break;
case 9:
kabise=true;
break;
case 13:
kabise=true;
break;
case 17:
kabise=true;
break;
case 22:
kabise=true;
break;
case 26:
kabise=true;
break;
case 30:
kabise=true;
break;
default:
kabise=false;
break;
}
if(kabise){
if(c_m==12 and c_d==30){
is_ok=true;
}
}

if(c_y<980 or c_y>9000){
is_ok=false;
}

}else if(c_type==2){

if(c_m<1 or c_m>12){
is_ok=false;
}
if(c_d<1 or c_d>g_days_in_month[c_m-1]){
is_ok=false;
}

if ((c_y % 4) ==0) {
if ((c_y % 100) == 0) {
bLeapYear = ((c_y % 400) == 0);
} else {
bLeapYear = true;
}
}
if (bLeapYear){
if(c_m==2 and c_d==29){
is_ok=true;
}
}

if(c_y<1601 or c_y>9000){
is_ok=false;
}

}else{
cout<<"Error!";
cout<<"\n";system("PAUSE");
exit(0);
}
if(!is_ok){
cout<<"Not Valid Data!";
cout<<"\n";system("PAUSE");
exit(0);
}
if(kabise){
cout<<"\n*In sal Kabise Ast\n\n";
}
if(bLeapYear){
cout<<"\n*This Is a Leap Year\n\n";
}
}

int main(void){
int y, m, d, flag, j_year, j_mon, j_day, g_year, g_mon, g_day;

while(flag!=1 and flag!=2 and flag!=3){
cout<<"Set a Convert Type:\n\n";
cout<<"1-Hejrishamsi To Miladi\n";
cout<<"2-Miladi To Hejrishamsi\n";
cout<<"3-Use Defult System Time\n";
cout<<"Chose:";
cin>>flag;
cout<<"\n";
}
if(flag==1){
cout<<"Please enter a date by Jalali calendar.\n(Seprate By Space!) \n\n";
cout<<"dd mm yyyy\n";
cin>> j_day>> j_mon>> j_year;
chek_date( j_year, j_mon, j_day, flag);
jalali_to_gregorian(&y, &m, &d, j_year, j_mon, j_day);
cout<<"yyyy/mm/dd\n";
cout<<j_year<<"/"<<j_mon<<"/"<<j_day<<endl;
cout<<"The Day Is: "<< d<<" "<< g_month_name[m] <<" "<<y<<endl;
}else if(flag==2){
cout<<"Please enter a date by Gregorian calendar.\n(Seprate By Space!) \n\n";
cout<<"dd mm yyyy\n";
cin>> g_day>> g_mon>> g_year;
chek_date( g_year, g_mon, g_day, flag);
gregorian_to_jalali(&y, &m, &d, g_year, g_mon, g_day);
cout<<"yyyy/dd/mm\n";
cout<<g_year<<"/"<<g_day<<"/"<<g_mon<<endl;
cout<<"In rooz barabar ast ba: "<< d<<" "<< j_month_name[m] <<" "<<y<<endl;
}else if(flag==3){
time_t bin_time;
struct tm *br_time;
time(&bin_time);
br_time = localtime(&bin_time);
gregorian_to_jalali(&y, &m, &d,1900+br_time->tm_year, 1+br_time->tm_mon, br_time->tm_mday);
cout<<"yyyy/dd/mm\n";
cout<<1900+br_time->tm_year<<"/"<<br_time->tm_mday<<"/"<<1+br_time->tm_mon<<endl;
cout<<"In rooz barabar ast ba: "<< d<<" "<< j_month_name[m] <<" "<<y<<endl;
}else cout<<"Convert Type Error\n\n";


cout<<"\n";system("PAUSE");
return 0;
}
دریافت فایل:
دریافت با حجم 132KB