| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 927 人关注过本帖, 1 人收藏
标题:贴一篇万年历
只看楼主 加入收藏
经典
Rank: 2
等 级:论坛游民
帖 子:17
专家分:10
注 册:2010-7-14
结帖率:50%
收藏(1)
已结贴  问题点数:1 回复次数:7 
贴一篇万年历
#include<stdio.h>
//************自定义函数声明************************
void screen();                            //系统主界面
void leapyear();                          //查询某年是否是闰年
int  IsLeapYear(int);                     //判断某年是否是闰年
void printmonthday();                     //查询某年某月的最大天数
int  everymonth(int,int);                  //计算每月的最大天数
void whatisit();                          //查询某年某月某日是星期几
int  whatisita(int,int);                   //计算当天是星期几
void printfyearday();                     //打印某年的全年日历
void printmonth(int,int);                 //打印某年某月月历
//*************主函数*******************************
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};//定义全局变量每月的最大天数(不是闰年)
char *week[]={"日","一","二","三","四","五","六"};
void main()
{
    screen();                              //万年历主界面查询
                                      
}
//************万年历主界面查询********************
void screen()
{
    int n;
    while(1)
    {
        printf("\n*******************************\n");
        printf("*      万年历查询程序         *\n");
        printf("*  1.查询某年某月某日是星期几 *\n");
        printf("*  2.查询某年是否是闰年       *\n");
        printf("*  3.打印某年的全年日历       *\n");
        printf("*  4.查询某月的最大天数       *\n");
        printf("*  5.退出                     *\n");
        printf("*******************************\n");
        printf("    请输入要查询的选项:");
        scanf("%d",&n);                       //读取输入的数字
        switch(n)
        {
        case 1:
            whatisit();                     //查询某年某月某日是星期几                     
            break;
        case 2:
            leapyear();                      //查询某年是否是闰年
            break;
        case 3:
            printfyearday();                //打印某年的全年日历
            break;
        case 4:
            printmonthday();                 //查询某月的最大天数
            break;
        case 5:
            return;                         //退出
        default:
            printf("你输入错误,请按要求输入!\n");
            break;
        }
    }
}
//**************查询某年某月某日是星期几*******************
void whatisit()
{
    int y,m,d,s,k=1,sum,n,i;
    char yn;
    while(k)
    {
        printf("\n请输入年,月,日:\n");
        scanf("%d,%d,%d",&y,&m,&d);
        getchar();                         //吸收回车符
        s=0;
        for(i=1;i<m;i++)
            s=s+a[i];
        s=s+d;                            //累加天数
        if(IsLeapYear(y) && m>2)            //判断是否是闰年,且月份大于2
            s=s+1;
        sum=s;
        n=(y-1+(y-1)/4-(y-1)/100+(y-1)/400+sum)%7; //计算结果0-6
        printf("这天是%s\n",week[n]);              //显示星期几
        printf("是否继续查询(Y/N)?");
        scanf("%c",&yn);
        if(yn=='y'||yn=='Y')
            k=1;
        else
            k=0;
    }
}
//****************判断某年是否是闰年************************
int  IsLeapYear(int year)
{
    return(year%4==0&&year%100!=0||year%400==0);
}
//****************查询某年是否是闰年************************
void leapyear()
{
    int y,k=1;
    char yn;
    while(k)
    {
        printf("\n请输入要查询的年份:\n");
        scanf("%d",&y);
        getchar();                         //吸收回车符
        if(IsLeapYear(y))                  //判断是否是闰年
            printf("是闰年\n");
        else
            printf("不是闰年\n");
        printf("是否继续查询(Y/N)?");
        scanf("%c",&yn);
        if(yn=='y'||yn=='Y')
            k=1;
        else
            k=0;
    }
}
//*****************计算某月的最大天数******************************
int everymonth(int year,int month)
{
    int s;
    s=a[month];
    if(IsLeapYear(year)&&month==2)   //判断是否是闰年的2月份
        s=s+1;
    return s;
}
//*****************查询某年某月的最大天数**************************
void printmonthday()
{
    int y,m,value,k=1;char yn;
    while(k)
    {
        printf("\n请输入要查询的年份,月份:\n");
        scanf("%d,%d",&y,&m);
        getchar();                          //吸收回车符
        if(m<0||m>12)                       //判断输入的月份是否正确
        {
            printf("输入月份不对!!!\n");
            break;
        }
        value=everymonth(y,m);             //计算该年该月的最大天数
        printf("%d年%d月的最大天数为:%d\n",y,m,value);
        printf("是否继续查询(Y/N)?");
        scanf("%c",&yn);
        if(yn=='y'||yn=='Y')
            k=1;
        else
            k=0;
    }
}
//***************打印某年的全年日历*******************************
void printfyearday()
{
    int y,value,sum,i,k=1;
    char yn;
    while(k)
    {
        printf("\n请输入查询日历的年份:\n");
        scanf("%d",&y);
        getchar();                          //吸收回车符
        for(i=1;i<=12;i++)
        {
            printf("%d年%d月的信息:\n",y,i);
            value=whatisita(y,i);           //计算当天是星期几   
            sum=everymonth(y,i);            //计算某年某月最大天数
            printmonth(value,sum);          //打印一个月月历
            printf("\n");
        }
        printf("是否继续查询(Y/N)?");
        scanf("%c",&yn);
        if(yn=='y'||yn=='Y')
            k=1;
        else
            k=0;
    }
}
//*****************打印某年某月月历*************************
void printmonth(int value,int sum)
{
    int n,i=0,j;
    for(j=0;j<7;j++)
        printf(" %s",week[j]);            //显示"日-六"
    printf("\n");
    while(i<value)
    {
        printf("   ");                    //根据当月1号是星期几打印空格
        i++;
    }
    for(n=1;n<=7-value;n++)
        printf("  %d",n);                //打印当月的第一个星期
    while(n<sum)
    {
        if((n+value-1)%7==0)            //判断是否一周
            printf("\n"),printf(" ");  
         if(n/10>0)                     //判断是否大于10
            printf("%d ",n);            
        else
            printf("%d  ",n);
        n++;
    }
}
//**************计算当天星期几*******************
int whatisita(int y,int m)
{
    int n,i,s=0;
    for(i=1;i<m;i++)
        s=s+a[i];                       //累加天数
    if(IsLeapYear(y) && m>2)            //判断是否是闰年,且月份大于2
        s=s+1;
    n=(y-1+(y-1)/4-(y-1)/100+(y-1)/400+s+1)%7;
    return n;
}



