c語言實現萬年曆
摘要:介紹使用c語言實現萬年曆的列印與輸出。
關鍵字:c;萬年曆;列印與輸出
一 引言
萬年曆是我們日常生活中經常用到的一種非常實用的工具。由於工作繁忙,人們常常忘記某一天是星期幾,或者想快速地查詢某一年中某一天是星期幾,這裡萬年曆就能派上用場了。本文將介紹一種萬年曆的實現方法,通過c語言程式設計實現基本的萬年曆查詢功能,讀者可以在本文的基礎上開發出更具個性化的萬年歷來。
二 設計思想
由於萬年曆具有以下特點:
1 平年365天(52周+1天),閏年366天(52周+2天),平年2月28天,閏年2月29天。由於公元1月1日設為星期六,故3月1日為星期三。為使演算法達到最簡,故本演算法以「星期」為計算單位,且選3月1日為基月。
2 每400年整一閏,或每4年且不為百年的一閏,即凡能被400整除,或不能被100整除但能被4整除的年份為閏年。
3 每 4年(3個平年+1個閏年)共208周+5天
每百年共100*(208周+5天)-1天=5217周+5天
每400年共4*(5217周+5天)+1天(整400年閏)=20871周+0天,即每400年乙個輪迴。
三 萬年曆實現的方法
1 程式預處理
程式預處理包括標頭檔案載入、巨集定義和全域性變數的定義。
#include"stdio.h"
#include"dos.h"
#include"conio.h"
#include"stdlib.h"
#defineleapyear (x) (x%4==0&&x%100!=0||x%400==0
)?1:0
structdate systime;
2 功能控制模組
功能控制模組包括每月天數判定功能、每年天數判定功能、星期計算功能。分別由函式monthnum()、yearnum()、isweek()和*getweek()
(1) int monthnum(inty,int m),判定每月天數。
(2) int yearnum(int y),判定第年天數。
(3) int isweek(inty,int m),根據給定年月計算該月第一天對應的星期。
(4) char *getweek(inty,int m,int d),根據給定年月日計算其對應的星期。
intmonthnum(int y,int m)
int month[13]=;
if(leapyear(y))
month[2]=29;/*閏年二月29天,平年28天*/
return month[m];
intyearnum(int y)
int t=365; /*平年365天*/
t+=leapyear(y);/*閏年366天*/
return t;
intisweek(int y,int m)
int year=1900,week=1,i; /*定義萬年曆是從2023年開始*/
long sum=0;
for(i=year;isum+=yearnum(i);
for(i=1;isum+=monthnum(y,i);
i=sum%7;
week=(week+i)%7;
return week;
char*getweek(int y,int m,int d)
char *eweek; int week;
week=(d+isweek(y,m)-1)%7; /*計算星期*/
switch(week)
case 0:eweek="sunday";break;
case 1:eweek="monday";break;
case 2:eweek="tuesday";break;
case 3:eweek="wendesday";break;
case 4:eweek="thursday";break;
case 5:eweek="friday";break;
case 6:eweek="sadurday";break;
return eweek ;
3 日曆顯示模組
日曆顯示是本程式的核心模組,該模組實現了日曆的生成和顯示功能。該模組由empty()函式和disp()函式實現。
(1) void empty(int n),控制每個月開始輸出的空格。
(2) void disp(int y,int m,int d),控制日曆的生成與顯示。
voidempty(int n)
int i;
for(i=0;iprintf("%*c",6,' ');
voiddisp(int y,int m,int d)
int week,i,num,t;
week=isweek(y,m);
printf("%6d/%02d/%02d\n",y,m,d);
printf("%6s%6s%6s%6s%6s%6s%6s\n","sun","mon","tue","wed","thu","fri","sat");
empty(week);
num=monthnum(y,m);
for(i=1;i<=num;i++)
printf("%6d",i);
t=(week+i)%7;
if(t==0)
printf("\n");
} /*游標移到下一行*/
printf("\n");
4 功能選擇模組
功能選擇模組實現程式功能的選擇,由函式select_mean()實現。
intselect_mean()
int sm;
printf("1. output calender\n");/*輸出當前月份的日曆*/
printf("2. query\n");/*查詢*/
printf("3. quit\n"); /*幫助*/
printf("please enter choose(1--3):");/*從1-3中選擇*/
doscanf("%d",&sm); /*輸入sm*/
while(sm<1||sm>4);
return sm;
5 主函式
本程式的主函式首行通過系統函式getdate()獲取系統日期,作為日曆顯示的初始化日期,然後迴圈呼叫功能模組,通過功能模組函式select_mean()來實現各個功能的操作。
voidmain()
intyear,year1,month,day,y1,m1,d1,y2,m2,d2,c,t;
int inkeyscan,inkey; /*輸入鍵盤操作資訊*/
getdate(&systime);
year=systime.da_year;
month=systime.da_mon;
day=systime.da_day;
year1=year;
printf("today is%d/%02d/%02d\n",year,month,day);
while(1)/*當選擇為1時,執行以下語句*/
switch(select_mean())
case 1:
disp(year,month,day); /*輸出日曆*/
while(1)
inkey=bioskey(0);
inkeyscan=(inkey&0xff00)>>8;
if(inkeyscan==77)
if(month==12)
month=1;year1++;
disp(year1,month,day);
else
month++;
disp(year1,month,day);
if(inkeyscan==75)
if(month==1)
month=12;year1--;
disp(year1,month,day);
else
month--;
disp(year1,month,day);
if(inkeyscan==73)
if(year1==1900)
year1=year;
else
year1--;
disp(year1,month,day);
if(inkeyscan==81)
year1++;
disp(year1,month,day);
if(inkeyscan==28)
break;
break; /*終止迴圈*/
case 2:
printf("pleaseinput(eg:2001,12,1)");
scanf("%d,%d,%d",&y2,&m2,&d2);
disp(y2,m2,d2);
printf("%d/%02d/%02d--%s\n",y2,m2,d2,getweek(y2,m2,d2));
break;
case 3:
exit(0);
default:
printf("entererror!\n");
break;
萬年曆 C語言
顯示效果 大概步驟 1.顯示主介面 void showmenu char temp 10 2.判斷是否為閏年 bool isleap int year 3.計算總天數 int daysum int year,int month 4.顯示日曆 showcalendar int sum,int year...
C實現萬年曆
要求 輸入年份輸出這一年的日曆 注意 公元1900年一月一日是星期一,這一年是平年 思路 獲取輸入的年份y,首先獲取從公元1900年到 y 1 年 的天數,然後獲得該年份的第一天是星期幾,進行輸出。這次例項,我花費了很長的時間,最後發現錯誤的原因出在在求某一年是閏年還是平年的時候,我沒有田間retu...
C語言列印萬年曆
date.h檔案如下 列印萬年曆從1900年起 ifndef date h define date h include define out of year 1 是否是閏年 bool isleap int year 從year到1900年間閏年個數 int leapyearnum int year ...