2016-12-24 2 views
-1

Мне нужно сделать код, который вычисляет среднее значение внутри массива.Вычисление среднего внутри 2D-массива в C

Пользователь вводит размер и 2D-массив. для каждого номера в этом двумерном массиве программа должна вычислять среднее число чисел выше и слева от них. после этого должен быть напечатан новый массив, в котором средние значения будут сохранены вместо числа, для которого рассчитывалось среднее значение.

для ПРИМЕР- для размерно 3 и array-

1 2 3 
4 5 6 
7 8 9 

результат будет:

1 1.5 2 
2.5 3 3.667 
4 4.5 5 

это то, что я пытался до сих пор

int main() 
{ 
    int size, i = 0,j = 0,r=0,c=0; 
    double array[N][N] = {{0},{0}},sum[N][N]= {{0},{0}}; 
    scanf("%d",&size); 
     for (i=0; i<size ;i++) 
     { 
      for (j=0; j<size ;j++) 
      {scanf("%lf",&array[i][j]); 
       }} 
    for (i=0;i<size;i++) 
    { for(j=0;j<size;j++) 
     { 
       for(r = 0;r<i;r++) 
        {for (c = 0;c<j;c++) 
          sum[r][c] += array[i][j]; 

          } 

     } 

     sum[r][c] =(sum[r][c])/((i+1)+(j+1)); 
} 
    for (r=0; r<size; r++){ 
     for (c=0; c<size; c++) 
      printf("%.2f ",sum[r][c]); 
      printf("\n"); 
    } 
    return 0; 
} 
+3

Добро пожаловать на переполнение стека! Похоже, вам, возможно, потребуется научиться использовать отладчик для выполнения вашего кода. С хорошим отладчиком вы можете выполнить свою программу по очереди и посмотреть, где она отклоняется от ожидаемого. Это важный инструмент, если вы собираетесь заниматься программированием. Дальнейшее чтение: [Как отлаживать небольшие программы] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

Кроме того, '3.667' может быть неправильным в этом примере. Это происходит потому, что '(1 + 2 + 3 + 4 + 5 + 6)/6'' '3.5'. Если я не ошибся. – RoadRunner

ответ

0

Я бы используйте текущую сумму, а затем подсчитайте количество используемых элементов. Тогда легко вычислить среднее значение.

попробовать что-то вроде этого:

double current_sum = 0; 
    int current_count = 0; 
    for (i=0;i<size;i++) 
    { for(j=0;j<size;j++) 
     { 
      ++current_count; 
      current_sum += array[i][j]; 
      sum[i][j] = current_sum/current_count; 
     } 
    } 
+1

Я не думаю, что вычисляет то, что нужно OP? Его средние значения для всех элементов выше/слева от текущего элемента (включая текущую строку/столбец), похоже. –

+1

Согласен с Полом R, он не работает в общем случае. Например, попробуйте положить -5 вместо 5. – ibancg

+0

@ibancg, Что значит * -5 вместо 5 *? Вы имеете в виду, что OP мог бы ввести '1 2 3 4 -5 6 7 8 9' вместо' 1 2 3 4 5 6 7 8 9'? – RoadRunner

1

Вы можете просто накапливают по вертикали, по горизонтали, и разделить на количество элементов:

memcpy(sum, array, sizeof(sum)); // copy array into sum 

for (i=1;i<size;i++) { // vertical accumulation 
    for(j=0;j<size;j++) { 
     sum[i][j] += sum[i - 1][j]; 
    } 
} 

for(j=1;j<size;j++) { // horizontal accumulation 
    for (i=0;i<size;i++) 
     sum[i][j] += sum[i][j - 1]; 
    } 

for (i=0;i<size;i++) { // divide by the number of elements 
    for(j=0;j<size;j++) { 
     sum[i][j] /= ((i+1)*(j+1)); 
    } 
} 

Это можно уменьшить количество петель, но нам нужно выбрать правильный порядок, в котором мы проходим по элементам.

Эквивалентный код в MATLAB является:

cumsum(cumsum(array), 2) ./ cumsum(cumsum(ones(size(array, 1))), 2) 
Смежные вопросы