| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2305 人关注过本帖
标题:____万年历____
只看楼主 加入收藏
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
结帖率:100%
收藏
 问题点数:0 回复次数:21 
____万年历____
网友“追影”写的发给我的。
starwing版主曾提了个输出2009年的日历的问题,我写的时候没用函数,后来网友梁子改进成万年历的时候也没用函数,追影不但用了函数,而且code很简单很清晰很规范,有兴趣的朋友可以看看
————————————————————————————我是分割线——————————————————————————————
#include <stdio.h>

int rn(int nianfen)/*判断某年是否是闰年*/
{
    if( ((nianfen % 4 == 0) && (nianfen % 100 != 0)) || (nianfen % 400 == 0))
        return 1;
    else
        return 0;
}

int yf(int yuefen, int runnian)/*获得当月天数*/
{
    int dyts;
    switch(yuefen)
    {
    case 1: dyts=31;break;
    case 2: dyts=28 + runnian;break;
    case 3: dyts=31;break;
    case 4: dyts=30;break;
    case 5: dyts=31;break;
    case 6: dyts=30;break;
    case 7: dyts=31;break;
    case 8: dyts=31;break;
    case 9: dyts=30;break;
    case 10: dyts=31;break;
    case 11: dyts=30;break;
    case 12: dyts=31;break;
    }
    return dyts;
}

int yuandan(int nian)/*元旦是星期几*/
{
    return (nian-1+(nian-1)/4-(nian-1)/100+(nian-1)/400 + 1) % 7;
}

void prin(int yuefen,int nian)/*输入月份表*/
{
    int i,dyts,xqdw,sun=0,x=0;
    dyts = yf(yuefen,rn(nian));/*获得当月天数*/


        printf("\n\t%d年%d月\n",nian,yuefen);

        printf(" 日            六\n");
        for(i=1; i<yuefen; i++)/*计算这个月的第一天是星期几*/
        {
            sun += yf(i,rn(nian));
        }
        xqdw = (sun+yuandan(nian)) % 7;
        for(i=0; i<xqdw; i++)/*把当月1日的前几天空过去*/
        {
            printf("    ");
            x++;
        }
        for(i=1; i<=dyts; i++)/*输入月份表*/
        {
            printf("%3d",i);
            x++;
            if(x == 7)
            {
                printf("\n");
                x=0;

            }
            else
            {
                printf(" ");
            }


    }
    printf("\n");
}



void gn()
{
    int nian,x=1,i;
    char pd;
    printf("请输入要打印的年份(格式:xxxx):");
    scanf("%d",&nian);
    do
    {
        if(x == 1)/*正常输出*/
        {
            printf("\n\n");
            for(i=1; i<=12; i++)/*输出月份表*/
            {
                prin(i,nian);
            }
        }
        printf("是否继续打印(Y/N)?");
        fflush(stdin);//清除输入年份时“回车”的缓冲流

        scanf("%c",&pd);

        if(pd == 'y' || pd == 'Y')
        {
            x = 1;
            gn();
        }
        else
        {
            if(pd == 'n' || pd == 'N')
            {
                x = 1;
            }
            else
            {
                x = 0;
                printf("选择错误请重新输入:\n");
            }
        }
    }
    while(x != 1);
}

int caidan()/*菜单项*/
{
    int x;
    printf("万年历功能菜单\n1. 打印某年的全年日历\n2. 退出\n");
    printf("请输入您的选择:");
    scanf("%d",&x);
    switch(x)
    {

    case 1:gn();return 0;
    case 2:return -1;
    default:printf("输入错误请重新输入!\n");return 0;
    }
}

int main()
{
    int pd=0;
    do
    {
        printf("\n\n");
        if(pd == 0)
        {
            pd = caidan();
        }
    }
    while(pd != -1);
    printf("程序成功退出!\n");
    return 0;
}
————————————————————————————我是分割线——————————————————————————————
ps:相比我原来的有点小不同,它不是3行4列的格式输出的,现在有兴趣的朋友可以想想玩,怎么在不大改动的情况下实现每3个月换行的功能.
搜索更多相关主题的帖子: 万年历 
2009-11-13 20:34
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
顶就一个字
我只说一次

