【问题标题】:Printing two arrays side by side with specific number of characters at a time一次并排打印两个具有特定字符数的数组
【发布时间】:2015-04-17 08:44:54
【问题描述】:

我刚刚开始学习 C。今天我有一个问题,我必须输入 2 个矩阵(行数和列数由用户指定)并添加它们。我很容易地完成了添加和其他部分。但我正在考虑让它看起来更好的格式。 所以我的想法是: 假设用户输入一个 3x3 大小的矩阵。假设他选择了以下元素->

Matrix 1->   
1 2 3
4 5 6
7 8 9

Matrix 2->
9 8 7
6 5 4
3 2 1

我希望它们显示为->

| 1 2 3        +       9 8 7 |
| 4 5 6        +       6 5 4 |
| 7 8 9        +       3 2 1 |

(不,不是实际的加法,只是这种格式,然后在下一行我给出加法的答案)。 但问题是,我无法显示右手边的一半。

我的输出如下:

| 1 2 3        +       9 8 7 |
| 4 5 6        +        |
| 7 8 9        +        |

我已经尝试了很多使剩余字符以正确的顺序显示,但遇到了一些或其他类似的问题。到目前为止,这是我的代码(它不是最新的,我已经尝试将它弄得更糟,但最新的代码引入了许多我认为甚至不需要的变量,从而进一步弄乱了它。所以我会发布我的迄今为止最好的进展)。

printf("| ");
i = 0;  //A global int loop variable defined somewhere

width2 = width;   //Another width variable in case I need it in second array, width is variable for number of elements in a row of array. In above example, width=3

for (ii = 0; ii < width * height; ii++) {   //ii is just like i, another global int loop variable. Height is number of characters in a row (in above example 3)
    if (ii != 0) {
        if (ii % width == 0) {
            printf(" |\n| ");
        }
    }

    printf("%d ", row1[ii]);  //For printing out first (left) set of numbers. row1 is where my matrix 1 array values are stored.

    if (((ii + 1)*(width - 1)) % (width * 2) == 0) {   //I think this condition is where things are going wrong.
        printf("     +     ");
        for (i; i < width2; i++) {
            if (i != 0) {
                if (i % width2 == 0) {
                    printf(" |\n| ");
                }
            }
            printf("%d ", row2[i]);    //row2 has second matrix (right) array values
        }
    }
    sec++;  //Just another integer variable to have some control over loop process, didnt succeed much though
}
printf(" |\n\n");

从 2 天以来一直在尝试这个,这真的让我很头疼。我不介意是否有更好的更小的代码并且需要替换整个代码(因为我对 C 很陌生)。

【问题讨论】:

    标签: c arrays nested-loops


    【解决方案1】:

    保持简单,为行设置一个外循环,为列设置两个内循环。矩阵的大小是否不同并不重要,只需在每个内部循环之前添加一个简单的检查即可。

    类似于下面的代码:

    size_t max_line_count = MAX(matrix1_line_count, matrix2_line_count);
    for (size_t line = 0; line < max_line_count; ++line)
    {
        size_t column;
    
        printf(" | ");
    
        // First matrix
        for (column = 0; column < matrix1_column_count; ++column)
        {
            if (line < matrix1_line_count)
                printf("%2d", matrix1[line][column]);
            else
                printf("  ");
        }
    
        printf("    +    ");
    
        // The second matrix
        for (column = 0; column < matrix2_column_count; ++column)
        {
            if (line < matrix2_line_count)
                printf("%2d", matrix2[line][column]);
            else
                printf("  ");
        }
    
        printf(" |\n");
    }
    

    内部循环可以分解成一个单独的函数,以避免代码重复。

    如果矩阵不是数组的数组,而是一个大的单个数组,则使用例如matrix1[line * matrix1_column_count + column]

    【讨论】:

    • 谢谢,但它在那些 printf 命令上给了我错误“订阅的值既不是数组也不是指针也不是向量”。我已经声明了 MAX 宏,并在 C99 模式下运行它。仍然给出这个错误。如果你能帮我解决这个问题(因为我还没有 C 方面的经验)?因为很想尝试新代码。
    【解决方案2】:

    gcc 警告“声明无效”的行显示

    for (i; i < width2; i++)
    

    ——瞧,这样做是对的!仅将第一个 i 更改为 i=0 会显示第二组数字。 (你离得太近了!)

    但它只重复显示前 3 个,因为其中的 i 循环仅在 width2 上循环一次。可以用诸如

    之类的数学方法来哄骗其中的正确值
    printf("%d ", row2[width2*(ii/width) + i]);
    

    之所以有效,是因为ii 每下一行都会以width 的步长增加,并且您希望行数乘以右手设置的宽度。

    将整个例程拆分为三个循环可能更容易:外部只需要在height上运行,内部首先打印一行set1数字,然后打印一行set2数字。不过,我会把它留作练习。

    【讨论】:

    • 完美运行!非常感谢 :D 我看到了很多关于将循环拆分为函数的建议,所以肯定也会尝试 :)
    【解决方案3】:

    创建一个单独的函数来打印行以提高可读性 看我的例子:

    #include <stdio.h>
    
    
    void printRow(int len, int row[]) {
        int i =0;
        for (i = 0; i < len; i++) {
            printf("%d\t", row[i]);
        }
    }
    
    int main(void) {
        int m1[3][3] = {{1,2,3}, {4,5,6}, {7, 8, 9}};
        int m2[3][3] = {{7, 8, 9}, {4,5,6}, {1,2,3}};
        int i = 0;
        int width = 3; //3x3
    
        for (i = 0; i < width; i++) {
            printf("|\t");
            printRow(width, m1[i]);
            printf("\t+\t");
            printRow(width, m2[i]);
            printf("\t|\n");
        }
        return 0;
    }
    

    输出:

    |   1   2   3       +   7   8   9       |
    |   4   5   6       +   4   5   6       |
    |   7   8   9       +   1   2   3       |
    

    工作示例: http://ideone.com/JfnnAS

    【讨论】:

      【解决方案4】:

      在第二个循环中,您没有重新初始化 i,因此条件 i&lt;width2 失败,因此在 for 循环中初始化 i=0 改为:

      if (((ii + 1)*(width - 1)) % (width * 2) == 0) {   
          printf("     +     ");
          for (i=0; i < width2; i++) {//set i=0 here
              if (i != 0) {
                  if (i % width2 == 0) {
                      printf(" |\n| ");
                  }
              }
              printf("%d ", row2[i]);   
          }
      }
      

      【讨论】:

      • 谢谢,xD 确实成功了,但在第二行(右一),它只在所有 3 行中打印相同的前 3 个数字。我想那是我的代码中的更多错误(我在上面的答案中得到了更正,哈哈)。谢谢你让我进步:)
      猜你喜欢
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 2015-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多