【C 语⾔应⽤实例】输出当⽉⽇历
C 语⾔在控制台输出当⽉⽇历
C 语⾔在控制台输出当⽉⽇历
⼀、概述
在学完C语⾔的⼤致语法后,是否感觉有⼒⽆处施展呢?这个输出⽇历的⼩程序可以帮助⼤家获得⼀点成就感!
⼆、提前知识准备
由于本程序使⽤到了C语⾔标准库的time.h 这个头⽂件,建议提前了解⼀下:
注: 以下介绍多引⽤⾃这两个⽹站,侵删!
(1)、tm 结构体
(2)、⼀些⽤到的库变量类型
类型介绍
说⼈话time_t
能够代表时间的算术类型。虽然没有定义,这⼏乎总是⼀个整体值持有秒数(不包括闰秒)⾃00:
00,1970年1⽉1⽇UTC,对应POSIX时间⼀个长整形存储着从前⼀个表格⾥说的那天到现在的秒数struct
tm 保留⽇历⽇期和时间的结构细分为其组件这是⼀个⽤来保存时间和⽇期的结构。
(3)、asctime 函数char *asctime(const struct tm *timeptr)
返回⼀个指向字符串的指针,它代表了结构 timeptr 的⽇期和时间。
(4)、localtime 函数
struct tm *localtime(const time_t *timer)
timer 的值被分解为 tm 结构,并⽤本地时区表⽰。
(3)、time 函数
C 库函数 time_t time(time_t *seconds) 返回⾃纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果seconds 不为空,则返回值也存储在变量 seconds 中。
三、运⾏界⾯
struct  tm {
int  tm_sec ;        /* 秒,范围从 0 到 59        */
int  tm_min ;        /* 分,范围从 0 到 59        */
int  tm_hour ;        /* ⼩时,范围从 0 到 23        */
int  tm_mday ;        /* ⼀⽉中的第⼏天,范围从 1 到 31    */
int  tm_mon ;        /* ⽉,范围从 0 到 11        */
int  tm_year ;        /* ⾃ 1900 年起的年数        */
int  tm_wday ;        /* ⼀周中的第⼏天,范围从 0 到 6    */
int  tm_yday ;        /* ⼀年中的第⼏天,范围从 0 到 365    */
int  tm_isdst ;      /* 夏令时                */
};
运⾏起来就像下⾯这个样⼦的啦在控制台的话界⾯是不是还不错呢?
四、代码
好了呢,废话就不多说了,直接上代码!
#include <stdio.h>
#include <time.h>
const char head[]=" Mon Tue Wed Thu Fri Sat Sun";
int getEndDay(int year,int month);
int getWeekOfFirstDay(int nowDay,int nowWeek);
int main(void)
{
time_t rawtime;
struct tm * now;
time(&rawtime);
now =localtime(&rawtime);
printf("\n  %s\n",asctime(now));
int endDay =getEndDay(now->tm_year, now->tm_mon);
int weekOfFirstDay =getWeekOfFirstDay(now->tm_mday, now->tm_wday);
int today = now->tm_mday;
printf("%s\n", head);// 输出表头
// 输出第⼀⾏占位空格
if(weekOfFirstDay ==0)
printf("                        ");
for(int i =1; i < weekOfFirstDay; i++)
printf("    ");
// 从⼀号开始输出到⽉末
for(int i =1; i <= endDay; i++)
{
if(i == today)
printf("%3d*", i);
else
printf("%4d", i);
// 周末输出结束后输出换⾏
if((i + weekOfFirstDay -1)%7==0)
puts("");
}
puts("");
return0;
c语言struct头文件}
// 得到当前所在⽉份的天数
int getEndDay(int year,int month)
{
const int days[15]={31,-1,31,30,31,30,31,31,30,31,30,31};
if(month ==1)
if(month ==1)
{
if(year %400==0||(year %100!=0&& year %4==0)) return29;
else
return28;
}
else
return days[month];
}
// 推算这⽉第⼀天是礼拜⼏
// 返回值:[0, 6] (礼拜⽇, 礼拜⼀ ~ 礼拜六)
int getWeekOfFirstDay(int nowDay,int nowWeek)
{
int mod =(nowDay -1)%7;
int ans = nowWeek - mod;
if(ans >=0)
return ans;
else
return7- ans;
}