想象力征服世界
2009-11-13 20:46
lijm1989
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:珠海
等 级:贵宾
威 望:12
帖 子:675
专家分:2844
注 册:2009-10-14
收藏
得分:0 
顶···效果不错··
2009-11-13 21:25
xy4919961
Rank: 5Rank: 5
等 级:职业侠客
帖 子:199
专家分:362
注 册:2009-10-24
收藏
得分:0 
#include "stdio.h"
long int f(int year,int month)
{/*f(年,月)=年-1,如月<3;否则,f(年,月)=年*/
    if(month<3) return year-1;
    else return year;
}

long int g(int month)
{/*g(月)=月+13,如月<3;否则,g(月)=月+1*/
    if(month<3) return month+13;
    else return month+1;
}

long int n(int year,int month,int day)
{
  /*N=1461*f(年、月)/4+153*g(月)/5+日*/
    return 1461L*f(year,month)/4+153L*g(month)/5+day;
}

int w(int year,int month,int day)
{
  /*w=(N-621049)%7(0<=w<7)*/
    return(int)((n(year,month,day)%7-621049L%7+7)%7);
}

int date[12][6][7];
int day_tbl[ ][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
            {31,29,31,30,31,30,31,31,30,31,30,31}};
main()
{int sw,leap,i,j,k,wd,day;
 int year;/*年*/
 char title[]="SUN MON TUE WED THU FRI SAT";
clrscr();
printf("Please input the year whose calendar you want to know: ");/*输入年*/
scanf("%d%*c",&year);/*输入年份值和掠过值后的回车*/
sw=w(year,1,1);
leap=year%4==0&&year%100||year%400==0;/*判闰年*/
for(i=0;i<12;i++)
    for(j=0;j<6;j++)
        for(k=0;k<7;k++)
            date[i][j][k]=0;/*日期表置0*/
for(i=0;i<12;i++)/*一年十二个月*/
    for(wd=0,day=1;day<=day_tbl[leap][i];day++)
    {/*将第i+1月的日期填入日期表*/
     date[i][wd][sw]=day;
    sw=++sw%7;/*每星期七天,以0至6计数*/
    if(sw==0) wd++;/*日期表每七天一行,星期天开始新的一行*/
    }

    printf("\n|==================The Calendar of Year %d =====================|\n|",year);
for(i=0;i<6;i++)
{/*先测算第i+1月和第i+7月的最大星期数*/
    for(wd=0,k=0;k<7;k++)/*日期表的第六行有日期,则wd!=0*/
        wd+=date[i][5][k]+date[i+6][5][k];
    wd=wd?6:5;
    printf("%2d  %s  %2d  %s |\n|",i+1,title,i+7,title);
    for(j=0;j<wd;j++)
    {
        printf("   ");/*输出四个空白符*/
        /*左栏为第i+1月,右栏为第i+7月*/
        for(k=0;k<7;k++)
            if(date[i][j][k])
                printf("%4d",date[i][j][k]);
            else printf("    ");
        printf("     ");/*输出十个空白符*/
        for(k=0;k<7;k++)
            if(date[i+6][j][k])
                printf("%4d",date[i+6][j][k]);
            else printf("    ");
        printf(" |\n|");
    }
    /*scanf("%*c");/*键入回车输出下一个月的日历*/
 
}
puts("=================================================================|");
puts("\n Press any key to quit...");
getch();
}
                  这个别人写的。.有详细注释..

QQ群:96348241
2009-11-13 22:14
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
判闰年处还可精简

想象力征服世界
2009-11-14 12:37
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 5楼 longlong89
how to do?

我可好玩啦...不信你玩玩^_^
2009-11-14 18:29
longlong89
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广州
等 级:小飞侠
威 望:6
帖 子:1043
专家分:2754
注 册:2009-8-18
收藏
得分:0 
return nianfen % 4 == 0 && nianfen % 100 != 0 || nianfen % 400 == 0;

想象力征服世界
2009-11-14 19:25
pgy
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:C
等 级:小飞侠
威 望:8
帖 子:1248
专家分:2329
注 册:2009-9-23
收藏
得分:0 
回复 7楼 longlong89
简化的好,但我觉得原来的更清晰

我可好玩啦...不信你玩玩^_^
2009-11-14 21:05
李若斌
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:219
专家分:184
注 册:2009-9-30
收藏
得分:0 
哎...看是看懂了,就是太长了,有点迷糊。一个比一个强啊。
2009-11-14 21:15
soky
Rank: 4
等 级:业余侠客
帖 子:126
专家分:228
注 册:2009-7-13
收藏
得分:0 
看一遍就明白了,过去弄了半天,放弃了
2009-11-14 22:47
快速回复:____万年历____
数据加载中...
 
   



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

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