C 一次以特定字符数并排打印两个数组

C 一次以特定字符数并排打印两个数组,c,arrays,nested-loops,C,Arrays,Nested Loops,我刚刚开始学习C语言。今天我问了一个问题,我必须输入两个矩阵(行数和列数由用户指定)并添加它们。我做加法和其他部分很容易。但我正在考虑让它看起来更好。 所以我的想法是: 假设用户输入一个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

我刚刚开始学习C语言。今天我问了一个问题,我必须输入两个矩阵(行数和列数由用户指定)并添加它们。我做加法和其他部分很容易。但我正在考虑让它看起来更好。 所以我的想法是: 假设用户输入一个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//在某处定义的全局int循环变量
宽度2=宽度//另一个宽度变量,以防我在第二个数组中需要它,宽度是数组行中元素数量的变量。在上面的示例中,宽度=3
对于(ii=0;ii

我已经试了两天了,这真的让我头疼。我不介意是否有更好的更小的代码,并且需要替换整个代码(因为我对C非常陌生)。

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

类似于以下伪代码:

size\u t max\u line\u count=max(矩阵1\u line\u count,矩阵2\u line\u count);
用于(尺寸线=0;线<最大线数;++线)
{
柱体尺寸;
printf(“|”);
//第一矩阵
for(列=0;列
内部循环可以分解成单独的函数,以避免代码重复


如果矩阵不是数组的数组,而是一个大的单个数组,则使用例如
matrix1[line*matrix1\u column\u 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;
}
工作示例:

gcc
警告在以下行中出现“无效声明”

for (i; i < width2; i++)
这是因为下一行的
ii
width
的步长递增,并且您希望行计数乘以右侧设置的宽度


将整个例程分成三个循环可能更容易:外部循环只需在高度上运行,内部循环先打印一行set1编号,然后打印一行set2编号。不过,我将把它作为一个练习。

在第二个循环中,您没有重新初始化
I
,因此条件
I运行起来,相当于技巧xD,但在第二行(右一行),它只是在所有3行中打印相同的前3个数字。我猜我的代码中还有一些错误(我在上面的答案lol中得到了更正)。谢谢你让我进步:)谢谢,但它给我的那些printf命令错误“subcripted值既不是数组,也不是指针,也不是向量”。我已经声明了MAX宏,并在C99模式下运行它。仍然给出了这个错误。如果你能帮我做这件事(因为我在C方面还没有那么丰富的经验)?因为我想尝试一个新的代码。它工作完美!非常感谢:D我看到很多关于将循环拆分为函数的建议,所以我也一定会尝试:)
#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       |
for (i; i < width2; i++)
printf("%d ", row2[width2*(ii/width) + i]);
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]);   
    }
}