Как выполнить оператор if только один раз за итерацию в цикле for? - PullRequest
2 голосов
/ 11 ноября 2019

Предполагая, что в обоих списках нет повторяющихся слов, я бы хотел сравнить слова из списка А со словами из списка В. Если есть совпадение, я хочу напечатать совпадающее слово и сравнить следующие 'n' слова в списке B, чтобы увидеть, есть ли совпадение. Аналогичным образом, если совпадения нет (т. Е. Как только я достигну последнего слова в списке A), я хочу напечатать слово, которое не может быть найдено, и сравнить следующие 'n' слова в списке B, чтобы увидеть, есть ли совпадение.

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

alineno & blineno относится к текущему номеру строки в массивах aline & bline, где хранятся слова

 // index through listA
 for(i = 0; i < alineno; i++){ 
   // index through all the words in listB
   for(j = 0; j < blineno; j++){ 
      if(strcmp(aline[i], bline[j]) == 0){
        printf("%s is in the list!", bline[j]);
      }
      continue;
      if(strcmp(aline[strlen(aline[0])-1], bline[j]) != 0){
        printf("%s is not in the list!", bline[j]);
      }
   }
 }

Ввод:

  1. listA: Aardvark, Cat, Bear, Dog
  2. listB: Cat, Badger

Ожидаемый результат:

Cat isв списке! Барсука нет в списке!

Фактический вывод:

Кошка в списке!

РЕДАКТИРОВАТЬ:

Я понимаю, что мое утверждение continue является причиной, по которой второе условие не проверяется. Удаление его приведет к тому, что слово будет / нет в списке 'j' количество раз, что не является моим желаемым выводом. Другими словами, я был бы признателен за рекомендации о том, как мне следует реализовывать такие утверждения, чтобы соответствовать спецификациям.

Ответы [ 4 ]

2 голосов
/ 11 ноября 2019

Мое предложение состоит в том, чтобы вы изменили циклы, поэтому у вас есть цикл над «listB» в качестве внешнего цикла и итерация над «listA» во внутреннем цикле.

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

В псевдо коде возможно что-то вроде этого

for (to_find in listB)
{
    found_flag = false;

    for (animal in listA)
    {
        if (to_find == animal)
        {
            found_flag = true;
            break;
        }
    }

    if (found_flag)
        printf("Animal found");
    else
        printf("Animal not found");
}
1 голос
/ 11 ноября 2019

Ваш continue всегда выполняется;Вы никогда не достигнете своего второго if.

0 голосов
/ 12 ноября 2019

Лучший способ сделать это - это, вероятно, бинарный поиск или хеш-таблица, в зависимости от объема данных. При этом код может быть улучшен следующим образом:

for(int i = 0; i < alineno; i++)
{ 
  int j;
  for(j = 0; j < blineno; j++)
  {
    if(strcmp(aline[i], bline[j]) == 0)
      break;
  }

  if(j == blineno)
    printf("%s is not in the list!", aline[i]); 
  else
    printf("%s is in the list!", bline[j]);
}

Примечание: aline[i] не bline[i] в printf. bline[i] будет потенциальной ошибкой массива вне границ, если alineno и blineno могут иметь разную длину.

0 голосов
/ 11 ноября 2019

Во-первых, используйте goto, например:

void something(void) {
    // index through listA
    for(int i = 0; i < alineno; i++){ 
        // index through all the words in listB
        for(int j = 0; j < blineno; j++){ 
            if(strcmp(aline[i], bline[j]) == 0){
                printf("%s is in the list!", bline[j]);
                goto doneAnimal;
            }
        }
        printf("%s is not in the list!", bline[i]);
doneAnimal: ;
    }
}

Во-вторых;чтобы избежать риска глупости «goto is bad» (см. раздел «Историческая справка» ниже), усложните чтение кода, разбив его на 2 разные функции, чтобы можно было преобразовать goto в return, например так:

void something(void) {
    // index through listA
    for(int i = 0; i < alineno; i++){ 
        doAnimal(i, blineno);
    }
}


void doAnimal(int i, int blineno) {
    for(int j = 0; j < blineno; j++){ 
        if(strcmp(aline[i], bline[j]) == 0){
            printf("%s is in the list!", bline[j]);
            return;
        }
    }
    printf("%s is not in the list!", bline[i]);
}

Историческая справка

Когда-то языки более высокого уровня (например, ассемблер) не имели функций структурированного программирования (do, while,break, continue, switch, ...). Вместо этого программисты писали бы код, используя goto, например (например) "if(x < MAX) goto loopStart; вместо" } while(x < MAX);.

Чтобы поощрить принятие функций структурированного программирования, в 1968 году Эдсгер В. Дейкстра написал письморедактору ACM под названием «перейти к заявлению, признанному вредным». Это письмо имело желаемый эффект - функции структурированного программирования (do, while, break, continue, switch, ...) были приняты на всех основных языках.

Однако;у него также был один непреднамеренный побочный эффект - письмо было слишком эффективным;и невежественные люди (которые не смогли прочитать письмо или понять его контекст) стали ревнителями, ухудшили свой код (для случаев, когда новых возможностей структурированного языка недостаточно), чтобы избежать перехода, не понимая, почему, и поощряя других людей делать этоих код хуже, не понимая почему.

Примеры этого включают усложнение кода путем введения дополнительных переменных исключительно ради того, чтобы избежать более простого goto, и / или усложнение кода для введения дополнительных ветвей исключительно ради избежанияболее простой goto.

позже (в беседах с Дональдом Э. Кнутом);Сам Дейкстра сказал: « Пожалуйста, не попадитесь в ловушку веры в то, что я ужасно догматичен в отношении [перехода к утверждению]. У меня неприятное ощущение, что другие делают из этого религию Как будто концептуальные проблемы программирования могут быть решены одним трюком, простой формой кодирования!"

Печально;как только невежество начинает распространяться, здравый смысл вступает в проигрышную битву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...