【问题标题】:How do I write a program that reads array in from text file and finds max and min?如何编写一个从文本文件中读取数组并找到最大值和最小值的程序?
【发布时间】:2017-11-06 10:00:07
【问题描述】:

我的任务是编写一个从 txt 文件数组中读取数字并找到最大值、最小值、总和等的代码。(200)个数字采用以下格式: 3.23 19.398 98.73 2.1 ... 抱歉,如果代码有点乱,我一直在尝试拼凑很多不同的教程,但无济于事。我基本上需要知道如何让代码按顺序读取值,并提取最大值/最小值并继续遍历数组。 (并一路找到总和)如何正确格式化?

# include <stdio.h>


int main()
{
    //char data[200];
int newnum;
int max = 0, min = 99999999999;
int i = 0;
int y[200];
//min=max=newnum;

FILE *fpdata = fopen("data.txt", "r");
    if((fpdata = fopen("data.txt", "r")) == 0)
    {
        printf("File not found.  Abort!");
        exit(-1);
    }


    while(fscanf(fpdata,"%f", &y[i++]) != EOF);{
    //for(i=0; i < 200; i++)

        i--;
        printf("i=%d \n", i);
        //printf("\n%d%d\n", &y[i++], y);
        if(newnum > max)
        max = newnum;

        if(newnum < min)
        min = newnum;
    }


    printf("The largest number is %d\n", max);
    printf("The smallest number is %d\n", min);
    fclose(fpdata);


    return 0;
}

任何帮助将不胜感激,我已经尝试利用所有可能的资源(youtube、其他 stackoverflow 问题)几个小时,但没有明确说明如何从文件中格式化调用数组、读取并从中提取值.

【问题讨论】:

  • FILE *fpdata = fopen("input1.txt", "r"); -> FILE *fpdata;
  • EOF);{ --> EOF){(即去掉;
  • 你永远不会给newnum分配任何东西。可能只是将&amp;y[i++] 替换为&amp;newnum
  • 您扫描 int 但格式看起来好像文件包含浮点数
  • 为什么不在读入时检查每个值的最大值/最小值,而不是尝试用那个讨厌的 while() 循环来读取它们,然后在之后迭代数组?尽量不要写那样的代码——调试单行复杂的语句/表达式非常困难,(更不用说难以理解)。

标签: c arrays file-io io format


【解决方案1】:

有很多问题:

你可能想要这个:

#include <stdio.h>
#include <stdlib.h>                   // include also stdlib.h

int main()
{
  float newnum;
  float max = 0, min = 99999999999;   // use float type for float numbers
  int i = 0;    
  FILE *fpdata;     // callign fopen only once

  if ((fpdata = fopen("data.txt", "r")) == 0)
  {
    printf("File not found.  Abort!");
    exit(-1);
  }

  while (fscanf(fpdata, "%f", &newnum) != EOF) {    // removed extra ;
    printf("i = %d, newnum = %f\n", i++, newnum);   // reading into newnum 
                                                    // correct format specifiers

    if (newnum > max)
      max = newnum;

    if (newnum < min)
      min = newnum;
  }

  printf("The largest number is %f\n", max);  // correct format specifiers
  printf("The smallest number is %f\n", min);
  fclose(fpdata);

  return 0;
}

但仍有改进的余地。

这里是先将所有数据读入data数组(datay更好的名字)然后进行计算的版本:

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

int main()
{
  float max = 0, min = 99999999999;
  float data[200];

  FILE *fpdata;

  if ((fpdata = fopen("input1.txt", "r")) == 0)
  {
    printf("File not found.  Abort!");
    exit(-1);
  }

  int nbofnumbers = 0;
  while (fscanf(fpdata, "%f", &data[nbofnumbers]) != EOF)
  {
    nbofnumbers++;
  }

  for (int i = 0; i < nbofnumbers; i++)
  {
    printf("data[%d] = %f\n", i, data[i]);
    if (data[i] > max)
      max = data[i];

    if (data[i] < min)
      min = data[i];
  }

  printf("The largest number is %f\n", max);
  printf("The smallest number is %f\n", min);
  fclose(fpdata);

  return 0;
}

【讨论】:

  • 一些建议:max = -FLT_MAX, min = FLT_MAXwhile (fscanf(fpdata, "%f", &amp;newnum) == 1)
  • @4386427 正确,但正如我所写:仍有改进空间
  • 是的,我注意到了,所以我只是添加了一些 OP 可以考虑包含的建议。它不是意味着对您的答案的批评,但使用 `!= EOF` 非常“危险”,因为如果输入文件包含无法作为浮点数传递的内容,程序将永远循环.
【解决方案2】:

您的代码存在一些问题:

  • 您扫描float,但将数据存储为int
  • open文件两次
  • while 末尾有一个意外的;
  • 循环条件(即!= EOF)可能会导致文件中的无限循环包含无法解析为浮点数的内容。使用== 1 更安全。
  • 可以改进 max 和 min 的初始化

修复后的程序可能是:

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

int main(void) 
{
  float newnum;
  float max = -FLT_MAX;
  float min = FLT_MAX;

  FILE *fpdata;
  if((fpdata = fopen("data.txt", "r")) == 0)
  {
    printf("File not found.  Abort!");
    exit(-1);
  }

  while(fscanf(fpdata,"%f", &newnum) == 1)
  {
    printf("%f\n", newnum);
    if(newnum > max) max = newnum;
    if(newnum < min) min = newnum;
  }

  printf("The largest number is %f\n", max);
  printf("The smallest number is %f\n", min);
  fclose(fpdata);

  return 0;
}

【讨论】:

    猜你喜欢
    • 2017-08-01
    • 2014-07-15
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2021-12-28
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多