2015-10-19 2 views
0

Так что у меня проблемы с чем-то. Мне нужно создать функцию, которая найдет наименьшее число в массиве. Я знаю один способ сделать это, используя сумму overkill if/else if, которая не принесет никакой пользы, если размер массива изменится. Я знаю, что использование цикла for должно делать трюк, но я не могу понять, как его написать. Любое толчок в правильном направлении было бы весьма полезным.Найти наименьшее значение в массиве

#include <iostream> 
using namespace std; 

int findLowest(int[]); 

int main() 
{ 
    int AR[5] = {4, 87, 1, -3, 78}; 
    cout << findLowest(AR); 

    return 0; 
} 

int findLowest(int AR[]) 
{ 

    return lowest; 
} 
+1

Если вы не хотите/не должны этого делать самостоятельно, возможно, посмотрите 'std :: min_element'. –

+0

"не будет ничего хорошего, если размер массива изменится" Изменяется ли он во время выполнения задачи? Если нет, просто храните временный элемент и проверяйте его. – CroCo

ответ

0
#include <iostream> 
using namespace std; 

int findLowest(int ar[]) 
{ 
    int lowest = 1000000; 
    for(int i=0; i<5;i++) 
    { 
     if(lowest > ar[i]) 
      lowest = ar[i]; 
    } 
    return lowest; 
} 

int main() 
{ 
    int AR[5] = {4, 87, 1, -3, 78}; 
    cout << findLowest(AR); 

    return 0; 
} 
+0

Да, это то, к чему я пытался добраться, но вместо i> 5 я пытался использовать размер массива. Это возможно? –

+0

Да, вы можете определить постоянную переменную после #include, например: #define LENGTH 100 (или любой другой номер, который вы хотите) и изменить его каждый раз, когда вы хотите другое значение. Примером может быть ваша проблема: #include #define N 100 using namespace std; int findLowest (int ar [], int dim) { int lower = 1000000; для (int i = 0; i ar [i]) lower = ar [i]; } return lower; } int main() { int AR [N] = {4, 87, 1, -3, 78}; cout << findLowest (AR, N); возвращение 0; } –

+1

Как насчет 'int AR [5] = {1000001, 1000002, 1000003, 1000004, 1000005};'? – CroCo

3

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

#include <climits> 
... 

/* assumes AR_size > 0 */ 
int findLowest(int AR[], int AR_size) 
{ 
    int lowest = INT_MAX; 
    for (i = 0; i < AR_size; ++i) { 
     lowest = (AR[i] < lowest) ? AR[i] : lowest; 
    } 
    return lowest; 
} 
+1

'lower = (AR [i] <самый низкий)? AR [i]: самый низкий, 'чистый, но неэффективный, поскольку он вызывает присвоение самому себе. Оптимизатор может удалить это, но 'if (AR [i] LINEMAN78

+0

Мне почему-то нравятся тернарные высказывания. Возможно, более читаемо. Точка, но удар производительности, вероятно, будет очень минимальным. –

+0

Есть ли более эффективный способ, чем этот, не используя if (ar [i]> lower)? –

0

Вместо того, чтобы определять свою собственную функцию для поиска наименьшего числа в вашем массиве, почему вы не используете стандартную функцию std::min_element, чтобы сделать это за вас? Создайте объект std::vector из массива и пусть функция min_element выполнит задание для вас.

#include <algorithm> 
#include <cstdlib> 
#include <iostream> 
#include <vector> 

#define ARRAY_SIZE 5 

int main (int argc, char **argv) 
{ 
     int ar [ ARRAY_SIZE ] = {4, 87, 1, -3, 78}; 

     std::vector<int> arVector (ar, ar + ARRAY_SIZE); 

     std::cout << *std::min_element (arVector.begin (), arVector.end ()) << std::endl; 

     return EXIT_SUCCESS; 
} 

Выход:

-3 
+0

mega overkill. Стандартная библиотека уже имеет функцию 'min_element'. –

+0

Сортировка, чтобы найти минимальное (или максимальное) значение, является относительно дорогим и ненужным, когда вы можете найти границы в линейном времени (один проход). –

+0

Неплохо, я немного поспешил прочитать вопрос. Он думал, что хочет сортировать функцию. Я исправил это сейчас. – BufferOverflow

3
template<size_t N> 
int findLowest(int (&ar)[N]) 
{ 
    return *std::min_element(std::begin(ar), std::end(ar)); 
} 

Обратите внимание на использование шаблона, чтобы убедиться, что мы получаем информацию о размере от вызывающего.

+0

Определенно больше C++ - ic –

0
#include <iostream> 
#include <cassert> 
using namespace std; 

int findLowest(int ar[], const int& SIZE) 
{ 
    assert(("Error: the size of the array is zero. Make sure that ", SIZE > 0)); 

    int lowest = ar[0]; 

    for(int i=0; i<SIZE;i++) 
    { 
     if(lowest > ar[i]) 
      lowest = ar[i]; 
    } 
    return lowest; 
} 

int main() 
{ 
    const int SIZE(5); 
    int AR[5] = {11, 12, 10, 14, 15}; 
    cout << findLowest(AR,SIZE); 

    return 0; 
} 
Смежные вопросы