在我们日常生活中离不开时钟,从早上的脑中叫醒到晚上提醒睡觉,时间在我们身边一分一秒地流过。可是,在我们生活中接触的是智能手机或者电脑上的时间,却没有接触编程语言设计的秒表时间。今天就带大家了解一下如何使用C语言编写秒表。
实现思路及代码
如何获取流逝的时间长度?
要实现一个秒表,首先要知道从开始计时至今过了多久。在*nix 系统中,表示时刻的事实标准是Epoch Time[1],在shell脚本中要获取 Epoch Time 可以用date命令。再用首尾时刻相减便得到了期间流逝的秒数了,示例代码如下
begin_at=$(date '+%s') # 睡个觉 end_at=$(date '+%s') ((interval=${end_at} - ${begin_at}))
双圆括号是一种在shell脚本中执行算术运算的语法,其它语法可以参见Math in Shell Scripts[2]。
如何换算为时分秒?
有了interval中存储的总秒数后,换算成时分秒便是轻而易举的事情,示例代码如下
((hours=${interval} / 3600)) ((minutes=(${interval} % 3600) / 60)) ((seconds=(${interval} % 3600) % 60))
如何输出形如hh:mm:ss的格式?
hh:mm:ss的意思是分别用两个十进制数字显示时分秒,并以冒号分隔它们。如果有任何一个单位的数值小于 10,便用字符0填充左侧的空白。按这个格式,凌晨 1 点 2 分 3 秒便会显示为01:02:03。
要在命令行中打印字符串,最容易想到的便是echo命令,只可惜它不能方便地实现填充字符0的需求。
强人所难也不是不行,示例代码如下
hours=1 minutes=2 seconds=3 if [ "${hours}" -lt '10' ]; then echo -n "0${hours}" else echo -n "${hours}" fi echo -n ':' if [ "${minutes}" -lt '10' ]; then echo -n "0${minutes}" else echo -n "${minutes}" fi echo -n ':' if [ "${seconds}" -lt '10' ]; then echo -n "0${seconds}" else echo -n "${seconds}" fi
更优雅的方法是用printf命令来自动填充左侧的字符0
printf "%02d:%02d:%02d" ${hours} ${minutes} ${seconds}
如何覆盖已经打印的内容?
只要用tput命令即可,示例代码如下
echo -n '11:22:33' tput cr tput el echo '44:55:66'关于cr和el,以及更多可以传给tput命令的参数,可以参见terminfo的man文档。
如何每隔一秒钟输出一次?
这大概是整个程序中最简单的需求了
while [ 1 -eq 1 ] do # 此处可以为所欲为 sleep 0.5 done完整的秒表实现
至此,完整的秒表程序就可以实现出来了
#!/bin/bash # 秒表,以hh:mm:ss的格式展示数据 begin_at=$(date '+%s') while [ 1 -eq 1 ] do end_at=$(date '+%s') # 算术运算:http://faculty.salina.k-state.edu/tim/unix_sg/bash/math.html ((interval=${end_at} - ${begin_at})) ((hours=${interval} / 3600)) ((minutes=(${interval} % 3600) / 60)) ((seconds=(${interval} % 3600) % 60)) tput cr tput el printf "%02d:%02d:%02d" ${hours} ${minutes} ${seconds} sleep 0.5 done运行后的效果如下:
扫码二维码 获取免费视频学习资料
- 本文固定链接: http://phpxs.com/post/9369/
- 转载请注明:转载必须在正文中标注并保留原文链接
- 扫码: 扫上方二维码获取免费视频资料
查 看2022高级编程视频教程免费获取