如何在for循环中每次迭代仅执行一次“ if”语句?

假设两个列表中没有重复的单词,我想将listA的单词与listB的单词进行比较。 如果有匹配项,我想打印匹配的单词并比较listB中的下一个'n'单词以查看是否存在匹配项。 同样,如果没有匹配项(即,一旦我到达listA中的最后一个单词),我想打印找不到的单词并比较listB中的下一个'n'个单词以查看是否存在匹配项。 / p>

我坚持应该如何在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:猫,ad子

预期输出:

  

猫在列表中!   ger不在列表中!

实际输出:

  

猫在列表中!

编辑:

我了解我的continue语句是未检查第二个条件的原因。删除它会打印一个单词,该单词不在列表'j'内,也不是我想要的输出。换句话说,我希望您能指导我如何执行这些声明以符合规范。

lbwaaa 回答:如何在for循环中每次迭代仅执行一次“ if”语句?

我的建议是更改循环,以便将“ 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");
}
,

您的continue总是被执行;您将永远不会到达第二个if

,

首先,使用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: ;
    }
}

第二;为避免胡说八道的错误(请参阅下面的历史记录),请将代码分成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]);
}

历史记录

从前,高级语言(如汇编语言)没有结构化的编程功能(dowhilebreakcontinue,{{1} },...)。相反,程序员会使用switch来编写代码,例如(例如)“ goto”而不是“ if(x < MAX) goto loopStart;”。

为鼓励采用结构化编程功能,1968年Edsger W. Dijkstra给ACM的编辑写了一封信,标题为“声明被认为有害”。这封信产生了预期的效果-所有主要语言都采用了结构化的编程功能(} while(x < MAX);dowhilebreakcontinue等)语言。

但是;它还有一个意想不到的副作用-这封信有点太有效了;愚昧无知的人(无法阅读字母或理解其上下文)开始变得狂热,使他们的代码变得更糟(对于新的结构化语言功能还不够的情况),以免在不了解原因的情况下转到goto,并鼓励其他人他们的代码不了解为什么会变得更糟。

例如,通过纯粹为了避免使用简单的switch引入额外的变量来使代码复杂,和/或纯粹为了避免简单的goto来引入额外的分支的复杂代码。

稍后(与Donald E. Knuth对话);迪克斯特拉本人说:“ 请不要陷入相信我对[go to statement]极为教条的陷阱。我对其他人正在从中发扬宗教信仰感到不安 >,就好像编程的概念性问题可以通过一个技巧,一种简单的编码规则来解决!

可悲;一旦无知开始蔓延,常识就是在打败一场战斗。

,

执行此操作的最佳方法可能是二进制搜索或哈希表,具体取决于数据量。话虽如此,代码可以通过以下方式进行改进:

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]);
}

注意:printf中的aline[i]不是bline[i]。如果允许bline[i]alineno具有不同的长度,则blineno将是一个潜在的数组错误。

本文链接:https://www.f2er.com/3125878.html

大家都在问