C语言 | 编写一个简单的定时关机程序「建议收藏」

C语言 | 编写一个简单的定时关机程序「建议收藏」前言今天,我同学问我这个程序怎么做:于是,我用C给他写了一个类似的控制台程序:我的这个控制台程序有8个小功能,分别是:1、定时n秒后自动关机。2、定时到x点x分提醒你是否要关机,如果你没…

大家好,又见面了,我是你们的朋友全栈君。

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

前言

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

C语言 | 编写一个简单的定时关机程序「建议收藏」

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

C语言 | 编写一个简单的定时关机程序「建议收藏」

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

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

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

3、立即关机。

4、取消自动关机。

5、注销计算机。

6、打开计算器。

7、打开画图软件。

8、打开记事本。

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

system函数

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

int system (const char * command);

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

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

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

功能分析

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

1、定时n秒后自动关机

功能演示

C语言 | 编写一个简单的定时关机程序「建议收藏」

代码

// 菜单选择1:定时n秒后自动关机
void choice_01(void)
{
    int sec_count;
    char cmd[30];
    scanf("%*[^\n]");scanf("%*c");  // 清空缓冲区
    printf("请输入您要定时关机的秒数:");
    scanf("%d", &sec_count);        // 读入定时的秒数
    sprintf((char*)cmd, "shutdown -s -t %d", sec_count);    // cmd定时关机命令组包
    system(cmd);                    // 执行定时关机命令
    printf("定时开始!\n");
    // 输出倒计时的秒数
    while (sec_count--)
    {
        // 非阻塞式键盘监听,输入缓冲区非空时则退出while循环
        if (kbhit())  // kbhit函数包含在头文件conio.h中,所以只适用于windows系统
        {
            break;
        }
        printf("您的电脑将在%d秒后自动关机(输入数字4并回车可取消自动关机)\n", sec_count);
        Sleep(1000);        // 休眠1秒
        system("cls");      // 清屏操作
    }
}

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

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

C语言 | 编写一个简单的定时关机程序「建议收藏」

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

功能演示

C语言 | 编写一个简单的定时关机程序「建议收藏」

代码

// 菜单选择2:定时每天x点x分自动关机
void choice_02(void)
{
    struct timed_time shutdown_time;
    char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
    time_t t;
    struct tm *time_date;
    int year = 0, mon = 0, mday = 0;
    int hour = 0, min = 0, sec = 0;
    char *week = NULL;
    int count_down = 60;
    int count_down_flag = 0;
    scanf("%*[^\n]");scanf("%*c");  // 清空缓冲区
    printf("请输入您要定时关机的时间(如23:59):");
    scanf("%d:%d", &shutdown_time.timed_hour, &shutdown_time.timed_min);    // 读入要定时关机的时间
    printf("现在是:");
    system("time /T");  // 输出此刻的时间
    printf("您的电脑将在%.2d点%.2d分提醒您是否要关机\n", shutdown_time.timed_hour, shutdown_time.timed_min);
    while(1) 
    {
        time(&t);       // 返回1970年1月1日至今的秒数
        time_date = localtime(&t); // 取得当地时间并保存在time_date中
        year = 1900 + time_date->tm_year;   // 年(本程序中暂未用到)
        mon  = 1 + time_date->tm_mon;       // 月(本程序中暂未用到)      
        mday = time_date->tm_mday;          // 日(本程序中暂未用到)
        week = wday[time_date->tm_wday];    // 星期(本程序中暂未用到)
        hour = time_date->tm_hour;          // 时(用到)
        min  = time_date->tm_min;           // 分(用到)
        sec  = time_date->tm_sec;           // 秒(本程序中暂未用到)
        // 如果此时此刻的时、分等于设定值,则开始倒计时60秒
        if (hour == shutdown_time.timed_hour && 
            min == shutdown_time.timed_min && 
            sec == 0)
        {
            system("shutdown -s -t 60"); // 定时60秒自动关机
            count_down_flag = 1;         // 倒计时标志置一
        }
        // 开始倒计时
        if (1 == count_down_flag)
        {
            count_down--;
            printf("您的电脑将在%d秒后自动关机(输入数字4可取消自动关机)\n", count_down);
            Sleep(1000);
            system("cls");
        }
        // 非阻塞式键盘监听,输入缓冲区非空时则退出while循环
        if (kbhit())
        {
            count_down_flag = 0; // 倒计时标志清零
            break;
        }
    }
}

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

3、立即关机

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

代码

// 菜单选择3:立即关机
void choice_03(void)
{
    char shutdown_affirm;  // 确认是否真的需要立即关机
    scanf("%*[^\n]");scanf("%*c");  // 清空缓冲区
    printf("您确定要立即关闭您的计算机(y/n)?\n");
    scanf("%c",&shutdown_affirm);   
    if (shutdown_affirm == 'y')
    {
        printf("您的计算机即将关机!\n");
        Sleep(1000);        
        system("shutdown -p");
    }
    else
    {
        system("cls");
        printf_menu();
    }
}

4、取消自动关机

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

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

代码

