一次并排打印两个具有特定字符数的数组

Printing two arrays side by side with specific number of characters at a time

刚开始学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        +        |

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

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");

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

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

类似于下面的代码:

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].

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

#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

gcc

行上警告 "statement with no effect"
for (i; i < width2; i++)

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

但它只重复显示前 3 个,因为那里的 i 循环只在 width2 上循环一次。可以用

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

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

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

在第二个循环中你没有重新初始化 i 所以条件 i<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]);   
    }
}