| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3069 人关注过本帖
标题:帮一MM写的一个日历小程序
只看楼主 加入收藏
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
结帖率:100%
收藏
 问题点数:0 回复次数:21 
帮一MM写的一个日历小程序
帮一MM写的一个日历小程序 。程序从1980年1月1日开始可以计算到9999年12月31日
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define  LEAP(x) ( !(x % 4) && ( !(x % 400) || (x %100) ) )

char *w[] = { "Sun" , "Mon", "Tue" , "Wed" , "Thu" , "Fri" ,"Sat" }  ;
enum {Sun , Mon ,Tue , Wed , Thu , Fri,Sat} days ;

void setsp(int n) {

           int i ;
           for ( i = 1 ; i <= n ; i++)
                putchar(' ') ;
  return  ;
}

void Print_Week(char *w[]) {

                int  i ;
                for (i = 0 ; i < 7 ; i++)
                    printf("%+5s" , w[i]) ;
                printf("\n") ;


 return  ;
} 

void Print_date(int year ,int month , int date) {

                int  i , j = date ,month_days ;
                
                if (month == 2)
                    month_days = 28 + LEAP(year) ;

                else
                if (month == 4 || month == 6 || month == 9 || month == 11)
                    month_days = 30 ;
                else
                    month_days = 31 ;
                    
                for (i = 1 ; i <= month_days ; i++,j++) {
                    if (j-1 == Sat){
                       putchar('\n') ;
                       j = Sun ;
                    }
                    printf("%5d" , i) ;
                 }
   return  ;
}

int Get_day(int current_year , int current_month){

         int  year=1980 ,month = 1 ,day = 2 , month_days = 31 ; //1981-1-1 Tuesday
         
         while (year < current_year) {

                for (month = 1 ; month <= 12 ; month++) {
                    if (month == 2)
                        month_days = 28 + LEAP(year) ;
                    else if (month == 4 || month == 6 || month == 9 || month == 11)
                             month_days = 30 ;
                    else
                         month_days = 31 ;
                    day = (day + (month_days % 7) ) % 7 ;
                }
                year++ ;
          }
          for (month = 1 ; month <= current_month ; month++) {
                if (month == 2)
                    month_days = 28 + LEAP(year) ;

                else
                if (month == 4 || month == 6 || month == 9 || month == 11)
                    month_days = 30 ;
                else
                    month_days = 31 ;
                    day = (day + (month_days % 7) ) % 7 ;
          }
   return day ;

  }

int main(void) {

         int year , month , day ;
         printf("Input the year and month like  \"2008-10\":") ;
         scanf("%d-%d", &year , &month) ;
         
         if(year < 1980 || month > 12) {
            fprintf(stderr,"The year can not less than 1980 and the month can not more than 12\n") ;
            exit(1) ;
         }
         day = Get_day(year , month - 1) ;

         Print_Week(w) ;
         switch (day) {
                 case Sun: setsp(0) ; Print_date(year,month,day) ; break ;
                 case Mon: setsp(5) ; Print_date(year,month,day) ; break ;
                 case Tue: setsp(10); Print_date(year,month,day) ; break ;
                 case Wed: setsp(15); Print_date(year,month,day) ; break ;
                 case Thu: setsp(20); Print_date(year,month,day) ; break ;
                 case Fri: setsp(25); Print_date(year,month,day) ; break ;
                 case Sat: setsp(30); Print_date(year,month,day) ; break ;
          }
          putchar('\n') ;
  return 0 ;
}


[[it] 本帖最后由 iFreeBSD 于 2008-10-30 10:26 编辑 [/it]]
搜索更多相关主题的帖子: 日历 
2008-10-30 10:06
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
直接贴出来的格式杂这么难看。

without further ado, let’s get started
2008-10-30 10:07
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
发帖时,工具栏有个选项,类似<>的一个按钮,是插入代码,将代码插入至弹出的窗口中即可。

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2008-10-30 10:10
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
不错,不过代码长了点……这程序可以写得很简单,我以前写过一个。
今天买了本FreeBSD Handbook,果然是优雅系统啊……

PS:你的程序在GCC下有个警告,说%s带了加号格式符似乎有问题……
2008-10-30 12:34
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
顺便再说说,Get_day这个名字不伦不类的……要么就是GetDay,要么就是get_day,要么就是getDay……
2008-10-30 12:38
baoxiang2007
Rank: 1
等 级:新手上路
帖 子:12
专家分:0
注 册:2008-10-30
收藏
得分:0 
想部下,,在WINDOWS 操作系统下,可以使用GCC吗。我现在一直用的是VISUAL C++,
2008-10-30 12:48
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
有个小问题……你试试看2008--10
2008-10-30 12:50
iFreeBSD
Rank: 4
等 级:业余侠客
威 望:4
帖 子:474
专家分:236
注 册:2007-11-5
收藏
得分:0 
to 风居住的街道
我用gcc,cc 等编译均无问题,况且"+"属printf格式输出修饰符,哪来warnning之说,如果有更简单的代码不妨发上来,函数命名属个人喜好,样例输入我也已经给出,你不按说明输入得到了错误结果,我想那不是我的错吧。

[[it] 本帖最后由 iFreeBSD 于 2008-10-30 13:35 编辑 [/it]]

date.jpg (7.24 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册

without further ado, let’s get started
2008-10-30 13:32
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
1 首先这程序写得的确不错,编译也没有问题的确,但是编译开-Wall选项是个好习惯,希望LZ能考虑一下~~~
2 程序的健壮性包括,对于用户所有的输出,都必须给出合理的结果,显然这个“所有”也包括错误的情况,不然所有的缓冲区溢出都是合法的了……
3 的确是个人喜好,不便多说,这个是我不对,抱歉~~
4 恩~那我也写一个代码好了~稍等~~
2008-10-30 19:26
风居住的街道
Rank: 1
等 级:新手上路
帖 子:374
专家分:0
注 册:2008-10-24
收藏
得分:0 
我的实现~~稍微修改了部分功能设计:
程序代码:
#include <stdio.h>
#include <ctype.h>

int is_leap_year(int y)
{
    return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
}

int get_week_of_date(int y, int m, int d)
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y / 4 - y / 100 + y / 400 + t[m-1] + d) % 7;
}

int get_month_days(int y, int m)
{
    if (m == 2)
        return 28 + is_leap_year(y);
    return 30 + ((m <= 7) == (m % 2));
}

void print_calendar(int y, int m)
{
    int day = get_week_of_date(y, m, 1), week = 0;
    int pre_month_day, month_day = get_month_days(y, m);

    if (m == 1)
        pre_month_day = get_month_days(y - 1, 12);
    else
        pre_month_day = get_month_days(y, m - 1);

    puts("  Sun  Mon  Tue  Wed  Thu  Fri  Sat");
    for (; day > 0; day--, week++)
        printf("%5d", pre_month_day - day + 1);

    for (day = 1; day <= month_day; day++)
    {
        printf("%5d", day);
        if (++week % 7 == 0)
            putchar('\n');
    }

    for (day = 1; week % 7 != 0; day++, week++)
        printf("%5d", day);
    putchar('\n');
}

int main(void)
{
    int year, month;
    puts("Input the year and month like  \"2008-10\"");
    while (putchar(':'), scanf("%d-%d", &year , &month) == 2)
    {
        if (month >= 1 && month <= 12)
            print_calendar(year, month);
        else
            puts("date error");
    }
    return 0;
}
2008-10-30 20:22
快速回复:帮一MM写的一个日历小程序
数据加载中...
 
   



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

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