700 lines
17 KiB
C
700 lines
17 KiB
C
#include<stdio.h>
|
||
#include<math.h>
|
||
|
||
#define ll long long
|
||
#define BUF 256//定义最大输入长度
|
||
|
||
//-----------------Press to continue函数--------------------------
|
||
int Press_to_continue()
|
||
{
|
||
printf("\n[按下任意健继续......]");
|
||
getch();//---------------等待按下按键
|
||
printf("\033c");
|
||
printf("\033[2J");
|
||
printf("\033[0m");//------------清屏函数
|
||
return 0;
|
||
}
|
||
//-----------------------------------------------------------------
|
||
|
||
|
||
|
||
//------将字符转换为数字的函数(写这个是因为直接(int)转换好像会出问题)
|
||
int number(char n)//选择穷举!!!
|
||
{
|
||
if(n=='0')
|
||
return 0;
|
||
else if(n=='1')
|
||
return 1;
|
||
else if(n=='2')
|
||
return 2;
|
||
else if(n=='3')
|
||
return 3;
|
||
else if(n=='4')
|
||
return 4;
|
||
else if(n=='5')
|
||
return 5;
|
||
else if(n=='6')
|
||
return 6;
|
||
else if(n=='7')
|
||
return 7;
|
||
else if(n=='8')
|
||
return 8;
|
||
else if(n=='9')
|
||
return 9;
|
||
}
|
||
//------------------------------------------------------------------
|
||
|
||
|
||
|
||
//------------------------输入判断函数--------------------------------
|
||
int input()
|
||
{
|
||
int flag=0;
|
||
int i=0;
|
||
char c[BUF];
|
||
ll int num=0;
|
||
do//------------判断输入是否合法(仅含数字为合法)
|
||
{
|
||
flag=0;
|
||
scanf("%s",c);
|
||
while(c[i]!='\0')
|
||
{
|
||
if(c[i]!='1' && c[i]!='2' && c[i]!='3' && c[i]!='4' && c[i]!='5' && c[i]!='6' && c[i]!='7' && c[i]!='8' && c[i]!='9' && c[i]!='0')
|
||
{
|
||
flag=1;
|
||
break;
|
||
}
|
||
i++;
|
||
}
|
||
if(flag)
|
||
{
|
||
printf("\n[输入有误!请重新输入]:");
|
||
}
|
||
}while(flag);
|
||
// printf("%s",c);
|
||
// printf("\n%d",flag);
|
||
|
||
i=0;
|
||
while(c[i]!='\0')
|
||
{
|
||
num=num*10+number(c[i]);
|
||
i++;
|
||
}
|
||
// printf("%lld",num);//-----调试用代码
|
||
return num;
|
||
}
|
||
//------------------------------------------------------------------
|
||
|
||
|
||
|
||
//------------------------判断平年闰年函数--------------------------
|
||
int is_Ryear(ll int year)
|
||
{
|
||
if(year%4==0&&year%100!=0||year%400==0){
|
||
return 1;
|
||
}
|
||
else{
|
||
return 0;
|
||
}
|
||
}
|
||
//------------------------------------------------------------------
|
||
|
||
|
||
|
||
//--------------------------检测日期是否合法--------------------------
|
||
int rule(ll int y,int m,int d)
|
||
{
|
||
if((y<0||m<0||d<0)||(m>12)||((m==1||m==3||m==5||m==7||m==8||m==10||m==12)&&d>31)||((m==4||m==6||m==9||m==11)&&d>30)||is_Ryear(y)&&(m==2)&&(d>29)||(y==1582&&m==10&&(d>=5&&d<=14)))
|
||
{
|
||
return 1;
|
||
}
|
||
else{
|
||
return 0;
|
||
}
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//--------------------------计算星期_返回星期几-----------------------
|
||
int week(ll int y,int m,int d)
|
||
{
|
||
int w=0,y2;
|
||
ll int c;
|
||
// ll int c=y%100;
|
||
if(m==1||m==2)
|
||
{
|
||
m+=12;
|
||
y-=1;
|
||
}
|
||
|
||
y2=y%100;
|
||
c=y/100;
|
||
//网上查的公式......
|
||
if(y==1582&&m==10&&d<=4||y==1582&&m<=9||y<=1581)
|
||
{
|
||
//
|
||
// 儒略历计算公式:W = (5-C) + y + [y/4] + [13 * (M+1) / 5] + d - 1;
|
||
|
||
w=(y2+y2/4+c/4-2*c+(26*(m+1))/10+d-1+10)%7;
|
||
|
||
}
|
||
else//----1582年之后
|
||
{
|
||
// w=(d+1+2*m+3*(m+10)/5+y+y/4+7)%7;
|
||
// w=(y2+(y2/4)+(c/4)-2*c+(26*(m+1)/10)+d-1)%7;
|
||
//蔡勒公式:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
|
||
w=(y2+y2/4+c/4-2*c+(26*(m+1))/10+d-1)%7;
|
||
}
|
||
return w;
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//---------------------------返回月份对应天数-------------------------
|
||
int month(ll int y,int m)
|
||
{
|
||
int d;
|
||
if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
|
||
{
|
||
d=31;
|
||
}
|
||
else if(m==4||m==6||m==9||m==11)
|
||
{
|
||
d=30;
|
||
}
|
||
else if(m==2&&is_Ryear(y))
|
||
{
|
||
d=29;
|
||
}
|
||
else
|
||
{
|
||
d=28;
|
||
}
|
||
return d;
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//-----------------------画日历函数__单列-----------------------------
|
||
int pic_s(ll int y,int m,int w,int d)
|
||
{
|
||
int k=0;
|
||
int f=0;
|
||
|
||
printf("\n|***************************************************|");
|
||
printf("\n|%lld年%d月|",y,m);
|
||
printf("\n 日\t 一\t 二\t 三\t 四\t 五\t 六\n ");
|
||
// printf(" ");
|
||
f=0;
|
||
for(int i=0;i<w;i++)
|
||
{
|
||
printf("\t");
|
||
f++;
|
||
}
|
||
if(f!=0)
|
||
{
|
||
printf(" ");
|
||
}
|
||
|
||
k=0;
|
||
// f=0;
|
||
while(k<d)
|
||
{
|
||
k++;
|
||
if(rule(y,m,k))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
printf("%2d",k);
|
||
f++;
|
||
// if((w+f)%7==0)//-----判断第二天是否为周日
|
||
if(f%7==0)
|
||
{
|
||
printf("\n ");
|
||
}
|
||
else
|
||
{
|
||
printf("\t ");
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
/*旧版代码(与新版格式不统一)
|
||
int pic_s(ll int y,int m,int w,int d)
|
||
{
|
||
int k=0;
|
||
int f=0;
|
||
|
||
printf("\n|*****************************************|");
|
||
printf("\n|%lld年%d月|",y,m);
|
||
printf("\n 日 一 二 三 四 五 六 \n");
|
||
printf(" ");
|
||
f=0;
|
||
for(int i=0;i<w;i++)
|
||
{
|
||
printf(" ");
|
||
f++;
|
||
}
|
||
|
||
k=0;
|
||
// f=0;
|
||
while(k<d)
|
||
{
|
||
k++;
|
||
if(rule(y,m,k))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
printf("%2d",k);
|
||
f++;
|
||
// if((w+f)%7==0)//-----判断第二天是否为周日
|
||
if(f%7==0)
|
||
{
|
||
printf("\n ");
|
||
}
|
||
else
|
||
{
|
||
printf(" ");
|
||
}
|
||
|
||
}
|
||
|
||
}
|
||
*/
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//-----------------------画日历函数__双列-----------------------------
|
||
int pic_d(ll int y,int m,int w_1,int d_1,int d_2)
|
||
{
|
||
int w_2;
|
||
if(y==1582&&m==9)
|
||
{
|
||
w_2=(w_1+d_1-10)%7;
|
||
}
|
||
else
|
||
{
|
||
w_2=(w_1+d_1)%7;
|
||
}
|
||
int i = 0;
|
||
int j = 0;
|
||
int days[6][15] = {0};// 初始化一个6行15列,全为0的数组
|
||
//days 是所有需要打印的日期表,最极端情况,会有6周,前面7列为单数月份,中间一列间隔列,后面7列为 双数月份
|
||
//打印的时候,把0的位置用tab 制表符替换打印出来也就是(\t)
|
||
printf("\n");
|
||
//单数月处理
|
||
for(i = 0; i < d_1; i++)
|
||
{
|
||
int row = (w_1 + i) / 7;//行
|
||
int col = (w_1 + i) % 7;//列
|
||
days[row][col] = i + 1;//需要注意i从0开始,日期从1开始,所以要+1
|
||
}
|
||
//双数月处理
|
||
for(i = 0; i < d_2; i++)
|
||
{
|
||
int row = (w_2 + i) / 7;//行
|
||
int col = (w_2 + i) % 7 + 8 ;//列,计算出来的星期数需要向右移动8个位置
|
||
days[row][col] = i + 1;//需要注意i从0开始,日期从1开始,所以要+1
|
||
}
|
||
printf("\n|***************************************************|\t\t|***************************************************|");
|
||
printf("\n|%lld年%d月|\t\t\t\t\t\t\t|%lld年%d月|",y,m,y,m+1);
|
||
printf("\n日\t一\t二\t三\t四\t五\t六\t\t日\t一\t二\t三\t四\t五\t六\n");
|
||
for (i = 0; i < 6; i++)
|
||
{
|
||
for (j = 0; j < 15; j++)
|
||
{
|
||
if(days[i][j] == 0 )
|
||
{
|
||
//0 的位置输出制表符
|
||
printf("\t");
|
||
}
|
||
else
|
||
{
|
||
//非0的位置打印数字,并将光标移到下一个制表符位置
|
||
printf("%2d \t", days[i][j]);
|
||
}
|
||
}
|
||
printf("\n");
|
||
}
|
||
}
|
||
/*旧版代码(有bug)
|
||
int pic_d(ll int y,int m,int w_1,int d_1,int d_2)
|
||
{
|
||
int k=0;
|
||
int f=0;
|
||
int f_2=0;
|
||
int w_2;
|
||
|
||
if(y==1582&&m==9)
|
||
{
|
||
w_2=(w_1+d_1-10)%7;
|
||
}
|
||
else
|
||
{
|
||
w_2=(w_1+d_1)%7;
|
||
}
|
||
|
||
|
||
printf("\n|*****************************************| |*****************************************|");
|
||
printf("\n|%lld年%d月| |%lld年%d月|",y,m,y,m+1);
|
||
printf("\n 日 一 二 三 四 五 六 日 一 二 三 四 五 六\n");
|
||
printf(" ");
|
||
f=0;
|
||
f_2=0;
|
||
for(int i=0;i<w_1;i++)
|
||
{
|
||
printf(" ");
|
||
f++;
|
||
}
|
||
|
||
k=0;
|
||
int k_2=0;//-----右列日期置0
|
||
// f=0;
|
||
while(k<=d_1)
|
||
{
|
||
k++;
|
||
if(rule(y,m,k))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
|
||
|
||
printf("%2d",k);
|
||
f++;
|
||
|
||
|
||
|
||
// if((w+f)%7==0)//-----判断第二天是否为周日
|
||
if(f%7==0||(k-1>=d_1)&&(k_2<d_2))
|
||
{
|
||
if((k-1>=d_1)&&(k_2<d_2))
|
||
{
|
||
for(int q=0;q<(7-(f+w_1-1)%7)%7;q++)
|
||
{
|
||
printf(" ");
|
||
}
|
||
}
|
||
|
||
|
||
printf(" ");
|
||
f_2=0;
|
||
for(int j=0;j<w_2;j++)
|
||
{
|
||
printf(" ");
|
||
f_2++;
|
||
}
|
||
w_2=0;
|
||
|
||
// f=0;
|
||
while(k_2<d_2)
|
||
{
|
||
k_2++;
|
||
if(rule(y,m+1,k_2))
|
||
{
|
||
continue;
|
||
}
|
||
|
||
printf("%2d",k_2);
|
||
f_2++;
|
||
// if((w+f)%7==0)//-----判断第二天是否为周日
|
||
if(f_2%7==0)
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
printf(" ");
|
||
}
|
||
|
||
}
|
||
|
||
|
||
|
||
printf("\n ");
|
||
}
|
||
else
|
||
{
|
||
printf(" ");
|
||
}
|
||
|
||
}
|
||
}
|
||
*/
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//------------------------------功能一--------------------------------
|
||
int fun_1()
|
||
{
|
||
|
||
ll int y=1,m=1,d=1;
|
||
int flagf=1;
|
||
int w;//星期变量||0--周日||1--周一||2--周二||3--周三||4--周四||5--周五||6--周六||
|
||
//char X,Y;
|
||
|
||
while(flagf)
|
||
{
|
||
flagf=0;
|
||
printf("\n|****************星期查询*****************|");
|
||
// printf("\n请输入您要查询的日期\n[格式:YYYY MM DD]:");
|
||
printf("\n[请输入查询日期所在的年份]:");
|
||
y=input();
|
||
printf("\n[请输入查询日期所在的月份]:");
|
||
m=(int)input();
|
||
printf("\n[请输入查询日期所在日]:");
|
||
d=(int)input();
|
||
|
||
//-----------旧版输入,有BUG
|
||
// scanf("%lld%lld%lld",&y,&m,&d);//<-----------------年月日的输入
|
||
//输入的判断
|
||
if(rule(y,m,d))
|
||
{
|
||
printf("\n[输入有误!请重新输入!]");
|
||
flagf=1;
|
||
}
|
||
}
|
||
printf("\n|*****************************************|");
|
||
printf("\n您输入的是:%lld年%lld月%lld日",y,m,d);
|
||
if(is_Ryear(y)){
|
||
printf("\n 这一年是闰年,");
|
||
}
|
||
else{
|
||
printf("\n 这一年是平年,");
|
||
}
|
||
|
||
w=week(y,m,d);
|
||
switch(w)
|
||
{
|
||
case 0: printf("这一天是星期日。");break;
|
||
|
||
case 1: printf("这一天是星期一。");break;
|
||
|
||
case 2: printf("这一天是星期二。");break;
|
||
|
||
case 3: printf("这一天是星期三。");break;
|
||
|
||
case 4: printf("这一天是星期四。");break;
|
||
|
||
case 5: printf("这一天是星期五。");break;
|
||
|
||
case 6: printf("这一天是星期六。");break;
|
||
}
|
||
printf("\n|*****************************************|");
|
||
Press_to_continue();
|
||
return 0;
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//---------------------------功能二菜单--------------------------------
|
||
int fun_2_menu()
|
||
{
|
||
ll int y;
|
||
int w,flag;
|
||
printf("\n|****************星期查询*****************|");
|
||
printf("\n|*****************************************|");
|
||
printf("\n| 请选择功能: |");
|
||
printf("\n| 1.单列显示 |");
|
||
printf("\n| 2.双列显示 |");
|
||
printf("\n|*****************************************|");
|
||
printf("\n[请输入您要使用的功能]:");
|
||
flag=(int)input();
|
||
// scanf("%d",&flag);
|
||
// while(!(flag==1||flag==2))//--------------判断输入是否正确
|
||
// {
|
||
// printf("\n[输入有误!请重新输入!]");
|
||
// scanf("%d",&flag);
|
||
// }
|
||
printf("\n[请输入您要查询的年份]:");
|
||
// scanf("%lld",&y);
|
||
y=input();
|
||
w=week(y,1,1);
|
||
if(flag==1)
|
||
{
|
||
printf("\033c");//------------清屏函数
|
||
// printf("\033[2J");//------------清屏函数
|
||
// printf("\033[0m");//------------结束状态函数
|
||
fun2_s(y,w);
|
||
}
|
||
else
|
||
{
|
||
printf("\033c");//------------清屏函数
|
||
// printf("\033[2J");//------------清屏函数
|
||
// printf("\033[0m");//------------结束状态函数
|
||
fun2_d(y,w);
|
||
}
|
||
return 0;
|
||
//start_10k();
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//-------------------------功能二__单列-----------------------------
|
||
int fun2_s(ll int y,int w)
|
||
{
|
||
int m,d,flag=0;
|
||
printf("\033c");
|
||
// printf("\033[2J");//-------清屏函数
|
||
// printf("\033[0m");//------结束指示符
|
||
// printf("\n|*****************************************|");
|
||
printf("\n----|*****公元%lld年历*****|----",y);
|
||
for(m=1;m<=12;m++)
|
||
{
|
||
d=month(y,m);
|
||
pic_s(y,m,w,d);
|
||
|
||
if(y==1582&&m==10)
|
||
{
|
||
w=(w+d-10)%7;
|
||
}
|
||
else
|
||
{
|
||
w=(w+d)%7;
|
||
}
|
||
flag+=1;
|
||
if(flag>=4&&m!=12)
|
||
{
|
||
flag=0;
|
||
printf("\n[按下任意健继续......]");
|
||
getch();
|
||
}
|
||
}
|
||
|
||
Press_to_continue();
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//-------------------------功能二__双列-----------------------------
|
||
int fun2_d(ll int y,int w)
|
||
{
|
||
int m,d1,d2,flag=0,w_2;
|
||
printf("\033c");
|
||
printf("\033[2J");
|
||
printf("\033[0m");
|
||
printf("\n|*****************************************|");
|
||
printf("\n|*****公元%lld年历*****|",y);
|
||
for(m=1;m<=11;m+=2)
|
||
{
|
||
d1=month(y,m);
|
||
d2=month(y,m+1);
|
||
pic_d(y,m,w,d1,d2);
|
||
|
||
if(y==1582&&m==9)
|
||
{
|
||
w_2=(w+d1-10)%7;
|
||
}
|
||
else
|
||
{
|
||
w_2=(w+d1)%7;
|
||
}
|
||
w=(w_2+d2)%7;
|
||
|
||
flag+=1;
|
||
if(flag>=4&&m!=12)
|
||
{
|
||
flag=0;
|
||
printf("\n[按下任意健继续......]");
|
||
getch();
|
||
|
||
}
|
||
}
|
||
|
||
Press_to_continue();
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
//---------------------------菜单函数---------------------------------
|
||
int start_10k()
|
||
{
|
||
// int flagm=1;
|
||
printf("\033c");//-------------清屏函数
|
||
// printf("\033[2J");//-------------清屏函数
|
||
// printf("\033[0m");//------------结束状态函数
|
||
|
||
// while(flagm==1)
|
||
// {
|
||
// flagm=1;
|
||
|
||
int p;
|
||
|
||
printf("\n|*************欢迎使用万年历**************|");
|
||
printf("\n|*****************************************|");
|
||
printf("\n| 请选择功能: |");
|
||
printf("\n| 1.星期查询 |");
|
||
printf("\n| 2.年历查询 |");
|
||
printf("\n| |");
|
||
printf("\n| 0.退出程序 |");
|
||
printf("\n|*****************************************|");
|
||
|
||
printf("\n[请输入您要使用的功能]:");
|
||
p=(int)input();
|
||
//------旧版输入,输入字母后会无限循环(有BUG)
|
||
// scanf("%d",&p);
|
||
// while(!(p==0||p==1||p==2))
|
||
// {
|
||
// printf("\n[输入有误!请重新输入]");
|
||
// printf("\n[请输入您要使用的功能]:");
|
||
// scanf("%d",&p);
|
||
// }
|
||
|
||
switch(p)
|
||
{
|
||
|
||
case 1: printf("\033c");
|
||
// printf("\033[2J");//------------清屏函数
|
||
// printf("\033[0m\n");//------------结束状态函数
|
||
fun_1();
|
||
return 1;
|
||
break;
|
||
|
||
case 2: printf("\033c");
|
||
// printf("\033[2J");//------------清屏函数
|
||
// printf("\033[0m\n");//------------结束状态函数
|
||
fun_2_menu();
|
||
return 1;
|
||
break;
|
||
|
||
case 0: return 0;
|
||
// flagm=0;
|
||
break;
|
||
}
|
||
// }
|
||
// printf("\n|***************感谢您的使用**************|\n");
|
||
return 1;
|
||
}
|
||
//-------------------------------------------------------------------
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
//-----------------------------主函数-----------------------------------
|
||
int main()
|
||
{
|
||
int flag;
|
||
printf("万年历\n 制作者:吕亦杰");
|
||
Press_to_continue();
|
||
do
|
||
{
|
||
flag=start_10k();
|
||
}while(flag);
|
||
printf("\n|***************感谢您的使用**************|\n");
|
||
}
|