时间对于每个人都是宝贵的。人类从古至今都在发展计时设备和改善计时方法。远古时期,人类根据太阳和月亮的位置来判断时间、根据影子的方向长短来区分早晨、中午和黄昏。古代人也发明了很多计时的方法,日晷、沙漏、滴漏(大多数都叫铜壶滴漏)等较为精密的仪器来优化计时方法,使计算时间做到较为精准。现代人则更多依靠的是各种各样的电子表、手表等精密仪器来记录自己的时间。它们在给人类带来准确时间的同时,也让人们对自己的生活有了更合理,更高效的管理,使人们对自己的生活节奏有了更好的把控。

如何利用c语言编写一个时钟呢?我利用的就是c语言中的条件控制语句if...else...语句。通过控制if语句的判断条件来让程序进行判断何时进行时间进位,从而达到计时的目的。

一、sleep()函数介绍

函数:sleep();

功能:用于延时运行程序

sleep()函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。当函数设定的计时器到期,或者接收到信号、程序发生中断都会导致程序继续执行。它就相当于一个延时函数,目的是让程序进行延时,一般用于减速程序运行过程,以便人们对运行途中的现象和运行后的结果进行观察。

在Windows操作系统中,sleep()函数需要一个以毫秒为单位的参数代表程序挂起时长。

sleep(1000);//windows系统    1000毫秒=1秒

而在unix操作系统中,调用sleep()函数需要一个以秒为单位的参数。

sleep(1);//unix系统    1秒

二、fflush()函数介绍

函数:fflush();

头文件:#include<stdio.h>

函数定义:int fflush(FILE *stream);

函数功能:调用fflush()会将缓冲区的数据写入steam所指的文件中。如果没有找到对应文件将会对所有打开的文件进行数据更新。

fflush()函数的作用是用来刷新缓冲区数据的。

fflush(stdout);//刷新缓冲区,将缓冲区内的数据输出到设备 

本次计时器程序运用的fflush()函数主要目的是让显示出来的数据进行实时刷新,防止显示过多行运行结果导致观感欠佳。

三、程序的大概思路及设计代码

步骤一:获取初始时间

目的:获取计数的初始值

这里我采用了两种方式获取。

第一种是写入内部,当程序开始运行时便可以立刻开始计数。

    int year=2022,month=7,day=11;        //2022年   7月   11日
	int hour=17,minute=55,second=00;     //  17时  55分    0秒

这种方式的优点在于在程序运行时可以立刻开始计数。不用多余的操作。而存在的缺点则是初始值被写入了代码段内,每次修改初始值时都需要进入代码内修改。对于不了解代码的人更是无法修改。

第二种方法则是依靠终端输入。每次在运行程序后会给出输入界面一次输入每个项目的数值。程序则会从终端进行获取。

    printf("请输入按顺序输入年 月 日 时 分 秒(以空格分开):");
	ret=scanf("%d%d%d%d%d%d",&year,&month,&day,&hour,&minute,&second);
    while((getchar()!='\0'));

用户从终端输入六个整数用来给六个变量进行初始赋值。

这种赋值方法的优点在于用户不用重新编译代码便可以直接修改初始值并且可以让不了解代码的人根据提示输入对应的数字。

这里我采用的是第二种方法并且定义了结构体,结构体类型为TIME。

typedef struct 
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
}TIME;

 在主函数中定义了结构体变量time以及标志量ret

    TIME time;
	int ret=0;

步骤二:判断输入的值是否符合时间规则

目的:防止因为错误输入导致程序显示错误的数据。

        这里我才用的是ret标志量和if条件判断语句的搭配来构成对输入量是否正确的筛选。

