首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

用C语言做倒计时秒表,可是输不出0,小弟我检查不出有关问题,求指正

2012-10-21 
用C语言做倒计时秒表,可是输不出0,我检查不出问题,求指正!编辑内容如下:#include stdio.h#include coni

用C语言做倒计时秒表,可是输不出0,我检查不出问题,求指正!
编辑内容如下:
#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
#include "windows.h"

void display(int t)
{
 system("cls");
 printf("%d",t);
}
 
void main()
{
 DWORD dwStart, dwCmp;
 int i,t,told,m;
 char a,b;
 printf("请对表\n");
  scanf("%d",&m);
 if(m>=0&&m<=599)
 {

  loop:dwStart = GetTickCount();
  told=1;
  for(;;)
  { 
  dwCmp = GetTickCount() - dwStart;
  if(told==0)
  {
  m=599;
  goto loop;
  }
  Sleep(1);
  t =m - dwCmp / 1000;
  if(told != t)
  {
  display(t);
  told = t;
  }
  }
 }
  else
  printf("输入不正确");
}

运行的时候在输出 1 之后,感觉卡一下直接跳到 599 了,我按程序想了一遍,感觉不应该这样啊,应该能显示 0 ;我将"told==0"改成"told<0"之后就能显示 0 了,不过 0 至599的时候还是感觉卡了一下,大神们给点解释吧,谢谢

[解决办法]
全部都是goto的错

loop:dwStart = GetTickCount();
for(;;)

dwCmp = GetTickCount() - dwStart;
if(told==0)
{
goto loop;
}

在这段代码中,程序完成了以下功能:
第一,for循环判断当前时间
第二,若当前时间为零,则跳到loop标号处,重新设置起始时间

由此导致以下问题:
第一,每次当前时间为0时,都重新设置起始时间,因此根本谈不上精度,因为本应只设置一次的起始时间实际上每隔一段时间就变化一次
第二,每次当前时间为0时,都跳回loop标号处,导致0这个时间根本不可能在下面的语句中输出

根本原因在于:
goto因为太过随意而被大多数编程者摒弃
程序的顺序条件循环结构足以完成所有功能,goto的随意性会导致程序流程难以把握
一般来说,goto被推荐的使用条件只有一个,那就是当所有分支共同导向一个错误处理时,可以使用goto来避免多次跳出循环,这种情况下不易出现流程难以理解的问题

对楼主来说
放弃goto,仔细想想怎么使用顺序条件循环等普通语句实现所需功能
2楼给你的代码用的是clock(),它和GetTickCount()的区别在于clock()是C标准库函数,任何系统只要有C开发环境都可以使用,而GetTickCount()是window系统函数,换个操作系统它就不存在
至于精度,任何库函数的精度都由库函数提供者保证,windows系统下不管是系统函数还是标准库函数都由比尔盖茨的小弟们负责,你无能为力也不应该关心。在你的程序中,计时误差来自你不断重设时间起点

热点排行