C - 在结构数组中打印二维数组的元素
C - Printing elements of a 2d array inside a struct array
我正在尝试创建一个函数来设置二维数组的值,然后创建另一个函数来打印这些值。
出于某种原因,在我当前的实现中,如果我创建一个 3x3 矩阵并将每个值设置为数字 5,它会打印这些值,但它会打印从 5 开始计数的值,因此它会打印 567、678 , 789,而我希望它打印我设置的确切值。
这是函数定义 - 我做错了什么?:
结构定义:
struct matrix{
char matrixName[50];
int rows;
int columns;
float* data;
};
typedef struct matrix matrix_t;
矩阵创建:
int create_matrix(matrix_t* matrixP, int matrixLocation){
char tempName[50];
int rows, cols;
printf("Enter a name for your matrix>\n");
scanf("%s", tempName);
printf("Enter the number of rows>\n");
scanf("%d", &rows);
printf("Enter the number of cols>\n");
scanf("%d", &cols);
float * our_matrix = (float *) malloc(rows * cols * sizeof(float));
strcpy(matrixP[matrixLocation].matrixName, tempName);
matrixP[matrixLocation].rows = rows;
matrixP[matrixLocation].columns = cols;
matrixP[matrixLocation].data = our_matrix;
return 0;
}
设置值:
int setValues(matrix_t* our_matrix, int matrix_index) {
int counter = 0;
int row = 0, col = 0;
for (col = 1; col <= our_matrix[matrix_index].columns; col++) {
for (row = 1; row <= our_matrix[matrix_index].rows; row++) {
counter++;
printf("Enter the value for column number %d of row number %d>\n", col, row);
scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));
}
/* separate rows by newlines */
}
return 0;
}
打印:
int printMatrix(matrix_t* our_matrix, int index) {
int row = 0, col = 0;
for (col = 1; col <= our_matrix[index].columns; col++) {
for (row = 1; row <= our_matrix[index].rows; row++) {
printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));
}
printf("\n");
}
return 0;
}
如果我在没有先使用 setValues 的情况下调用 printMatrix()
函数,它似乎会像这样打印它正在打印的单元格的相对位置:
但是当我调用 setValues()
并将所有值设置为数字 5 时,它的打印从数字 5 开始计数,如下所示:
您的排名计算有误。有一个问题和一个 'aconventional notation' 问题。
问题是数组下标的计算:
scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));
printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));
您需要将 (row - 1)
值乘以 our_matrix[matrix_index].cols
。你可能会用一些更短的值名称做得更好:
int max_col = our_matrix[matrix_index].columns;
int max_row = our_matrix[matrix_index].rows;
float *data = our_matrix[matrix_index].data;
for (col = 1; col <= max_col; col++)
{
for (row = 1; row <= max_row; row++)
{
printf("Enter the value for column number %d of row number %d>\n", col, row);
if (scanf("%f", data + (col-1) + (row-1) * max_col) != 1)
{
…report error and do not continue…
}
}
}
for (col = 1; col <= max_col; col++)
{
for (row = 1; row <= max_row; row++)
printf(" %.2f", data[(col-1) + (row-1) * max_col]);
putchar('\n');
}
那是处理实质性的bug。请注意 scanf()
上的错误检查。这在 'real world' 程序中很重要(即使您在 类 或在线竞赛中没有它而逃脱)。您也可以在对 scanf()
的调用中明智地使用符号 &data[(col-1) + (row-1) * max_cols]
代替 data + (col-1) + (row-1) * max_cols
— 这将提高代码的一致性。
'aconventional notation' 问题是在 C 中,数组索引从 0 而不是 1 开始,您可以通过遵循 C 约定来避免大量的 -1
术语。此代码段还在需要时声明循环变量,从而最小化它们的范围。这是自 C99 以来 C 的一个特性——它可能在某些逆行(但流行和广泛)平台上不可用。
for (int col = 0; col < max_col; col++)
{
for (int row = 0; row < max_row; row++)
printf(" %.2f", data[col + row * max_col]);
putchar('\n');
}
我正在尝试创建一个函数来设置二维数组的值,然后创建另一个函数来打印这些值。
出于某种原因,在我当前的实现中,如果我创建一个 3x3 矩阵并将每个值设置为数字 5,它会打印这些值,但它会打印从 5 开始计数的值,因此它会打印 567、678 , 789,而我希望它打印我设置的确切值。
这是函数定义 - 我做错了什么?:
结构定义:
struct matrix{
char matrixName[50];
int rows;
int columns;
float* data;
};
typedef struct matrix matrix_t;
矩阵创建:
int create_matrix(matrix_t* matrixP, int matrixLocation){
char tempName[50];
int rows, cols;
printf("Enter a name for your matrix>\n");
scanf("%s", tempName);
printf("Enter the number of rows>\n");
scanf("%d", &rows);
printf("Enter the number of cols>\n");
scanf("%d", &cols);
float * our_matrix = (float *) malloc(rows * cols * sizeof(float));
strcpy(matrixP[matrixLocation].matrixName, tempName);
matrixP[matrixLocation].rows = rows;
matrixP[matrixLocation].columns = cols;
matrixP[matrixLocation].data = our_matrix;
return 0;
}
设置值:
int setValues(matrix_t* our_matrix, int matrix_index) {
int counter = 0;
int row = 0, col = 0;
for (col = 1; col <= our_matrix[matrix_index].columns; col++) {
for (row = 1; row <= our_matrix[matrix_index].rows; row++) {
counter++;
printf("Enter the value for column number %d of row number %d>\n", col, row);
scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));
}
/* separate rows by newlines */
}
return 0;
}
打印:
int printMatrix(matrix_t* our_matrix, int index) {
int row = 0, col = 0;
for (col = 1; col <= our_matrix[index].columns; col++) {
for (row = 1; row <= our_matrix[index].rows; row++) {
printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));
}
printf("\n");
}
return 0;
}
如果我在没有先使用 setValues 的情况下调用 printMatrix()
函数,它似乎会像这样打印它正在打印的单元格的相对位置:
但是当我调用 setValues()
并将所有值设置为数字 5 时,它的打印从数字 5 开始计数,如下所示:
您的排名计算有误。有一个问题和一个 'aconventional notation' 问题。
问题是数组下标的计算:
scanf("%f", our_matrix[matrix_index].data+(col-1)+(row-1));
printf(" %2.f ", *our_matrix[index].data+(col-1)+(row-1));
您需要将 (row - 1)
值乘以 our_matrix[matrix_index].cols
。你可能会用一些更短的值名称做得更好:
int max_col = our_matrix[matrix_index].columns;
int max_row = our_matrix[matrix_index].rows;
float *data = our_matrix[matrix_index].data;
for (col = 1; col <= max_col; col++)
{
for (row = 1; row <= max_row; row++)
{
printf("Enter the value for column number %d of row number %d>\n", col, row);
if (scanf("%f", data + (col-1) + (row-1) * max_col) != 1)
{
…report error and do not continue…
}
}
}
for (col = 1; col <= max_col; col++)
{
for (row = 1; row <= max_row; row++)
printf(" %.2f", data[(col-1) + (row-1) * max_col]);
putchar('\n');
}
那是处理实质性的bug。请注意 scanf()
上的错误检查。这在 'real world' 程序中很重要(即使您在 类 或在线竞赛中没有它而逃脱)。您也可以在对 scanf()
的调用中明智地使用符号 &data[(col-1) + (row-1) * max_cols]
代替 data + (col-1) + (row-1) * max_cols
— 这将提高代码的一致性。
'aconventional notation' 问题是在 C 中,数组索引从 0 而不是 1 开始,您可以通过遵循 C 约定来避免大量的 -1
术语。此代码段还在需要时声明循环变量,从而最小化它们的范围。这是自 C99 以来 C 的一个特性——它可能在某些逆行(但流行和广泛)平台上不可用。
for (int col = 0; col < max_col; col++)
{
for (int row = 0; row < max_row; row++)
printf(" %.2f", data[col + row * max_col]);
putchar('\n');
}