2016-07-02 2 views
-3

Правильно ли я использовал float overallavg(float* matrix, int rows, int cols)? Я думаю, что нет. Я пытаюсь вернуть среднее значение элементов массива, на которые указывает матрица. Должен ли я вызвать две другие функции в общую, а затем делить на общее число элементов в массиве?Функция, чтобы найти среднее значение для массива

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

float *readMatrix(int rows, int cols); 
float *rowavg(float *matrix, int rows, int cols); 
float *colavg(float *matrix, int rows, int cols); 
float overallavg(float* matrix, int rows, int cols); 
void printavg(float *matrix, float *rowAve, float *colAve, float overallAve, int rows, int cols); 

#define MAX_DIM 10 

int main(void) 
{ 
    int done = 0; 
    int rows, cols; 
    float *dataMatrix; 
    float *rowAveVector; 
    float *colAveVector; 
    float overallAve; 

    while (!done) 
    { 
    // Prompt user to enter row and column dimensions of matrix (must be > 0) 
    do 
    { 
     printf("Enter row dimension (must be between 1 and %d): ", MAX_DIM); 
     scanf("%d", &rows); 

    } while(rows <= 0 || rows > MAX_DIM); 
    do 
    { 
     printf("Enter column dimension (must be between 1 and %d): ", MAX_DIM); 
     scanf("%d", &cols); 
    } while(cols <= 0 || cols > MAX_DIM); 

    dataMatrix = readMatrix(rows, cols); 
    if (dataMatrix == NULL) 
    { 
     printf ("Program terminated due to dynamic memory allocation failure\n"); 
     return (0); 
    } 


    rowAveVector = rowAverage(dataMatrix, rows, cols); 
    colAveVector = colAverage(dataMatrix, rows, cols); 
    if(rowAveVector == NULL || colAveVector == NULL) 
    { 
    printf("malloc failed. Terminating program\n"); 
    return (0); 
    } 
    overallAve = overallAverage(dataMatrix, rows, cols); 

    //Print Averages 
    printAverages(dataMatrix, rowAveVector, colAveVector, overallAve, rows, cols); 

    free(dataMatrix); 
    free(rowAveVector); 
    free(colAveVector); 

    //Check if user wants to enter a new matrix 
    printf("Enter 0 to continue with a new matrix\n"); 
    printf("Enter any other number to terminate the program: "); 
    scanf("%d", &done); 
    } 
    //That's it, we are done 
    return (0); 
} 

float *readMatrix(int rows, int cols) 
{ 

    int i=0; 
    int j=0; 
    int elements=0; 
    float *m=malloc(rows*cols*sizeof(float)); 
    if (m==NULL) 
    { 
     printf("error\n"); 
     return NULL; 
    } 
    printf("Enter values for the matrix: "); 
    for (i=0;i<rows;i++) 
    { 
     for (j=0;j<cols;j++) 
     { 
      elements = i*cols+j; 
      scanf("%f", &m[elements]); 
     } 
    } 
    return m; 
} 

float *readMatrix(int rows, int cols) 
{ 
    int i=0; 
    int j=0; 
    int elements=0; 
    float *m=malloc(rows*cols*sizeof(float)); 
    if (m==NULL) 
    { 
     printf("error\n"); 
     return NULL; 
    } 
    printf("Enter values for the matrix: "); 
    for (i=0;i<rows;i++) 
    { 
     for (j=0;j<cols;j++) 
     { 
      elements = i*cols+j; 
      scanf("%f", &m[elements]); 
     } 
    } 
    return m; 
} 


float *rowavg(float *matrix, int rows, int cols) 
{ 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 
    int i=0; 
    int j=0; 
    float mean=0; 
    float *Average_array=malloc(rows*sizeof(float)); 
    if (Average_array==NULL) 
    { 
     return NULL; 
    } 
    for (i=0;i<rows;i++) 
    { 
     for (j=0;j<cols;j++) 
     { 
      mean+=matrix[i*cols+j]; 
     } 
     Average_array[i]=(float)(mean/cols); 
    } 
    return Average_array; 
} 


float *colavg(float *matrix, int rows, int cols) 
{ 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 
    int i=0; 
    int j=0; 
    float mean=0; 
    float *Average_array=malloc(cols*sizeof(float)); 
    if (Average_array==NULL) 
    { 
     return NULL; 
    } 
    for (i=0;i<cols;i++) 
    { 
     for (j=0;j<rows;j++) 
     { 
      mean+=matrix[j*cols+i]; 
     } 
     Average_array[i]=(float)(mean/rows); 
    } 
    return Average_array; 
} 

float overallavg(float* matrix, int rows, int cols) 
{ 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 
    int i=0; 
    int j=0; 
    float mean_1=0; 
    float mean_2=0; 
    float avg=0; 
    float elements=0; 
    float sum=0; 
    elements=rows*cols; 
    for (i=0;i<rows;i++) 
    { 
     for (j=0;j<cols;j++) 
     { 
      mean_1+=matrix[i*rows+j]; 
     } 
    } 
    for (i=0;i<cols;i++) 
    { 
     for (j=0;j<rows;j++) 
     { 
      mean_2+=matrix[j*cols+i]; 
     } 
    } 
    sum=mean_1+mean_2; 
    avg=sum/elements-1; 
} 
+0

