2.实现一个时钟(if/else while) 例:2020-2-28 16:37:20

// 检测当前年分是闰年还是平年
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
}
发布了10 篇原创文章 · 获赞 0 · 访问量 534

猜你喜欢

转载自blog.csdn.net/TurboTab/article/details/104606050