我刚刚开始学习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很新)。
答案 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]);
}
}