【问题标题】:Printf statement in for loopfor循环中的printf语句
【发布时间】:2016-01-26 09:12:22
【问题描述】:

所以我试图比较这两个数组的值,并创建了一个测试,比较每个数组的每个元素。但是,我只希望 printf 语句仅在每个数组的所有元素彼此相等时打印一次。

此代码为每个相等的元素打印语句,但如果所有元素都相同,我只需要打印一次。我该怎么办?

int MatrixEqualsActual[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int MatrixEquals[3][3] = {{3, 5, 9}, {1, 2, 6}, {9, 0, 1}};

int i, j;
for (i = 0; i < 3; i++) { 
    for (j = 0; j < 3; j++) { 
        if(MatrixEqualsActual[i][j] == MatrixEquals[i][j]) 
        {    
            printf("PASSED (2/2): MatrixEquals()\n");
        }
    }
}

【问题讨论】:

  • 只需设置一个条件来检查所有元素是否相同。然后只打印一次。
  • 您需要一个标志变量来检查数字是否相同。然后你使用 printf

标签: c


【解决方案1】:

只需使用一个标志,并且仅在设置时打印! 喜欢:

...
bool flag = true;
for (i = 0; i < 3; i++)
{ 
    for (j = 0; j < 3; j++)
    { 
        if(MatrixEqualsActual[i][j] != MatrixEquals[i][j]) 
        {   
            flag = false;
            break; // we break since we already know that at least one element doesn't match.
        }
   }
}
if(flag)
{
    printf("PASSED (2/2): MatrixEquals()\n");
}

请记住#include &lt;stdbool.h&gt;,否则您将无法在 C 中使用布尔类型。 如果您不想包含它,int 变量会很好!

【讨论】:

  • 现在使用有意义的小写变量名,我完全支持你 ;-)
  • 感谢您的帮助!欣赏它。
【解决方案2】:

您可以在循环中保留一个标志,表明矩阵是否相等:

int areEqual = 1;
for(...){
    for(...){
        if (MatrixEqualsActual[i][j] != MatrixEquals[i][j]){
            areEqual = 0;
            break; //stop checking by breaking out of the loop
        }
    }
}
if (areEqual) printf("They're the same matrix\n");

【讨论】:

  • 感谢您的帮助!
【解决方案3】:

three possible ways 可以在不使用break 的情况下实现这一点 - 在C/C++ 中break 只能终止最里面的循环,这并不是你真正想要的。

版本 1 使用简单的return

int i, j;
for (i = 0; i < 3; i++) { 
   for (j = 0; j < 3; j++) { 
      if (MatrixEqualsActual[i][j] != MatrixEquals[i][j]) 
      {    
          return;
      }
   } 
}
printf("PASSED (2/2): MatrixEquals()\n");    

版本 2 使用 goto:

int i, j;
for (i = 0; i < 3; i++) { 
    for (j = 0; j < 3; j++) { 
       if (MatrixEqualsActual[i][j] != MatrixEquals[i][j]) 
       {    
           goto mark;
       }
    } 
}
printf("PASSED (2/2): MatrixEquals()\n");
mark: {} // Matrices do not equal

使用标志的版本 3:

int i, j;
int flag = 1;
for (i = 0; (i < 3) && flag; i++) { 
    for (j = 0; (j < 3) && flag; j++) { 
        if (MatrixEqualsActual[i][j] != MatrixEquals[i][j]) 
        {    
            flag = 0;
        }
    } 
}
if (flag) {
    printf("PASSED (2/2): MatrixEquals()\n");
}

此外,您可能希望将循环条件中的硬编码3 替换为计算出的长度,如下所示:

size_t length_outer = sizeof(MatrixEqualsActual) / sizeof(MatrixEqualsActual[0]);
size_t length_inner = sizeof(MatrixEqualsActual[0]) / sizeof(MatrixEqualsActual[0][0]);

【讨论】:

  • 版本 1 没有提供任何有用的信息,因为当矩阵不相等时,不会返回任何信息并且不会打印任何内容。版本 2 使用 goto,不推荐。这不是那么坏,但它不是一个好习惯养成。它降低了可读性。
  • @Arc676 如果需要,您可以简单地修改版本 1 以返回某些内容。 goto 是否是不好的做法当然是一个争论的领域——但直言不讳地说“不推荐”在 IMO 中过于大胆。当矩阵不相等时打印消息不是 OP 的要求,your answer 也不提供此功能。
  • 我没有说打印是必需的。我只是认为提及return 后面没有其他内容会很有用,因此不会从函数中输出任何信息。我没有任何冒犯的意思。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 2014-08-28
  • 2016-06-16
  • 2019-06-09
相关资源
最近更新 更多