#include<stdio.h>
void Printmonth()//这里就不需要传参了,因为y,m都在函数内部定义完了,不需要外界传递给他
{
int c,i,j,a,w//这里只需要知道每个月的第一天对应的星期就可,因而不需要定义数组
int y,m,s,b=1,d,n,g
printf("《显示月历》输入年月:")
scanf("%d%d",&y,&m)
printf(" 第%d年,%d月月历: \n",y,m)//这里如果加上&就意味着输出y和m的地址
printf("周日\t周一\t周二\t周三\t周四\t周五\t周六")
for(a=1a<=31a++)
{
if (m==1) c=a
else if (m==2) c=31+a
else if (m==3) c=31+28+a
else if (m==4) c=31+28+31+a
else if (m==5) c=31+28+31+30+a
else if (m==6) c=31+28+31+30+31+a
else if (m==7) c=31+28+31+30+31+30+a
else if (m==8) c=31+28+31+30+31+30+31+a
else if (m==9) c=31+28+31+30+31+30+31+31+a
else if (m==10) c=31+28+31+30+31+30+31+31+30+a
else if (m==11) c=31+28+31+30+31+30+31+31+30+31+a
else if (m==12) c=31+28+31+30+31+30+31+31+30+31+30+a
if (m>2)
{
if (y%100==0)
{
if (y%400==0)c=c+1
}
else if (y%4==0)
c=c+1
}
// s=(y-1)*365+(y-1)/4-(y-1)/100+(y-1)/400+c
//蔡勒公式:
//W=y+[y/4]+[c/4]-2*c+[26*(m+1)/10]+d-1
//W:是星期
//C:世纪-1,其中,世纪:公元是年份前两位+1
//Y:年(年份后两位数)
//M:月(m>=3 && m<14) 即某年的1、2月要看作上一年的13、14月来计算,比如2003年的1月1日要看做是2002年的13月1日来计算
//D:日
//[]:代表取整
//结果W%7为星期几
//如果w<0,则将w+7操作
if(m<3)
{
y-=1
m+=12
}
d=1//此处计算月份的第一天的星期
n=y/100
g=y%100
s=g+g/4+n/4-2*n+26*(m+1)/10+d-1
w=s%7
if(w<0)w+=7
}
/*if(w==1)
{
for(i=1i<=6i++)
{
*/
printf("\n")
if(w!=6)
{
for(i=0i<wi++)
{
printf("\t")
b++
}
}
for(j=1j<=cj++,b++)
{
printf("%d\t",j)
if(b%7==0)printf("\n")
}
}
int main()
{
Printmonth()
}
#include <stdio.h>int main()
{
int i,j,a
scanf("%d",&a)
if(a==7)
{
a=0
}
else
{
a=a
}
printf("Sun Mon Tue Wed Thu Fri Sat\n")
for(i=1i<=ai++)
{
printf("%4c",' ')
}
for(j=1j<=30j++)
{
if((j+a)%7==0)
{
printf("%3d",j)
printf("\n")
}
else
printf("%3d ",j)
}
return 0//返回值
}
程序可以运行,就记得给main函数增加返回值,删去没有使用到的b和c就行了,其他正常
我这儿有一个万年历的程序,楼主可以试着编写实现你所需要的功能。希望有所帮助。#include<stdio.h>
#include<stdlib.h>
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}
int n[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}
char w[7][3]={"日","一","二","三","四","五","六"}
char mon[13][7]={"","一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"}
/*判断是否为闰年*/
int IsLeap(int year)
{
if((year%4==0 &&year%100!=0)||(year%400==0))
return 1
else
return 0
}
/*计算某年某月某日是星期几*/
int Getweekday(int year,int month,int day)
{
int weekday
int dayCount=0
int i
if(IsLeap(year))
{
for(i=1i<monthi++)
dayCount+=n[i]
}
else
{
for(i=1i<monthi++)
dayCount+=m[i]
}
dayCount=dayCount+day
weekday=((year-1)+(year-1)/4-(year-1)/100+(year-1)/400+dayCount)%7
return weekday
}
/*判断某年某月某日是星期几的函数*/
void SelectDay()
{
int year,month,day
char ch
int weekday
printf("请输入年月日(xxxx-xx-xx):\t")
scanf("%d-%d-%d",&year,&month,&day)
weekday=Getweekday(year,month,day)
printf("\n")
printf("%d年%d月%d日是:星期%s\n",year,month,day,w[weekday])
printf("\n您还需要继续查询吗?\t是(Y)/否(N)")
getchar()
ch=getchar()
if(ch=='y'||ch=='Y')
SelectDay()
}
/*输出某月的日历*/
void GetMonth(int year,int month )
{
int weekday,i,monthday
weekday=Getweekday(year,month,1)
printf("日\t一\t二\t三\t四\t五\t六\n")
for(i=0i<weekdayi++)
printf("\t")
if(IsLeap(year))
monthday=n[month]
else
monthday=m[month]
for(i=1i<=monthdayi++)
{
printf("%2d\t",i)
weekday++
if(weekday%7==0)
printf("\n")
}
printf("\n")
}
/*打印某年某月日历函数*/
void Month()
{
int year,month
char ch
printf("请输入年月(xxxx-xx):\t")
scanf("%d-%d",&year,&month)
printf("\n")
GetMonth(year,month )
printf("\n您还需要继续查询吗?\t是(Y)/否(N)")
getchar()
ch=getchar()
if(ch=='y'||ch=='Y')
Month()
}
/*打印某年日历函数*/
void Year()
{
int year,i
char ch
printf("请输入年份:\n")
scanf("%d",&year)
for(i=1i<=12i++)
{
printf("%s\n",mon[i])
GetMonth(year,i)
printf("\n\n")
}
printf("\n您还需要继续查询吗?\t是(Y)/否(N)")
getchar()
ch=getchar()
if(ch=='y'||ch=='Y')
Year()
}
/*退出程序*/
void Exit()
{
char ch
getchar()
printf("是否确定退出?\t是(Y)/否(N)")
ch=getchar()
if(ch=='y'||ch=='Y')
printf("感谢您的使用!!\n\n")
exit(0)
}
/*主函数*/
void main()
{
int choice
while(1)
{
printf("欢迎使用该系统!!\n")
printf("**===**===**===**===**===**===**===**===**===**\n")
printf("1.查询某年某月某日是星期几\n")
printf("2.打印某年某月的全月日历\n")
printf("3.打印某年的全年日历\n")
printf("4.退出系统\n")
printf("**===**===**===**===**===**===**===**===**===**\n")
printf("请输入您需要进行的操作前面的序号: ")
scanf("%d",&choice)
switch(choice)
{
case 1:SelectDay() break
case 2:Month() break
case 3:Year() break
case 4:Exit() break
}
}
}