搜索更多相关主题的帖子: 万年历 
2010-07-24 14:07
key8714
Rank: 2
等 级:论坛游民
帖 子:48
专家分:87
注 册:2010-6-9
收藏
得分:0 
不错
2010-07-25 16:46
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
年历制作
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1

enum{Sunday, Monday, Tuesday, Wednesday,
     Thursday, Friday, Saturday};/*0,1,2....*/
 
int  M_GetYear(void);   
void M_PrintMonthNum(int year);
void M_PrintMonth(int month, int year);
char *M_MonthName(int month);
int  M_MonthDays(int year, int month);
int  M_IsLeapYear(int year);
int  M_YeFirstMonthDay(int year, int month);
void M_BlankUnit(int weekday);
int main(void)
{
    int year;
   
    year = M_GetYear();
   
    M_PrintMonthNum(year);
   
   
}

/*************************************************
函数名称:M_GetYear

函数功能:输入一个年份

被本函数调用的函数清单:无

函数返回值:(int)
*************************************************/
int M_GetYear(void)
{
    int year;
   
    while(TRUE)
    {
        printf("(大于1900)请输入年份 : ");
        scanf("%d", &year);
        if(year > 1900)/*计人最多活106岁*/
        {
            return year;
        }
    }
}

/*************************************************
函数名称:M_PrintMonthNum

函数功能:调用每个月份

被本函数调用的函数清单:M_PrintMonth

输入参数:year

函数返回值:(void)
**************************************************/
void M_PrintMonthNum(int year)
{
    int month;
   
    for(month = 1; month <= 12; month++)
    {
        M_PrintMonth(month, year);
        printf("\n");
    }
}

