C語言實現(xiàn)日歷算法


C語言萌新小白之作,大佬請繞路。

本UP最近開始學習C語言了(在學校里感覺是啥也沒學著)從書本中發(fā)現(xiàn)一個有趣的算法,偷來改了一下,給大家分享一下(督促學習),感覺以后也能為做單片機里的一個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; // 實際的列數(shù)
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日星期數(shù)
for(i=1;i<12;i++)? b[i]= (a[i-1]+b[i-1]) % 7;? //計算其他月份的1號的星期數(shù)
printf("\n");
for(month=0;month<12;month=month+COL) //月份循環(huán),步長為COL
{
if(month+COL>12) col=12-month; // 最后一行如果不夠COL,修正列數(shù)
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("按回車繼續(xù) 輸出日歷\n");
getchar();
getchar();
goto menu;
}

本UP為一只在學的自動化學弱狗,學習較渣。希望看官們能給個贊(代碼都給你們了)