2016-11-13 2 views
-1

Новичок на C++ здесь и изучает массивы. Предполагается, что указанная ниже программа возвращает наименьшее и наибольшее число в массиве, используя две отдельные функции. Один для самого большого и один для наименьшего числа. Тем не менее, он все время возвращает 0 для функции lastLowestIndex, и я не уверен, что я могу делать неправильно.Программа на C++ для поиска самого маленького и самого большого числа в массиве

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

Спасибо вам большое за вашу помощь и заблаговременно!

#include <iostream> 
#include <cstdlib> 

int lastLargestIndex(int [], int); 
int lastLowestIndex(int [], int); 

using namespace std; 

int main() 
{ 
    const int N = 15; 
    int arr[N] = {5,198,76,9,4,2,15,8,21,34,99,3,6,13,61}; 
    int location; 
    //int location2; 

    location = lastLargestIndex(arr, N); 

    cout << "The last largest number is:" << location << endl; 

    location = lastLowestIndex(arr, N); 

    cout << "The last smallest number is:" << location << endl; 


    // std::system ("pause"); 

    return 0; 
} 

int lastLargestIndex(int arr[], int size) 
{ 
    int highNum = 0; 

    for(int i = 0; i < size; i++) 
    { 
     if (arr[i] > highNum) 
     { 
     highNum = arr[i]; 
     } 
    } 

    return highNum; 
} 

int lastLowestIndex(int arr[], int size) 
{ 

    int smallest = 0; 

    for (int i = 0; i < size; i++) 
    { 
     if (arr[i] < smallest) 
     { 

      smallest = arr[i]; 

     } 

    } 

    //cout << smallest << '\n'; 

    return smallest; 


} 
+2

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

+0

Если вам нужно сделать это в «реальном» коде, вы, вероятно, захотите использовать 'std :: minmax_element', который (как вы, вероятно, можете догадаться от имени) определен, чтобы сделать * точно * то, что вы ищете здесь , –

ответ

2

Однако, она возвращается 0 все время для функции lastLowestIndex и я не уверен, что я могу делать неправильно.

Вы получили логическую ошибку, когда вы инициализирован smallest к 0 в функции lastLowestIndex() - это условие способ if (arr[i] < smallest) не оценивается в true, если все входные положителен. Вместо этого вы должны инициализировать его первому члену массива arr. Функция должна выглядеть следующим образом:

int lastLowestIndex(int arr[], int size) 
{ 

    int smallest = arr[0]; 
    for (int i = 0; i < size; i++) 
    { 
     if (arr[i] < smallest) 
     { 
      smallest = arr[i]; 
     } 
    } 
    return smallest; 
} 
1

lastLowestIndex() инициализирует smallest быть 0, а затем сравнивает все элементы массива (которые являются положительными, в вашем примере) с ним. Все положительные значения больше нуля, поэтому наименьшее значение останется равным нулю.

Обратите внимание, что ваша логика также не является общей для нахождения максимума. Рассмотрим, что будет делать код, если все элементы массива отрицательные.

Вам было бы лучше принять логику, которая не делает никаких предположений о массиве, кроме его размера, и что он содержит целые значения. Например;

int lastLargestIndex(int arr[], int size) 
{ 
    int highNum = arr[0]; 

    for(int i = 1; i < size; i++) 
    { 
     if (arr[i] > highNum) 
     { 
      highNum = arr[i]; 
     } 
    } 
    return highNum; 
} 

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

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

1

Это правильный рабочий код!

#include <iostream> 
#include <cstdlib> 

int lastLargestIndex(int [], int); 
int lastLowestIndex(int [], int); 

using namespace std; 

int main() 
{ 
    const int N = 15; 
    int arr[N] = {5,198,76,9,4,2,15,8,21,34,99,3,6,13,61}; 
    int location; 
    //int location2; 

    location = lastLargestIndex(arr, N); 

    cout << "The last largest number is:" << location << endl; 

    location = lastLowestIndex(arr, N); 

    cout << "The last smallest number is:" << location << endl; 


    // std::system ("pause"); 

    return 0; 
} 

int lastLargestIndex(int arr[], const int size) 
{ 
    int highNum = -100001; 

    for(int i = 0; i < size; i++) 
    { 
     if (arr[i] > highNum) 
     { 
     highNum = arr[i]; 
     } 
    } 

    return highNum; 
} 

int lastLowestIndex(int arr[], const int size) 
{ 

    int smallest = 100001; 

    for (int i = 0; i < size; i++) 
    { 
     if (arr[i] < smallest) 
     { 

      smallest = arr[i]; 

     } 

    } 

    //cout << smallest << '\n'; 

    return smallest; 


} 

Модификации сделано:

  1. Заменено аргумент в функции от int size к const int size, поскольку N объявлен как const int в main функции

  2. Заменены highNum с -100001

  3. Заменено smallest с 100001

+0

Что вы ожидаете от реализации с 32-битным 'int', и если какое-либо из значений в массиве меньше или равно -100001 или больше 100001? – Peter

+0

@Peter, мы можем использовать INT_MIN и INT_MAX, чтобы иметь правильные пределы. И это будет зависеть от системы, как указано [здесь] (http://www.cplusplus.com/reference/climits/). –

Смежные вопросы