| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7941 人关注过本帖, 1 人收藏
标题:万年历程序
取消只看楼主 加入收藏
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
结帖率:71.43%
收藏(1)
 问题点数:0 回复次数:2 
万年历程序
#include<stdio.h>
#include<conio.h>
#define PF printf
#define EP PF("%s%s%.10s%s%s*",s,k,k,k,k)
#define LEAP(y) !(y%(y%100?4:400))

int xqj(int year,int month,int day)//星期几
{
    int i,y1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    days[2]=28+LEAP(year);
    for(i=1;i<month;i++)day+=days[i];
    y1=year-1;
    day+=y1+y1/4-y1/100+y1/400;
    return day%7;
}

void fill(int y,int m,char array[3*7*6])
{
    char *pa;
    int i,x1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    days[2]=28+LEAP(y);
    x1 = xqj(y,m,1);
    x1 = x1?x1-1:x1+6;
    pa = array+3*x1;
    for(i=1;i<=3*7*6;i++)array[i-1]=' ';
    for(i=1;i<=days[m];i++,pa+=3)sprintf(pa,"%3d",i);
    *pa=' ';
}

void half(int year,int m)
{
    int i,j;
    char ary[6][7*3],bry[6][7*3],cry[6][7*3];
    char *k="                    ",*s="\n    *";
    char *xs="********************************";
    PF("%s%s %04d %s*",s,xs,year,xs);
    for(i=1;i<=2;i++,m+=3)
    {
       EP;
       if(m<10)PF("%s%.10s(%d)%.20s(%d)%.20s(%d)%.11s*",s,k,m,k,m+1,k,m+2,k);
       else    PF("%s%.10s(%d)%.19s(%d)%.19s(%d)%.10s*",s,k,m,k,m+1,k,m+2,k);
       EP;
       PF("%s  MO TU WE TH FR SA SU   MO TU WE TH FR SA SU   MO TU WE TH FR SA SU  *",s);
       fill(year,m  ,ary[0]);
       fill(year,m+1,bry[0]);
       fill(year,m+2,cry[0]);
       for(j=0;j<6;j++)
       {
          PF("%s %.21s  %.21s  %.21s  *",s,ary[j],bry[j],cry[j]);
       }
       EP;
    }
    PF("%s%s******%s*",s,xs,xs);
}

main( )
{
    int year;
    do
    {
       PF("year: ");
       scanf("%d",&year);
    }
    while(year<=0||year>9999);
    half(year,1);//上半年
    getch();
    PF("\n");
    half(year,7);//下半年
    getch();
    PF("\n");
}
收到的鲜花
  • 永夜的极光2008-01-14 17:35 送鲜花  5朵   附言:支持原创
