基于C语言的万年历

时间:2021-03-31 01:41:46

大一刚学几个月C语言后写了两天的课程设计,尽管现在看来写的有些稚气,风格凌乱,但也看得出用心。留住做个回念。


#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include<conio.h>
int judge(int year) //判断该年是不是闰年
{
int a;
if(year%100==0)
if(year%400==0)
a=1;
else a=0;
else if(year%4==0)
a=1;
else a=0;
return(a);
}



int weekday(int year) //判断该年的11号是星期几
{
int a,b,c,d;
long day;
year--;
a=year/400;
b=(year%400)/100;
c=(year%100)/4;
day=365*year+97*a+24*b+c; //算该年11日距元年11日(星期一)有多少天
d=day%7;
d++; //算该年11日是周几
return(d);
}




int monthdays(int year,int i) //判断一个月多少天
{
int a,monthday;
a=judge(year);
switch(i)
{
case 1:monthday=31;break;
case 2:monthday=28+a;break;
case 3:monthday=31; break;
case 4:monthday=30; break;
case 5:monthday=31;break;
case 6:monthday=30;break;
case 7:monthday=31;break;
case 8:monthday=31;break;
case 9:monthday=30;break;
case 10:monthday=31;break;
case 11:monthday=30;break;
case 12:monthday=31;break;
}
return(monthday);
}
int main()
{
int a;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);//绿色背景
system("color 0A");
printf(" \n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━┓ \n");
printf(" ┃ 欢 迎 来 到 万 年 历 查 询 系 统 ┃ \n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛ \n");
printf(" \n");
printf(" \n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━┓ \n");
printf(" ┃ 查 询 一 年 的 日 历 请 按 1 ┃ \n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛ \n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━┓ \n");
printf(" ┃ 查 询 某 年 某 月 的 请 按 2 ┃ \n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛ \n");
printf(" ┏━━━━━━━━━━━━━━━━━━━━┓ \n");
printf(" ┃ 查 询 某 年 某 月 某日 的 请 按 3 ┃ \n");
printf(" ┗━━━━━━━━━━━━━━━━━━━━┛ \n");
printf("\n");
printf("\n");
printf("\n");
do{
printf("请输入1或2或3.\n");
scanf("%d",&a);
if(a!=1 && a!=2 && a!=3)
printf("输入错误,请重新输入。\n");
}while(a!=1 && a!=2 && a!=3);


//运行1模式

if(a==1)
{
int year,i,j,k,s,firstday,monthday;
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//system("color 3");
system("cls");
do{
printf("请输入一个年份:\n");
scanf("%d",&year);
if(year<=1)
printf("您输入的年份不符合条件,请重新输入。\n");
}while(year<=1);
system("cls");
s=judge(year);
if (s==1)
printf("%d 年为闰年,该年有366天,下面是该年的日期表:\n",year);
else printf("%d 年为平年,该年有365天,下面是该年的日期表:\n",year);
printf("\n");
firstday=weekday(year);
for(i=1;i<=12;i++) //i代表月份
{
monthday=monthdays(year,i);
printf(" %d 月\n",i);
printf("\n");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("日 ");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("一 二 三 四 五 六\n");
for(j=0;j<firstday%7;j++)
{
printf(" "); //写一个月1号前面没有星期天
}
for(k=1;k<=monthday;k++)
{
if((k+firstday)%7==1)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("%-4d",k);
}
else
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("%-4d",k);
}

SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
if((k+firstday)%7==0)
printf("\n");
}
firstday=(firstday+monthday)%7; //下个月份的1号星期几
printf("\n");
printf("\n");
}
}


//运行2模式,内容其实和模式1是一样的,这里只是把不是指定的月份对应的月历清空,剩下指定月份年的日历

