一次打印两个数组并使用特定数量的字符

时间:2015-04-17 08:44:54

标签: c arrays nested-loops

我刚刚开始学习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很新)。

4 个答案:

答案 0 :(得分:4)

保持简单,为行提供一个外部循环,为列提供两个内部循环。如果矩阵的大小不同并不重要,只需在每个内循环之前添加一个简单的检查。

类似于以下代码:

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]

答案 1 :(得分: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

答案 2 :(得分:3)

gcc警告说

这一行的“无效声明”
for (i; i < width2; i++)

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

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

之类的数学在那里哄骗正确的值
printf("%d ", row2[width2*(ii/width) + i]);

可行,因为ii每行下一行的width步长增加,并且您希望行数乘以右手集宽度。

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

答案 3 :(得分:1)

在第二个循环中,您没有初始化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]);   
    }
}