2017-01-04 3 views
0

Я хочу найти самые большие и самые низкие числа в массиве с помощью функции. Вот мой код:Поиск наибольшего числа в массиве возвращает значение max int

#include <stdio.h> 

void findLowHigh(int* numbers, int size, int* min, int* max) { 
    for(int i = 0; i < size; i++) { 
     if (*min > numbers[i]) *min = numbers[i]; 
     else if (*max < numbers[i]) *max = numbers[i]; 
    } 
} 

int main() { 
    printf("##### Find lowest and highest number in collection #####"); 
    printf("\n Array checked: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]"); 
    int min, max; 
    int numbers1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
    findLowHigh(numbers1, 10, &min, &max); 
    printf("\nMin: %d\nMax: %d", min, max); 

    printf("\n Array checked: [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]"); 
    int numbers2[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 
    findLowHigh(numbers2, 10, &min, &max); 
    printf("\nMin: %d\nMax: %d", min, max); 

    return 0; 
} 

И есть выход:

##### Find lowest and highest number in collection ##### 
Array checked: [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] 
Min: 1 
Max: 32767 
Array checked: [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ] 
Min: 1 
Max: 32767 
Process finished with exit code 0 

Я предполагаю, что есть что-то не так с указателями, но что это?

+3

Похоже, вам, возможно, потребуется узнать, как использовать отладчик для перехода по вашему коду. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: ** [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) ** – NathanOliver

+0

Ваши переменные не инициализируются, поэтому они устанавливаются к некоторому унифицированному значению, которое в вашем случае равно 32767, поэтому никогда не бывает так, что max меньше любого из ваших значений в вашем массиве. Вы должны инициализировать оба значения до разумного значения, например '0' или что угодно: – EdChum

+0

, где вы инициализируете низкий и высокий? – RyanP

ответ

1

if (*min > numbers[i]) Предполагается, что *min уже содержит юридическое значение.

Но вы не инициализируете целое число, адрес которого вы передаете. Возможное исправление (после включения limits.h (или climits, если вы действительно компиляции C++)):

int min=INT_MAX; 
int max=INT_MIN; 

Как Натан Оливер предложил в комментариях. Более надежным решением было бы установить min и max в первый элемент массива.

if (min && max && numbers && size > 0) { 
    *min = numbers[0]; 
    *max = numbers[0]; 
} 
+0

Тогда функция всегда будет возвращать 'INT_MIN' и' INT_MAX' как min и max. –

+0

@KrzysztofKraszewski И у вас не может быть этого 'else' там ... или, по крайней мере, не для' i == 0'. – LogicStuff

+0

@ KrzysztofKraszewski - Нет, не будет. любое целое число меньше, чем 'INT_MAX'. Поэтому 'numbers [0]' будет немедленно выбран в качестве нового min. – StoryTeller

2

Вы должны инициализировать мин/макс:

int min, max; 

как:

int min=INT_MAX, max=INT_MIN; 

Больше в C++ стиль вы будете использовать #include <limits> и:

int min = std::numeric_limits<int>::max(); 
int max = std::numeric_limits<int>::min(); 

[править]

Вы должны также (как это было в комментариях) удалить else в вашей логике от:

if (*min > numbers[i]) *min = numbers[i]; 
    else if (*max < numbers[i]) *max = numbers[i]; 

иначе вы никогда не можете найти максимальное значение в результатах.

1

Как вы сравниваете со значением мин и макс, прежде чем передать значение функции вы должны инициализировать значения мин = INT_MAX и макс = INT_MIN.

0

Когда вы инициализируете свои переменные, такие как int min, max;, вы оставляете их пустыми вместо числа, это означает, что min и max автоматически устанавливаются как неопределенные числа.

+1

nope - min, max содержат случайное (неопределенное) значение, если не инициализировано – marcinj

+0

@marcinj на самом деле не имеет значения, какие значения min max будут содержать, поскольку программа будет иметь UB. – Slava

1

int min, max; неинициализированы, они могут содержать любое значение. Вы должны инициализировать в начале findLowHigh. Важно перезагрузить их, прежде чем вызывать findLowHigh или прошлые результаты окажут влияние на будущие результаты.

Вы можете просто установить их оба для первого элемента numbers и пропустить этот элемент в своем цикле. Обязательно проверьте, что size не имеет нулевого значения.

void findLowHigh(int* numbers, int size, int* min, int* max) 
{ 
    if(size > 0) 
    { 
     *min = numbers[0]; 
     *max = numbers[0]; 

     for(int i = 1; i < size; i++) { 
      if (*min > numbers[i]) *min = numbers[i]; 
      if (*max < numbers[i]) *max = numbers[i]; // Also, remove this else 
     } 
    } 
} 

Edit: Вы должны решить, что должно произойти в случае size равен нулю. Каков минимальный и максимальный пустые списки?