if(a==2)
{

int year,i,j,p,k,s,firstday,monthday,month,day=0; //day=0 的用处是在下面如果给不是写 年月 而是写 年月日 ,会提示错误
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
system("cls");
do{
day=0;
printf("请输入一个月份,如 2014,5 表示2014年5月:\n");
scanf("%d,%d,%d",&year,&month,&day);
if(year<=1||month<1||month>13||day!=0)
printf("您输入的 年月份 不符合格式,请重新输入。\n");
}while(year<=1||year>9999||month<1||month>13||day!=0);
system("cls");
s=judge(year);
if (s==1)
printf("%d 年为闰年,该年有366天,下面是%d%d月的日期表:\n",year,month);
else printf("%d 年为平年,该年有365天,下面是%d%d月的日期表:\n",year,month);
printf("\n");
firstday=weekday(year);
for(i=1;i<13;i++) //i代表月份
{
system("cls");
monthday=monthdays(year,i);
printf(" %d 月\n",i);
printf("\n");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("日 ");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("一 二 三 四 五 六\n");
for(j=0;j<firstday%7;j++)
{
printf(" "); //写一个月1号前面没有星期天
}
for(k=1;k<=monthday;k++)
{
if((k+firstday)%7==1)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("%-4d",k);
}
else
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("%-4d",k);
}
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
if((k+firstday)%7==0)
printf("\n");
}
firstday=(firstday+monthday)%7; //下个月份的1号星期几
printf("\n");
printf("\n");
if(i==month)
{
for(p=0;p<firstday%7;p++)
{
printf(" "); //写一个月1号前面没有星期天
}
break;
}
}
printf("\n");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
if (s==1)
printf("%d 年为闰年,该年有366天,以上是 %d%d月 的日期表:\n",year,year,month);
else printf("%d 年为平年,该年有365天,以上是 %d%d月 的日期表:\n",year,year,month);
}





//以下是3模式,内容其实和模式1是一样的,这里只是把不是指定的月份对应的月历清空,剩下指定月份年的日历,并且如果当期满足输入的天时,变为高亮色
if(a==3)
{

int year,i,j,p,k,s,firstday,monthday,month,day=0,whichday; //用于检查输入的天数是星期天
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
system("cls");
do{
printf("请输入一个 年月日,如 2014,5,30 表示2014年5月30号\n");
scanf("%d,%d,%d",&year,&month,&day);
if(year<=1||month<1||month>13||day==0)
printf("您输入的 年月日 格式不符合要求,请重新输入。\n");
}while(year<=1||month<1||month>13||day==0);
system("cls");
s=judge(year);
if (s==1)
printf("%d 年为闰年,该年有366天,下面是%d%d月的日期表:\n",year,month);
else printf("%d 年为平年,该年有365天,下面是%d%d月的日期表:\n",year,month);
printf("\n");
firstday=weekday(year);
for(i=1;i<13;i++) //i代表月份
{
system("cls");
monthday=monthdays(year,i);
printf(" %d 月\n",i);
printf("\n");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("日 ");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("一 二 三 四 五 六\n");
for(j=0;j<firstday%7;j++) //用于排版
{
printf(" "); //写一个月1号前面没有星期天
}
for(k=1;k<=monthday;k++)
{

if((k+firstday)%7==1)
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
if(k==day)
{
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);//当k是输入天数时,日期变成高亮
printf("%-4d",k);
whichday=7; //记录这一天是星期天

}
else
{
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED);//红色的周末
printf("%-4d",k);
}
}
else
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
if(k==day)
{
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //当k是输入天数时,日期变成高亮
printf("%-4d",k);
whichday=(k+firstday)%7-1; //记录这一天是星期几
}
else
{
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY| FOREGROUND_GREEN);//绿色的一到六
printf("%-4d",k);
}
}
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); //变成白色
if((k+firstday)%7==0)
printf("\n");
}
firstday=(firstday+monthday)%7; //下个月份的1号星期几
printf("\n");
printf("\n");
if(i==month)
{
for(p=0;p<firstday%7;p++)
{
printf(" "); //写一个月1号前面没有星期天
}
break;
}
}
printf("\n");
SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);//变成白色
if (s==1)
printf("%d 年为闰年,该年有366天,以上是 %d%d%d日 对应的日期表,这一天是星期 %d \n",year,year,month,day,whichday);
else
printf("%d 年为平年,该年有365天,以上是 %d%d%d日 对应的日期表,这一天是星期 %d \n",year,year,month,day,whichday);
}
return 0;
}


2014年3月