用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");
}

浙公网安备 33010602011771号