如何用C语言打出一个月历表
问题描述:
要求输入年月,输出对应的月历表,月历表要契合标准日历,第一行从星期一开始,星期日结束。
答
代码如下,如有帮助,请帮忙采纳一下,谢谢。
效果图是输入2018 5
代码:
#include <stdio.h>
int main()
{
int year,mon;
int i,j,cnt = 0;
int t = 1,k=1;
int arr[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int curYear,curMon,curDay, wk;
curYear = 2021;
curMon = 10;
curDay = 27;
wk = 3;
scanf("%d %d",&year,&mon);
if(curYear >= year)
{
for(i=mon;i<=12;i++)
{
if(i==2)
{
if(year%4==0 && year%100 !=0 || year%400==0)
cnt += 29;
else
cnt += 28;
}else
cnt += arr[i];
}
for(i=year+1;i<curYear;i++)
{
if(i%4==0 && i%100 !=0 || i%400==0)
cnt += 366;
else
cnt += 365;
}
for(i=1;i<curMon;i++)
{
if(i==2)
{
if(curYear%4==0 && curYear%100 !=0 || curYear%400==0)
cnt += 29;
else
cnt += 28;
}else
cnt += arr[i];
}
cnt += curDay;
wk = 7 - (wk+cnt)%7;
}else
{
for(i=curMon+1;i<=12;i++)
{
if(i==2)
{
if(curYear%4==0 && curYear%100 !=0 || curYear%400==0)
cnt += 29;
else
cnt += 28;
}else
cnt += arr[i];
}
for(i=curYear+1;i<year;i++)
{
if(i%4==0 && i%100 !=0 || i%400==0)
cnt += 366;
else
cnt += 365;
}
for(i=1;i<mon;i++)
{
if(i==2)
{
if(year%4==0 && year%100 !=0 || year%400==0)
cnt += 29;
else
cnt += 28;
}else
cnt += arr[i];
}
cnt += curDay;
wk = (wk+cnt-1)%7;
}
printf("一 二 三 四 五 六 日\n");
//int t = 1,k=1;
if(year%4==0 && year%100 !=0 || year%400==0) arr[2]= 29;
while(t <= arr[mon])
{
if(k<wk)
{
printf(" ");
}else
{
printf("%-3d",t);
t++;
}
if(k%7==0) printf("\n");
k++;
}
return 0;
}
答
#include<stdio.h>
#define bool int//自定义bool类型
#define true 1
#define false 0
bool IsLeap(int year);
int GetWeek(int year,int month);
void main()
{
int y,m,week,i;
printf("输入yyyy-mm:");
scanf("%d%d",&y,&m);
printf(" %d年%d月\n",y,m);
printf("=====================\n");
printf(" 一 二 三 四 五 六 日\n");
week = GetWeek(y,m);
if(week == 0)
week = 7; //若week == 0,将其视作7,以便留下足够的空格
for (i = 1;i < week; i++)
{
printf(" "); //三个字符为一个单位,保证第一行与周数对应
}
int month[12] = {31,28,31,30,31,30,31,31,30,31,30,31};//以数组方式统计每个月的天数
if (IsLeap(y) == true) //若为闰年,将2月份的天数修改为29
month[1] = 29;
for(i=1;i<=month[m-1];i++) //利用for循环,依次输出日数,并且若加上通过计算week+i-1%7来判断是否该换行
{
printf("%3d",i);
if((i+week-1) % 7 == 0)
printf("\n");
}
printf("\n=====================\n");
}
bool IsLeap(int year)
{
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))//判断是否为闰年的条件
return true;
else
return false;
}
int GetWeek(int year,int month)
{
int m[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; //以数组记录每个月的天数
int day=0,week,i;
switch (month)
{
case 1:
day = 1;
break;
case 2:
day = m[0] + 1;
break;
case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12:
if (IsLeap(year) == true)
m[1] = 29;
for (i=0;i<month-1;i++)
{
day = day + m[i];
}
day = day + 1;
break;
}
week = ((year-1) + (year-1)/4 - (year-1)/100 + (year-1)/400 + day) % 7;
return week;
}
如有帮助,望采纳!谢谢!