265 lines
5.8 KiB
C++
265 lines
5.8 KiB
C++
#include "stdio.h"
|
||
/*判断闰年*/
|
||
int leap(int year)
|
||
{
|
||
return ((year % 4 == 0 && year % 100!= 0) || year % 400 == 0);
|
||
}
|
||
|
||
/*获取某月的天数*/
|
||
int ji_suan_tian_shu(int month, int year)
|
||
{ if(year==1582&&month==10)
|
||
{
|
||
return 21;
|
||
}
|
||
if (month == 2) {
|
||
return leap(year)? 29 : 28;
|
||
} else if (month == 4 || month == 6 || month == 9 || month == 11) {
|
||
return 30;
|
||
} else {
|
||
return 31;
|
||
}
|
||
}
|
||
|
||
/*计算1月1日是星期几*/
|
||
int ji_suan_di_yi_tian(int year)
|
||
{
|
||
int K=year%100;
|
||
int J=year/100;
|
||
if(year<1582)
|
||
{
|
||
return (1+(13*(1+1))/5+K+K/4+5-J)%7;
|
||
|
||
}
|
||
else
|
||
{
|
||
return (1+(13*(1+1))/5+K+K/4+J/4+5*J)%7;
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
/*输出日历的星期单列*/ void xing_qi()
|
||
{
|
||
printf(" 日 一 二 三 四 五 六\n");
|
||
}
|
||
/*处理1582年单列*/void chu_li_1582_nian_10_yue_de_ri_li(int *di_yi_tian)
|
||
{
|
||
|
||
|
||
for (int i=0;i<*di_yi_tian;i++)//在前面加空格
|
||
{
|
||
printf("");
|
||
}
|
||
|
||
for (int day=1;day<=4;day++)//输出1到4号
|
||
{
|
||
printf("%5d",day);
|
||
if ((*di_yi_tian+day-1)%7==6)//到了周六换行
|
||
{
|
||
printf("\n");
|
||
}
|
||
}
|
||
|
||
|
||
int x=5;
|
||
for (int day=15;day<=31;day++)//输出15号及之后
|
||
{
|
||
if ((*di_yi_tian+x-1)%7==0)//一周换行
|
||
{
|
||
printf("\n");
|
||
}
|
||
printf("%5d",day);
|
||
x++;
|
||
}
|
||
printf("\n");
|
||
//*di_yi_tian=(*di_yi_tian+21)%7;
|
||
}
|
||
/*输出某月的日历单列*/void shu_chu_yue_ri_li(int month, int year) {
|
||
int zhe_ge_yue_you_duo_shao_tian = ji_suan_tian_shu(month, year);
|
||
int zhe_ge_yue_di_yi_tian = ji_suan_di_yi_tian(year);
|
||
for (int i = 1; i < month; i++) //计算某月前面的月有多少天
|
||
{
|
||
zhe_ge_yue_di_yi_tian+= ji_suan_tian_shu(i, year);
|
||
}
|
||
zhe_ge_yue_di_yi_tian%= 7;//计算前面月的最后一天是周几
|
||
|
||
xing_qi();
|
||
|
||
|
||
/*输出前面的空格*/for (int i = 0; i <zhe_ge_yue_di_yi_tian ; i++) {
|
||
printf(" ");
|
||
}
|
||
|
||
|
||
/*处理1582年10月少的那10天*/if (year == 1582 && month == 10)
|
||
{
|
||
chu_li_1582_nian_10_yue_de_ri_li(&zhe_ge_yue_di_yi_tian);
|
||
//两个函数结合,准确输出1582年10月的月历
|
||
}
|
||
else {
|
||
// 输出其余日期
|
||
for (int i = 1; i <=zhe_ge_yue_you_duo_shao_tian; i++) {
|
||
printf("%5d", i);
|
||
if ((zhe_ge_yue_di_yi_tian + i) % 7 == 0) {
|
||
printf("\n");
|
||
}
|
||
}
|
||
}
|
||
if ((zhe_ge_yue_di_yi_tian + zhe_ge_yue_you_duo_shao_tian) % 7!= 0) {
|
||
printf("\n");//当前月1号星期加上有多少天判断是不是整的周数
|
||
}//判断该月最后一行是不是完整的
|
||
}
|
||
/*输出一年的日历*/ void shu_chu_ri_li(int year)
|
||
{
|
||
for (int month = 1; month <= 12; month++)
|
||
{
|
||
printf(" %d月\n", month);
|
||
shu_chu_yue_ri_li(month, year);
|
||
printf("\n");
|
||
}
|
||
}
|
||
/*输出一年的日历双列*/
|
||
void shu_chu_ri_li_2(int year)
|
||
{
|
||
int kai_shi_day[12];
|
||
kai_shi_day[0]=ji_suan_di_yi_tian(year);//储存开始日期
|
||
for (int month=1;month<12;month++) //计算每月起始星期几
|
||
{
|
||
kai_shi_day[month]=(kai_shi_day[month-1]+ji_suan_tian_shu(year,month))%7;//将每个月起始星期储存
|
||
}
|
||
|
||
const char *yue_fen[]={"1月", "2月", "3月", "4月", "5月", "6月","7月", "8月", "9月", "10月", "11月", "12月"};
|
||
|
||
for (int i = 0; i < 6; i++) //每行两个月
|
||
{
|
||
printf("\n");
|
||
for (int j = 0; j < 2; j++) //两个月的标题
|
||
{
|
||
int month = i * 2 + j + 1;
|
||
printf(" %d %s ",year,yue_fen[month-1]);
|
||
}
|
||
printf("\n");
|
||
for (int j = 0; j < 2; j++)//星期标题
|
||
{
|
||
printf("日 一 二 三 四 五 六 ");
|
||
}
|
||
printf("\n");
|
||
|
||
int zui_duo_days[2] = { ji_suan_tian_shu(year, i * 2 + 1), ji_suan_tian_shu(year, i * 2 + 2) };//两个月的最大天数
|
||
int kai_shi_days[2] = { kai_shi_day[i * 2], kai_shi_day[i * 2 + 1] };//起始星期几
|
||
|
||
//打印日期
|
||
int day[2] = {1, 1}; //每个月的当前日期
|
||
int sheng_yu_days = 1; //是否有剩余日期
|
||
while (sheng_yu_days)//判断是否有剩余
|
||
{
|
||
sheng_yu_days = 0;
|
||
|
||
for (int j = 0; j < 2; j++)
|
||
{
|
||
if (day[j] == 1)//打印空格
|
||
{
|
||
for (int k = 0; k < kai_shi_days[j]; k++)
|
||
{
|
||
printf(" ");
|
||
}
|
||
}
|
||
while (day[j] <= zui_duo_days[j] && ((day[j] + kai_shi_days[j] - 1) % 7) != 6)//打印日期
|
||
{
|
||
printf("%2d ",day[j]++);
|
||
sheng_yu_days=1;//设置为1表示未打印完
|
||
}
|
||
|
||
|
||
if (day[j] <= zui_duo_days[j])//最后一个日期,换行并进入下一个月
|
||
{
|
||
printf("%2d ",day[j]++);
|
||
sheng_yu_days=1;
|
||
} else
|
||
{
|
||
printf(" "); //填充空格
|
||
}
|
||
|
||
printf(" "); //每月之间的间隔
|
||
}
|
||
printf("\n");
|
||
}
|
||
}
|
||
}
|
||
int main()
|
||
{
|
||
int x;
|
||
for(;x!=4;)
|
||
{
|
||
printf(" menu\n ");
|
||
printf("1.判断是否是闰年\n");
|
||
printf("2.查询这一年的某一天是周几\n");
|
||
printf("3.输出这一年的日历\n");
|
||
printf("4.退出程序\n");
|
||
printf("扣1,2,3,4来选择功能\n");
|
||
scanf("%d",&x);
|
||
if(x>4)
|
||
{
|
||
printf("请从1 2 3 4中选择输入\n");
|
||
}//if的括号
|
||
|
||
else if(x==1)
|
||
{
|
||
int year;
|
||
printf("请输入年份:\t");
|
||
scanf("%d",&year);
|
||
if((year%4==0&&year%100!=0)||year%400==0)
|
||
printf("是闰年\n");
|
||
else
|
||
printf("是平年\n");
|
||
}
|
||
|
||
|
||
else if(x==2)
|
||
{
|
||
int year;
|
||
int month;
|
||
int day;
|
||
printf("请输入日期 (输入格式为 年 月 日):");
|
||
scanf("%d %d %d",&year,&month,&day);
|
||
if(year==1582&&month==10&&day>4&&day<15);
|
||
printf("不存在这一天,请重新输入 (输入格式为 年 月 日):\t");
|
||
scanf("%d %d %d",&year,&month,&day);
|
||
const char *chu_chun_xing_qi[]={"六","日","一","二","三","四","五"};
|
||
int K=year%100;
|
||
int J=year/100;
|
||
int w;
|
||
if(year<1582||(year==1582&&(month<10||(month==10&&day<=4))))
|
||
{
|
||
w=(day+(13*(month+1))/5+K+K/4+5-J)%7;
|
||
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
|
||
}
|
||
else
|
||
{
|
||
w=(day+(13*(month+1))/5+K+K/4+J/4+5*J)%7;
|
||
printf("这一天是周%s\n",chu_chun_xing_qi[w]);
|
||
}
|
||
}
|
||
|
||
else if(x==3)
|
||
{
|
||
int year;
|
||
printf("请输入年份:\t");
|
||
scanf("%d",&year);
|
||
printf("扣1 2选择\n1.单列\n2.双列\t");
|
||
int c;
|
||
scanf("%d",&c);
|
||
if(c==1)
|
||
{
|
||
shu_chu_ri_li(year);
|
||
}
|
||
else if(c==2)
|
||
{
|
||
shu_chu_ri_li_2(year) ;
|
||
}
|
||
}
|
||
}//for的括号
|
||
return 0;
|
||
}
|