Нахождение минимального и максимального значений

Я пытаюсь написать простую программу, которая считывает целые числа из файла данных и выводит минимальное и максимальное значение. Первое целое число входного файла укажет, сколько еще целых чисел будет прочитано, а затем целые числа будут перечислены.

Моя программа компилируется без проблем, однако возвращает значения, которые не являются частью набора в моем файле тестовых данных. Может ли кто-нибудь помочь с диагностикой этой проблемы?

int main(){
FILE *fp = fopen("data.txt", "r");
int count;
int num;
int i;
int min = 0;
int max = 0;

fscanf (fp, "%d", &count);

for (i = 0; i < count; i++)
    fscanf( fp, "%d", &i);  
    {   
    if (num < min)
        min = num;
    if (num > max)
        max = num;
    }
fclose (fp);

printf("Of the %d integers, the minimum value is %d and the maximum value is %d \n", count, min, max);} 

person user01    schedule 25.09.2012    source источник
comment
min, вероятно, должно быть INT_MAX, а max, вероятно, должно быть INT_MIN. Таким образом, вам не понадобится что-то большее или меньшее, чем 0, чтобы изменить его. Как бы то ни было, файл, полный положительных чисел, даст минимум 0.   -  person chris    schedule 25.09.2012
comment
Какой у вас набор данных? И какой ток на выходе? Как говорит @chris, поскольку ваш min уже начинается с 0, если в вашем файле данных нет отрицательных чисел, будет напечатано 0. У вас будет аналогичная проблема с max, если ваш файл полон отрицательных чисел.   -  person Jim Buck    schedule 25.09.2012
comment
Вы даже не удосужились просмотреть свой код на наличие очевидных ошибок, таких как то, что вы считываете числа в свой счетчик циклов i, а не в num. Также не требуется особых усилий, чтобы увидеть, что { находится совершенно не в том месте, и что min и max, начинающиеся с 0, не могут быть правильными. Если вы хотите иметь хоть какую-то надежду на написание пригодных для использования программ, вам необходимо выработать хорошие привычки.   -  person Jim Balter    schedule 20.09.2014


Ответы (3)


Вот несколько ошибок в вашем коде.

Прежде всего, измените i на num в цикле в fscanf, как говорит cnicutar. Так что вы можете прочитать ввод правильно. А левая скобка { должна быть после цикла for.

for (i = 0; i < count; i++)  {   // put the { here
    fscanf( fp, "%d", &num);

Во-вторых, ваши min и max не правильно инициированы. Вы должны изменить их на INT_MAX и INT_MIN. И #include <limits.h>.

#include <stdio.h>
#include <limits.h>
......
int min = INT_MAX;
int max = INT_MIN;
person halfelf    schedule 25.09.2012
comment
Хорошо, теперь я получаю правильный минимум, но мой максимум все еще далек (максимум моего набора тестовых данных составляет 58, и мой вывод дает мне 2147383647). - person user01; 25.09.2012
comment
Ничего странного для моего кода. Итак, каковы все тестовые данные? - person halfelf; 25.09.2012
comment
Это отлично работает на моей машине. Проверьте свой код еще раз. Все ошибки исправил? - person halfelf; 25.09.2012
comment
@ user01 максимальное количество моих тестовых данных равно 58, и мой вывод дает мне 2147383647 - это потому, что вы установили max = INT_MAX вместо INT_MIN. Программирование требует осторожности и точности. - person Jim Balter; 20.09.2014

В дополнение к изменениям halfelf, вы захотите инициализировать min как произвольно большое значение, чтобы по крайней мере одно из ваших входных чисел было меньше этого значения. В противном случае, если все ваши входные значения положительны, вы в конечном итоге отобразите минимальное значение, равное нулю. Даже лучше, чем произвольно большое начальное значение, использовать условную логику для обнаружения первого раза в цикле и установить минимальное и максимальное значение в первое реальное значение в вашем входном потоке. Это позволяет избежать дилеммы о том, насколько большим должен быть начальный минимум (и насколько малым должен быть начальный максимум, о чем я не упоминал, но это, по сути, обратная проблема).

person Marc Cohen    schedule 25.09.2012

Ваша переменная num пуста и не использовалась. Вы сравниваете его с max и min. Следовательно, max и min будут хранить мусорные значения num. Сделай это так:

int main(){
FILE *fp = fopen("data.txt", "r");
int count=0;
int i;
int min = 0;
int max = 0;
while (!feof(fp))
{
count++;
fscanf( fp, "%d", &i);
if (i < min)
min = i;
if (i > max)
max = i;
}
printf("Of the %d integers, the minimum value is %d and the maximum value is %d \n", count, min, max);}
person Samar Rizvi    schedule 25.09.2012