查看原文
其他

教你写一个定时关机程序

正念君 嵌入式大杂烩 2021-01-31

前言

今天,我同学问我这个程序怎么做:

于是,我用C给他写了一个类似的控制台程序:

我的这个控制台程序有8个小功能,分别是:

1、定时n秒后自动关机。

2、定时到x点x分提醒你是否要关机,如果你没确认不关机,则在60s后将自动关机。

3、立即关机。

4、取消自动关机。

5、注销计算机。

6、打开计算器。

7、打开画图软件。

8、打开记事本。

在介绍各个功能之前,首先介绍一个函数: system函数。

system函数

system是C函数库 stdlib.h中的一个函数,用于发出一个DOS命令给系统,函数原型为:

  1. int system (const char * command);

例如: system("pause"); 可以实现冻结屏幕。在往期笔记【C语言笔记】你的黑窗口闪退?也有介绍,欢迎阅读。

这里的8个功能,我们都是借用这个函数来实现的,然后再添加一些处理逻辑即可。

对DOS命令有一些了解的同学可能觉得定时关机、取消关机之类的只要一行命令就可以了,干嘛要那么麻烦。的确,不实用!但是,我们是本着练习C编程的原则来做的,看似简单的功能,做起来也会遇到很多问题的,特别注意要理清楚一些逻辑关系及一些细节。下面分析各代码块:

功能分析

这几个功能中,其中功能1和功能2的实现比较麻烦一点。其他几个功能都只是调用 system函数往发DOS命令给系统。下面看各个功能的具体实现:

1、定时n秒后自动关机

功能演示

代码

  1. // 菜单选择1:定时n秒后自动关机

  2. void choice_01(void)

  3. {

  4. int sec_count;

  5. char cmd[30];


  6. scanf("%*[^\n]");scanf("%*c"); // 清空缓冲区

  7. printf("请输入您要定时关机的秒数:");

  8. scanf("%d", &sec_count); // 读入定时的秒数

  9. sprintf((char*)cmd, "shutdown -s -t %d", sec_count); // cmd定时关机命令组包

  10. system(cmd); // 执行定时关机命令

  11. printf("定时开始!\n");


  12. // 输出倒计时的秒数

  13. while (sec_count--)

  14. {

  15. // 非阻塞式键盘监听,输入缓冲区非空时则退出while循环

  16. if (kbhit()) // kbhit函数包含在头文件conio.h中,所以只适用于windows系统

  17. {

  18. break;

  19. }

  20. printf("您的电脑将在%d秒后自动关机(输入数字4并回车可取消自动关机)\n", sec_count);

  21. Sleep(1000); // 休眠1秒

  22. system("cls"); // 清屏操作

  23. }

  24. }

2、定时到x点x分提醒你是否要关机

这个功能像我手机的自动关机的操作:

我给我的手机定时每天0点0分自动关机,关机之前先倒计时一分钟,看你是否要真的关机,此时可以点击立即关机,也可以取消关机。

功能演示

代码

  1. // 菜单选择2:定时每天x点x分自动关机

  2. void choice_02(void)

  3. {

  4. struct timed_time shutdown_time;

  5. char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

  6. time_t t;

  7. struct tm *time_date;

  8. int year = 0, mon = 0, mday = 0;

  9. int hour = 0, min = 0, sec = 0;

  10. char *week = NULL;

  11. int count_down = 60;

  12. int count_down_flag = 0;


  13. scanf("%*[^\n]");scanf("%*c"); // 清空缓冲区

  14. printf("请输入您要定时关机的时间(如23:59):");

  15. scanf("%d:%d", &shutdown_time.timed_hour, &shutdown_time.timed_min); // 读入要定时关机的时间

  16. printf("现在是:");

  17. system("time /T"); // 输出此刻的时间

  18. printf("您的电脑将在%.2d点%.2d分提醒您是否要关机\n", shutdown_time.timed_hour, shutdown_time.timed_min);

  19. while(1)

  20. {

  21. time(&t); // 返回1970年1月1日至今的秒数

  22. time_date = localtime(&t); // 取得当地时间并保存在time_date中

  23. year = 1900 + time_date->tm_year; // 年(本程序中暂未用到)

  24. mon = 1 + time_date->tm_mon; // 月(本程序中暂未用到)

  25. mday = time_date->tm_mday; // 日(本程序中暂未用到)

  26. week = wday[time_date->tm_wday]; // 星期(本程序中暂未用到)

  27. hour = time_date->tm_hour; // 时(用到)

  28. min = time_date->tm_min; // 分(用到)

  29. sec = time_date->tm_sec; // 秒(本程序中暂未用到)


  30. // 如果此时此刻的时、分等于设定值,则开始倒计时60秒

  31. if (hour == shutdown_time.timed_hour &&

  32. min == shutdown_time.timed_min &&

  33. sec == 0)

  34. {

  35. system("shutdown -s -t 60"); // 定时60秒自动关机

  36. count_down_flag = 1; // 倒计时标志置一

  37. }


  38. // 开始倒计时

  39. if (1 == count_down_flag)

  40. {

  41. count_down--;

  42. printf("您的电脑将在%d秒后自动关机(输入数字4可取消自动关机)\n", count_down);

  43. Sleep(1000);

  44. system("cls");

  45. }


  46. // 非阻塞式键盘监听,输入缓冲区非空时则退出while循环

  47. if (kbhit())

  48. {

  49. count_down_flag = 0; // 倒计时标志清零

  50. break;

  51. }

  52. }

  53. }

