欢迎光临散文网 会员登陆 & 注册

C语言实现日历算法

2020-08-10 02:31 作者:长不大的猫猫头  | 我要投稿


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为一只在学的自动化学弱狗,学习较渣。希望看官们能给个赞(代码都给你们了)

C语言实现日历算法的评论 (共 条)

分享到微博请遵守国家法律