UIT2024_Calendar/stu2024/计科2402王娅晗.cpp
2024-12-07 16:23:34 +08:00

250 lines
4.4 KiB
C++

#include<stdio.h>
void fun(void);
int year;
int shiji;
int yue;
int ri;
int w;//星期
int y; //年份后两位
void getday(int first_day[],int y);
void shuchurili(int days[],int first_day[]);
int main()
{{
int a;
printf("查询某年某月某日的日期是周几,该年是否为闰年 请输入1\n");
printf("输入年份,输出这一年的日历,要求能够单列输出和双列输出 请输入2\n");
scanf("%d",&a);
if(a==1)
{
scanf("%d-%d-%d",&year,&yue,&ri);
if((year<=0||yue<=0||ri<=0)||(year==1582&&yue==10&&(ri==5||ri==6||ri==7||ri==8||ri==9||ri==10||ri==11||ri==12||ri==13||ri==14))
{{
printf("输入错误,请重新输入:");
scanf("%d-%d-%d",&year,&yue,&ri);
} }else {
if(yue<3)
{
year--;
yue+=12;
}
shiji=(year/100);
y=year%100;
w=shiji/4-2*shiji+y+y/4+13*(yue+1)/5+ri-1;
if(w%7==0)
printf("星期7");
else
printf("星期%d ",w%7);
if((year%4==0&&year%100!=0)||(year%400==0))
printf("闰年");
else
printf("非闰年");
}
}}
//第二部分
if(a==2)
{
//单双列输出选择
printf("请选择您要输出的格式\n");
printf("单列输出请按1\n");
printf("双列输出请按2\n");
int b;
scanf("%d",&b);
if(b==1)
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int first_day[12]={0};
int year=0;
int i=0;
int a=1;
while(a)
{
printf("请输入年份:");
scanf("%d",&year);
//报错
if(year<=0)
{
printf("输入错误,请重新输入:");
scanf("%d",&year);
}
--a;
}
//获取该年每个月所属星期
getday(first_day,year);
if((year%4==0&&year%100!=0)||(year%400==0))
days[1]=29;
//输出日历
shuchurili(days,first_day);
return 0;
}else
//双列输出
{
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int first_day[12]={0};
int year=0;
int i=0;
int a=1;
while(a)
{
printf("请输入年份:");
scanf("%d",&year);
//报错
if(year<=0)
{
printf("输入错误,请重新输入:");
scanf("%d",&year);
}
--a;
}
//获取该年每个月所属星期
getday(first_day,year);
if((year%4==0&&year%100!=0)||(year%400==0))
days[1]=29;
//输出日历
shuchurili(days,first_day);
return 0;
}
}
return 0;
}
void getday(int first_day[],int y)
{
int m=0;
int d=1;
int w=0;
for(m=3;m<=12;m++)
{
w=(d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
first_day[m-1]=w;
}
y-=1;
for (m=13;m<=14;m++)
{
w = (d+1+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;
first_day[m-13] = w;
}
}
void shuchurili(int days[],int first_day[])
{
int dyt=0;
int d=0,i=0,j=0;
for(i=0;i<12;i++)
{
dyt=first_day[i];
printf(" %2d 月 \n", i+1);
printf(" 日 一 二 三 四 五 六 \n");
//1号前的空格
//改后
for(j=0;j<dyt;j++)
printf(" ");
for(d=1;d<=days[i];d++)
{
printf(" %2d",d);
if((d+dyt)%7==0)
printf("\n");
}
printf("\n");
}
}
/*
//第二部分
#include<string.h>
//判断闰年的函数
int isleapyear(int year)
{
return ((year%4==0&&year%100!=0)||(year%400==0));
}
//计算每月天数的函数
int month(int year,int yue)
{
int run[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(yue==2&&isleapyear(year))
{
return 29;
}
return run[yue];
}
//计算给定日期是星期几(蔡勒公式)
int week(int year,int yue,int ri)
{
if(yue<3)
{
year--;
yue+=12;
}
shiji=(year/100);
y=year%100;
w=shiji/4-2*shiji+y+y/4+13*(yue+1)/5+ri-1;
return (w%7+7)%7;
}
//输出日历函数
void rili(int year)
{
char *week[]={"一","二","三","四","五","六","日"};
scanf("&d-%d-%d",&year,&yue,&ri);
for(yue=1;yue<=12;yue++)
{
int i;
printf("%d ",yue);
for(i=0;i<7;i++)
printf("%s",week[i]);
printf("\n");
int w=week(year,yue,1);//w为每月第一日是星期几
int jx=month(year,yue);
char a[w]={"0"};
char b[][7];//输出日期的数组
if((year%4==0&&year%100!=0)||(year%400==0))
{
for(int n=0;n<7;n++)
{
for(int m=1;m<jx;m++)
{
for(int e=1;e<jx;e++)
b[m][n]='e';
}
}
for(int m=0;m<6;m++)
{
for(int n=0;n<7;n++)
printf("%d",a[m][n]);
printf("\n");
}
}
}
}
*/