| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 520 人关注过本帖
标题:打印日历。
取消只看楼主 加入收藏
may大象
Rank: 2
等 级:论坛游民
帖 子:55
专家分:38
注 册:2013-5-30
结帖率:87.5%
收藏
已结贴  问题点数:20 回复次数:1 
打印日历。
#include<stdio.h>

#define Sunday     0
#define Monday     1
#define Tuesday    2
#define Wednesday  3
#define Thursday   4
#define Friday     5
#define Saturday   6

int input_year();
void prt_calendar(int year);
void prt_month_calendar(int month,int year);
char *month_name(int month);
int month_days(int month,int year);
int first_day_of_month(int month,int year);
void print_space(int weekday);
int is_leapyear(int year);

int main(void)
{
    int year;
    year=input_year();
    prt_calendar(year);
    return 0;
}
/* 输入年份 */
int input_year()
{
    int year;
    while(1)
    {
    printf("Which year:");
    scanf("%d",&year);
    if(year>=1900)
        return year;
    else
        printf("The year must be at least 1900.\n");
    }
}
/* 打印year年的日历*/
void prt_calendar(int year)
{
    int month;
    for(month=1;month<=12;month++)
    {
        prt_month_calendar(month,year);
        printf("\n");
    }
}

/* 打印某个月的日历*/
void prt_month_calendar(int month,int year)
{
    int weekday,ndays,day;
    printf("    %s     %d\n",month_name(month),year);
    printf(" Su Mo Tu We Th Fr Sa\n");
    ndays=month_days(month,year);            /* 计算某年某月的天数 */
    weekday=first_day_of_month(month,year);  /* 计算某年某月第一天是星期几 */
    print_space(weekday);                     /* 打印某月第一天以前的空格 */
    /* 在星期表上打印日期 */
    for(day=1;day<=ndays;day++)
    {
        printf(" %2d",day);
        if(weekday == Saturday)
            printf("\n");                   /* 当打印星期六的日后换行 */
        weekday=(weekday+1)%7;              /* 计算下一天是星期几 */  
    }
    if(weekday != Sunday)                   /* 最后一行为星期的开头时不需要换行 */
        printf("\n");

}  

/* 打印月份的名称*/
char *month_name(int month)
{
    switch(month)
    {
    case 1:   return("January");
    case 2:   return("February");
    case 3:   return("March");
    case 4:   return("April");
    case 5:   return("May");
    case 6:   return("June");
    case 7:   return("July");
    case 8:   return("August");
    case 9:   return("September");
    case 10:  return("October");
    case 11:  return("November");
    case 12:  return("Deccember");
    default:  return("Illegal month");
    }
}
/* 计算year年month月的天数的函数*/
int month_days(int month,int year)
{
    switch(month)
    {
    case 2:
         if(is_leapyear(year))  /* 调用判断是否闰年函数*/
             return 29;         /* 闰年2月为29天 */
         else                    
             return 28;         /* 非闰年2月为28天 */
         break;
    case 4:
    case 6:
    case 9:
    case 11: return 30; break;  /* 第4、6、9、11月为30天 */
    default: return 31; break;  /* 第1、3、5、7、8、10、12月为31天 */
    }
}

/* 计算year年month月第一天是星期几。*/
int first_day_of_month(int month,int year)
{
    int weekday,i;
    weekday=Monday;  /* 1900年1月1日为星期一 */
    for(i=1900;i<year;i++)
    {
        weekday=(weekday+365)%7;    /* 计算某年的1月1日为星期几 */
        if(is_leapyear(i))
            weekday=(weekday+1)%7;  /* 闰年时一年要加1为366天 */
    }
    for(i=1;i<month;i++)
        weekday=(weekday+month_days(i,year))%7;  /* 计算本年某月的第一天是星期几 */
    return weekday;
}

/* 打印某月打一天以前的空格函数,weekday 为该月第一天的星期 */
void print_space(int weekday)
{
    int i;
    for(i=0;i<weekday;i++)
        printf("   ");           /* 一次打印三个空格 */
}

/* 判断是否为闰年 */
int is_leapyear(int year)
{
    return (((year%4==0)&&(year%100==0)) || (year%400==0));
}




输入2006的时候,输出的结果不对,例如:2006年1月1日是星期日,但是它输出的是星期4.我觉得是计算year年month月第一天是星期几的函数没写对,但是不知道怎么改,麻烦懂的人指教一下。。。谢谢
搜索更多相关主题的帖子: include 日历 
2013-08-08 16:15
may大象
Rank: 2
等 级:论坛游民
帖 子:55
专家分:38
注 册:2013-5-30
收藏
得分:0 
回复 2楼 beyondyf
额~~~改成(year%100!=0),问题解决了,谢谢!

                             凡成大事者,各有各的方法论。
2013-08-08 22:04
快速回复:打印日历。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025603 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved