Macierz obliczanie średniej w C

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

pojawia się problem
jaki?

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

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.

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ć.

0

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

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

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.

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ć?

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)
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?

0

mnożenie macierzy, transpozycja macierzy, obliczenie wyznacznika macierzy

0

Próbowałam zrobić transpozycję macierzy, co jest nie tak?

void transponuj (float **m int w, int k)
{
    int i,j;
    float **Tm;
    if (w!=k)
    {
        printf("Nie można transponować macierzy!");
        return 0;
    }
    for(i=0;i<w;i++)
        for(j=0;j<k;j++)
            Tm[j][i]=m[i][j];
}
void wyswietlT(float **Tm, int w, int k)
{
    int i,j;
    for (i=0; i<w; i++)
        for(j=0; j<k; j++)
            printf(Macierz T: %f",Tm[j][i]);

}
 

Czy może nie poprawnie wywołuję funkcje w main i stąd nie działa?

0

U siebie też masz taki kod? Kolorowanie wyraźnie wskazuje na błąd składniowy w wierszu printf(Macierz T: %f",Tm[j][i]);.

0

Faktycznie jest bład ale kompilator go nie wyrzuca, dlaczego? Jak poprawnie wywołać oby dwie funkcje w main?

0

transponuj() - nie da się poprawnie wywołać - maże po pamięci i niczego nie transponuje.
Natomiast wyswietlT() wcale nie potrzebujesz ponieważ masz wyswietl_macierz()

0

Jak poprawić transpozycję aby działała, co jest w niej nie tak?

1

Absolutnie wszystko!

  1. smrodek przy inkrementacji: http://4programmers.net/Forum/1101404
  2. rozmiary typu int - czyżby umiałeś obsłużyć ujemne rozmiary ?!
  3. funkcja ma transponować a nie mazać po ekranie
  4. transpozycja tylko macierzy kwadratowych?! WTF?
  5. bezsensowne nazewnictwo zmiennych lokalnych
  6. brak przydzielenia pamięci
  7. Weź lepiej całość przerób wg tego: http://4programmers.net/Forum/C_i_C++/262823-struktura_definiujaca_macierz?p=1204394#id1204394
0

Ad 1. Ta inkrementacja powinna być zmieniona w każdym for?
Ad 2. Gdzie powinnam zmienić na signed int?
Ad 5. Co z tymi nazwami nie tak?

0

Ad 1. Nie, tylko tam gdzie nie potrzebujesz kopii zmiennej sprzed inkrementacji
Ad 2. signed int to to samo co int, więc - unsigned int a jeszcze lepiej tam gdzie chodzi o indeksy tablicy: size_t - wszędzie tam gdzie zmienna/parametr za nic w świecie nie może być ujemna/ujemny
Ad 5. Jak nazywasz i, j lub w, k to za chwile nie wiesz co jest czym (jak nie za chwile to za tydzień już na pewno). Zamiast w, k - rows, cols zamiast i, j - y, x

Jeszcze polskie nazewnictwo, zobacz jak wygląda twój kod: http://4programmers.net/Forum/1208091

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