2015-10-26 1 views
-4

OK donc pour mes devoirs je dois faire un tableau avec 5 valeurs aléatoires, demander à l'utilisateur un nombre à rechercher, puis retourner l'index du nombre recherché. Tout ceci est facile (ou du moins je l'ai fait) mais maintenant si le nombre entré par l'utilisateur n'existe pas dans le tableau, je dois quand même retourner le plus proche.C++ Recherche Array la plus proche

Exemple 1:

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

Int iSearchTarget = 199; 

Index renvoyée = 2 (l'indice de 198)


Exemple 2:

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

Int iSearchTarget = 37; 

Index retourné = 1 (indice de 38

... Voici à quoi ressemble ma fonction, j'ai juste besoin d'aide pour trouver le "plus proche" au lieu de retourner -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

Ceci est un site de questions et réponses. Ce n'est pas une question. En outre, vous pouvez trouver quelqu'un qui va juste écrire le code pour vous, mais ce n'est pas ce que ce site est à propos non plus. –

+0

J'ai déjà écrit tout le programme, j'ai juste besoin d'aide pour trouver le nombre le plus proche de celui de l'intérieur du tableau. @JonathanWood –

+0

Pensez à la façon dont le tri pourrait vous aider – ZivS

Répondre

0

Mon approche serait quelque chose comme ça ...

#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

MERCI DE NE PAS ÊTRE UN DICK COMME @JonathanWood, avec son site Web shiitty ass lol. Sérieusement merci l'homme, maintenant je peux aller dormir –

+0

je ne comprends pas cette ligne int diff {std :: numeric_limits :: max()}, idx {0}; –

+0

Il s'agissait de définir la valeur initiale à la valeur entière la plus élevée possible, mais elle n'est pas nécessaire. – dspfnder

1

est ici l'approche que je prendrais.

Je commencerais par stocker l'index du premier élément de tableau (0), avec la différence absolue entre cet article et iSearchTarget.

Ensuite, je ferais une boucle sur le reste du tableau et pour tout élément qui a une différence absolue inférieure à iSearchTarget que celui actuellement stocké, je remplacerais l'index et la différence avec ce nouvel élément.

Lorsque vous avez terminé, vous aurez l'index de l'élément le plus proche.

Mais désolé, je n'écris pas le code pour vous.

+0

ok lol, merci –

0

Après chaque itération lors de la recherche prend une autre variable (min) qui stocke la différence absolue des nombres

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. Son juste une idée que la façon de procéder à l'problem.Not le code complet

+0

Votre code a un bug. Avez-vous testé? –

+0

C'était juste pour lui donner l'idée. Pas le code complet –

+0

Mais vous lui avez donné le code complet, sauf avec un bug. –

0

Avec algorithme, il devient:

#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