// 检测当前年分是闰年还是平年
int IsLeapYear(int year)
{
int ret = 0; // 0 = 平年 1 = 闰年
// 检测当前输入参数是否合法
// 支持公元1 - 2100年
if(year <= 0 || year > 2100){
ret = -1; // 年 参数错误
}
// 普通闰年:能被4整除但不能被100整除的年份为普通闰年
// 世纪闰年:能被400整除的为世纪闰。
if(((year%4 == 0) && (year%100 != 0)) || // 普通闰年
(year%400 == 0)){ // 世纪闰年
ret = 1; // 闰年
}
return ret;
}
// 检测当前年月最大日期
// 判断该月一共有几天?
// input: int year: 当前年份
// int month: 当前月份
// output: -1: 年份输入错误
// -2: 月份输入错误
// 其他:正确结果
int FindDate(int year, int month)
{
int ret = 0;
// 检测年份参数是否合法
// 并判断年份是闰年还是平年
ret = IsLeapYear(year);
if(ret < 0){ // 参数错误
goto err;
}
// 此处检测月份参数是否合法
if(month <= 0 || month >12){
ret = -2; // 年与月参数错误
goto err;
}
// 月份检测
switch(month){
case 2: // 2月
if(ret == 1){ // 闰年是29天
ret = 29;
}else{
ret = 28; // 平年是28天
}
break;
case 4:
case 6:
case 9:
case 11: // 4月 6月 9月 11月 固定30天
ret = 30;
break;
default: ret = 31; // 1月 3月 5月 7月 8月 10月 12月固定31天
}
err:
return ret;
}
void Test02_PrintfTime(void)
{
int year,month,day,hour,min,sec;
int ret = 0; // 记录当前运行状态/记录当前年月有多少天
// 初始化时间
year = 2020;
month = 2;
day = 29;
hour = 16;
min = 59;
sec = 55;
// 年份与月份参数检测并返回当前年月有多少天
ret = FindDate(year, month);
if(ret < 0){
goto err; // -1:输入年份错误 -2:输入月份错误
}
// 检测当前输入的day参数是否有效
if(day <= 0 || day > ret){
ret = -3; // -3:输入日期错误
goto err;
}
// 检测输入时间是否合法日期
// 此处单独使用,不做独立函数
if((hour < 0 || hour > 23) || // 检测小时
(min < 0 || min > 59) || // 检测分钟
(sec < 0 || sec > 59) ){ // 检测秒
ret = -4; // -4:输入时间错误
goto err;
}
system("clear"); // 新增清屏效果
for(;;){
// 打印当前日期与时间
// 此处打印-解决上电显示延时的问题
// 优化同行覆盖显示
// 优化:屏蔽\b, 在最后printf("+++\r");
//printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b");
printf("%04d-%02d-%02d ", year, month, day);
printf("%02d:%02d:%02d\r", hour, min, sec );
fflush(stdout);
sleep(1); // 延时1s
// 范围判断
if(++sec > 59){ // 秒的有效范围:0-59
sec = 0; // 清空sec
if(++min > 59){ // 分的有效范围:0-59
min = 0; // 清空min
if(++hour > 23){ // 时的有效范围:0-23
hour = 0; // 清空hour
if(++day > ret){ // 日期范围1-ret
day = 1; // 初始化day
if(++month > 12){ // 月的范围1-12
month = 1;
year++; // 年份+1,没有范围
}
// 检测当前参数是否正确
// 返回当前日期当月有多少天
ret = FindDate(year, month);
if(ret < 0){
goto err;
}
}
}
}
}
}
err:
printf("input start time Error = %d,please try again.\n", ret);
}
// 主函数
int main(int argc, const char *argv[])
{
#if 1
// 在题目基础上新增时间初始化的参数有效性判断
// 可升级为随时可调时间并作输入的时间有效的判断(待升级)
// 年月日时分秒 分别测试通过
// 经过初步调试,测试相对比较稳定
// 未做优化20190229MrWang
Test02_PrintfTime();
// 打印效果:
// 2020-02-29 16:59:55
#endif
}
2.实现一个时钟(if/else while) 例:2020-2-28 16:37:20
猜你喜欢
转载自blog.csdn.net/TurboTab/article/details/104606050
今日推荐
周排行