#include #include #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=d_1)&&(k_2=d_1)&&(k_2=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"); }