/*************************************************
函数名称:M_PrintMonth

函数功能:打印万年历

被本函数调用的函数清单:M_MonthName,M_YeFirstMonthDay
,M_BlankUnit..

调用本函数的函数清单:M_PrintMonthNum

输入参数:month, year

函数返回值:(void)
**************************************************/
void M_PrintMonth(int month, int year)
{
    int weekday, ndays, day;
   
    printf(" %s", M_MonthName(month));/*打印开头一行的月份*/
    printf("\n Su Mo Tu We Th Fr Sa\n");
   
    ndays = M_MonthDays(year, month);
   
    weekday = M_YeFirstMonthDay(year, month);
   
    M_BlankUnit(weekday);
   
    for(day = 1; day <= ndays; day++)
    {
        printf(" %2d", day);
      
        if(weekday == Saturday)/*      是星期六就打印换行*/
        {
            printf("\n");
        }
        weekday = (weekday + 1) % 7;/*      计算是星期几*/
    }
   
    if(weekday != Sunday)
    printf("\n");
}

/*************************************************
函数名称:MonthName

函数功能:返回每个月份的英文

调用本函数的函数清单:M_PrintMonth

输入参数:month

函数返回值:(char)
**************************************************/
char *M_MonthName(int month)
{
    char *name[] = {
         "Illegal month",
         "January", "February", "March",
         "April", "May", "June",
         "July", "August", "September",
         "October", "November", "December"
    };
   
    return (month < 1 || month > 12) ? name[1] : name[month];
}

/*************************************************
函数名称:M_MonthDays

函数功能:返回每个月份的天数

被本函数调用的函数清单:IsLeapYear

调用本函数的函数清单:M_PrintMonth, M_YeFirstMonthDay

输入参数:year, month

函数返回值:(int)
**************************************************/
int  M_MonthDays(int year, int month)
{
    switch(month)
    {
        case 2 :
             if(M_IsLeapYear(year))/*          如果是闰年*/
             {
                 return 29;
             }
             return 28;
        case 4 : case 6 : case 9 : case 11 :
             return 30;
      
        default :
             return 31;
    }
}

/*************************************************
函数名称:IsLeapYear

函数功能:返回是否是闰年的bool值

调用本函数的函数清单:M_MonthDays

输入参数:year

函数返回值:(int,返回bool值1或0)
**************************************************/
int M_IsLeapYear(int year)
{
    return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
}

/*************************************************
函数名称:M_YeFirstMonthDay

函数功能:年份第一个月第一天是星期几,开头enum
从Sunday(0开始),则从(weekday + 1) %7,weekday
是过几天后,能推出几天后就是星期几了,后面依次类推

被本函数调用的函数清单:M_MonthDays

调用本函数的函数清单:M_PrintMonth

输入参数:year, month

函数返回值:(int)
**************************************************/
int  M_YeFirstMonthDay(int year, int month)
{
    int i, weekday;
   
    weekday = Monday;
    for(i = 1900; i < year; i++)
    {
        weekday = (weekday + 365) % 7;
      
        if(M_IsLeapYear(i))/*       如果是闰年就加1*/
        {
            weekday = (weekday + 1) % 7;
        }
    }
   
    for(i = 1; i < month; i++)
    {
        weekday = (weekday + M_MonthDays(year, i)) % 7;
    }
   
    return weekday;
}

/*************************************************
函数名称:M_BlankUnit

函数功能:年份第一个月第一天星期几就要空几个空格

调用本函数的函数清单:M_PrintMonth

输入参数:weekday

函数返回值:(void)
**************************************************/
void M_BlankUnit(int weekday)
{
    int i;
   
    for(i = 0; i < weekday; i++)
    {
        printf("   ");
    }
}

 

2010-07-25 18:42
神奇的地球
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-6-6
收藏
得分:0 
请问代码在那个编译工具里可以调试成功啊


我用的是Editplus+gcc不通过啊
2010-07-25 22:26
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:1 
好东西,顶

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-26 20:41
xiayizhanzyf
Rank: 2
等 级:论坛游民
帖 子:80
专家分:78
注 册:2010-7-21
收藏
得分:0 
在VC++6.0中调试
2010-07-26 20:47
小旬_C
Rank: 2
等 级:论坛游民
帖 子:72
专家分:33
注 册:2010-7-25
收藏
得分:0 
看到就顶

没有失败,只有暂时停止成功
2010-07-26 20:55
lyj2010lyj
Rank: 2
等 级:论坛游民
帖 子:25
专家分:27
注 册:2010-9-28
收藏
得分:0 
厉害,不能简洁吗?
2010-09-30 09:43
快速回复:贴一篇万年历
数据加载中...
 
   



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

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