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

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

文章目录

实现思路1.极简版本运行效果

2.普通版本运行效果

3.高级版本运行效果

实现思路

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

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

1.极简版本

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

#include

#include //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.普通版本

普通版本也很简单,主要包括:

设置计时时间倒计时蜂鸣器报警(系统提示音)

#include

#include

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_flag和menu_flag这两个标志,前者控制倒计时的开始,暂停与继续,后者控制菜单是否需要刷新(只有程序第一次运行、设置计时时间或计时结束时才需要打印菜单)。

#include

#include

#include //kbhit()/_kbhit(),getch()

#include //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;

}

运行效果

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

[an error occurred while processing the directive]
Copyright © 2088 世界杯日本队|世界杯强队|塞诺帕蒂内饰世界杯场馆装扮站|senopatiinterior.com All Rights Reserved.
友情链接