2016-12-24 2 views
-1

Ich brauche einen Code, der den Durchschnitt in einem Array berechnen.Berechnung eines Durchschnitts in einem 2D-Array in C

Der Benutzer gibt die Größe und ein 2D-Array ein. Für jede Zahl in diesem 2D-Array sollte das Programm den Durchschnitt der Zahlen oben und links berechnen. Anschließend muss ein neues Array gedruckt werden, in dem die Durchschnittswerte gespeichert werden und nicht die Zahl, für die der Durchschnitt berechnet wurde.

für Beispiel- für größen- 3 und die Array-

1 2 3 
4 5 6 
7 8 9 

wird das Ergebnis sein:

1 1.5 2 
2.5 3 3.667 
4 4.5 5 

das, was ich bisher

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

Willkommen bei Stack-Überlauf! Es klingt, als müssten Sie lernen, wie Sie einen Debugger verwenden, um durch Ihren Code zu gehen. Mit einem guten Debugger können Sie Ihr Programm Zeile für Zeile ausführen und sehen, wo es von dem, was Sie erwarten, abweicht. Dies ist ein essentielles Werkzeug, wenn Sie programmieren wollen. Weiterführende Literatur: [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+2

Auch '3.667' könnte im Beispiel falsch sein. Dies liegt daran, dass "(1 + 2 + 3 + 4 + 5 + 6)/6" 3,5 ist. Es sei denn, ich habe einen Fehler gemacht. – RoadRunner

Antwort

0

versucht ist, würde ich Verwenden Sie eine laufende Summe und zählen Sie dann die Anzahl der verwendeten Elemente. Dann ist es einfach, den Durchschnitt zu berechnen.

versuchen, etwas wie folgt aus:

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

Ich glaube nicht, dass berechnet, was das OP braucht? Seine Mittelwerte gelten für alle Elemente oberhalb/links des aktuellen Elements (einschließlich der aktuellen Zeile/Spalte). –

+1

Mit Paul R vereinbart, funktioniert es nicht in einem allgemeinen Fall. Versuchen Sie zum Beispiel, -5 anstelle von 5 zu setzen. – ibancg

+0

@ibancg, Was meinst du * -5 statt 5 *? Meinst du, dass das OP "1 2 3 4 -5 6 7 8 9" anstelle von "1 2 3 4 5 6 7 8 9" eingeben könnte? – RoadRunner

1

Sie können einfach akkumulieren vertikal, horizontal und dividieren durch die Anzahl der Elemente:

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)); 
    } 
} 

Es ist möglich, die Anzahl der Schleifen zu reduzieren, aber Wir müssen die richtige Reihenfolge wählen, in der wir über die Elemente gehen.

Der entsprechende Code in MATLAB ist:

cumsum(cumsum(array), 2) ./ cumsum(cumsum(ones(size(array, 1))), 2) 
Verwandte Themen