从C中的文件中查找最大和最小浮点数

时间:2013-03-13 04:40:33

标签: c

我正在编写一个使用C的程序,只是为了从我的输入文件中找到包含大约500个浮动数字(如54.54)的最大和最小数字。我可以让程序运行,但输出显示我的min是0,我的最大值是54.88,这是文件中的第一个数字。 这是我到目前为止所做的。

#include <stdio.h>

int main(int argc, const char * argv[])
{

    FILE * fp;

    fp=fopen("file.txt","r");
    if (fp==NULL)
    {
        printf("Failed to open");
    }

    float i;
    float min ;
    float max ;

    {
        fscanf( fp, "%f", &i);

        if (i < min)
            min = i;
        if (i > max)
            max = i;
        }
    printf("Data range is: %f  %f \n", min, max);
    return 0;
}

5 个答案:

答案 0 :(得分:1)

应将最小值/最大值初始化为适当的值。例如。

float inf = 1.0 / 0.0;  // also in math.h as INFINITY?
float max = -inf;
float min = inf;
float i;

另一种选择是将min和max初始化为从文件读取的第一个值。这是编写循环的一种方法:

while (fscanf(fp, "%f", &i)==1)   // 
{
   ...
}

答案 1 :(得分:1)

该计划符合该法案。

#include <stdio.h>

int main() 
{
    float num;
    float min = 999.99; /*Max value of number your file will not exceed*/
    float max = 0;
    int i = 0;

    FILE *fp;
    fp = fopen("file.txt", "r");

     while(fscanf(fp,"%f",&num) == 1)
     {
          if (num < min)
             min = num;
          if (num > max)
             max = num;
     }

    fclose(fp);

    printf("Data range is: %f  %f \n", min, max);

    return 0; 
}

答案 2 :(得分:1)

保留大部分代码:

#include <stdio.h>

int main(int argc, const char * argv[])
{
    float i=0, min=0, max=0;
    FILE * fp fp=fopen("file.txt","r");
    if (fp==NULL)
    {
        perror("Failed to open file.");
        return EXIT_FAILURE;
    }

    if (fscanf(fp,"%f", &i) == 1)
    {
        min = max = i;
        while (fscanf( fp, "%f", &i) == 1)
        {
            if (i < min)
                min = i;
            else if (i > max)
                max = i;
        }
    }

    printf("Data range is: %f  %f \n", min, max);
    return 0;
}

对不起打字错误。

答案 3 :(得分:0)

您没有读取文件中所有数字的循环。你得到的只是第一个。

答案 4 :(得分:0)

如果你知道每条线上只有一个双,那么这是你可以做到的一种方式。它可能不是最优雅的,但在我脑海中编译它似乎可以完成工作。

(我没有对此代码进行错误测试,而且我也不确定这是否是最大和最小双值的正确宏)

char buf[10]; /* as big as the biggest number */
char c;
int i = 0;
double d, dmax = -INFINITY, dmin = INFINITY;

while ((c = getc(fp)) != EOF) {
    if (c != '\n')
        buf[i++] = c;
    else {
        buf[i] = '\0';
        d = atof(buf);
        if (d > dmax) dmax = d;
        if (d < dmin) dmin = d;
        i = 0;
   }
}