static int year
static int weekDay
bool isLeapYear(int y) //判断是否是闰年
{
return(y%4==0&&y%100!=0||y%400==0) //闰年的条件就是年份同时能被4和100整除或
// 者能被400整除
}
long firstDayOfYear(int y) //求出输入的那年第一天是星期几
{
long n
n=y*365
for(int i=1i<yi++)
if(isLeapYear(i))
n+=1
return n%=7
}
void printHead(int m) //打印每个月的标题
{
if(m<10)
printf(" %d月 日 一 二 三 四 五 六\n",m)
else
printf(" %d月 日 一 二 三 四 五 六\n",m)
printf(" ")
for(int i=0i<weekDayi++)
printf(" ")
}
int daysOfMonth(int m) // 判断每个月有多少天
{
switch(m)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: return 31
case 4:
case 6:
case 9:
case 11: return 30
case 2:if(isLeapYear(year))
return 29
else
return 28
}
return 0
}
void printMonth(int m) //打印每月的日历
{
printHead(m)
int days=daysOfMonth(m)
for(int i=1i<=daysi++)
{
if(i<10)
printf(" %d",i)
else
printf(" %d",i)
weekDay=(weekDay+1)%7
if(weekDay==0)
{
printf("\n")
printf(" ")
}
}
}
void main() //主程序入口,接收输入的年份,调用函数打印日历
{
int y
printf("请输入年份:")
scanf("%d",&y)
year=y
if(year<1)
{
printf("输入年份不能小于1\n")
return
}
weekDay=(int)firstDayOfYear(year)
printf(" %d年\n",year)
printf(" ========================================\n")
for(int i=1i<=12i++)
{
printf("\n")
printMonth(i)
printf("\n")
}
}
可以显示公元1世纪以后的所有年份的日历,第2和第3问其实都包含在第1问里,程序看懂了自然也就会了(话说为什么不能上传附件?)
/*C语言编程万年历要求输入年月,判断是否闰年;
输入年月日,判断星期几;
输入年份,打出12个月的月历;
输入年份,月份,打印出本月日历;
要求用多个函数实现。*/
#include<stdio.h>
#include<time.h>
#include<string.h>int calendar[12][6][7]/*月历*/
char* week[]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Satarday"}
char* Monthname[]={"January","February","March","April","May","June","July",
"August","September","October","November","December"}
int monthday[]={31,28,31,30,31,30,31,31,30,31,30,31}
char* menu[]={/* *** 作菜单*/
"1.Input a year number,check whether it's a leap year.\n",
"2.Input year,month,day,check the weekday.\n",
"3.Input year,month,output the calendar of that month.\n",
"4.Input year,output all the month calendar.\n",
"0.Exit.\n"
}/*判断参数year传递的年份是否是闰年*/
int IsLeapyear(int year)
{
if(!(year%4)&&year%100||!(year%400)) return 1
else return 0
}/*输入年月日,判断星期几,利用Zeller公式w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
w是结果星期数,y是年份的后两位,c是年份的前两位,m是月份,3≤m≤14,也就是当
m≤2时,要算到前一年的13月份和14月份,最后要将w对7取模
*/
int WeekDay(int year,int month,int day)
{
int w,y,c,m,d
c=year/100
if(month<3){
m=12+month
y=year%100-1
}
else{
m=month
y=year%100
}
d=day
w=y+y/4+c/4-2*c+26*(m+1)/10+d-1
return (w%7+7)%7
}/*输入年份,月份,打印出本月的日历*/
void Monthly(int year,int month)
{
int weekday,i,j
if(month==2)
if(IsLeapyear(year)) monthday[1]+=1
weekday=WeekDay(year,month,1)
printf("%s\n",Monthname[month-1])
printf("Sun. Mon. Tue. Wed. Thu. Fri. Sat.\n")
for(i=1,j=weekdayi<=monthday[month-1]i++,j++){
calendar[month-1][j/7][j%7]=i
}
for(i=0i<6i++){
for(j=0j<7j++)
{
if(calendar[month-1][i][j]==0) printf("%5c",' ')
else printf("%-5d",calendar[month-1][i][j])
}
printf("\n")
}
}void allMonth(int year) /*输入年份,打印出12个月的月历*/
{
int i
for(i=1i<=12i++){
Monthly(year,i)
getch()/*按任意键继续执行*/
}
}void main(void)
{
int year,month,day,i,n,weekday
memset(&calendar,sizeof(calendar),0) /*初始化月历*/
for(i=0i<5i++)
printf("%s",menu[i])
while(1){
printf("Please choose the menu:")
scanf("%d",&n)
printf("\n")
switch(n){
case 1:
printf("Please input year:")
scanf("%d",&year)
if(IsLeapyear(year)) printf("\n%d is leap year.\n",year)
else printf("%d isn't leap year.\n",year)
break
case 2:
printf("Please input year month day:")
scanf("%d%d%d",&year,&month,&day)
printf("\n")
weekday=WeekDay(year,month,day)
printf("That day is %s\n",week[weekday])
break
case 3:
printf("Please input year month,then it output a calendar of that month:")
scanf("%d%d",&year,&month)
printf("\n")
Monthly(year,month)
break
case 4:
printf("Please input year,then it will output the calendar of that year:")
scanf("%d",&year)
printf("\n")
allMonth(year)
break
case 0:
return
default:
printf("The number you input is invalid.\n")
break
}
}
getch() /*按任意键,程序退出*/
}这个程序是可用的~~希望能帮到你~~~
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)