c語言實現萬年曆教程
阿新 • • 發佈:2018-11-29
先來看效果圖
功能就是輸入一個年月日 輸出當月的日曆
基本思路
1.列印一個日曆的模板出來
2.判斷平年還是閏年
3.設定一個時間的初始點 計算距離這一天的天數
首先列印模板
/***********************************************************************標頭檔案*****************************************************/ #include<stdio.h> /***********************************************************************函式宣告***************************************************/ void muban(); void printstar(); /***********************************************************************自定義函式*************************************************/ void muban() { int i; printf(" 萬年曆\n"); printstar(); char week[7][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"}; for(i = 0;i<7;i++) printf("%10s",week[i]); } void printstar() { printf("***********************************************************\n"); } /***********************************************************************主函式*****************************************************/ int main() { muban(); return 0; }
大家可以自己用空格調整字的位置
判斷閏年和平年具體看這篇文章https://blog.csdn.net/viafcccy/article/details/83628920
我們只需要知道我們輸入的日期的月份距離1900年的01月有多少天即可
因為百度上的萬年曆也是將19000101作為基準點
所以我們也用這一天
因為日曆實際上可以看成這樣
也就是緊密相連的 所以我們只需要算出當前月份和190001距離天數與7的餘數即可知道這個月剩下的日期是多少
所以來計數
int qiuhe(int year,int month,int day,int run[],int ping[]) { int i,sum=0; for(i=2001;i<year;i++) { int m;//用來標籤是閏年還是平年 m==1,就是閏年 m=leap(i);//函式的呼叫,函式的巢狀呼叫 if(m==1) { sum=sum+366; } else { sum=sum+365; } } //加月份的天數 for(i=0;i<month-1;i++) { if(leap(year)==1) sum=sum+run[i]; else sum=sum+ping[i]; } return sum; }
實際上是加到你輸入月份的前一個月
例如 求20181127
實際上算的是20181031到19000101的天數
然後按日曆的規律遍歷打印出來
void shibiePrint(int sum,int year,int month) { int yushu,temp,i; yushu=sum%7;//得到多餘的天數,然後在後一個月份用空格表示出來 for(i=0;i<yushu;i++) printf(" ");//輸出空格 temp=7-yushu; if(leap(year)==1) { for(i=1;i<=run[month-1];i++)//列印31天 { printf("%10d",i); if(i==temp||(i-temp)%7==0) printf("\n"); } printf("\n"); } else { for(i=1;i<=ping[month-1];i++)//列印30天 { printf("%10d",i); if(i==temp||(i-temp)%7==0) printf("\n"); } printf("\n"); } } int main() { scanf("%4d%2d%2d",&year,&month,&day); he=qiuhe(year,month,day,run,ping);//呼叫函式求和 muban();//呼叫模板函式,輸出模板 shibiePrint(he,year,month);//進行相應的識別,並輸出 printStar();//列印最後一行的星號 return 0; }
最後組合優化後所有的程式碼如下
/***************************************************************標頭檔案***************************************************/
#include<stdio.h>
/***************************************************************函式宣告*************************************************/
void printStar();
void muban();
int leap(int year);
int qiuhe(int year,int month,int day,int run[],int ping[]);
void shibiePrint(int sum,int year,int month);
/***************************************************************全域性變數**************************************************/
int year,month,day,he;
int run[12]={31,29,31,30,31,30,31,31,30,31,30,31};
int ping[12]={31,28,31,30,31,30,31,31,30,31,30,31};
/***************************************************************自定義函式*************************************************/
void printStar()
{
printf("*************************************************************************************\n");
}
void muban()
{
char weekday[7][10]={"星期一","星期二","星期三","星期四","星期五","星期六","星期天"};
int i;
printf(" 萬年曆 \n");
printStar();
for(i=0;i<7;i++)
printf("%10s",weekday[i]);
printf("\n");
}
//判斷閏年和平年
int leap(int year)
{
int four , hundred , fourhundred;
scanf("%d",&year);
four = year % 4;
hundred = year % 100;
fourhundred = year % 400;
if (four == 0 && hundred == 0 && fourhundred == 0)
return 1;
else if (four == 0 && hundred != 0 && fourhundred != 0)
return 1;
else return 0;
}
//這點到基本點的求和
int qiuhe(int year,int month,int day,int run[],int ping[])
{
//19000101 星期一
int i,sum=0;
for(i=1900;i<year;i++)
{
int m;//用來標籤是閏年還是平年 m==1,就是閏年
m=leap(i);
if(m==1)
{
sum=sum+366;
}
else
{
sum=sum+365;
}
}
//加月份的天數
for(i=0;i<month-1;i++)
{
if(leap(year)==1)
sum=sum+run[i];
else
sum=sum+ping[i];
}
return sum;
}
void shibiePrint(int sum,int year,int month)
{
int yushu,temp,i;
yushu=sum%7;//得到多餘的天數,然後在後一個月份用空格表示出來
for(i=0;i<yushu;i++)
printf(" ");//輸出空格
temp=7-yushu;
if(leap(year)==1)
{
for(i=1;i<=run[month-1];i++)//列印31天
{
printf("%10d",i);
if(i==temp||(i-temp)%7==0)
printf("\n");
}
printf("\n");
}
else
{
for(i=1;i<=ping[month-1];i++)//列印30天
{
printf("%10d",i);
if(i==temp||(i-temp)%7==0)
printf("\n");
}
printf("\n");
}
}
/**********************************************************主函式***************************************************/
int main()
{
scanf("%4d%2d%2d",&year,&month,&day);
he=qiuhe(year,month,day,run,ping);//呼叫函式求和
muban();//呼叫模板函式,輸出模板
shibiePrint(he,year,month);//進行相應的識別,並輸出
printStar();//列印最後一行的星號
return 0;
}