Macierz obliczanie średniej w C

Odpowiedz Nowy wątek
2016-02-01 16:17

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Witam mam pewien problem dotyczący macierzy. Alokuję tablicę dwuwymiarową, wczytuję z klawiatury dane, wyświetlam powstałą macierz.


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

float **utworz_macierz(int w, int k)
{
   float **m;
   int i;
   m = (float **) malloc(w * sizeof(float*));
   if(m == NULL) return NULL;
   for(i=0 ; i<w ; i++)
   {
      m[i] = (float *) malloc(k *sizeof(float));
      if(m[i]==NULL)
      {
         /*  sprzatanie juz przydzielonej pamieci */
         zwolnij_macierz(m,i);
         return NULL;
      }
   }
   return m;
}

void wyswietl_macierz(float **m,int w,int k)
{
   int i,j;
   for(i=0 ; i<w ; i++)
   {
      for(j=0 ; j<k ; j++)
         printf(" %6.1f", *(*(m+i)+j) );
      printf("\n");
   }
}

float** wczytaj_macierz(float **m,int w,int k)
{
   int i,j;
   for(i=0 ; i<w ; i++)
   {
      for(j=0 ; j<k ; j++)
      {
         printf(" [%d,%d] = ", i,j);
         scanf("%f",*(m+i)+j);
      }
   }
   return m;
}

void zwolnij_macierz(float **m, int w)
{
    while(--w > 0) free(*(m+w));
   free(m);
}

int main(int argc, char** argv)
{
   float **m;
   int w,k;
   printf("Podaj wymiary macierzy:");
   scanf("%d %d",&w,&k);
   m = utworz_macierz(w,k);
   wyswietl_macierz(wczytaj_macierz(m,w,k),w,k);
   zwolnij_macierz(m,w);

}

Chciałabym wykonać na niej jakieś proste operacje np. obliczyć średnią arytmetyczną elementów i tutaj pojawia się problem. Nie wiem gdzie dokładnie popełniam błąd. Ktoś może coś doradzić i wytłumaczyć błędy?

 void LiczSrednia( float **m,int w, int k, float srednia, int suma)
{
    int i, j;
    suma=0;
    for (i=0; i<w; i++)
        for (j=0; j<k; j++)
            suma = suma + m[i][j];
    srednia = (float ) suma/(w*k);
    printf("Suma elementow: %d\n",suma);
    printf("Srednia arytmetyczna: %f\n\n",srednia);
}

Pozostało 580 znaków

2016-02-01 16:39

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

1

pojawia się problem
jaki?

Jakie są dane wejściowe, jakie wyjściowe?

Pozostało 580 znaków

2016-02-01 16:47

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Wprowadzam losowe liczby, średnia i suma nie są liczone prawidłowo, zazwyczaj suma jest dodaniem ostatnich dwóch liczb jakie zostaną wprowadzone, nie wiem skąd to się bierze.

Pozostało 580 znaków

2016-02-01 16:56

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

1

Jak dla mnie to działa dobrze: http://ideone.com/0H7Foi

Inna sprawa, że przekazanie srednia i suma do funkcji jest totalnie bez sensu. Jak również to, że funkcja Licz... wyświetla wynik zamiast zwracać.

Pozostało 580 znaków

2016-02-01 17:04

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Możesz rozwinąć myśl i podpowiedzieć jak powinno być poprawnie?

Pozostało 580 znaków

2016-02-01 17:11

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

0
float average(float** matrix, int rows, int cols)
{
    int i, j, sum = 0;
    for (i = 0; i < rows; ++i)
        for (j = 0; j < cols; ++j)
            sum += matrix[i][j];

    return (float) sum / (rows * cols);
}

Pozostało 580 znaków

2016-02-01 17:32

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Dziękuję za pomoc, chciałabym jeszcze zapytać o to jak wywołać poprawnie w main aby w konsoli obliczona srednia wyświetliła się

srednia(m,w,k); 

chyba nie jest poprawne ?

I mam pytanie czy jest możliwość akurat w tym kodzie wykorzystania makra ?

Pozostało 580 znaków

2016-02-01 17:36

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

1
float wynik = srednia(m, w, k);

I mam pytanie czy jest możliwość akurat w tym kodzie wykorzystania makra?
Teoretycznie wszędzie dla się wsadzić jakieś makro, tyle że to sensu większego nie ma.

Pozostało 580 znaków

2016-02-01 17:43

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Wiem, że sensu nie ma ale niestety zostało mi z góry narzucone aby przynajmniej jedno dla przykładu zrobić. Kompletnie nie orientuję się w jaki sposób poprawnie je zrobić, czytałam o tym ale nic bez przećwiczenia nie rozumiem, mógłbyś podpowiedzieć?

Pozostało 580 znaków

2016-02-01 17:49

Rejestracja: 6 lat temu

Ostatnio: 6 dni temu

1

Durny przykład:

#define FOR(i, end) for ((i) = 0; (i) < (end); ++(i)) 

Wtedy zamiast

for (i = 0; i < w; ++i)

można pisać

FOR(i, w)

Pozostało 580 znaków

2016-02-01 18:32

Rejestracja: 4 lata temu

Ostatnio: 4 lata temu

0

Dziękuję za tak szybką pomoc!! :) Jakie mogłabym wykonać operacje na takiej macierzy, udało mi się zrobić jeszcze maksymalny element, a coś z trudniejszych rzeczy?

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0