关于时间日期函数,可以查看往期笔记:【C语言笔记】时间日期函数

3、立即关机

选择该功能时,先提示是否要关机,预防误操作。

代码

  1. // 菜单选择3:立即关机

  2. void choice_03(void)

  3. {

  4. char shutdown_affirm; // 确认是否真的需要立即关机


  5. scanf("%*[^\n]");scanf("%*c"); // 清空缓冲区

  6. printf("您确定要立即关闭您的计算机(y/n)?\n");

  7. scanf("%c",&shutdown_affirm);

  8. if (shutdown_affirm == 'y')

  9. {

  10. printf("您的计算机即将关机!\n");

  11. Sleep(1000);

  12. system("shutdown -p");

  13. }

  14. else

  15. {

  16. system("cls");

  17. printf_menu();

  18. }

  19. }

4、取消自动关机

若此时没有定时关机操作,则选择取消自动关机时,会打印输出:

因为没有任何进行中的关机过程,所以无法终止系统关机。(1116)

代码

  1. // 菜单选择4:取消自动关机

  2. void choice_04(void)

  3. {

  4. system("cls"); // 清屏

  5. printf("您已取消自动关机\n");

  6. system("shutdown /a"); // 取消自动关机

  7. printf_menu(); // 打印输出菜单

  8. }

5、注销计算机

代码

  1. // 菜单选择5:注销

  2. void choice_05(void)

  3. {

  4. system("cls"); // 清屏

  5. printf("当前用户即将被注销\n");

  6. system("shutdown -l");

  7. }

6、打开计算器

代码

  1. // 菜单选择6:打开计算器

  2. void choice_06(void)

  3. {

  4. system("calc"); // 打开计算器的命令

  5. system("cls"); // 清屏

  6. printf_menu(); // 打印输出菜单

  7. }

7、打开画图软件

代码

  1. // 菜单选择7:打开画图软件

  2. void choice_07(void)

  3. {

  4. system("mspaint"); // 打开画图软件的命令

  5. system("cls"); // 清屏

  6. printf_menu(); // 打印输出菜单

  7. }

8、打开记事本

代码

  1. // 菜单选择8:打开记事本

  2. void choice_08(void)

  3. {

  4. system("notepad"); // 打开记事本的命令

  5. system("cls"); // 清屏

  6. printf_menu(); // 打印输出菜单

  7. }

本程序用到的DOS命令

  1. 1、清屏操作:cls

  2. 2、定时关机:shutdown -s -t sec (说明:sec为要定时的秒数)

  3. 3、取消定时关机:shutdown /a

  4. 4、输出此刻的时间:time /T

  5. 5、输出今天的日期:date /T

  6. 6、立即关机:shutdown -p

  7. 7、注销计算机:shutdown -l

  8. 8、设置cmd窗口标题:title 正念君 (设置标题为“正念君”)

  9. 9、设置窗口宽高:mode con cols=60 lines=30

  10. 10、设置窗口前景色与背景色:color f0

  11. 11、打开计算器:calc

  12. 12、打开画图软件:mspaint

  13. 13、打开记事本:notepad

这些命令可以cmd窗口中运行,如:

有些不需要依赖于cmd窗口的命令也可以直接在运行窗口中输入,如在运行窗口中输入 calc打开计算器:

其中,可通过组合键【win+r】调出运行窗口。

完整程序

由于完整的代码较长,就不贴出来了,有兴趣的朋友可在后台回复关键词:定时关机,获取该 .c 文件。温馨提示:链接失效,可在后台回复,或添加小编微信(备注XX链接失效)。

总结

论实用性,除了功能二之外,其他功能都可以直接通过在cmd窗口中输入命令就可以实现。但多写一些这些功能性的东西,可以很好的锻炼我们的编程实践能力及编程的逻辑思维,这对于提高我们嵌入式应用的编写能力有很大的帮助!


这次写的是控制台的定时关机程序,之后有时间有机会再把该定时关机程序做成图形界面的形式,欢迎持续关注!


转发、点在看就是对小编最大的支持!


猜你喜欢

【Linux笔记】Linux下编译C程序

【Linux笔记】make工程管理工具(二)

【C语言笔记】关于数组的一个陷阱!

【C语言笔记】操作位的技巧

【RT-Thread笔记】裸机系统与多线程系统

【RT-Thread笔记】关于RT-Thread的启动问题



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存