在c语言中使用函数来制作一个万年历,要求,可以知道每个月有多少天,每个月的第一天是星期几

 我来答
悠久纤尘
2015-05-11 · TA获得超过191个赞
知道小有建树答主
回答量:160
采纳率:66%
帮助的人:111万
展开全部
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

//是否闰年
#define IS_LEAP_YEAR(iYear) (((iYear) % 100 == 0) ? ((iYear) % 400 == 0) : ((iYear) % 4 == 0))

int Calendar(int iYear, int iMonth);

void main()
{
//获取今天的日期
struct tm *today;
time_t ltime;
time(&ltime);
today = localtime(&ltime);

// printf("%d-%02d-%02d %02d:%02d:%02d\n星期%d 当年第%d天\n", 
// today->tm_year + 1900, today->tm_mon + 1, today->tm_mday, 
// today->tm_hour, today->tm_min, today->tm_sec, today->tm_wday, today->tm_yday);

int iYear = today->tm_year + 1900;
int iMonth = today->tm_mon + 1;

do {
system("cls");

int ch = Calendar(iYear, iMonth);
if (ch == 27) break;

switch (ch)
{
case 75: //<--
iYear--;
break;
case 77: //-->
iYear++;
break;
case 80: //下箭头
iMonth++;
if (iMonth > 12)
{
iYear++;
iMonth = 1;
}
break;
case 72: //上箭头
iMonth--;
if (iMonth < 1)
{
iYear--;
iMonth = 12;
}
break;
case 71: //Home
iYear = today->tm_year + 1900;
iMonth = today->tm_mon + 1;
break;
}
} while (1);
}

//显示给定年月的日历
//返回值为获取的用户按键, 以确定下一步的操作
int Calendar(int iYear, int iMonth)
{
int i, j, iDays;

//初始化数组w的值为1至31
int w[31];
for (i = 0; i < 31; i++) w[i] = i+1;

//获取本月天数于iDays中
switch (iMonth)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
iDays = 31;
break;
case 4: case 6: case 9: case 11:
iDays = 30;
break;
case 2:
iDays = IS_LEAP_YEAR(iYear) ? 29 : 28;
break;
}

//显示 日历头
printf("\n    %d年%d月 日历\n\n", iYear, iMonth);
printf(" 日 一 二 三 四 五 六\n");
printf("----------------------\n");


//获取参数指定年月的第一天是周几。保存在firstday.tm_wday中
struct tm firstday = {0};
firstday.tm_year = iYear - 1900;
firstday.tm_mon = iMonth - 1;
firstday.tm_mday = 1;

time_t ltime;
ltime = mktime(&firstday);

firstday = *localtime(&ltime);

//处理1号前的留空
j = firstday.tm_wday; //周几
for (i = 0; i < j; i++)
{
printf("   "); //3个空格
}

//显示日历正文
for (i = 0; i < iDays; i++)
{
printf("%3d", w[i]);
if (++j == 7)
{
printf("\n");//逢七换行
j = 0;
}
}
if (j != 0) printf("\n");


//获取今天日期
time(&ltime);
struct tm today = *localtime(&ltime);

//显示 日历尾
printf("----------------------\n");
printf("今天是: %d年%d月%d日\n\n", today.tm_year + 1900, today.tm_mon + 1, today.tm_mday);

printf("←: 上一年  →: 下一年\n");
printf("↑: 上一月  ↓: 下一月\n\n");
printf("Home: 今天  Esc: 退出\n");

//获取用户按键 (不用按回车立即返回)
fflush(stdin);
clearerr(stdin);

int c = getch();
if (c == 0xe0 || c == 0) c = getch();

return c;
}
高人仰北谋
推荐于2016-04-16 · TA获得超过3404个赞
知道大有可为答主
回答量:2259
采纳率:86%
帮助的人:781万
展开全部
long YearDays(int Year)
{ Year--;
return(Year*365+Year/4-Year/100+Year/400+1);
}
int LeapYear(int Year)
{ if(Year%4)return 0;
if(Year%100)return 1;
if(Year%400)return 0;
return 1;
}
int MonthDays(int Year,int Month)
{ const int MonDays[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
if(Year<=0||Month<1||Month>12)return 0;
if(Month!=2)return MonDays[Month];
return MonDays[2]+LeapYear(Year);
}
long TotalDays(int Year,int Month,int Day)
{ long Days=0L;
int i;
if(Month<=0)Month=1;
if(Month>12)
{ Month--;
Year+=Month/12;
Month%=12;
Month++;
}
for(i=1;i<Month;i++)
Days+=MonthDays(Year,i);
Days+=YearDays(Year);
return Days+Day-1;
}
int Week(int Year,int Month,int Day)
{ return TotalDays(Year,Month,Day)%7;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式