Если я не могу определить переменную внутри условия if, как я могу сократить поиск в моем массиве несколько раз в этом коде? - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть функция, тело которой выглядит примерно так:

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

Функция contains перебирает мой массив и проверяет, содержит ли он element, который я передаю емуи вернуть либо свою позицию, если она существует, либо -1, если ее нет.

В моей части // do something мне нужна позиция этого элемента в массиве.Я могу сделать это несколькими способами:

  1. Я могу вызвать мою функцию contains() еще раз, чтобы получить позицию.
  2. Я могу определить несколько переменных, которые определены как возвращение функции содержимого, и затем проверить их в моем блоке if-else.Так что-то вроде:

    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. Возможно, я могу изменить contain, чтобы он возвращал int array[2], с array[0] равным 0 или 1 независимо от того, является ли элементв ней или нет, и тогда array[1] q будет равно фактическому местоположению, делая код таким:

    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
    }...
    
  4. Я могу сказать, прикрутить блок if-else, сохранив возврат contains в переменной и запустить несколько операторов if.

Первое решение будет искать в моем массиве как минимум дважды.Второе решение будет искать по крайней мере столько раз, сколько элементов я ищу.Решение 3, возможно, лучшее, но, возможно, не самое элегантное.Решение 4 будет запускать каждый оператор if ...

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

Ответы [ 3 ]

0 голосов
/ 18 февраля 2019

Вы можете передать указатель, чтобы сказать int, который заполняется, когда функция содержит элемент.Тогда внутри вашего if блока вы будете уверены, что pos является правильным индексом.

Пример:

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...
}
0 голосов
/ 18 февраля 2019

Вот решение, которое вообще не требует, чтобы вы изменили contains:

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
}

Это работает, потому что назначение переменных в большинстве императивных языков является выражением.

0 голосов
/ 18 февраля 2019

Я бы изменил contains, чтобы использовать только возвращаемое значение, чтобы указать ошибку / успех поиска, и, если параметр был найден, вывести параметр по ссылке.

int contains(int *data, int value, int *loc)
{
    for(int i = 0; i < SIZE; i++)
    {
         if(data[i]==value)
         {
              *loc = i;
              return 1; // success
         }
    }
    *loc = -1;
    return 0; // failure
}

Теперь,Вы можете просто сделать:

int elem1loc, elem2loc, elem3loc;
if(contains(data, val1, &elem1loc))
     // use elem1loc...
if(contains(data, val2, &elem2loc))
     // use elem2loc...  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...