搜索更多相关主题的帖子: 万年历 int days define 
2008-01-13 12:30
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
原帖由 [bold][underline]sunkaidong[/underline][/bold] 于 2008-1-13 21:22 发表 [url=http://bbs.bccn.net/redirect.php?goto=findpost&pid=1179865&ptid=197285][/url]
怎么没人响应我的提议呢?呵呵,用mfc改写啊,这样有助于我们论坛水平的提高啊,现在大家都关注控制台的程序,这样会和企业要求脱节.最好能做个好的导向啊.缩短于企业距离啊 ...

特别希望友人用MFC重写这些程序,因为本人尚不会写windows下的程序
2008-01-14 10:17
yu_hua
Rank: 2
等 级:论坛游民
帖 子:222
专家分:95
注 册:2006-8-10
收藏
得分:0 
万年历程序(中文版)
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

char*S="\n    *";
//换行符'\n'右边的4个空格使“年历”相对于屏幕比较“居中”
//空格少则“年历”偏于屏幕左边,反之则“年历”就偏于右边。

//“准空行(1个星号+70个空格+1个星号)”的宏定义:
#define EP printf("%s%s          %s%s*",S,k,k,k)

int LEAP(int year);
int xqj(int year,int month,int day);
void fill(int y,int m,char array[]);
void half(int year,int month1st);

main()
{
    int year;
    do
    {
       printf("年份:  ");
       scanf("%d",&year);
       fflush(stdin);//避免误输入导致的死循环
    }
    while(year<=0||year>9999);
    half(year,1); //上半年
    getch();//避免一闪而过
    printf("\n");
    half(year,7); //下半年
    getch();//避免一闪而过
    printf("\n");
}

int LEAP(int y)//判断公元y年是否闰年
//如果y是闰年年份(如2008)则返回1,否则返回0
{
    return!(y%(y%100?4:400)); //即
//  return (y%(y%100!=0?4:400))==0;
//  但前面那种表达方式显然更加精炼
}

int xqj(int year,int month,int day)
//确定year年month月day日为星期几
//[注意]如果是星期天则返回值为零
{
    int i,y1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    days[2]=28+LEAP(year);//搞定2月份的天数
    for(i=1;i<month;i++)day+=days[i];
//  循环毕,形参day存放:这一天是全年的第几天
    y1=year-1;//因为year年还没过完,所以减一
    day+=y1+y1/4-y1/100+y1/400;//此句是核心
    return day%7; //让返回值落在闭区间[0,6]
}

void fill(int y,int m,char array[3*7*6])
//用sprintf()对array[]填充某个月的“日”
//关于数组大小[3*7*6]的解释:
//“3”是因为“日”最大值31占用2格再加上1个间隔
//“7”是因为“星期几”共有7种状态
//“6”是因为1个“月”最多可能要涉及6个“星期”
{
    char *pa;
    int i,x1,days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
    days[2]=28+LEAP(y);//搞定2月份的天数
    x1=xqj(y,m,1);//求y年m月1号是星期几
    if(x1==0)x1=7;//让星期日与x1==7对应
    pa=array+3*(x1-01);//此句是很关键的
////pa=array+3*(x1-00);//另一种版本应这样//////////////////
    for(i=0;i<3*7*6;i++)array[i]=' ';
    for(i=1;i<=days[m];i++,pa+=3)sprintf(pa,"%3d",i);
    *pa=' ';//用空格冲掉sprintf()语句遗留下来的'\0'
}

void half(int year,int m)
//完成半个“年历”的输出任务
//m=1对应上半年m=7对应下半年
{
    int i,j;
    char ary[6][7*3],bry[6][7*3],cry[6][7*3];
    char *k="                    ";//20个空格
    char *xq="一 二 三 四 五 六 日 ";//星期几
////char *xq="日 一 二 三 四 五 六 ";//另一种版本应这样//////////////////
    char *xs="********************************";//32个星号
    printf("%s%s %04d %s*",S,xs,year,xs);//上半个年历(或下半个年历)的首行
    for(i=1;i<=2;i++,m+=3)
    {
       EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号)
       if(m<10)//如果是1~9月份之一
          printf("%s%.10s%d月%.20s%d月%.20s%d月%.11s*",S,k,m,k,m+1,k,m+2,k);
       else  //如果是10~12月份之一
          printf("%s%.10s%d月%.19s%d月%.19s%d月%.10s*",S,k,m,k,m+1,k,m+2,k);
       EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号)
       printf("%s  %s  %s  %s *",S,xq,xq,xq);
       fill(year,m  ,*ary);
       fill(year,m+1,*bry);
       fill(year,m+2,*cry);
       for(j=0;j<6;j++)
       {
          printf("%s %.21s  %.21s  %.21s  *",S,ary[j],bry[j],cry[j]);
       }
       EP;//为了美观,插入1个准空行(即1个星号、70个空格、1个星号)
    }
    printf("%s%s******%s*",S,xs,xs);//上半个年历(或下半个年历)的底行
}
2008-01-14 17:31
快速回复:万年历程序
数据加载中...
 
   



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

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