4
votes

Si je ne peux pas définir une variable dans une condition if, comment puis-je réduire la recherche dans mon tableau plusieurs fois dans ce code?

J'ai une fonction dont le corps ressemble beaucoup à ceci:

if (contains(array, element1)[0] > -1){
    // do something
} else if (contains(array, element2)[0] > -1) {
    // do something
} else if (contains(array, element3)[0] > -1) {
    // do something
}...

La fonction contains boucle dans mon tableau et vérifie si elle contient un élément que je lui passe et retourne soit sa position s'il existe, soit -1 si ce n'est pas le cas.

Dans ma partie // faire quelque chose , j'ai besoin de la position de cet élément dans le tableau. Je peux faire cela de différentes manières:

  1. Je peux appeler ma fonction contains () une fois de plus pour obtenir la position.
  2. Je peux définir plusieurs variables qui sont définies comme le retour de la fonction contain, puis les vérifier dans mon bloc if-else. Donc quelque chose comme:

    int element1Loc = contains(array, element1);
    int element2Loc = contains(array, element2);
    int element3Loc = contains(array, element3);
    
    if (element1Loc > -1){
        // do something
    } else if (element2Loc > -1) {
        // do something
    } else if (element3Loc > -1) {
        // do someting
    }...
    
  3. Je peux peut-être modifier contain pour renvoyer un int array [2] , avec array [0] égal à 0 ou 1 si l'élément y est ou non, puis array [1] q correspondrait à l'emplacement réel, ce qui donnerait au code l'aspect de celui-ci:

    if (contains(array, element1) > -1){
            // do something
        } else if (contains(array, element2) > -1) {
            // do something
        } else if (contains(array, element3) > -1) {
            // do someting
        }...
    
  4. Je peux dire visser le bloc if-else, enregistrer le retour de contains dans une variable et exécuter plusieurs instructions if.

La première solution cherchera dans mon tableau au moins deux fois. La solution deux recherchera au moins autant de fois que d'éléments que je recherche. La solution 3 est peut-être la meilleure, mais peut-être pas la plus élégante. La solution 4 exécutera chaque instruction if ...

Quelle est la meilleure façon de rechercher une seule fois? Dois-je créer une fonction qui prend tout ce que je recherche et renvoie un tableau avec la position de chaque élément? Est-ce que je réfléchis trop?


1 commentaires

Pas joli, mais vous pouvez faire int elementLoc; ... if ((elementLoc = contains (array, element1))> -1) {... . Vous n'utilisez donc qu'une seule variable, qui n'est calculée qu'en cas de besoin.


3 Réponses :


2
votes

Je modifierais contient pour n'utiliser que la valeur de retour pour indiquer l'erreur / succès de la recherche, et, si le paramètre a été trouvé, afficher le paramètre par référence.

int elem1loc, elem2loc, elem3loc;
if(contains(data, val1, &elem1loc))
     // use elem1loc...
if(contains(data, val2, &elem2loc))
     // use elem2loc...  


1 commentaires

c'est génial. Je ne savais pas que vous pouviez pointer vers un int comme ça.



2
votes

Vous pouvez passer un pointeur pour dire int qui sera rempli lorsque la fonction contient trouve un élément. Ensuite, dans votre bloc if , vous seriez assuré que pos est l'index correct.

Exemple:

int pos;

if (contains(array, element1, &pos) > -1) {
    // Here you can check pos for the position
} else if (contains(array, element2, &pos) > -1) {
    // Here you can check pos as well...
}

p >


1 commentaires

Govind a fourni une réponse plus tôt et "plus complète" que vous, donc j'accepte la sienne, mais c'est l'OMI tout aussi génial. J'aime particulièrement le fait que vous n'ayez pas instancié plusieurs variables, ce que je ne pense pas que vous deviez faire (comme l'a fait Gavin). Je vous remercie!



1
votes

Voici une solution qui ne vous oblige pas du tout à modifier contient :

int pos;

if ((pos = contains(array, element1)) > -1) {
    // do something with pos
} else if ((pos = contains(array, element2)) > -1) {
    // do something with pos
} else if ((pos = contains(array, element3)) > -1) {
    // do something with pos
}

Cela fonctionne car l'attribution de variable dans la plupart des langages impératifs est une expression.

/ p>


0 commentaires