相信我们大家都用过PPT的自动放映功能,
但是联系到C语言我们难免会想到:在C的世界中能不能做到利用延时输出来达到自动放映的效果呢?
当然是可以的,下面将在这一个知识点的基础上进行放射性展开。
****************************************************************************************************************************************
1.延时输出:
- 延时输出会用到"windows.h"库函数中的Sleep()函数,首先应该指明需要调用的库函数"windows.h"
- Sleep()函数的使用:括号内的的参数是毫秒数(1000ms=1s)
- 示例代码如下:
#include <stdio.h> #include <windows.h> int main() { system("title 延时输出示例程序"); printf("最快的脚步不是跨越,而是继续,\n\n"); // system("cls"); Sleep(1000); printf("最慢的步伐不是小步,而是徘徊。\n\n"); Sleep(1000); system("pause"); }
-
运行结果:
- 在本代码中用到了三个system()函数(注释掉了一个清屏功能,下面对这几个函数进行延伸性分析:
- system("title 延时输出示例程序");功能是修改控制台标题(在我的上一篇博客中也有提到,在这再次提一下)
- system("cls");功能是清屏
- system("pause");就如同pause的表面含义一样,它通过输出"请按任意键继续…"起到了暂停程序的功能,也可用于程序的调试
- system("");函数使用前必须要声明,它在库函数"stdlib.h"与"windows.h"中均有包含
- 是不是觉得这个system()函数很有意思?那就再看几个,下面给出一个示例代码(控制计算机关机):
#include<stdio.h> #include<string.h> #include<stdlib.h> int print() { printf("╔═════════ C语言关机程序 ═════════╗\n"); printf("║※1.实现10分钟内的定时关闭计算机 ║\n"); printf("║※2.立即关闭计算机 ║\n"); printf("║※3.注销计算机 ║\n"); printf("║※0.退出系统 ║\n"); printf("╚═════════════════════════════════╝\n"); printf("请输入需要执行的功能:"); return 0; } int main() { system("title C语言关机程序"); //设置cmd窗口标题 system("mode con cols=48 lines=25"); //窗口宽度高度 system("date /T"); system("time /T"); char cmd[20]="shutdown -s -t "; char t[5]="0"; print(); int c; scanf("%d",&c); getchar(); switch(c) { case 1:printf("您想在多少秒后自动关闭计算机?(0~600)\n");scanf("%s",t);system(strcat(cmd,t));break; case 2:system("shutdown -p");break; case 3:system("shutdown -l");break; case 0:break; default:printf("Error!\n"); } printf("\n"); system("pause"); exit(0); }
-
system("mode con cols=48 lines=25"); 功能是设置控制台的大小
-
system("date /T");和system("time /T");功能是按已固定的格式输出当前系统的时间
-
这是比较常用的几个system()函数,就先介绍这几个
-
补充:exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统。exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出。
-
2.即时输出系统时间:
- 首先给出基本的获取系统时间的程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ()
{
system("title 获取系统时间");
time_t t;
struct tm *lt;
time (&t);
lt = localtime (&t);
printf ("%d/%d/%d %d:%d:%d\n\n",lt->tm_year+1900, lt->tm_mon+1, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);
system("pause");
return 0;
}
- 这个源程序中包含了大量的信息量,下面我将对其进行通俗易懂的讲解:
- time_t t;time_t是一个特殊的数据类型,类似于long,用于储存从1970.01.01(细节可以自行搜索了解)到如今的秒数
- struct tm *lt;定义一个结构体指针变量,struct tm是库函数"time.h"下的一个已定义的结构体,该结构体定义如下:
struct tm { int tm_sec; /* 秒 – 取值区间为[0,59] */ int tm_min; /* 分 - 取值区间为[0,59] */ int tm_hour; /* 时 - 取值区间为[0,23] */ int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */ int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */ int tm_year; /* 年份,其值等于实际年份减去1900 */ int tm_wday; /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */ int tm_yday; /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 */ int tm_isdst; /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的时候,tm_isdst为0;不了解情况时,tm_isdst()为负。 long int tm_gmtoff; /*指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数*/ const char *tm_zone; /*当前时区的名字(与环境变量TZ有关)*/ };
-
time (&t); 功能是返回自 Unix 纪元(January 1 1970 00:00:00 GMT)起的当前时间的秒数,主要用来获取当前的系统时间,返回的结果是一个time_t类型。
-
lt = localtime (&t);功能是将时间的秒数转换为当前的时间,起着过渡”作用,与下面的输出语句连用
-
下面那条语句功能是输出当前日期以及时间。
-
运行结果:
- 现在这样已经基本达到目的了,但是又来了一个问题:刚刚说到延时输出与清屏功能,那么能不能实现显示自动刷新的时间呢?
- 起初我是我搜索了一些代码,看到一种方式(代码如下,虽然不能实现,但是既然代码有错另一方面也说明了部分错误代码有另一种用法)
#include "stdio.h" #include <windows.h> int main() { int i; for(i=0;i<100;i++) { system("cls"); printf("%s - %s\n",__TIME__); Sleep(1000); } system("pause"); }
- 稍微分析就会发现这个demo的关键点在于"__TIME__",如果这个调用的是系统时间那么每刷新一次按理说就会自动更新一次,可见其功能不是这个,那它的功能是什么呢?搜索后发现这涉及到C语言的内置宏问题:
- "__DATE__"表示当前的编译日期
- "__TIME__"表示当前编译时间
- 接下来附上正确代码(程序内部空格是为了更加直观分析):
#include <stdio.h> #include <time.h> #include <windows.h> int main() { time_t t; struct tm *date_time; while (1) { Sleep(1000); time(&t); date_time = localtime(&t); COORD Out={0,0}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),Out); //这两句是控制输出位置,可不考虑 printf("%04d/%02d/%02d %02d:%02d:%02d\n",date_time->tm_year+1900, date_time->tm_mon+1,date_time->tm_mday,date_time->tm_hour, date_time->tm_min,date_time->tm_sec); } }
-
这个分析就可以自己分析了,设计的知识点在前方均已经提到过了 QAQ
- 起初我是我搜索了一些代码,看到一种方式(代码如下,虽然不能实现,但是既然代码有错另一方面也说明了部分错误代码有另一种用法)
****************************************************************************************************************************************
最快的脚步不是跨越,而是继续,最慢的步伐不是小步,而是徘徊。
****************************************************************************************************************************************