// 菜单选择4:取消自动关机
void choice_04(void)
{
    system("cls");          // 清屏
    printf("您已取消自动关机\n");
    system("shutdown /a");  // 取消自动关机
    printf_menu();          // 打印输出菜单
}

5、注销计算机

代码

// 菜单选择5:注销
void choice_05(void)
{
    system("cls");          // 清屏
    printf("当前用户即将被注销\n");
    system("shutdown -l");
}

6、打开计算器

代码

// 菜单选择6:打开计算器
void choice_06(void)
{
    system("calc");         // 打开计算器的命令
    system("cls");          // 清屏
    printf_menu();          // 打印输出菜单
}

7、打开画图软件

代码

// 菜单选择7:打开画图软件
void choice_07(void)
{
    system("mspaint");      // 打开画图软件的命令
    system("cls");          // 清屏
    printf_menu();          // 打印输出菜单
}

8、打开记事本

代码

// 菜单选择8:打开记事本
void choice_08(void)
{
    system("notepad");      // 打开记事本的命令
    system("cls");          // 清屏
    printf_menu();          // 打印输出菜单
}

本程序用到的DOS命令

1、清屏操作:cls
2、定时关机:shutdown -s -t sec (说明:sec为要定时的秒数)
3、取消定时关机:shutdown /a
4、输出此刻的时间:time /T
5、输出今天的日期:date /T
6、立即关机:shutdown -p
7、注销计算机:shutdown -l
8、设置cmd窗口标题:title 正念君 (设置标题为“正念君”)
9、设置窗口宽高:mode con cols=60 lines=30
10、设置窗口前景色与背景色:color f0 
11、打开计算器:calc
12、打开画图软件:mspaint
13、打开记事本:notepad

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

C语言 | 编写一个简单的定时关机程序「建议收藏」

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

C语言 | 编写一个简单的定时关机程序「建议收藏」

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

完整程序

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

总结

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

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

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

猜你喜欢

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

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

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

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

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

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

1024G 嵌入式资源大放送!包括但不限于C/C++、单片机、Linux等。关注微信公众号【嵌入式大杂烩】,回复1024,即可免费获取!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162963.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 搜狐视频P2P技术揭秘 – 流程篇

    搜狐视频P2P技术揭秘 – 流程篇本文介绍了搜狐视频P2P技术的整体业务流程,包括服务的调用,打洞等,比较详细。

    2022年6月19日
    25
  • AMD CPU电脑安装Android Studio详细步骤以及无法成功install HAXM的解决办法「建议收藏」

    AMD CPU电脑安装Android Studio详细步骤以及无法成功install HAXM的解决办法「建议收藏」想做个手机APP,安装Androidstudio遇到了各种各样的问题,这一切都源于电脑CPU是AMD的,经过各种各样方法的探索,终于找到了解决办法,成功安装了Andriodstudio及模拟器并成功运行了第一个程序Helloworld!下载Androidstudio国外网站下载比较慢,这里推荐一个下载网站,里面的资源很全,包括Android开发的AndroidSDK,开发中遇到的工…

    2022年6月28日
    170
  • JS后退, JS返回上一页, JS返回下一页

    JS后退, JS返回上一页, JS返回下一页
    Javascript返回上一页:
    1. history.go(-1),返回两个页面:history.go(-2);
    2. history.back(). 
    3. window.history.forward()返回下一页
    4. window.history.go(返回第几页,也可以使用访问过的URL)  
     例:
    向上一页 
    respons

    2022年7月25日
    7
  • 2021年电子设计大赛预测–球形机器人设计方案

    随着2021年电赛的临近和清单的出炉,各参赛队伍都在紧张的备赛当中。然而在电赛清单中,我们能看到一个比较特别的器件–空心透明球。这个器件的特别之处在于它的吃尺寸过大,以至于让人摸不着头脑。在网上看过很多预测,关于这个球的预测大家也是众说纷纭。那么现在就根据预测的最多的一种情况–球形机器人,来进行简单的设计方案分析。准备材料三个直流电机,一个舵机,飞轮一片,空心透明亚克力球(直径在20~30cm),TB6612电机驱动模块两片,STM32F1最小系统板一块,杜邦线若…

    2022年4月7日
    35
  • 金士顿有2t的u盘吗_群联3110主控

    金士顿有2t的u盘吗_群联3110主控最近新买的金士顿DT101G2U盘用老版本的群联检测工具GETinfo如GETinfov3.2.9.2会不认识MP的版本,一般会显示为MPv48.30.30,而使用新版本的如GETinfov3.5.7.2会显示MPALLv3.13.0B或MPALLv3.12.0A等。而这些版本网上都无释出版本的量产工具,怎么办呢,很多人都不知道该怎么选择量产工具的版本了。这里根据我成功…

    2022年9月9日
    0
  • java链表排序方法_java链表排序

    java链表排序方法_java链表排序插入排序    对链表进行插入排序,是最简单的一种链表排序算法,用于插入排序是迭代的,所以每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。    每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在序列中适当的位置,并将其插入。重复直到所有输入数据插入完为止。    插入排序的时间复杂度为O(N^2),空间复杂度为O(1)cla

    2022年10月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号