鱼C论坛

 找回密码
 立即注册
查看: 3268|回复: 16

[技术交流] 马上开学了,初学C观甲鱼视频,写了个定时关机重启的小程序

[复制链接]
发表于 2012-2-10 19:55:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
呵呵,寒假马上结束了,看了一个寒假的小甲鱼视频,目前指针那块不是很好。写了个定时关机和重启的小程序,贴上源码,因为初学,只能用最简单的方法来表达。所以希望高手给改改,尽量高效一点。
************************代码分割线*****************************************

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void print_top();
void print_end();
void judge_num_end(int n);

void main()
{
      int num,num_end;
      int seconds, minutes;
      char string_seconds[5];
      char close[] = "shutdown -s -t 0";
      char result[] = "shutdown -r -t 0";
      
      print_top();
      scanf("%d",&num);
      
      while( num !=1 && num !=2 )
      {
            printf("输入序号错误,请重新输入:");
            scanf("%d",&num);
      }
      
      if ( num == 1 )
      {
            printf("\n请输入关机时间(0~600分):");
            
            scanf("%d",&minutes);
            printf("\n");
            
            while ( minutes < 0 || minutes > 600 )
            {
                  printf("输入时间错误,请重新输入:");
                  scanf("%d",&minutes);
                  printf("\n");
                  
            }
            
            seconds = minutes * 60;           
            itoa(seconds, string_seconds, 10);  //将int型转换成string型  10 代表的十进制
            system(strcat(close,string_seconds));
            
            printf("执行成功! %d分钟后,电脑将自动关闭...\n\n",minutes);
            printf("请及时保存相关的操作!关机计时中...\n\n");
      }
      if( num == 2 )
      {
            printf("请输入重启时间(0~600分):");
            
            scanf("%d",&minutes);
            printf("\n");
            
            while ( minutes < 0 || minutes > 600 )
            {
                  printf("输入时间错误,请重新输入:");
                  scanf("%d",&minutes);
                  printf("\n");
                  
            }
            
            seconds = minutes * 60;
            itoa(seconds, string_seconds, 10);  //将int型转换成string型  10 代表的十进制
            system(strcat(result,string_seconds));
            
            printf("执行成功! %d分钟后,电脑将自动重启...\n\n",minutes);
            printf("请及时保存相关的操作!重启计时中...\n\n");
            
      }
      
      print_end();
      scanf("%d",&num_end);
      
      while( num_end !=1 && num_end !=2 )
      {
            printf("输入序号错误,请重新输入:");
            scanf("%d",&num_end);
      }
      
      judge_num_end(num_end);
      
      system("pause");
}

void print_top()
{
      printf("\n");
      printf("*******************欢迎使用定时程序!******************\n");
      printf("\n          1、定时关机      2、定时重启\n\n");
      printf("******************************************************\n\n");
      printf("请选择序号:");   
}

void print_end()
{
      printf("******************************************************\n");
      printf("\n          1、退出          2、取消本次定时\n\n");
      printf("******************************************************\n\n");
      printf("请选择序号:");
}

void judge_num_end(int n)
{
      if(n == 1) exit(1);
      if(n == 2) system("shutdown -a");
}

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
小甲鱼 + 5 + 5 鼓励分享精神!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-10 20:03:41 | 显示全部楼层
希望大家都来看下,看看有么有什么bug,能不能改高效点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-10 21:12:07 | 显示全部楼层
这个   我才学呢  呵呵   就看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-11 00:48:40 | 显示全部楼层
楼主写的很好了。
个人觉得这种类型的小工具,如果用witch...case结构会更清淅,扩充也会更方便。
shutdown函数有系统版本限制,之前我也试用过。
有兴趣可以百度查下通用版的API函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-11 13:37:21 | 显示全部楼层

好的,谢谢。继续学习
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-11 13:51:50 | 显示全部楼层
看不懂,我才刚开始学,vc++6还不知道怎么用里。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-11 14:19:55 | 显示全部楼层
Leap 发表于 2012-2-11 13:51
看不懂,我才刚开始学,vc++6还不知道怎么用里。

加油,共同努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-13 13:48:42 | 显示全部楼层
猫礼 发表于 2012-2-11 14:19
加油,共同努力

