C语言实现日历算法


C语言萌新小白之作,大佬请绕路。

本UP最近开始学习C语言了(在学校里感觉是啥也没学着)从书本中发现一个有趣的算法,偷来改了一下,给大家分享一下(督促学习),感觉以后也能为做单片机里的一个APP打下基础,话不多说直接上代码

#include<process.h>
#define COL 3 //默认一行打印3个月份日历
void main()
{
int i,j,k,m[COL];
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31},b[12];
int year,month,currentMonth,colMonth;
int col=COL; // 实际的列数
char blank[]=" " ; // 3个空格
menu:
printf("*******************************\n");
printf("清空屏幕输入999999(退出输入零)\n");
printf("*****输入年份*****:");
scanf("%d",&year);
if(year==0)exit(0);//设置一个退出方式
if(year==999999)
{
system("cls");
goto menu;
}
if(year%400==0 ||(year%100!=0 && year%4==0)) a[1]=29;
b[0]=(int) (year-1+(year-1)/4.0-(year-1)/100.0+(year-1)/400.0+1) %7; //1月1日星期数
for(i=1;i<12;i++) b[i]= (a[i-1]+b[i-1]) % 7; //计算其他月份的1号的星期数
printf("\n");
for(month=0;month<12;month=month+COL) //月份循环,步长为COL
{
if(month+COL>12) col=12-month; // 最后一行如果不够COL,修正列数
for(i=0;i<col;i++) m[i]=1;// m[i]保存当前打印的几个月份的当前要输出的日期
for(i=0;i<col;i++) //输出月份标题
{
printf("%12d月",month+i+1);
for(j=0;j<10;j++)printf(" ");
}
printf("\n\n");
for(i=0;i<col;i++) //输出星期标题
{
printf(" 日 一 二 三 四 五 六");
printf("%s", blank);
}
printf("\n");
for(i=0;i<6;i++) //每个月份均按6行输出,不足补空行
{
for(j=0;j<col;j++) // 每行COL列
{
currentMonth = month+j; // 当前月,month=0,3,6,9
//首行输出1号前面的空
if(i==0) //第1行,1号前面的空格
for(k=0;k<b[currentMonth]*3;k++) printf(" ");
while(1)
{
//currentMonth%COL : 0,1,2,...,COL-1
colMonth = currentMonth%COL;
if(m[colMonth]<=a[currentMonth])// 正常的日期
printf("%3d",m[colMonth]);
else
printf("%s", blank); // 超出范围,输出3个空格填充位置
//每个月的第i行输出完毕,判断是否需要换行或换月份
if((b[currentMonth]+m[colMonth]++) % 7 == 0)
{
if(j==col-1) // 最后1列换行
printf("\n");
else
printf("%s", blank); // 每月日历之间空3个空格
break; // 输出一行,退出while,输出下一行
}
}
}
}
printf("\n"); // 每COL个月份输出完毕,换行
}
printf("按回车继续 输出日历\n");
getchar();
getchar();
goto menu;
}

本UP为一只在学的自动化学弱狗,学习较渣。希望看官们能给个赞(代码都给你们了)