| 编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛
全能ASP/PHP/ASP.NET主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
高端软件开发 = 年薪十万不是梦赛孚耐:软件保护加密专家身份认证令牌USB KEY 
共有 1873 人关注过本帖
标题:万年历程序
收藏  订阅  推荐  打印 
yu_hua
Rank: 2
等级:注册会员
帖子:148
积分:1772
注册:2006-8-10
万年历程序

#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");
}
搜索更多相关主题的帖子: 万年历  int  days  define  
本帖最近评分记录
2008-1-13 12:30
nobush
Rank: 2
等级:注册会员
帖子:71
积分:838
注册:2008-1-10
居然沒人支持,我來響應一下

我覺得寫的挺不錯的,還可以繼續優化
比如兩個函數都在初始化days[],可以拿到外面來,
兩次調用half()後都有getch();PF("\n");何不把他們放到函數裡面去?
另外循環調用scanf,有必要加上防誤輸入措施
輸出排版的時候減少一行,不然一屏顯示不完
2008-1-13 14:33
sunkaidong
Rank: 12Rank: 12Rank: 12
来自:南京师范大学
等级:版主
威望:4
帖子:4128
积分:44851
注册:2006-12-28

我觉得你要是改成图形画的就更好了,其实这些东西考试经常练习啊,所以大家都不怎么说话了,帮你顶一下,期待你写更好的程序.
2008-1-13 14:46
way3
Rank: 2
来自:湖南
等级:注册会员
帖子:83
积分:1106
注册:2007-12-8
我来顶!

非常的好呀,我来运行一下了.顶!
2008-1-13 14:59
spring4676
Rank: 2
来自:内蒙古大草原
等级:注册会员
帖子:69
积分:908
注册:2007-12-10
非常好

我支持
顶一个
再接再厉
2008-1-13 17:18
xianshizhe111
Rank: 6Rank: 6
等级:金牌会员
帖子:1451
积分:15818
注册:2007-12-8

不错支持
2008-1-13 21:16
sunkaidong
Rank: 12Rank: 12Rank: 12
来自:南京师范大学
等级:版主
威望:4
帖子:4128
积分:44851
注册:2006-12-28

怎么没人响应我的提议呢?呵呵,用mfc改写啊,这样有助于我们论坛水平的提高啊,现在大家都关注控制台的程序,这样会和企业要求脱节.最好能做个好的导向啊.缩短于企业距离啊
2008-1-13 21:22
yu_hua
Rank: 2
等级:注册会员
帖子:148
积分:1772
注册:2006-8-10

原帖由 [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-1-14 10:17
麦嘟
Rank: 1
等级:新手上路
帖子:30
积分:406
注册:2007-12-18

不错,顶顶
2008-1-14 15:46
yu_hua
Rank: 2
等级:注册会员
帖子:148
积分:1772
注册:2006-8-10
万年历程序(中文版)

#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-1-14 17:31
关于我们 | 广告合作 | 编程中国 | 清除Cookies | Archiver | WAP | TOP

编程中国 版权所有,并保留所有权利。鲁ICP备08000592号
Powered by Discuz, Processed in 0.050391 second(s), 10 queries.
Copyright©2004-2008, BCCN.NET, All Rights Reserved