谢谢,共同学习吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-13 21:11:24 | 显示全部楼层
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>

  4. void print_top();
  5. void print_end();
  6. void judge_num_end(int n);

  7. void main()
  8. {
  9.         int num,num_end;
  10.         int seconds, minutes;
  11.         char string_seconds[5];
  12.         char close[] = "shutdown -s -t 0";
  13.         char result[] = "shutdown -r -t 0";
  14.        
  15.         print_top();
  16.         scanf("%d",&num);
  17.        
  18.         while( num !=1 && num !=2 )
  19.         {
  20.                 printf("输入序号错误,请重新输入:");
  21.                 scanf("%d",&num);
  22.         }
  23.        
  24.         if ( num == 1 )
  25.         {
  26.                 printf("\n请输入关机时间(0~600分):");
  27.                
  28.                 scanf("%d",&minutes); //如果输入的是不是字符的话 会出一直循环!不会再往下进行了!
  29.                 printf("\n");         
  30.                
  31.                 while ( minutes < 0 || minutes > 600 )
  32.                 {
  33.                         printf("输入时间错误,请重新输入:");
  34.                         scanf("%d",&minutes);
  35.                         printf("\n");
  36.                        
  37.                 }
  38.                
  39.                 seconds = minutes * 60;           
  40.                 itoa(seconds, string_seconds, 10);  //将int型转换成string型  10 代表的十进制
  41.                 system(strcat(close,string_seconds));
  42.                
  43.                 printf("执行成功! %d分钟后,电脑将自动关闭...\n\n",minutes);
  44.                 printf("请及时保存相关的操作!关机计时中...\n\n");
  45.         }
  46.         if( num == 2 )
  47.         {
  48.                 printf("请输入重启时间(0~600分):");
  49.                
  50.                 scanf("%d",&minutes);
  51.                 printf("\n");
  52.                
  53.                 while ( minutes < 0 || minutes > 600 )
  54.                 {
  55.                         printf("输入时间错误,请重新输入:");
  56.                         scanf("%d",&minutes);
  57.                         printf("\n");
  58.                        
  59.                 }
  60.                
  61.                 seconds = minutes * 60;
  62.                 itoa(seconds, string_seconds, 10);  //将int型转换成string型  10 代表的十进制
  63.                 system(strcat(result,string_seconds));
  64.                
  65.                 printf("执行成功! %d分钟后,电脑将自动重启...\n\n",minutes);
  66.                 printf("请及时保存相关的操作!重启计时中...\n\n");
  67.                
  68.         }
  69.        
  70.         print_end();
  71.         scanf("%d",&num_end);
  72.        
  73.         while( num_end !=1 && num_end !=2 )
  74.         {
  75.                 printf("输入序号错误,请重新输入:");
  76.                 scanf("%d",&num_end);
  77.         }
  78.        
  79.         judge_num_end(num_end);
  80.        
  81.         system("pause");
  82. }

  83. void print_top()
  84. {
  85.         printf("\n");
  86.         printf("*******************欢迎使用定时程序!******************\n");
  87.         printf("\n          1、定时关机      2、定时重启\n\n");
  88.         printf("******************************************************\n\n");
  89.         printf("请选择序号:");   
  90. }

  91. void print_end()
  92. {
  93.         printf("******************************************************\n");
  94.         printf("\n          1、退出          2、取消本次定时\n\n");
  95.         printf("******************************************************\n\n");
  96.         printf("请选择序号:");
  97. }

  98. void judge_num_end(int n)
  99. {
  100.         if(n == 1) exit(1);
  101.         if(n == 2) system("shutdown -a");
  102. }
复制代码
不好意思问题多!我只指出一个!您那个异常处理慢慢弄下!因为选择1.2.3 要是输入字符呢!所以请楼主好好弄下!希望楼主采纳!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-2-14 00:11:12 | 显示全部楼层
hy19970612 发表于 2012-2-13 21:11
不好意思问题多!我只指出一个!您那个异常处理慢慢弄下!因为选择1.2.3 要是输入字符呢!所以请楼主好好弄 ...

是的呢,早发现输入字符问题了,进入死循环。我在想,把ASKII码 定死,不知道这样行不。呵呵刚学,难免问题多点。我用switch改写了一下,但是还是改不了那个字符死循环。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-14 09:38:57 | 显示全部楼层
用API比较好吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-14 10:42:11 | 显示全部楼层
猫礼 发表于 2012-2-14 00:11
是的呢,早发现输入字符问题了,进入死循环。我在想,把ASKII码 定死,不知道这样行不。呵呵刚学,难免问 ...

