2016-10-12 3 views
0

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

#include <stdio.h> 

int main() { 

int header, i, j, cur_val, auction[50], sum = 0; 
int max = 0; 

FILE * ifp; 

ifp = fopen("input.txt", "r"); 

fscanf(ifp, "%d", &header); 

for (i = 0; i < header; i++) { 

    fscanf(ifp, "%d", &cur_val); 
    printf("%d\n", cur_val); 

    for (j = 0; j < cur_val; j++) { 
     fscanf(ifp, "%d", &auction[j]); 

     printf("%d\n", auction[j]); 

     max = auction[0]; 
     if (auction[j] > max) { 
      max = auction[j]; 
     } 

    }//end j loop 

    printf("Max: %d\n", max); 
    printf("\n"); 
    //printf("Auction %d was sold for $%.2f!\n", i+1,); 
    //sum+=max; 

}//end i loop 

fclose(ifp); 


return 0; 

} 

Вот входной файл:

5 

4 

100 500 250 300 

1 

700 

3 

300 150 175 

2 

920 680 

8 

20 10 15 25 50 30 19 23 

В максимальные значения, напечатанные на консоли следующим образом:

300 700 300 920 23 

Середина 3 работа, но не первый и последний. Любая идея почему?

+3

Переместить 'max = auction [0];' out of the loop. –

+0

Вы не можете переместить его за пределы цикла. Неизвестное значение аукциона [0] вне цикла. – nicomp

+1

Вы должны проверить *** каждый *** вызов 'fscanf', чтобы гарантировать, что вы обрабатываете фактическое значение, а не только мусор (например,' if (fscanf (ifp, "% d", & header)! = 1) {/* ошибка дескриптора * /} ') Если у вас есть * совпадение с ошибкой * или * сбой преобразования * и вы не справитесь с этой ошибкой, вы будете в неизведанной воде с этого момента. –

ответ

2

Вы устанавливаете max = auction [0]; на каждом цикле, исключая предыдущее максимальное значение.

Инициализировать максимальное значение только один раз в цикле или инициализировать максимум вне цикла (после считывания первого значения).

+0

Итак, куда он должен идти? Я поставил его за пределы for и теперь имеет некоторое массивное число для первого и последнего ... – Josh

1

Вы найти последний номер в списке, который больше, чем аукцион [0]

+0

Вне цикла установите max равным наименьшему целому числу в вашем компиляторе. Если у вас есть limits.h, установите max в INT_MIN. – nicomp

+0

Зачем ты прокомментировал свой ответ? Вы можете [изменить] его, чтобы добавить дополнительную информацию. – user3386109

0

Каноническая реализация линейногоmax_value цикла что-то вроде этого

Учитывая

  • N
  • MIN_N < = N < = MAX_N

max_value = MIN_N for i in 1...N if values[i] > max_value max_value = values[i]

Теперь, вы можете прочитать все значения в массив (я назвал его values выше), или просто читать в значениях по одному за раз.

Преобразования это C, и предполагая массив для простоты здесь:

int max_value = MIN_N; 
for (int i = 0; i < N; ++i) { 
    if (values[i] > max_value) 
     max_value = values[i]; 
} 
printf("Max %d\n", max_value); 

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

FILE *f = open_input_file(); // could return stdin for testing 
int T = read_an_integer(f); 

for (int t = 0; t < T; +=t) { 
    int N = read_an_integer(f); 
    int max_value = MIN_N; 

    if (N <= 0) continue; 

    for (int n = 0; n < N; ++n) { 
     int v = read_an_integer(f); 
     if (v > max_value) 
      max_value = v; 
    } 

    printf("Max %d\n", max_value); 
} 
close_my_file(f); 

Я оставлю обработку файлов и ввод/вывод в качестве упражнения - но убедитесь, что вы имеете дело со всеми условиями ошибок (в этом случае, вероятно, достаточно позвонить exit(-1)).