C语言小项目——计时器(倒计时+报警提示)_c语言倒计时

    //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;     //更新旧的秒数
            }

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
725643284422)]
[外链图片转存中…(img-7a1PMN69-1725643284422)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

加入社区》https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值