if(ret==6&&time.month<=12&&time.month>=1&&time.year>0){
		if (time.month==1 || time.month==3 || time.month== 5|| time.month == 7||time.month == 8||time.month == 10 || time.month == 12){
					if(time.day<=31&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
						time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else if( time.month==4 || time.month == 6 || time.month == 9 || time.month == 11){
					if(time.day<=30&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
						time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else if(time.month == 2){	
					if(time.year%4==0 && time.year%100!=0 || time.year%400==0){
						if(time.day<=29&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
							time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
					}else{
						if(time.day<=28&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
							time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else{
			printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
			return -1;

        ret负责判断输入个数,if语句来判断输入数据是否符合要求。如果不符合要求,则会显示警告信息并关闭程序。

步骤三:对输入正确的数据进行处理

目的:主要是设置变量之间的进位上限,以保证秒进分、分进时以此类推。

        这里我封装了一个函数time_l()

        函数:time_l()

        函数定义:int time_l(TIME *time);

        功能:用来计数并显示时间。

        这里我运用了大量的if语句区分不同年不同月之间不同的天数。

代码如下:

int time_l(TIME *time){
	while (1)
		time->second+=1;
		if(time->second == 60){
			time->minute+=1;
			time->second=0;
		if(time->minute == 60){
			time->hour+=1;
			time->minute=0;
		if(time->hour==24){
			time->day+=1;
			time->hour=0;
		if (time->month==1 || time->month==3 || time->month== 5|| time->month == 7||time->month == 8||time->month == 10 || time->month == 12)
			if(time->day==32){
				time->month+=1;
				time->day=1;
		}else if( time->month==4 || time->month == 6 || time->month == 9 || time->month == 11){
			if(time->day==31){
				time->month+=1;
				time->day=1;
		if(time->month == 2){	
			if(time->year%4==0 && time->year%100!=0 || time->year%400==0){
				if(time->day==30){
					time->month+=1;
					time->day=1;
			}else{
				if(time->day==29){
					time->month+=1;
					time->day=1;
		if(time->month==13){
			time->year+=1;
			time->month=1;
		sleep(1);
		printf("%4d年 %4d月 %4d天 %4d时 %4d分 %4d秒\r",time->year,time->month,time->day,time->hour,time->minute,time->second);
		fflush(stdout);
	return 0;

        其中我运用了sleep()函数用来读秒,又用了while函数制造了死循环以便数据不停的更新,程序运转,fflush(stdout)语句则是用来更新输出数据,使显示界面更整洁只显示当前时间。

        这里我将sleep(1)语句放在了printf()语句前面,会导致运行的第一秒不会显示。可以将sleep语句放在printf语句后面可以立刻显示数据。

四、结果展示

 上图为正常输入后的结果显示图

 此图为错误输入数据后的结果显示图

        以上就是时钟小程序的实现步骤及结果展示

全部代码:

#include<stdio.h>
#include<unistd.h>
typedef struct 
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
}TIME;
int time_l(TIME *);
int time_l(TIME *time){
	while (1)
		time->second+=1;
		if(time->second == 60){
			time->minute+=1;
			time->second=0;
		if(time->minute == 60){
			time->hour+=1;
			time->minute=0;
		if(time->hour==24){
			time->day+=1;
			time->hour=0;
		if (time->month==1 || time->month==3 || time->month== 5|| time->month == 7||time->month == 8||time->month == 10 || time->month == 12)
			if(time->day==32){
				time->month+=1;
				time->day=1;
		}else if( time->month==4 || time->month == 6 || time->month == 9 || time->month == 11){
			if(time->day==31){
				time->month+=1;
				time->day=1;
		if(time->month == 2){	
			if(time->year%4==0 && time->year%100!=0 || time->year%400==0){
				if(time->day==30){
					time->month+=1;
					time->day=1;
			}else{
				if(time->day==29){
					time->month+=1;
					time->day=1;
		if(time->month==13){
			time->year+=1;
			time->month=1;
		sleep(1);
		printf("%4d年 %4d月 %4d天 %4d时 %4d分 %4d秒\r",time->year,time->month,time->day,time->hour,time->minute,time->second);
		fflush(stdout);
	return 0;
int main(int arc,char *argv[])
	TIME time;
	int ret=0;
	printf("请输入按顺序输入年月日时分秒(以空格分开):");
	ret=scanf("%d%d%d%d%d%d",&time.year,&time.month,&time.day,&time.hour,&time.minute,&time.second);
	while ((getchar()!='\n'));
	if(ret==6&&time.month<=12&&time.month>=1&&time.year>0){
		if (time.month==1 || time.month==3 || time.month== 5|| time.month == 7||time.month == 8||time.month == 10 || time.month == 12){
					if(time.day<=31&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
						time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else if( time.month==4 || time.month == 6 || time.month == 9 || time.month == 11){
					if(time.day<=30&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
						time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else if(time.month == 2){	
					if(time.year%4==0 && time.year%100!=0 || time.year%400==0){
						if(time.day<=29&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
							time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
					}else{
						if(time.day<=28&&time.day>=1 && time.hour<=23&&time.hour>=0 && time.minute<=59&&time.minute>=0 && time.second<=59&&time.second>=0){
							time_l(&time);
						else{
							printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
							return -1;
		else{
			printf("您输入的数据不正确,会导致系统显示错误,程序已关闭!\n");
			return -1;
	return 0;

        此代码中还有很多可以改进的地方,希望各位可以多多提出您宝贵的建议,由衷感谢。

CSDN-Ada助手: 恭喜你写了第10篇博客,题目也非常有价值。我觉得下一步你可以考虑更深入地探究不同类型存储单元的优缺点,或是介绍一些新兴的存储技术。希望你能继续保持创作热情,为读者带来更多有益的知识。 CSDN 会根据你创作的博客的质量,给予优秀的博主博客红包奖励。请关注 https://bbs.csdn.net/forums/csdnnews?typeId=116148&utm_source=csdn_ai_ada_blog_reply10 看奖励名单。 c++小程序之文本编辑器 2301_77316779: 温湿度报警装置 A 深蓝~浅蓝: 👏 👏 👏 python小游戏:“不要做”游戏取词器 A 深蓝~浅蓝: 拿走拿走! c++小程序之文本编辑器 A 深蓝~浅蓝: 进步很快,加油^0^~