关键是算那一年的第一天是周几
给你个基本算法,一年是365天,闰年366天
364是7的倍数,这样一年多出一天,中间多少个闰年,在加上相应的天数即可
400年多出来的天数是400+97=497也是7的倍数,那么400年一轮回,这样就算400年以内的即可
一个子函数,返回这一年的第一天是周几,很好做
int ye(int year)
{
int y=year%400
int day=y
int i
for(i=0i<yi++)
if(闰年判断)
day++
return day%7
}
做一个月份天数的全局数组
int mo[12]={31,28,31,30,31,30,31,31,30,31,30,31}
需要时用一个if判断闰年改变m0[1]的值是28还是29
打印子函数,有一个小技巧,就是每个月前面的空缺部分,这个1月份是ye子函数的返回值,后面的你看和前面月份是不是重合啊,吧这个记录下来在下一月份用即可
1 2
3 4
这样月份排列更好打印一些,你的那个截图有点麻烦
int pr(int year)
{
int k=ye(year)
int i,j,
if(闰年判断)
mo[1]=29
else
mo[1]=28
for(i=0i<12i++)
{
printf("周几英文的打印")
for(j=0j<kj++)
printf("一般是四个空格,就是月份前面空缺的打印")
for(j=1j<=mo[i]j++)
{
printf("%4d",j)
k++
if((k+j)%7==0)
printf("\n")
}
k%=7
if(k!=0)
printf("\n")
}
}
如果像你那样,感觉需要赋值一个大一点的数组,在吧数组打印出来更好,呵呵
scanf("%c",c)这个变量c干嘛不给地址呢?!还有,这个程序写得。。。说实话,比较乱,提示说明文字也是在乱用,不看代码直接运行的话,完全叫人看不懂。好几年没有写c程序了,过会儿给你试着改的工整点。。。还有,不要一直用while(1)这种结构和break没必要的。#include <stdio.h>
void print_days(int days_before, int num_days)
{
int y
printf("****************************************************\n")
printf("SUN\tMON\tTUE\tWED\tTHU\tFRI\tSAT\n")
y = days_before % 7
switch(y)
{
case 1:printf("\t")break
case 2:printf("\t\t")break
case 3:printf("\t\t\t")break
case 4:printf("\t\t\t\t")break
case 5:printf("\t\t\t\t\t")break
case 6:printf("\t\t\t\t\t\t")break
default:break
}
for(int i = 1i <= num_daysi++)
{
printf("%d\t",i)
if( (i + y) % 7 == 0)
printf("\n")
}
printf("\n")
}
void main()
{
int t, h, day
char c
do
{
do
{
printf("Enter month in 2013 to display calendar (1-12):\n")
scanf("%d", &t)
} while (t <= 0 || t >12)
switch (t)
{
case 1:h=2day=31break
case 2:h=31day=28break
case 3:h=31+28day=31break
case 4:h=31+28+31day=30break
case 5:h=31+28+31+30day=31break
case 6:h=31+28+31+30+31day=30break
case 7:h=31+28+31+30+31+30day=31break
case 8:h=31+28+31+30+31+30+31day=31break
case 9:h=31+28+31+30+31+30+31+31day=30break
case 10:h=31+28+31+30+31+30+31+31+30day=31break
case 11:h=31+28+31+30+31+30+31+31+30+31day=30break
case 12:h=31+28+31+30+31+30+31+31+30+31+30day=31break
default:break
}
print_days(h, day)
gets(&c)
printf("Would you like to display another month (y/n) ?")
scanf("%c",&c)
} while (c =='y' || c=='Y')
}
/*不过除了没有查询某年某月某日是这一年的第几天。。和判断这一年的生肖外,都能满足你的要求。加点金币帮你完善点!*/
#include<stdio.h>
int
Swiss(int
Years)
//判断是否是闰年
{
if(!(Years%100))
{
Years=Years/100
}
if(Years%4)
{
return
0
}
else
{
return
1
}
}
int
Number(int
Yearsa,int
Yearsb)
//已知两个年份,求出两个年份之间闰年的个数
{
int
i=Yearsa+1
int
mou=0
do{
if(Swiss(i))
{
mou++
}
i++
}while(i<Yearsb)
return
mou
}
int
Mvalue(int
Years,int
Month,int
Day)
//已知年月日,求出某年某月某日是星期几
{
int
M[12]={0,3,3,6,1,4,6,2,5,0,3,5}
//月值
int
N=6
//年值初始化
int
a
if(Years<2006)
//求年值,年值以2006年为基数
{
N=6-((2006-Years)%7)-Number(Years,2006)
if(Swiss(Years))
{
if(Month<3)
{
N--
}
}
}
else
if(Years>2006)
{
N=((Years-2006)%7)-1+Number(2006,Years)
if(Swiss(Years))
{
if(Month>2)
{
N++
}
}
}
a=(Day+M[Month-1]+N)%7
//某年某月某日是星期几=(日值+月值+年值)%7
return
a
}
int
Amonth(int
Month)
//已知月,求出这个月是大月还是小月
{
switch(Month)
{
case
1:
case
3:
case
5:
case
7:
case
8:
case
10:
//1,3,5,7,8,10,12是大月,没月31天
case
12:return
1
case
4:
case
6:
case
9:
case
11:return
0
//4,6,9,11是小月,每月30天
case
2:return
2
//二月份
}
return
-1
}
void
main
()
{
int
Dtable[7][7]
int
i,j
int
Years=9999
int
Month=12
int
Day=1
int
b
for(i=0i<7i++)
//初始化数组
{
Dtable[0][i]=i
}
for(i=1i<7i++)
{
for(j=0j<7j++)
{
Dtable[i][j]=0
}
}
i=Mvalue(Years,Month,Day)
switch(Amonth(Month))
{
case
0:b=30break
case
1:b=31break
case
2:if(Swiss(Years))b=29else
b=28break
//闰年2月29天,平年二月28天
default:b=-1break
}
for(i<7i++)
{
Dtable[1][i]=Day++
}
for(i=2i<7i++)
{
for(j=0j<7j++)
//建造日历表
{
if(Day<=b)
{
Dtable[i][j]=Day++
}
else
{
continue
}
}
}
printf("%d:%d\n",Years,Month)
for(i=0i<7i++)
//输出日历表
{
for(j=0j<7j++)
{
printf("%3d",Dtable[i][j])
}
printf("\n")
}
getch()
//完毕!
}