【问题标题】:Advice on optimizing this C program?关于优化这个 C 程序的建议?
【发布时间】:2011-03-28 19:31:55
【问题描述】:

想知道是否有办法缩小这个程序。我不喜欢 5 个 printf/scanf 对的外观,但我想不出一种方法来使用 for 循环来缩小它。我无法将 scanf 调用与 printf 调用匹配。

for(i = 1; i < 6; i++)
    printf("Enter row %d", i);

这部分很简单,但是对数组的 scanf 调用和赋值让我感到困惑。

//Sums row and column
#include <stdio.h>

int main(void) {

    int a[5][5];
    int row[5] = {0}, col[5] = {0};
    int i, j;

    printf("\t--Enter a 5x5 chart--\n");
    printf("\tEnter row #1: ");
    scanf("%d %d %d %d %d", &a[0][0], &a[0][1], &a[0][2], &a[0][3], &a[0][4]);

    printf("\tEnter row #2: ");
    scanf("%d %d %d %d %d", &a[1][0], &a[1][1], &a[1][2], &a[1][3], &a[1][4]);

    printf("\tEnter row #3: ");
    scanf("%d %d %d %d %d", &a[2][0], &a[2][1], &a[2][2], &a[2][3], &a[2][4]);

    printf("\tEnter row #4: ");
    scanf("%d %d %d %d %d", &a[3][0], &a[3][1], &a[3][2], &a[3][3], &a[3][4]);

    printf("\tEnter row #5: ");
    scanf("%d %d %d %d %d", &a[4][0], &a[4][1], &a[4][2], &a[4][3], &a[4][4]);

    for(i = 0; i < 5; i++) {
            for(j = 0; j < 5; j++) {
                    row[j] += a[j][i];
                    col[j] += a[i][j];
            }
    }

    printf("\tRow sums: %d %d %d %d %d\n", row[0], row[1], row[2], row[3], row[4]);
    printf("\tColumn sums: %d %d %d %d %d\n", col[0], col[1], col[2], col[3], col[4]);

    return 0;
}

【问题讨论】:

  • 拥有input_row 函数(有或没有用于scanf 单元的for 循环)并调用它N 次有什么问题?
  • 用户输入非常难以预测。你可能想确保你得到了你所期望的:if (scanf(...) != 5) /* user is being creative */;

标签: c arrays optimization nested-loops


【解决方案1】:

替换:

printf("\tEnter row #1: ");
scanf("%d %d %d %d %d", &a[0][0], &a[0][1], &a[0][2], &a[0][3], &a[0][4]);         
...
printf("\tEnter row #5: ");
scanf("%d %d %d %d %d", &a[4][0], &a[4][1], &a[4][2], &a[4][3], &a[4][4]);

与:

for (i = 0; i < 5; i++) {
    printf("\tEnter row #%d: ", i+1);
    scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);
}

【讨论】:

  • ... 并将变量 ij 分别重命名为 jk。 +1。
  • 在我发帖后,我在原始代码中看到了 i 的声明,并编辑了我的答案以删除我的新代码中的 i 声明。
  • 谢谢。回想起来,这似乎很明显,我自己没有早点看到它,我觉得有点愚蠢。
  • @Bowlslaw 当 printf 语句与 scanf 语句如此简单相关时,很难理解任何人“想不出办法”。也许你可以谈谈你的思考过程以及你错过了什么或阻碍了什么。顺便说一句,scanf 也应该表示为一个循环:for(j = 0; j &lt; COLS; ++j) scanf("%d", &amp;a[i][j]); ... 所有那些 '5' 都应该替换为诸如 ROWS 和 COLS 之类的清单常量。此外,为清楚起见,请考虑使用 r 和 c 或 row 和 col 代替 i 和 j。
【解决方案2】:

如何读取输入:

for (int i = 0; i < 5; ++i) {
   printf("\tEnter row #%i: ", i+1);
   scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);
}

【讨论】:

    【解决方案3】:
    for (int i = 0; i < 5; ++i)
    {
        printf ("\tEnter row #%d: ", (i+1));
        scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);
    }
    

    【讨论】:

      【解决方案4】:

      你可以这样做:

      int rowIndex;
      
      ... 
      
      for(rowIndex = 0; rowIndex < 5; rowIndex++)
      {
         printf("\tEnter row #%d: ", rowIndex+1);
          scanf("%d %d %d %d %d", &a[rowIndex][0], &a[rowIndex][1], &a[rowIndex][2], &a[rowIndex][3], &a[rowIndex][4]);
      }
      

      【讨论】:

        【解决方案5】:

        @Jim Balter 已经在他对当前接受的答案的评论中提到了这一点,但它值得作为答案发布,因为它是一个更好且更易于维护的解决方案。

        for (i = 0; i < ROWS; i++) 
        {
            printf("\tEnter row #%d: ", i+1);
        
            for( j = 0; j < COLUMNS; j++ )
            {
                scanf("%d", &a[i][j] ) ;
            }
        }
        

        请注意,scanf() 使用任何空格作为分隔符,因此,无需在单个 scanf() 调用中输入“行”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-06-15
          • 1970-01-01
          相关资源
          最近更新 更多