在普通版本的基础上添加了菜单打印和键盘按键扫描两部分代码。
程序的核心为 pause_flag
和menu_flag
这两个标志,前者控制倒计时的开始
,暂停
与继续
,后者控制菜单
是否需要刷新(只有程序第一次运行、设置计时时间或计时结束时才需要打印菜单)。
#include <stdio.h>
#include <time.h>
#include <conio.h>
#include <Windows.h>
int main(void)
unsigned int hour = 0, min = 0, sec = 0;
unsigned int hour_def = 0, min_def = 0, sec_def = 0;
time_t time_sec = 0;
time_t old_sec = 0;
char key;
int pause_flag = 1;
int menu_flag = 1;
while(1)
if(menu_flag == 1)
menu_flag = 0;
system("cls");
printf("================================\n");
if(hour_def || min_def || sec_def)
printf("|\t倒计时时间:%02d:%02d:%02d\t |\n",\
hour_def, min_def, sec_def);
printf("|\t未设置计时时间\t\t|\n");
printf("| S:设置 空格:开始/暂停 Q:退出 |\n");
printf("================================\n");
if(pause_flag == 0)
printf("计时结束\n");
for(int i = 0; i < 5; i++)
printf("\a");
sleep(1);
pause_flag = 1;
key = 0;
if(_kbhit())
key = getch();
switch(key)
case 's':
case 'S':
printf("请设置计时时间——时 分 秒\n");
scanf("%d %d %d", &hour_def, &min_def, &sec_def);
if(hour_def > 24 || min_def > 59 || sec_def > 59)
hour_def = min_def = sec_def = 0;
hour = min = sec = 0;
menu_flag = 1;
break;
case ' ':
if(hour_def || min_def || sec_def)
if(pause_flag)
pause_flag = 0;
if(!hour && !min && !sec)
hour = hour_def;
min = min_def;
sec = sec_def;
printf("倒计时——%02d:%02d:%02d\r",\
hour, min, sec);
pause_flag = 1;
time(&time_sec);
old_sec = time_sec;
break;
case 'q':
case 'Q': printf("程序退出\n");return 0;
time(&time_sec);
if(pause_flag == 0 && old_sec != time_sec)
old_sec = time_sec;
if(sec > 0)
sec--;
sec = 59;
if(min > 0)
min--;
min = 59;
hour--;
printf("倒计时——%02d:%02d:%02d\r", hour, min, sec);
if(!hour && !min && !sec)
menu_flag = 1;
return 0;
文章到这里就结束了,如果你有更好的方案,欢迎分享😁,如果我程序有任何问题,可以评论或私聊我,一起学习,一起进步!!!
函数原型:time_t time(time_t * timer)
功能: 获取当前的系统时间,返回的结果是一个time_t类型,其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。
说明:实际上time_t 类型就是 long int 类...