Dodawanie macierzy w C

Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Dodawanie macierzy w C

Post autor: Mar_ko »

Witam
Potrzebuje pomocy z programem w C, który ma dodawać do siebie macierze stworzone dynamicznie(przynajmniej chciałem żeby tak się dodawały). Nie umiem sobie z tym poradzić wklejam kod który dotąd napisałem wiem ze mam gdzie wałka w pętlach przy sumie ale nie wiem gdzie.
Jeśli to widzicie to pomóżcie.

Kod: Zaznacz cały

#include<stdio.h>

int main()
{
int i,j,b,a;
int **macierz;
printf("Podaj liczbe kolumn
");
scanf("%i", &a);
printf("Podaj liczbe wierszy
");
scanf("%i", &b);
macierz=(int**)malloc(sizeof(int*)*b); 
   for(i=0;i<b;i++) 
      macierz[i]=(int*)malloc(sizeof(int)*a);
      for(i=0;i<b;i++)
                for(j=0;j<a;j++)
                {
                     
                     printf("Podaj liczbe ");
                     scanf("%d", &macierz[i][j]);
}
printf("Pierwsza macierz (A):
");
/* wypisuje tablice */
for(i = 0 ; i < b ; i++)
{
      for(j = 0 ; j < a ; j++)
      {
            printf("%d ", macierz[i][j]) ;
            }
            printf("
") ; /* oddziela każdy nowy wiersz */
}
int x,y,q,w;
int **macierz2;
printf("Podaj liczbe kolumn
");
scanf("%d",&w);
printf("Podaj liczbe wierszy
");
scanf("%d",&q);
macierz2=(int**)malloc(sizeof(int)*q);
    for(x=0;x<q;x++)
        macierz2[x]=(int*)malloc(sizeof(int)*w);
        for(x=0;x<q;x++)
        for(y=0;y<w;y++)
        {
                        printf("Podaj liczbe ");
                        scanf("%d",&macierz2[x][y]);
}
        printf("Druga macierz (B):
");
        /*Wypisuje drugą tablice*/
        for(x=0;x<q;x++)
        {
                        for(y=0;y<w;y++)
                        {
                                        printf("%d ", macierz2[x][y]);
                        }
                        printf("
");
                        
}
if (a==w&b==q)
{
            printf("Dodaje macierze A+B=C
");
            int wiersz,kolumna, w1=a,k1=b;
            int **macierz3;
            printf("%d
",w1);
            macierz3=(int**)malloc(sizeof(int)*k1);
            for(wiersz=0;wiersz<w1;wiersz++)
            macierz3[wiersz]=(int*)malloc(sizeof(int)*w1);
                                                          for(kolumna=0;kolumna<k1;kolumna++)
                                                          for(wiersz=0;wiersz<w1;wiersz++)
                                                          {
                                                                                         
                                                                                          macierz3[wiersz][kolumna]=macierz2[x][y]+macierz[i][j];
                                                                                        printf("wiersz %d", wiersz);}
                                                                                        for(wiersz=0;wiersz<w1;wiersz++)
                                                                                        {
                                                                                        for(kolumna=0;kolumna<k1;kolumna++)
                                                                                           {  
                                
                                              
             printf("s %d",macierz3[wiersz][kolumna]);
             }
             printf("
");
}
}           
             else
{
    printf("Nie mozna dodac macierzy");
}

getch();
}
filip.wroc
Użytkownik
Użytkownik
Posty: 153
Rejestracja: 17 sty 2010, o 15:37
Płeć: Mężczyzna
Lokalizacja: Wroclaw
Pomógł: 13 razy

Dodawanie macierzy w C

Post autor: filip.wroc »

Na biegu zauwazylem jedna rzecz:
linia 57:
if (a==w&b==q)
rozdziel to nawiasami. Jako ze w C int moze byc traktowany jako wyrazenie logiczne, to to znaczy mniej wiecej tyle:
"jezeli a jest rowne w&b i zarazem rowne q".
Co znaczy w&b?
Przyjmijmy ze int ma tylko 8 bitow, dla urposzczenia przykladu.
jezeli
w=10101010
b =01111001
to w&b to liczba, w ktorej i-ty bit to i-te bity liczb w i b polaczone operatorem AND, czyli:
& =00101000 (tylko tam gdzie w obu liczbach stoi 1, w wyniku stoi 1, reszta jest ustawiona na 0).
Jak to rozwiazac?
Pogrupowac: if ( (a==w) & (b==q) ).

Nie wiem czy to to, ale jest taka opcja.

No i jeszcze jedna rzecz:
linia 77:
macierz3[wiersz][kolumna]=macierz2[x][y]+macierz[j];
skad sie biora x, y, i, j?
pod macierz[w][k] masz podstawic sume macierz2[w][k] i macierz[w][k] - te same pozycje.
Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Dodawanie macierzy w C

Post autor: Mar_ko »

Dzięki wielkie teraz wszystko działa jak powinno.

-- 6 lip 2010, o 15:27 --

hm jednak jest problem liczy tylko macierze kwadratowe . Czy o czymś zapomniałem?-- 6 lip 2010, o 17:05 --Niestety dalej źle podaje wynik przy macierzach niekwadratowych

Kod: Zaznacz cały

#include<stdio.h>

int main()
{
int i,j,b,a;
int **macierz;
printf("Podaj liczbe kolumn
");
scanf("%i", &a);
printf("Podaj liczbe wierszy
");
scanf("%i", &b);
macierz=(int**)malloc(sizeof(int*)*b); 
   for(i=0;i<b;i++) 
      macierz[i]=(int*)malloc(sizeof(int)*a);
      for(i=0;i<b;i++)
                for(j=0;j<a;j++)
                {
                     
                     printf("Podaj liczbe ");
                     scanf("%d", &macierz[i][j]);
}
printf("Pierwsza macierz (A):
");
/* wypisuje tablice */
for(i = 0 ; i < b ; i++)
{
      for(j = 0 ; j < a ; j++)
      {
            printf("%d ", macierz[i][j]) ;
            }
            printf("
") ; /* oddziela każdy nowy wiersz */
}
int x,y,q,w;
int **macierz2;
printf("Podaj liczbe kolumn
");
scanf("%d",&w);
printf("Podaj liczbe wierszy
");
scanf("%d",&q);
macierz2=(int**)malloc(sizeof(int)*q);
    for(x=0;x<q;x++)
        macierz2[x]=(int*)malloc(sizeof(int)*w);
        for(x=0;x<q;x++)
        for(y=0;y<w;y++)
        {
                        printf("Podaj liczbe ");
                        scanf("%d",&macierz2[x][y]);
}
        printf("Druga macierz (B):
");
        /*Wypisuje drugą tablice*/
        for(x=0;x<q;x++)
        {
                        for(y=0;y<w;y++)
                        {
                                        printf("%d ", macierz2[x][y]);
                        }
                        printf("
");
                        
}
if ((a==w)&(b==q))
{
            printf("Dodaje macierze A+B=C
");
            int wiersz,kolumna, w1=a,k1=b;
            int **macierz3;
            printf("%d
",w1);
            macierz3=(int**)malloc(sizeof(int)*k1);
            for(wiersz=0;wiersz<w1;wiersz++)
            macierz3[wiersz]=(int*)malloc(sizeof(int)*w1);
                                                          for(kolumna=0;kolumna<k1;kolumna++)
                                                          for(wiersz=0;wiersz<w1;wiersz++)
                                                          {
                                                                                         
                   macierz3[wiersz][kolumna]=macierz2[wiersz][kolumna]+macierz[wiersz][kolumna];
                                                                                        printf("wiersz %d", wiersz);}
                                                                                        for(wiersz=0;wiersz<w1;wiersz++)
                                                                                        {
                                                                                        for(kolumna=0;kolumna<k1;kolumna++)
                                                                                           {  
                                
                                              
             printf("s %d",macierz3[wiersz][kolumna]);
             }
             printf("
");
}
}           
             else
{
    printf("Nie mozna dodac macierzy");
}

getch();
}
Naprawdę nie wiem o co chodzi.
pfauel
Użytkownik
Użytkownik
Posty: 32
Rejestracja: 26 lis 2009, o 01:15
Płeć: Mężczyzna
Lokalizacja: Polska
Pomógł: 9 razy

Dodawanie macierzy w C

Post autor: pfauel »

Nie wywoływałem u siebie Twojego programu, także nie daję żadnej gwarancji, ale podejrzana wydaj mi się linijka:
60. int wiersz,kolumna, w1=a,k1=b;
nie powinny być te przypisania na odwrót? tzn. w1=b, k1=a?
Jeśli to nie jest błąd, którego szukasz, to mógłbyś, proszę, podać troche dokładniejsze informacje: wychodzi zły wynik? przykładowy błedny wynik przy jakich danych? jakiś błąd wyrzuca? jaki?
pozdrawiam
Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Dodawanie macierzy w C

Post autor: Mar_ko »

Faktycznie masz racje nie zauważyłem tego teraz się zgadza.
Dzięki wielkie.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

Dodawanie macierzy w C

Post autor: miki999 »

O ile dobrze pamiętam, przydział pamięci wiąże się z koniecznością jej uwolnienia.



Pozdrawiam.
filip.wroc
Użytkownik
Użytkownik
Posty: 153
Rejestracja: 17 sty 2010, o 15:37
Płeć: Mężczyzna
Lokalizacja: Wroclaw
Pomógł: 13 razy

Dodawanie macierzy w C

Post autor: filip.wroc »

dobrze pamietasz. nie zwrocilem uwagi, ale rzeczywiscie bedziesz mial tu wycieki. to wazny i duzy blad, jeden z najczestszych u osob poczatkujacych.
Mar_ko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lip 2010, o 13:09
Płeć: Mężczyzna
Lokalizacja: POLSKA
Podziękował: 2 razy

Dodawanie macierzy w C

Post autor: Mar_ko »

O jakie wycieki chodzi? sprawdzałem czy działa i nie wywala się.
filip.wroc
Użytkownik
Użytkownik
Posty: 153
Rejestracja: 17 sty 2010, o 15:37
Płeć: Mężczyzna
Lokalizacja: Wroclaw
Pomógł: 13 razy

Dodawanie macierzy w C

Post autor: filip.wroc »

wyciek pamieci w tak malym programie nie spowoduje raczej bledu. kwestia tego zebys nie nabral zlych nawykow.

co to w ogole wyciek pamieci:
Awatar użytkownika
Mariusz M
Użytkownik
Użytkownik
Posty: 6908
Rejestracja: 25 wrz 2007, o 01:03
Płeć: Mężczyzna
Lokalizacja: 53°02'N 18°35'E
Podziękował: 2 razy
Pomógł: 1246 razy

Dodawanie macierzy w C

Post autor: Mariusz M »

miki999, nie musisz zwalniać przydzielonej pamięci
jednak jeśli jej nie zwolnisz albo zwolnisz w nieprawidłowy sposób
doprowadzisz do wycieku pamięci

W języku C najpopularniejszymi funkcjami do
allokacji i zwalniania pamięci są malloc() oraz free()

W języku C++ operatory new i delete
ODPOWIEDZ