2016-01-20 89 views
1

我的程序基本上要求用户输入一个未定义数量的浮点数,我希望程序输出用户输入EOF时的最小值,最大值和值的平均值。C我如何打破EOF循环?

当前循环退出并输出最小值,最大值和当用户输入数字时的意思< = -100,000或=> 100,000,其中是程序对用户输入的限制。

#include <stdio.h> 
int main() 
{ 


    float sum, smallest, largest; 
    float value, average,check; 
    int count; 

    sum = 0.000000; 
    count = 0; 
    check = scanf(" %f",&value); 
    smallest = value; 
    largest = value; 

    while (value >= -100000 && value <= 100000) 
    { 
     sum += value; 
     count++; 
     if (value > largest) 
      largest = value; 

     else if (value < smallest) 
      smallest = value; 

     scanf(" %f",&value); 
    } 
     average = sum/count; 
     printf("%.2f ",smallest); 
     printf("%.2f ",largest); 
     printf("%.2f\n",average); 
    return 0; 
} 
+0

你不能简单地添加条件到你的while循环吗? 'while(value!= EOF && value> = -100000 && value <= 100000)' – Ben

+2

scanf()有一个返回值。用它。 – wildplasser

+2

@Ben除了'value'永远不会等于EOF(除非用户恰好输入了与OP平台上的常量值相等的东西)。应该检查'scanf'的返回值。 – szczurcio

回答

2

如何处理错误(非数字)输入?

最简单的方法可能是以下内容:

while (scanf("%f", &value) == 1 && value >= -100000 && value <= 100000) 
{ 
    // do stuff with value 
} 

这将循环直至value可能是因为匹配失败的指定范围scanf上输入失败外,(输入不是数字)或者是因为EOF已经发出信号,或者是由于其他输入错误。

请注意,&&运营商强制从左向右评估;将在执行任何测试之前执行scanf调用并更新value

还要注意的是,如果在与像12.3r非数字尾随字符的数字用户类型,scanf将其转换并分配12.3value离开r停留在输入流中,这将导致下一个调用scanf失败,此时循环将退出。

+0

该系统保证只有格式良好的输入才会被赋予我的程序,所以我不需要担心这些实例。 非常感谢! – Immortal

+0

@Rubiks“系统保证只有格式良好的输入”是属于你的文章的信息 - 但是这会稍微改变问题。 – chux

1

正如其他人指出的那样,使用scanf结果。 而且您不需要从2个位置调用scanf。 我建议这样的事情:

#include <stdio.h> 

int main() 
{ 
    float sum, smallest, largest, value, average; 
    int count; 

    for (count = sum = 0; scanf("%f", &value) == 1; count++) { 
     if (value <= -100000 || value >= 100000) 
      break; 

     sum += value; 

     if (count == 0) 
      smallest = largest = value; 
     else if (value > largest) 
      largest = value; 
     else if (value < smallest) 
      smallest = value; 
    } 

    if (count) { 
     average = sum/count; 
     printf("%.2f %.2f %.2f\n", smallest, largest, average); 
    } else { 
     printf("error, no data processed\n"); 
    } 

    return 0; 
}