//cnt--; //“cnt减1”放到while循环中(根据评论区建议进行优化)
}
printf("计时结束\n");
return 0;
}
### 运行效果
![请添加图片描述](https://img-blog.csdnimg.cn/1e51e6265b004a00b866e75084715a28.gif#pic_center)
## 2.普通版本
>
> 普通版本也很简单,主要包括:
>
>
> 1. 设置计时时间
> 2. 倒计时
> 3. 蜂鸣器报警(系统提示音)
>
>
>
#include <stdio.h>
#include <time.h>
int main(void)
{
int hour = 0, min = 0, sec = 0;
time_t time_sec = 0;
time_t old_sec = 0;
printf(“请设置计时时间——时 分 秒\n”);
scanf(“%d%d%d”, &hour, &min, &sec);
time(&time_sec); //获取当前秒数(1970-1-1 00:00:00到现在)
printf(“倒计时——%02d:%02d:%02d\r”, hour, min, sec);
old_sec = time_sec; //更新旧的秒数
while(hour > 0 || min > 0 || sec > 0)
{
time(&time_sec); //获取秒数保存到time_t变量
if(time_sec != old_sec) //如果秒数改变(计时达到1秒)
{
old_sec = time_sec; //更新旧的秒数
if(sec > 0)
sec–; //计时秒数减1
else
{
sec = 59; //如果原秒数为0,则变为59
if(min > 0)
min–; //计时分钟减1
else
{
min = 59; //如果分钟数为0,则变为59
hour–; //计时小时数减1
}
}
printf(“倒计时——%02d:%02d:%02d\r”, hour, min, sec);
}
}
for(int i = 0; i < 5; i++)
{
printf(“\a”); //响蜂鸣器(或系统提示音)
sleep(1); //延时1秒,太短电脑不发出声音
}
puts(“\n计时结束\n”);
return 0;
}
### 运行效果
![请添加图片描述](https://img-blog.csdnimg.cn/ecfd9732b9864b48b60f431c25376106.gif#pic_center)
## 3.高级版本
>
> 在普通版本的基础上添加了**菜单打印**和**键盘按键扫描**两部分代码。
> 程序的核心为 `pause_flag`和`menu_flag`这两个标志,前者控制倒计时的`开始`,`暂停`与`继续`,后者控制`菜单`是否需要刷新(只有**程序第一次运行**、**设置计时时间**或**计时结束**时才需要打印菜单)。
>
>
>
#include <stdio.h>
#include <time.h>
#include <conio.h> //kbhit()/_kbhit(),getch()
#include <Windows.h> //Sleep(ms)
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”); //Windows系统清屏命令
printf(“\n"); //菜单
if(hour_def || min_def || sec_def)
printf(“|\t倒计时时间:%02d:%02d:%02d\t |\n”,
hour_def, min_def, sec_def);
else
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); //延时1秒,太短电脑不发出声音
}
pause_flag = 1; //停止计时
}
}
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 键盘按键扫描+操作 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
key = 0;
if(\_kbhit()) //检测到按键按下
key = getch(); //读取按键
switch(key)
{
case 's': //按s/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)
{
//printf("时间设置失败\n");
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) //计数值为0
{
hour = hour_def; //读取上次设置的时间
min = min_def;
sec = sec_def;
//打印初始时间
printf("倒计时——%02d:%02d:%02d\r",\
hour, min, sec);
}
}
else
pause_flag = 1; //暂停计时
time(&time_sec); //获取当前秒数(1970-1-1 00:00:00到现在)
old_sec = time_sec; //更新旧的秒数
}
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
725643284422)]
[外链图片转存中…(img-7a1PMN69-1725643284422)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0