при инициализации 'float' переменной к нулю, правильное утверждение:' дробным = 0.0f; '' Не поплавок значение = 0; ' – user3629249

+0

в Функция 'malloc()' ожидает, что ее параметр будет длинным unsigned int' (И.Е. 'size_t'), однако' rows' и 'cols' являются' int', (и мы можем ожидать, что эти значения никогда не будут отрицательными). Предложите при передаче 'cols' и' rows' использовать тип 'size_t', а не тип 'int' – user3629249

+0

относительно таких строк:' Average_array [i] = (float) (mean/cols); 'заставит компилятор поднять предупреждающее сообщение. Предложите 'Average_array [i] = (mean/(float) cols);' – user3629249

ответ

0

Вы хотите вернуть среднее всей матрицы?

В этом случае просто просуммировать все элементы с помощью .. одноконтурный, а затем разделить на rows * cols Супер простой

double sum = 0.0; 
for(i = 0; i < rows * cols; i++) 
    sum += matrix[i]; 

return sum/(rows * cols); 
+0

этот ответ касается только одного аспекта проблем с кодом, поэтому он очень неполный – user3629249

0

следующий код:

  1. чисто компилирует
  2. содержит необходимые #include ЗАЯВЛЕНИЯ

Примечание: эту строку:

avg=sum/elements-1; 

не Calculat е среднее значение всех элементов, а несколько большее значение, поскольку общее число элементов уменьшается на 1

Предложение в функции: overallavg() не вычисляет отдельные «средние» значения, а просто проходит через весь массив суммирует каждый элемент, затем делят на общее число элементов

Предложение, используйте ширину отступа в 4 пространства, как это легко видно, даже с помощью шрифта переменной ширины. 2 пробела с шрифтом переменной ширины выглядят так, как будто в отступом строка имеет отступы около 1/2 ширины символа. И.Е. едва заметный и очень грязный вид. (Код считывается много много раз, так должны быть написаны очень легко читать.

#include <stdio.h> // printf() scanf() 
#include <stdlib.h> // malloc, free() 

float *readMatrix(size_t rows, size_t cols) 
{ 
    //int i=0; 
    //int j=0; 
    size_t elements=0; 

    float *m=malloc(rows*cols*sizeof(float)); 

    if (m==NULL) 
    { 
     printf("error\n"); 
     return NULL; 
    } 

    printf("Enter values for the matrix: "); 

    for (size_t i=0; i<rows; i++) 
    { 
     for (size_t j=0; j<cols; j++) 
     { 
      elements = i*cols+j; 
      scanf("%f", &m[elements]); 
     } 
    } 

    return m; 
} 


float *rowavg(float *matrix, size_t rows, size_t cols) 
{ 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 

    //int i=0; 
    //int j=0; 
    float mean=0; 

    float *Average_array=malloc(rows*sizeof(float)); 

    if (Average_array==NULL) 
    { 
     return NULL; 
    } 

    for (size_t i=0; i<rows; i++) 
    { 
     for (size_t j=0; j<cols; j++) 
     { 
      mean+=matrix[i*cols+j]; 
     } 
     Average_array[i] = (mean/(float)cols); 
    } 

    return Average_array; 
} 


float *colavg(float *matrix, size_t rows, size_t cols) 
{ 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 

    //int i=0; 
    //int j=0; 
    float mean=0; 

    float *Average_array = malloc(cols*sizeof(float)); 

    if (Average_array==NULL) 
    { 
     return NULL; 
    } 

    for (size_t i=0; i<cols; i++) 
    { 
     for (size_t j=0; j<rows; j++) 
     { 
      mean+=matrix[j*cols+i]; 
     } 
     Average_array[i] = (mean/(float)rows); 
    } 
    return Average_array; 
} 



float overallavg(float* matrix, size_t rows, size_t cols) 
{ 
    #if 0 
    if (matrix==NULL) 
    { 
     return NULL; 
    } 
    #endif 

    //int i=0; 
    //int j=0; 
    float mean_1=0; 
    float mean_2=0; 
    float avg=0; 
    float elements=0; 
    float sum=0; 

    elements= (float)rows* (float)cols; 

    for (size_t i=0;i<rows;i++) 
    { 
     for (size_t j=0;j<cols;j++) 
     { 
      mean_1+=matrix[i*rows+j]; 
     } 
    } 

    for (size_t i=0; i<cols; i++) 
    { 
     for (size_t j=0; j<rows ;j++) 
     { 
      mean_2+=matrix[j*cols+i]; 
     } 
    } 

    sum=mean_1+mean_2; 
    avg=sum/elements-1; 

    return avg; 
} 
+0

Примечание: в функции:' totalavg() 'каждый элемент подсчитывается дважды, один раз из строки 'mean' и снова для значения 'column'. Таким образом, конечный результат будет неправильным. – user3629249

+0

Надеюсь, вы видели редактирование i, сделанное с кодом – nm10563

+0

@ nm10563, я написал свой ответ, прежде чем вы применили редактирование вопроса. BTW: при редактировании вопроса после комментариев, ответов и т. Д., Добавлен дополнительный текст/код. Не изменяйте исходное содержание вопроса, потому что тогда комментарии/ответы (часто, как в этом случае) не имеют смысла. – user3629249