摘要:大家对计时器应该不陌生,我们在制定一个计划时,经常喜欢设置一个倒计时来规定完成时限,等到计时结束,它还会报警提示,今天,我就用语言编写一个简易的倒计时计时器。
大家对计时器应该不陌生,我们在制定一个计划时,经常喜欢设置一个倒计时来规定完成时限,等到计时结束,它还会报警提示,今天,我就用C语言编写一个简易的倒计时计时器。
简单介绍一下我的实现思路:
本文包括三个版本,分别是极简版、普通版、高级版:
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")
)。极简版代码很简单,就不多作介绍了。
#include #include //Sleep(ms)int main(){ int cnt = 0; puts("输入秒数"); scanf("%d", &cnt); while(cnt >= 0) { Sleep(1000); printf("%d/r", cnt); cnt--; } printf("计时结束/n"); return 0;}
普通版本也很简单,主要包括:
- 设置计时时间
- 倒计时
- 蜂鸣器报警(系统提示音)
#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;}
在普通版本的基础上添加了菜单打印和键盘按键扫描两部分代码。
程序的核心为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;}
文章到这里就结束了,如果你有更好的方案,欢迎分享?,如果我程序有任何问题,可以评论或私聊我,一起学习,一起进步!!!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/123617.html
摘要:其中判断信号灯的和车辆的位置关系可以通过,车辆的航向角信息,以及车辆的经纬度信息,目标点的经纬度信息,进行计算和处理后可以获取目标点和车辆的相对位置。 首先简单说明一下闯红灯预警算法流程图,总共分为7步如下图所示: 背景技术: 本算法主要是基于V2X通信技术,在道路交通中,车辆与车辆之间,...
摘要:下面我们将用平台来模拟一个设备管理系统。查看是否创建了定时器第三步,创建摄像机面板,烟感报警面板以及控制设备的开关,这里简单调整一下面板位置之后会增加两个创建设备的按钮。创建对象数组,以及数组标识第五步,为每个设备对应的创建控制开关。 国内高层建筑不断兴建,它的特点是高度高、层数多、体量大。面积可达几万平方米到几十万平方米。这些建筑都是一个个庞然大物,高高的耸立在地面上,这是它的外观,...
摘要:调试命令你只会对象提供对浏览器控制台的接入如的。分类输出不同类别信息的输出文字信息提示信息警告信息错误信息分组输出使用和包裹分组内容。中的参数作为计时器的标识,具有唯一性。应该需要其他的调试工具。 Javascript调试命令——你只会Console.log() ? Console 对象提供对浏览器控制台的接入(如:Firefox 的 Web Console)。不同浏览器上它的工作方式...
摘要:在考虑安全性时,你需要考虑如何避免被滥用,也不例外,即使在标准库中,也存在用于编写应用的不良实践。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数应用程序涉及可变延迟,因此几乎不可能在服务器上编写计时攻击。 简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中...
摘要:在考虑安全性时,你需要考虑如何避免被滥用,也不例外,即使在标准库中,也存在用于编写应用的不良实践。计时攻击需要精确性,所以通常不能用于高延迟的远程网络。由于大多数应用程序涉及可变延迟,因此几乎不可能在服务器上编写计时攻击。 简评:编写安全代码很困难,当你学习一个编程语言、模块或框架时,你会学习其使用方法。 在考虑安全性时,你需要考虑如何避免被滥用,Python 也不例外,即使在标准库中...
阅读 1340·2023-04-25 16:45
阅读 1882·2021-11-17 09:33
阅读 2285·2021-09-27 14:04
阅读 897·2019-08-30 15:44
阅读 2583·2019-08-30 14:24
阅读 3379·2019-08-30 13:59
阅读 1676·2019-08-29 17:00
阅读 862·2019-08-29 15:33