C语言小项目——计时器(倒计时+报警提示)「建议收藏」

大家对计时器应该不陌生,我们在制定一个计划时,经常喜欢设置一个倒计时来规定完成时限,等计时结束,它还会报警提示,今天,我就用C语言编写一个简易的倒计时计时器。

大家好,又见面了,我是你们的朋友全栈君。

大家对计时器应该不陌生,我们在制定一个计划时,经常喜欢设置一个倒计时来规定完成时限,等到计时结束,它还会报警提示,今天,我就用C语言编写一个简易的倒计时计时器。

实现思路

简单介绍一下我的实现思路:
本文包括三个版本,分别是极简版普通版高级版

  1. 极简版:简单的单次倒计时,只能设置秒数,计时通过Sleep()函数实现(粗略倒计时),先输入秒数cnt,然后每过1秒(Sleep(1000)),cnt减1,直到cnt变成0,就退出程序。
  2. 普通版:可设置计时的hour,min,sec),计时通过time()函数实现(用来获取当前系统时间的秒数),进入while循环,判断系统时间秒数是否变化,如有变化,说明过了1秒。这时将秒数sec减1,当sec减到0,下一秒就将分钟min减1,同时sec变为59。分钟min和小时hour的变化关系与秒和分钟的关系类似。一直循环倒计时,直到hour,minsec都变为0,此时计时结束,进行报警提示printf("\a"))。
  3. 高级版:在普通版的基础上,增加重复计时暂停计时的功能。首先需要设定计时时间,然后按下空格键开始计时,再次按下空格键,可以暂停倒计时,同时设置的倒计时时间具有记忆功能,即计时结束后,再次按下空格,依然按照上次设定的计时时间进行计时。

1.极简版本

极简版代码很简单,就不多作介绍了。

#include <stdio.h>
#include <Windows.h> //Sleep(ms)
int main()
{ 
   
    int cnt = 0;
    puts("输入秒数");
    scanf("%d", &cnt);
    while(--cnt >= 0)
    { 
   
        Sleep(1000);
        //printf("%d\r", cnt); //初始版本--存在BUG,见评论区
        printf("%-4d\r", cnt); //最大9999秒,
                               //如果要更高,把4加大即可
                               //-4表示左对齐,宽度固定为4字节
        //cnt--; //“cnt减1”放到while循环中(根据评论区建议进行优化)
    }
    printf("计时结束\n");
    return 0;
}

运行效果

请添加图片描述

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;
}

运行效果

请添加图片描述

3.高级版本

在普通版本的基础上添加了菜单打印键盘按键扫描两部分代码。
程序的核心为 pause_flagmenu_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;
}

运行效果

请添加图片描述

文章到这里就结束了,如果你有更好的方案,欢迎分享?,如果我程序有任何问题,可以评论或私聊我,一起学习,一起进步!!!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/126283.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • linux ubuntu安装_vscode electron

    linux ubuntu安装_vscode electron环境:ubuntux86_64apache2.4mysql5.7php7.0方法一:这个方法是我安装成功的方法,所以写在第一个.步骤:1.在官网https://code.visualstudio.com/Download下载相应的deb包到自己电脑上我下载的是64bit的.2.打开相应目录的终端,执行命令sudodpkg-icode_1.2…

  • Pycharm安装使用TensorFlow[通俗易懂]

    Pycharm安装使用TensorFlow[通俗易懂]众多深度学习的初学者都会面临环境搭建的问题,本文根据亲身经历说明几个关键步骤:1.安装Pycharm,其中社区版免费,可以直接去pycharm官网下载安装https://www.jetbrains.com/pycharm/download/2.安装Anaconda,初学者不用急于安装最新版本的Anaconda(尤其是硬件设备并非最新的初学者,因为我注意到很多初学者的设备就是自己的笔记本或者台式机,一些并没有独立显卡,或者是NVIDIA730之类的台式机显卡,无法使用最新的深度学习包,以及一些CUD

  • ProgressDialog 使用

    ProgressDialog 使用ProgressDialog[功能]ProgressDialog也是一种Dialog一般在出现ProgressDialog后台都会再开辟Thread来做一些耗时的工作我演示的是从100数到0这段时间既不太长不用浪费时间等待同时也能明显地看出效果[代码]1.ProgressDialog使用[code="java"]public…

  • 小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)

    小米5 MIUI 10系统完全Root教程 (Root思想通用所有机型)WrittenbyQingXiaonan2018-8-251.摘要  虽然手机在完全root后存在一定风险,但是可以从事一些具有探索性的工作如修改手机游戏、修改APP权限要求、编写按键脚本等。此外,完全root非常适合那些拥有两个手机的人。这篇帖子以小米5最新MIUI10开发版系统完全root过程为例,介绍了一种通用的小米机型完全Root办法。2.重要概念…

  • Swing程序设计(简易文本编辑器数据结构课设)

    Java课程设计-基于Swing的文本编辑器1.介绍2.相关技术3.项目地址4.所需环境5.安装教程6.运行截图7.相关博客1.介绍设计一个类似于Windows记事本(Notepad)的Java程序。可以打开、新建、保存一个文本文件;对选中的文本进行各种编辑操作(设置字体、字号、字型、对齐方式、背景、前景色、复制、粘贴、剪切等);在文本中能够插入对象。2.相关技术Java的Swing编程Java的文件读写3.项目地址https://gitee.com/jack0240/text-edi

  • 标签的含义_新建标签页的网址

    标签的含义_新建标签页的网址功能说明版权信息适用范围首页模板,列表模板,内容模板基本语法[NT:unLoop,NT:SiteID=0,NT:LabelType=CopyRight][/NT:unLoop]必填参数NT:SiteID表示站群ID,0表示总站NT:LabelType标签类型:值为CopyRight,表示版权信息后台设置:控制面板—系统…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号