二维数组和打印行列平均值

3

我还是一个C编程的初学者,需要在我的C编程课上写代码,希望你能给我一些帮助。

任务是:输入数据来自名为textfile94的文件中包含浮点数据类型的二维数组。输入的数组将包含3行数据,每行都包含5列数据。

  • 我希望您使用两个下标的动态内存分配方法。
  • 使用malloc创建一个保存指针的数组。
  • 该数组的每个元素指向另一个数组,即数据行。
  • 使用循环中的malloc创建您的行。
  • 然后,您可以使用两个下标操作符[r][c]来获取您的数据,进行求和和平均。
  • 该程序要求硬编码2D数组的高度和宽度,这些事先已知(实际上是3x5)。
  • 在您的代码中不要写入文字数字,而是创建一个全局常量变量来保存这些维度,并在您的代码中使用它们。

下面是我的代码:

#include <stdio.h>
#include <stdlib.h>

#define int rows = 3;
#define int columns = 5;

float array[rows][columns];

int main(int argc, char* argv[]){
    FILE* fin;
    float x;
    int i,j;
    int* array;

    fin = fopen("textfile94", "r");
    fscanf(fin,"%f", &x);
    array =(int*) malloc(rows* sizeof(int*));

    for(i=0;i<rows;i++){
            for(j=0;j<columns;j++)
              array[i]=(int*)malloc(columns* sizeof(int));
    }
    printf("The Average values for the three rows are:[%f]",array[i]);
    printf("The Average values for the five columns are:[%f]", array[j]);
    return 0;
}

在文本文件中: 4.33 5.33 1.11 99.00 100.00 1.0 33.3 12.5 1.1 -1000.00 22.1 11.9 2.4 8.3 8.9
程序应该输出: 三行的平均值为:41.95 -190.42 10.32 五列的平均值为:9.14 16.84 5.33 36.13 -297.7
遇到问题无法正确完成,任何帮助将不胜感激。我不想要答案,我想从中学习,只需要一些提示。谢谢。
更新后的代码:
#include <stdio.h>
#include <stdlib.h>

#define ROWS 3
#define COLUMNS 5

float array[ROWS][COLUMNS];

int main(int argc, char* argv[]){

FILE* fin;
int i;
float x;
float** array;

fin = fopen("textfile94", "r");
array=(float**) malloc(ROWS*sizeof(float*));
    for(i=0;i<ROWS;i++)
      array[ROWS]=(float*)malloc(COLUMNS*sizeof(float));
    for(j=0;j<COLUMNS;j++){
      fscanf(fin,"%f",&x);
      x = array[ROWS][COLUMNS];
}
printf("The Average values for the three rows are:%f", array[ROWS]);
printf("The Average values for the five columns are:%f", array[COLUMNS]);
return 0;
}
2个回答

3

好的,我会尽力添加内容。

定义不应该这样写,按照惯例应该都是大写字母。

#define ROWS 3
#define COLUMNS 5

他希望您通过malloc来动态分配数组,而您现在是静态地分配了一个二维浮点数数组,然后试图将整型数组强制转换到其中。您应该查找如何使用malloc实现多维数组的方法。
基本上,您想要的是:
float **array;

现在的数组是一个指向浮点数指针的指针,然后将数组行数的指针分配给浮点数。
ROWS * sizeof(float*)

在此之后,您可以为每一行分配一个数组[row]。
COLUMNS * sizeof(float)

现在你有了一个array[ROWS][COLUMNS]的结构

在Python风格的伪代码中,读取数据的一种方法是:

for(row 1..3)
    array[row] = malloc(...)
    for(col 1..5)
        fscanf(value)
        array[row][col] = value

告诉我是否太模糊了,尝试给出提示而不是直接给出代码。

好的,我觉得我有点明白了,我要试一下。我感觉我在这段代码中打转,但不仅仅是想要答案,这会对我以后有所帮助。 - Cka91405
我对最后一部分感到困惑:先用 malloc 分配一个大小为 rows 的 float* 块并将其赋给 array,然后再用 malloc 分配 cols 个 float 并将其分配到数组中。 - Cka91405
是的,我会看看能否澄清。但好消息是,我刚刚测试了一下,一旦我们解决了指针问题,你就不会差太远了。 - r_ahlskog
好的,我已经检查过了,在GCC下即使在ANSI模式下,我也可以选择是否进行强制转换。如果您选择进行强制转换,则顺序为(float**)和(float*)。 - r_ahlskog
"array[ROWS]=(float*)malloc(COLUMNS*sizeof(float));" - r_ahlskog
显示剩余4条评论

0

以下内容将帮助您开始分配数组、赋值和访问值,然后释放内存。为了清晰起见,省略了错误检查。最有可能的是,您会想要验证calloc实际上返回了一个有效的指针。

要完成程序,您需要将值读入数组,然后计算平均值。

#include <stdlib.h>
#include <stdio.h>

const size_t rows = 3;
const size_t columns = 5;

int main(void)
{
    size_t i, j;
    /* allocate a two-dimensional array of zeroes */
    double **array = calloc(1, rows * sizeof(double *));
    for (i = 0; i < rows; ++i) {
        array[i] = calloc(1, columns * sizeof(double));
    }
    /* print it out - replace this by reading in values */
    for (i = 0; i < rows; ++i) {
        for (j = 0; j < columns; ++j) {
            fprintf(stdout, "%.2f", array[i][j]);
            fputc(' ', stdout);
        }
        fprintf(stdout, "\n");
    }
    /* TODO loop through the array again and average the data */
    /* free memory */
    for (i = 0; i < rows; ++i) {
        free(array[i]);
    }
    free(array);
    return EXIT_SUCCESS;
}

不应该使用calloc,而应该使用malloc,并且它应该是一个浮点数而不是双精度。 - Cka91405
callocmalloc在功能上是等价的,calloc只是为您清零分配的内存,这通常是良好的编程实践。将double更改为float非常简单。 - Mike Steinert
好的,我还有点困惑,但是我已经完成了。我会更新新代码。 - Cka91405

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接