最新C语言小项目——计时器(倒计时+报警提示)_c语言倒计时,你的技术真的到天花板了吗

img
img

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

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

#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;     //更新旧的秒数
            }
            break;
        case 'q':
        case 'Q': printf("程序退出\n");return 0;
    }

    /\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\* 计时操作 \*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
    time(&time_sec);              //获取秒数保存到time\_t变量
    if(pause_flag == 0 && old_sec != time_sec)
    {
        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);

        if(!hour && !min && !sec) //计时结束
            menu_flag = 1;        //打印菜单
    }
}
return 0;

}




![img](https://img-blog.csdnimg.cn/img_convert/55436bb39b1c3113013ff330c3a34edf.png)
![img](https://img-blog.csdnimg.cn/img_convert/2c7e09c66f6a4fe8454fa9e8b613ab86.png)

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

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.youkuaiyun.com/topics/618658159)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值