UIT2024_Calendar/stu2024/软件2402吕亦杰.c
2024-12-07 16:23:34 +08:00

700 lines
17 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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");
}