年历显示(控制台)
完整源码
#include "stdafx.h"
#include <time.h>
#include <CMATH>
long int f(int year, int month)
{
if (month < 3) return year - 1;
else return year;
}
long int g(int month)
{
if (month < 3) return month + 13;
else return month + 1;
}
long int n(int year, int month, int day)
{
return 1461L * f(year, month) / 4 + 153L * g(month) / 5 + day;
}
int w(int year, int month, int day)
{
return(int)((n(year, month, day) % 7 - 621049L % 7 + 7) % 7);
}
int date[12][6][7];
int day_tbl[][12] = { {31,28,31,30,31,30,31,31,30,31,30,31},{31,29,31,30,31,30,31,31,30,31,30,31} };
void days();
void fish();
int main(int argc, char* argv[])
{
printf("***************欢迎来到年历显示*****************\n");
printf("*****1、输入年份,显示该年的日历*****************\n");
printf("*****2、输入年月,显示该月的日历*****************\n");
printf("*****3、输入年月日,显示距今天多少天,是星期几,是否公历节日\n");
printf("*****4、输入日期,显示这一天是打鱼还是晒网\n");
printf("请输入您的选择:\n");
int choice;
scanf("%d", &choice);
if (choice == 1)
{
//输入年份输出日历
int sw, leap, i, j, k, wd, day;
int year;
char title[] = "SUM MON TUE WED THU FRI SAT";
printf("请输入你想知道的日历年份:\n");
scanf("%d", &year);
sw = w(year, 1, 1);
leap = year % 4 == 0 && year % 100 || year % 400 == 0;
for (i = 0; i < 12; i++)
for (j = 0; j < 6; j++)
for (k = 0; k < 7; k++)
date[i][j][k] = 0;
for (i = 0; i < 12; i++)
for (wd = 0, day = 1; day <= day_tbl[leap][i]; day++)
{
date[i][wd][sw] = day;
sw = ++sw % 7;
if (sw == 0) wd++;
}
printf("\n|================== The Calendar of Year %d==================|\n|", year);
for (i = 0; i < 6; i++)
{
for (wd = 0, k = 0; k < 7; k++)
wd += date[i][5][k] + date[i + 6][5][k];
wd = wd ? 6 : 5;
printf(" %2d %s %2d %s|\n|", i + 1, title, i + 7, title);
for (j = 0; j < wd; j++)
{
printf(" ");
for (k = 0; k < 7; k++)
if (date[i][j][k])
printf("%4d", date[i][j][k]);
else printf(" ");
printf(" ");
for (k = 0; k < 7; k++)
if (date[i + 6][j][k])
printf("%4d", date[i + 6][j][k]);
else printf(" ");
printf("|\n|");
}
}
puts("==============================================================|");
}
else if (choice == 2)
{
//输入年月 输出当月日历
int m, d, monthmax, y;
while (1)
{
printf("请输入年份:\n");
scanf("%d",&y);
printf("请输入月份:\n");
scanf("%d",&m);
//判断年份和月份
if (y % 4 == 0 || (y % 100 == 0 && y % 400 == 0))//闰年
{
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
monthmax = 31;
if (m == 2)
monthmax = 29;
if (m == 4 || m == 6 || m == 9 || m == 11)
monthmax = 30;
}
if (y % 4 != 0)//平年
{
if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12)
monthmax = 31;
if (m == 2)
monthmax = 28;
if (m == 4 || m == 6 || m == 9 || m == 11)
monthmax = 30;
}
//基姆拉尔森计算公式取得一号周几
if (m == 1 || m == 2)
{
m += 12; //一月算做上一年的十三月,二月算做上一年的十四月
y--;
}
d = (2 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7;//算出这月一号周几
if (d == 0)
{
d = 7;
}
//输出日历
{
{
//标题模块
if (m == 13)
{
printf(" 公元%d年 第1月日历\n",y+1);
}
if (m == 14)
{
printf(" 公元%d年 第2月日历\n",y+1);
}
if (m != 13 && m != 14)
{
printf(" 公元%d年 第%d月日历\n",y,m);
}
}
printf(" 1 2 3 4 5 6 7 \n");
printf("===========================\n");
for (int i = 1; i <= d - 1; i++)
{
printf(" ");
}
for (int j = 1; j <= monthmax; j++)
{
if (j < 10)
{
printf(" %d ",j);
}
if (j >= 10)
{
printf(" %d ",j);
}
if ((j + d - 1) % 7 == 0)
{
printf("\n");
}
if (j == monthmax)
{
printf("\n");
}
}
printf("\n");
}
}
}
else if (choice == 3)
{
days();
}
else if (choice == 4)
{
fish();
}
else
{
printf("输入选择错误!");
}
return 0;
}
void days()
{
struct tm* loca_t;
time_t ti;
ti = time(NULL);
loca_t = localtime(&ti);
int s_year, s_month, s_day, s_sum = 0;
static int days = 0;
static int day = 0;
int e_year, e_month, e_day, e_sum = 0;
static int leap = 0;
int tmp, tmp1, tmp2;
s_year = loca_t->tm_year + 1900;
s_month = loca_t->tm_mon + 1;
s_day = loca_t->tm_mday;
printf("输入年:\n");
scanf("%d", &e_year);
printf("输入月:\n");
scanf("%d", &e_month);
printf("输入日:\n");
scanf("%d", &e_day);
if (s_year > e_year) //判断哪个年份大,如果起始时间大于结束时间,则互换值
{
tmp = s_year;
s_year = e_year;
e_year = tmp;
tmp1 = s_month;
s_month = e_month;
e_month = tmp1;
tmp2 = s_day;
s_day = e_day;
e_day = tmp2;
}
while (s_year < e_year)
{
if (e_year % 400 == 0 || (e_year % 4 == 0 && e_year % 100 != 0)) /*判断是否为闰年*/
{
days = days + 366; /*闰年*/
}
else
{
days = days + 365; /*平年*/
}
e_year--;
}
switch (s_month)
{
case 1:s_sum = 0;
break;
case 2:s_sum = 31;
break;
case 3:s_sum = 31 + 28;
break;
case 4:s_sum = 31 + 28 + 31;
break;
case 5:s_sum = 31 + 28 + 31 + 30;
break;
case 6:s_sum = 31 + 28 + 31 + 30 + 31;
break;
case 7:s_sum = 31 + 28 + 31 + 30 + 31 + 30;
break;
case 8:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
break;
case 9:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
break;
case 10:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
break;
case 11:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
break;
case 12:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
break;
}
s_sum = s_sum + s_day; /*计算起始日期天数*/
switch (e_month)
{
case 1:e_sum = 0;
break;
case 2:e_sum = 31;
break;
case 3:e_sum = 31 + 28;
break;
case 4:e_sum = 31 + 28 + 31;
break;
case 5:e_sum = 31 + 28 + 31 + 30;
break;
case 6:e_sum = 31 + 28 + 31 + 30 + 31;
break;
case 7:e_sum = 31 + 28 + 31 + 30 + 31 + 30;
break;
case 8:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
break;
case 9:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
break;
case 10:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
break;
case 11:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
break;
case 12:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
break;
}
if (s_year % 400 == 0 || (s_year % 4 == 0 && s_year % 100 != 0))
{
if (e_month > 2)
{
day++;
}
}
e_sum = e_sum + e_day; /*计算结束日期天数*/
days = days - s_sum + e_sum + day; /*相差的天数*/
printf("输入的日期距今天还有%d天\n", abs(days)); //因天数计算可能会出现负数,abs()函数可把相差的天数变成正数
int week = 0;
if (e_month == 1 || e_month == 2)
{
e_month += 12;
e_year--;
}
week = (day + 2 * e_month + 3 * (e_month + 1) / 5 + e_year + e_year / 4 - e_year / 100 + e_year / 400) % 7;
printf("输入的日期是星期%d\n", week);
printf("输入的日期是公历\n");
}
void fish()
{
int s_year, s_month, s_day, s_sum = 0;
static int days = 0;
static int day = 0;
int e_year, e_month, e_day, e_sum = 0;
static int leap = 0;
int tmp, tmp1, tmp2;
s_year = 1990;
s_month = 1;
s_day = 1;
printf("输入年:\n");
scanf("%d", &e_year);
printf("输入月:\n");
scanf("%d", &e_month);
printf("输入日:\n");
scanf("%d", &e_day);
if (s_year > e_year) //判断哪个年份大,如果起始时间大于结束时间,则互换值
{
tmp = s_year;
s_year = e_year;
e_year = tmp;
tmp1 = s_month;
s_month = e_month;
e_month = tmp1;
tmp2 = s_day;
s_day = e_day;
e_day = tmp2;
}
while (s_year < e_year)
{
if (e_year % 400 == 0 || (e_year % 4 == 0 && e_year % 100 != 0)) /*判断是否为闰年*/
{
days = days + 366; /*闰年*/
}
else
{
days = days + 365; /*平年*/
}
e_year--;
}
switch (s_month)
{
case 1:s_sum = 0;
break;
case 2:s_sum = 31;
break;
case 3:s_sum = 31 + 28;
break;
case 4:s_sum = 31 + 28 + 31;
break;
case 5:s_sum = 31 + 28 + 31 + 30;
break;
case 6:s_sum = 31 + 28 + 31 + 30 + 31;
break;
case 7:s_sum = 31 + 28 + 31 + 30 + 31 + 30;
break;
case 8:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
break;
case 9:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
break;
case 10:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
break;
case 11:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
break;
case 12:s_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
break;
}
s_sum = s_sum + s_day; /*计算起始日期天数*/
switch (e_month)
{
case 1:e_sum = 0;
break;
case 2:e_sum = 31;
break;
case 3:e_sum = 31 + 28;
break;
case 4:e_sum = 31 + 28 + 31;
break;
case 5:e_sum = 31 + 28 + 31 + 30;
break;
case 6:e_sum = 31 + 28 + 31 + 30 + 31;
break;
case 7:e_sum = 31 + 28 + 31 + 30 + 31 + 30;
break;
case 8:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31;
break;
case 9:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31;
break;
case 10:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30;
break;
case 11:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31;
break;
case 12:e_sum = 31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30;
break;
}
if (s_year % 400 == 0 || (s_year % 4 == 0 && s_year % 100 != 0))
{
if (e_month > 2)
{
day++;
}
}
e_sum = e_sum + e_day; /*计算结束日期天数*/
days = days - s_sum + e_sum + day; /*相差的天数*/
if ((abs(days)) % 5 <= 3)
{
printf("这一天是打鱼\n");
}
else
{
printf("这一天是晒网\n");
}
}