2015-04-17 106 views
2

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

回答

3

gcc警告了“声明没有效果“,说

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

- 而且,这样做是对的!只更改第一组ii=0即可显示第二组数字。 (你太亲近了!)

但它只重复显示前3个,因为在那里的i循环仅循环一次,超过width2。它可以哄正确的价值观在那里与数学等

printf("%d ", row2[width2*(ii/width) + i]); 

这工作,因为ii在每个下一行的width步骤增加,并且希望行数倍右手设置宽度。

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

+0

它工作完美!非常感谢:D我看到很多关于将循环分解为函数的建议,所以肯定会尝试这样做:) –

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

感谢,但它给我上subcripted那些printf的命令”错误值既不是数组也不是指针也不是矢量“。我已经声明了MAX宏,并在C99模式下运行它。仍然给出这个错误。如果你能帮我解决这个问题(因为我还没有在C中体验过)?由于会喜欢尝试新的代码。 –

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

1

在你没有重新初始化i这样的条件i<width2被失败的第二个循环,所以初始化在i=0 for循环 更改为:

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]); 
    } 
} 
+0

谢谢,相当不错的技巧xD,但在第二行(右侧)它只是在所有3行。我想这是我的代码中的一些更多的错误(我在上面的回答中得到了更正大声笑)。谢谢你让我进步:) –