用scanf的返回值判断是否读写成功
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-19 13:23:34 | 显示全部楼层
surongre 发表于 2012-2-14 10:42
用scanf的返回值判断是否读写成功

楼上的!不行的!是可以判断成功与否!但是不能再次输入了!因为你会给出错误提示吧!然后scanf()函数会吧你的提醒给读入!这样返回值还是错误的符合循环的条件!所以会进入死循环!我利用了一个Wind API 函数 atoi() 函数原型 int atoi(char str[]);具体代码马上贴上!解决死循环还可以判断正误!
  1. #include<stdio.h>
  2. #include<windows.h>// 函数 atoi()
  3. void main()
  4. {       
  5.         int a,scanfreturn;
  6.         char str[256];
  7.         printf("a:");
  8.         scanfreturn = scanf("%s",str);
  9.         a = atoi(str);//Windows API 函数 atoi 把一个字符串变为整数型返回,如果字符串为数字则返回数字如果为字母符号返回0!
  10.         while(a > 5 || a < 1)
  11.         {               
  12.                 printf("\t\t 错误......\n");                                       
  13.                 printf("a:");
  14.                 scanfreturn = scanf("%s",str);
  15.                 a = atoi(str);
  16.         }
  17.         printf("\t\t 正确.......\n");
  18. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-19 13:24:36 | 显示全部楼层
本帖最后由 hy19970612 于 2012-2-19 13:25 编辑
猫礼 发表于 2012-2-10 20:03
希望大家都来看下,看看有么有什么bug,能不能改高效点。


因为你会给出错误提示吧!然后scanf()函数会吧你的提醒给读入!这样返回值还是错误的符合循环的条件!所以会进入死循环!我利用了一个Wind API 函数 atoi() 函数原型 int atoi(char str[]);具体代码马上贴上!解决死循环还可以判断正误!

  1. #include<stdio.h>
  2. #include<windows.h>// 函数 atoi()
  3. void main()
  4. {        
  5.         int a;      
  6.         char str[256];
  7.         printf("a:");
  8.         scanf("%s",str);
  9.         a = atoi(str);//Windows API 函数 atoi 把一个字符串变为整数型返回,如果字符串为数字则返回数字如果为字母符号返回0!
  10.         while(a > 5 || a < 1)
  11.         {               
  12.                 printf("\t\t 错误......\n");                                       
  13.                 printf("a:");
  14.                 scanf("%s",str);
  15.                 a = atoi(str);
  16.         }
  17.         printf("\t\t 正确.......\n");
  18. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-20 17:27:57 | 显示全部楼层
hy19970612 发表于 2012-2-19 13:23
楼上的!不行的!是可以判断成功与否!但是不能再次输入了!因为你会给出错误提示吧!然后scanf()函数会吧 ...

我觉得C语言应该有清空键盘 缓冲区的函数吧
在C++中,我喜欢这样写
  1. while(!(std::cin >> a))
  2. {
  3.       std::cout << "输入错误,请重新输入:" << std::endl;
  4.     std::cin.sync() //清空键盘缓冲区
  5.     std::cin.clear()//因为cin读入失败后流会被置为无效,所以用clear()把流设为有效
  6. }
复制代码

这样就可以实现循环读入了

C语言也可以用类似的思路吧,先判断是否正确,然后再进行处理,重要是键盘缓冲区那段,如果用户输入abc,用while(!(scanf())来判断的话,scanf应该读取a后报错,输出错误提示后,自动读取键盘缓冲区里的下一个字符,结果打印了3次错误提示。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-20 17:32:35 | 显示全部楼层
还有,给个个人建议:把方法都写到函数里,要用的时候调用函数就可以了。个人觉得你的main函数太长了,大部分工作都是在main函数里完成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-2-20 17:48:17 | 显示全部楼层
  1. int i;
  2. printf("请输入整数\n");
  3. while(!(scanf(%d,i))
  4. {
  5.       printf("输入错误,请重新输入");
  6.     fflush(stdin)//网上查到的缓冲区
  7. }
复制代码
因为我没装vc6,装的是vs2010,不知道怎么新建c语言的,所以没测试

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-27 18:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表