2015-10-26 2 views
-4

OK, поэтому для моей домашней работы мне нужно создать массив с 5 случайными значениями, попросить пользователя для поиска номера, а затем вернуть индекс искомого номера. Все это легко (или, по крайней мере, сделало это), но теперь, если номер, который вводит пользователь, не существует в массиве, тогда я должен все же вернуть ближайший к нему.C++ Ближайший поиск массива

Пример 1:

Int iArr[SIZE] = {45, 38, 198, 36, 781}; 

Int iSearchTarget = 199; 

Возвращается индекс = 2 (индекс 198)


Пример 2:

Int iArr[SIZE] = {45, 38, 198, 36,781}; 

Int iSearchTarget = 37; 

Возвращается индекс = 1 (индекс 38)

... вот как выглядит моя функция, мне просто нужна помощь в том, как вы можете найти «Ближайший», а не возвращать -1.

int searchList(const int list[], int numElems, int value) 
{ 
    int index = 0; 
    int position = -1; 
    bool found = false; 

    while (index < numElems && !found) 
    { 
     if (list[index] == value) 
     { 
      found = true; 
      position = index; 
      cout << "The index of the number you searched for is "<<  position << endl; 
     } 
     index++; 
    } 

    if (position == -1) { 
     cout<<"Search not found" << position<<endl; 
    } 
    return position; 

}

+1

Это сайт вопросов и ответов. Это не вопрос. Кроме того, вы можете найти того, кто просто напишет код для вас, но это не то, о чем этот сайт. –

+0

Я уже написал всю программу, мне просто нужна помощь в том, как вы найдете ближайший номер к тому, что находится внутри массива. @JonathanWood –

+0

Подумайте, как сортировка массива может вам помочь – ZivS

ответ

0

Мой подход был бы что-то вроде этого ...

#include <iostream> 

using namespace std; 

const int cSize = 5; 
int iArr[cSize] = { 45, 38, 198, 36,781 }; 

int searchList(const int list[], int numElems, int value) { 
    int diff = abs(list[0] - value) , idx{ 0 }; 
    for (int i = 0; i < numElems; i++) { 
     if (abs(list[i] - value) < diff) { 
      diff = abs(list[i] - value); 
      idx = i; 
     } 
    } 
    return list[idx]; 
} 

int main() { 

    int num{ 0 }; 
    cout << "Please enter an integer: "; 
    cin >> num; 

    cout << "The closest number is: " << searchList(iArr, cSize, num) << endl; 

    // system("pause"); 
    return 0; 
} 
+0

СПАСИБО ЗА НЕОБХОДИМОСТЬ DICK LIKE @ JonathanWood, со своим сайтом shiitty ass lol. Серьезно спасибо человеку, теперь я могу спать –

+0

Я не понимаю эту строку int diff {std :: numeric_limits :: max()}, idx {0}; –

+0

Должно было установить начальное значение максимально возможного целочисленного значения, но в этом нет необходимости. – dspfnder

1

Вот подход, который я бы.

Я бы начал с хранения индекса первого элемента массива (0) вместе с абсолютной разницей между этим элементом и iSearchTarget.

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

Когда вы закончите, у вас будет указатель ближайшего элемента.

Но, извините, я не пишу код для вас.

+0

ok lol, thanks –

0

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

for(i=0;i<n;i++) 
{ 
if(arr[i]==iSearchTarget) 
{ 
    //found 
} 
else 
{ 
    p=abs(arr[i]-iSearchTarget) //absolute value of the difference 
    if(p<min) 
    { 
    min=p; 
    index=i; 
    } 
} 
} 
// print the index or the difference according to your requirement 

P.S. Его просто идея о том, как приступить к problem.Not полный код

+0

В вашем коде есть ошибка. Вы проверили это? –

+0

Это было просто дать ему эту идею. Не полный код –

+0

Но вы дали ему полный код, кроме как с ошибкой. –

0

С алгоритмом, он становится:

#include <algorithm> 
#include <iostream> 

int searchNearest(const int (&a)[5], int value) { 
    auto it = std::min_element(std::begin(a), std::end(a), 
           [value](int lhs, int rhs) { 
            return std::abs(lhs - value) < std::abs(rhs - value); 
           }); 
    return std::distance(std::begin(a), it); 
} 

int main() { 
    int arr[] = { 45, 38, 198, 36,781 }; 
    int num = 199; 

    auto index = searchNearest(arr, num); 
    std::cout << "The closest number is: " << arr[index] 
       << " with index " << index << std::endl; 
} 

Live Demo

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