461 lines
9.0 KiB
C++
461 lines
9.0 KiB
C++
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include <math.h>
|
|
void rili(int year,int pri){//1.按月份输出
|
|
int a,b,con=0;
|
|
int c=0;
|
|
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
|
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
|
|
if(year<=1582){
|
|
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
|
|
}
|
|
if((year%4==0&&year%100!=0)||year%400==0) //闰年
|
|
arr[2]=29;
|
|
if(pri==1){ //单列输出
|
|
for(int i=1;i<13;i++){
|
|
printf("=======================%2d月=======================\n",i);
|
|
printf("日\t一\t二\t三\t四\t五\t六\n");
|
|
if(year==1582&&i==11)
|
|
a=1;
|
|
if(year==1582&&i==112)
|
|
a=3;
|
|
if(a!=0){
|
|
for(int x=1;x<=a;x++)
|
|
{
|
|
printf("\t");
|
|
}
|
|
}
|
|
else
|
|
printf("\n");
|
|
|
|
|
|
for(int j=1;j<=arr[i];j++)
|
|
{
|
|
if(year==1582&&i==10&&(j>4&&j<15)){ //特殊年
|
|
continue;
|
|
}
|
|
con+=1;
|
|
printf("%d\t",j);
|
|
if((con+a)%7==0||j==arr[i])
|
|
printf("\n");
|
|
}
|
|
a=(arr[i]+a)%7;
|
|
con=0;
|
|
printf("\n");
|
|
|
|
}
|
|
} //单列结束
|
|
|
|
else if(pri==2){ //双列
|
|
con=0;
|
|
int q,m;
|
|
for(int i=1;i<13;i+=2){
|
|
printf("=======================%2d月=======================\t",i);
|
|
printf("=======================%2d月=======================\n",i+1);
|
|
printf("日\t一\t二\t三\t四\t五\t六\t日\t一\t二\t三\t四\t五\t六\n");
|
|
b=(arr[i]+a)%7;
|
|
q=7-b+1;
|
|
m=7-a+1;
|
|
if(year==1582&&i==11){
|
|
a=1;b=3;m=7;q=5;
|
|
}
|
|
if(a!=0){
|
|
for(int x=1;x<=a;x++)
|
|
{
|
|
printf("\t");
|
|
}
|
|
}
|
|
|
|
for(int x=1;x<=7-a;x++)
|
|
{
|
|
printf("%d\t",x);
|
|
}
|
|
if(year==1582&&i+1==10){
|
|
printf("\t1\t2\t3\t4\t15\t16\t");
|
|
q=17;
|
|
}
|
|
else{
|
|
if(b!=0)
|
|
{
|
|
for(int x=1;x<=b;x++)
|
|
{
|
|
printf("\t");
|
|
}
|
|
}
|
|
for(int y=1;y<=7-b;y++)
|
|
{
|
|
printf("%d\t",y);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
printf("\n");
|
|
/////////////////////////////////////第一行
|
|
for(int j=m;j<=arr[i];j++)
|
|
{
|
|
|
|
printf("%d\t",j);
|
|
|
|
if(j==arr[i]&&(j+a)%7!=0){
|
|
for(int g=0;g<=7-b-1;g++){
|
|
printf("\t");
|
|
}
|
|
}
|
|
|
|
|
|
if((j+a)%7==0||j==arr[i]){
|
|
|
|
for(int y=q;y<=arr[i+1];y++){
|
|
printf("%d\t",y);
|
|
if(year==1582&&(i+1)==10){
|
|
if(y==23||y==30||y==31){
|
|
q=y+1;
|
|
printf("\n");
|
|
break;
|
|
}
|
|
|
|
else
|
|
continue;
|
|
|
|
}
|
|
else{
|
|
if(((y+b)%7==0||y==arr[i+1])&&j!=arr[i]){
|
|
q=y+1;
|
|
printf("\n");
|
|
break;
|
|
}
|
|
else if(j==arr[i]&&(y+b)%7==0&&y!=arr[i+1]){
|
|
q=y+1;
|
|
printf("\n\t\t\t\t\t\t\t");
|
|
continue;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
if(year==1582&&i==9&&j==29)
|
|
printf("\n");
|
|
|
|
|
|
}
|
|
a=(arr[i+1]+b)%7;
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
}
|
|
|
|
}
|
|
void xingqi(int year,int mon,int day){ //查询星期
|
|
int a,b,con=0;
|
|
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
|
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+1)%7;//判断某一年第一天
|
|
if(year<=1582){
|
|
a=((year-1)*365+((year-1)/4)-((year-1)/100)+((year-1)/400)+11)%7;
|
|
}
|
|
if((year%4==0&&year%100!=0)||year%400==0) //闰年
|
|
arr[2]=29;
|
|
if(year==1582){
|
|
arr[10]=21;
|
|
}
|
|
for(int i=1;i<mon;i++){
|
|
|
|
a=(a+arr[i])%7;
|
|
}
|
|
if(year==1582&&mon==10&&day>=15){
|
|
b=(day-10)%7;
|
|
}
|
|
else
|
|
b=(a+day-1)%7;
|
|
switch(b){
|
|
case 1:printf("这一天是星期一\n");break;
|
|
case 2:printf("这一天是星期二\n");break;
|
|
case 3:printf("这一天是星期三\n");break;
|
|
case 4:printf("这一天是星期四\n");break;
|
|
case 5:printf("这一天是星期五\n");break;
|
|
case 6:printf("这一天是星期六\n");break;
|
|
case 0:printf("这一天是星期日\n");break;
|
|
}
|
|
}
|
|
void run(int year){ //判断闰年
|
|
if((year%4==0&&year%100!=0)||year%400==0)
|
|
printf("%d是闰年\n",year);
|
|
else
|
|
printf("%d不是闰年\n",year);
|
|
}
|
|
bool nian(int year){
|
|
if(year>0&&year<10000)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
bool yue(int mon){
|
|
if(mon>0&&mon<13)
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
bool ri(int year,int mon,int day){
|
|
int arr[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
|
|
if((year%4==0&&year%100!=0)||year%400==0) //闰年
|
|
arr[2]=29;
|
|
if(year==1582&&mon==10&&day>4&&day<15)
|
|
return false;
|
|
if(day>0&&day<=arr[mon])
|
|
return true;
|
|
|
|
else
|
|
return false;
|
|
}
|
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
int main(){
|
|
qwe:printf("1.查询对应年份的日历\n2.查询对应日期的星期\n3.查询对应年份是否为闰年\n4.退出\n(如果需要返回请按0)\n");
|
|
printf("请选择想要执行的项目:\n");
|
|
char num[100001]; //选择项目内容
|
|
int year=0,pri=0,mon=0,day=0,a,b,c;//年份 输出方式 月
|
|
char y[100001],p[100001],m[100001],d[100001];
|
|
while(gets(num)){
|
|
year=0;pri=0;mon=0;day=0;
|
|
if(strlen(num)!=1){
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
if(num[0]=='1'){
|
|
asd: printf("请输入想要查询的年份:\n");
|
|
edc: while(gets(y)){
|
|
year=0;
|
|
if(y[0]=='0'&&strlen(y)==1){
|
|
goto qwe;
|
|
}
|
|
if(strlen(y)<=4){
|
|
for(int i=0;i<strlen(y);i++){
|
|
if(y[i]>='0'&&y[i]<='9'){
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
printf("输入有误!请重新输入:\n");
|
|
goto edc;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
else{
|
|
printf("输入有误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
|
|
}
|
|
a=strlen(y)-1;
|
|
c=strlen(y);
|
|
while(a>=0){
|
|
|
|
b=((int)y[a]-48)*pow(10,c-a-1);
|
|
year+=b;
|
|
a-=1;
|
|
}
|
|
while(!nian(year)){
|
|
printf("您输入的年份有误请重新输入:\n");
|
|
goto edc;
|
|
}
|
|
printf("请选择日历的表现形式:\n1.单列输出\n2.双列输出\n");
|
|
bnm: while(gets(p)){
|
|
|
|
if(p[0]=='0'&&strlen(p)==1){
|
|
goto asd;
|
|
}
|
|
if(strlen(p)>1||(strlen(p)==1&&(p[0]>'2'||p[0]<'1'))){
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
pri=(int)p[0]-48;
|
|
while(pri!=1&&pri!=2){
|
|
printf("请输入1或2\n");
|
|
goto bnm;
|
|
}
|
|
|
|
rili(year,pri);
|
|
//执行1 输出日历
|
|
}
|
|
else if(num[0]=='2'){
|
|
rty: printf("请输入想要查询的具体日期\n");
|
|
printf("年:");
|
|
wsx: while(gets(y)){
|
|
year=0;
|
|
if(y[0]=='0'&&strlen(y)==1){
|
|
goto qwe;
|
|
}
|
|
if(strlen(y)<=4){
|
|
for(int i=0;i<strlen(y);i++){
|
|
if(y[i]>='0'&&y[i]<='9'){
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
printf("输入有误!请重新输入:\n");
|
|
goto wsx;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
else{
|
|
printf("输入有误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
|
|
}
|
|
a=strlen(y)-1;
|
|
c=strlen(y);
|
|
while(a>=0){
|
|
|
|
b=((int)y[a]-48)*pow(10,c-a-1);
|
|
year+=b;
|
|
a-=1;
|
|
}
|
|
while(!nian(year)){
|
|
printf("您输入的年份有误请重新输入:\n");
|
|
goto wsx;
|
|
}
|
|
|
|
uio: printf("月:");
|
|
qaz: while(gets(m)){
|
|
mon=0;
|
|
if(m[0]=='0'&&strlen(m)==1){
|
|
goto rty;
|
|
}
|
|
if(strlen(m)>2||(strlen(m)<=2&&((m[0]>'9'||m[0]<'0')||((m[1]>'9'||m[1]<'0')&&m[1]!='\0')))){
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
a=strlen(m)-1;
|
|
c=strlen(m);
|
|
while(a>=0){
|
|
|
|
b=((int)m[a]-48)*pow(10,c-a-1);
|
|
mon+=b;
|
|
a-=1;
|
|
|
|
}
|
|
|
|
if(!yue(mon)){
|
|
printf("您输入的月份有误请重新输入:\n");
|
|
goto qaz;
|
|
}
|
|
printf("日:");
|
|
rfv: while(gets(d)){
|
|
day=0;
|
|
if(d[0]=='0'&&strlen(d)==1){
|
|
goto uio;
|
|
}
|
|
if(strlen(d)>2||(strlen(d)<=2&&((d[0]>'9'||d[0]<'0')||((d[1]>'9'||d[1]<'0')&&d[1]!='\0')))){
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
a=strlen(d)-1;
|
|
c=strlen(d);
|
|
while(a>=0){
|
|
|
|
b=((int)d[a]-48)*pow(10,c-a-1);
|
|
day+=b;
|
|
a-=1;
|
|
}
|
|
while(!ri(year,mon,day)){
|
|
printf("您输入的日期有误请重新输入:\n");
|
|
goto rfv;
|
|
}
|
|
xingqi(year,mon,day);
|
|
}
|
|
else if(num[0]=='3'){ //3程序
|
|
printf("请输入想要查询的年份:\n");
|
|
tgb: while(gets(y)){
|
|
year=0;
|
|
if(y[0]=='0'&&strlen(y)==1){
|
|
goto qwe;
|
|
}
|
|
if(strlen(y)<=4){
|
|
for(int i=0;i<strlen(y);i++){
|
|
if(y[i]>='0'&&y[i]<='9'){
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
printf("输入有误!请重新输入:\n");
|
|
goto tgb;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
else{
|
|
printf("输入有误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
|
|
} //判空字符
|
|
a=strlen(y)-1;
|
|
c=strlen(y);
|
|
while(a>=0){
|
|
|
|
b=((int)y[a]-48)*pow(10,c-a-1);
|
|
year+=b;
|
|
a-=1;
|
|
}
|
|
while(!nian(year)){
|
|
printf("您输入的年份有误请重新输入:\n");
|
|
goto tgb;
|
|
} //判错误年份
|
|
|
|
|
|
|
|
run(year);
|
|
}
|
|
else if(num[0]=='4')break;
|
|
|
|
else{ //判错误序号
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
printf("想要在使用一次赵思雨的无敌旋风霹雳程序吗\n1.好的\n2.婉拒\n");//继续程序
|
|
char ok[100001];
|
|
|
|
int f=ok[100001]-48;
|
|
|
|
okf: while(gets(ok)){
|
|
|
|
if(strlen(ok)>1||(strlen(ok)==1&&(ok[0]>'2'||ok[0]<'1'))){
|
|
printf("输入错误!请重新输入:\n");
|
|
continue;
|
|
}
|
|
else
|
|
break;
|
|
}
|
|
f=(int)ok[0]-48;
|
|
while(f!=1&&f!=2){
|
|
printf("请输入1或2\n");
|
|
goto okf;
|
|
}
|
|
if(f==2)break;
|
|
else if(f==1){
|
|
system("cls");
|
|
goto qwe;
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|