用C写的一个类似cal命令的小程序

最近开始学习C语言,也不知道从何学起,就买了本《C Primer Plus》和《C语言项目案例分析》,先把C语言有关的基础的知识掌握,然后再跟着《C语言项目案例分析》这本书上的例子来练习练习,第一个小例子是万年历,就是类似于cal命令的一个小工具。

当然了,这个小工具基本没做什么错误兼容判断,也不能选定以周几为每周的第一天,目前也是只能显示一个月而已,但毕竟是我的第一个用C写的小工具,以后再慢慢完善吧。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>


typedef enum
{
    FALSE,
    TURE
}bool;

 

///日期结构体
typedef struct wendao{
    int year;
    int month;
    int day;
}strDate;

 

///函数声明区
strDate parseData( char dateStr[] );
int getWeek(int,int,int);
bool isRun(int);
void showCalender( int year, int month);
int getDay( int year, int month );

 

///主函数,接收命令行参数

int  main( int argc, char *argv[] )
{
    char str[11];
    if( argc > 1 )
    {
        strncpy(str,argv[1],10);
    }
    strDate wendao=parseData(str);
    printf("\nyear=%d\tmonth=%d\tday=%d\n",wendao.year,wendao.month,wendao.day);
    printf("\n");
    int m = getWeek(wendao.year,wendao.month,wendao.day);
    printf("%d/%d/%d the week is %d\n",wendao.year,wendao.month,wendao.day,m);
    showCalender(wendao.year,wendao.month);

    return 1;
}

///判断每月的天数
int getDay( int year, int month ){
    int dayNum[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    if( isRun(year) ){
        dayNum[2] = 29;
      }
    return dayNum[month];;
}

/**
* 判断是不是闰年

* 此算法是从网上找的,跟《C语言项目案例分析》的不太一样,感觉这个比较简单
*/
bool isRun( int year )
{
    return (year%4==0 && year%100!=0) || (year%100==0&&year%400==0);
}

 

/**
* 获取某天的星期,如0是周日,1是周一
*/
int getWeek( int year, int month, int day )
{
   if( month <1 || month >12 )
   {
      printf("invalid month:%d\n",month);
      exit(EXIT_FAILURE);
   }
   if( day < 1 || day > 31)
   {
      printf("invalid day:%d\n",day);
      exit(EXIT_FAILURE);
   }
   if( month == 1 || month == 2 )
   {
      month += 12;
      year--;
   } 
   return ((day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7 + 1)%7;
}


 

/**
* 将输入的字符串日期解析成数字日期
* 输入日期:2012/09/34  或者  2012.05.12  或者  20120412
*/
strDate parseData( char dateStr[] )
{
     strDate intDate;
     char year[5];
     char month[3];
     char day[3];

     strncpy(year,dateStr,4);

     ///2012/09/34  或者  2012.05.12格式的
     if( strchr(dateStr,'/') || strchr(dateStr,'.') ){
         char *ptr1=strchr(dateStr,'/');
         char *ptr2=strchr(dateStr,'.');
         if( ptr1 ){
            strncpy(month,ptr1+1,2);
            month[2]='\0';
            strncpy(day,ptr1+4,2);
            day[2]='\0';
         }
         if( ptr2 ){
           strncpy(month,ptr2+1,2);
           month[2]='\0';
           strncpy(day,ptr2+4,2);
           day[2]='\0';
         }
     }
     intDate.year=atoi(year);
     intDate.month=atoi(month);
     intDate.day=atoi(day);

     return intDate;
}

///显示日历
void showCalender( int year, int month){
    int firstDay = getWeek(year,month,1);
    int dayNum = getDay(year,month);
    int i,j;
    printf("\n****************************************************\n");
    printf("SUN\tMON\tTUE\tWEN\tTHU\tFRI\tSTA\n");
    for(j=1;j<=firstDay;j++){
    printf("\t");
    }
    printf("01\t");
    for(i=2;i<=dayNum;i++){
    printf("%02d\t",i);   
    if( getWeek(year,month,i) == 6 ){
         printf("\n");
    }
    }
    printf("\n");
}

posted @ 2012-07-25 04:41  奇葩文刀  Views(306)  Comments(0)    收藏  举报