transponowanie macierzy

kokosa
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lut 2009, o 22:13
Płeć: Mężczyzna

transponowanie macierzy

Post autor: kokosa »

Witam
mam taki problem napisalem program transponujacy macierz do rozmiaru 3x3 i w przypadkach gdy liczba wierszy nie jest rowna liczbie kolumn resetuje mi wartosc podczas transponowania ocb?:)

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{float mac[2][2];
int i, j,k,m,z,g,a,b;


printf("podaj liczbe wierszy macierzy 
");
scanf("%d",&i);
printf("podaj liczbe kolumn macierzy 
");
scanf("%d",&j);
                if((i<=0)||(j<=0)){
                                 printf("rozmiar macierzy nieprawidlowy");
                                 }
                else if((i>3)||(j>3)){
                                     printf("rozmiar macierzy jest wiekszy niz musialem zrobic:)");
                                     }
                else if((i==1)&&(j==1)){
                                       printf("macierz 1 wyrazowa, nie da sie wykonac operacji transponowania");
                                     }
                                  
               else{ for(m=-i;m<0;m++){
       z=-m;          
        a=z-1;    

                                  for(k=-j;k<0;k++){
                                                    g=-k;
                                                    printf("podaj wartosc wyrazu o wspolrzednych %d %d 
",z,g);
                                                   
                                                    b=g-1;
                                                    scanf("%f", &mac[a][b]);
                                                    
                                  
                                 
                                  }
                                  }
                                 
                                  }
        printf("
 Macierz przed transponowaniem:
");
                                  for(a=0;a<i;a++){printf("
");
                                                    for(b=0;b<j;b++)
                                  printf("%.1f 	", mac[a][b]);}
        printf("
 
 Macierz po transponowaniu:
");
                                  for(b=0;b<j;b++){printf("
");
                                                    for(a=0;a<i;a++)
                                  printf("%.1f 	", mac[b][a]);}
                                  
system("PAUSE");	
  return 0;
}
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

transponowanie macierzy

Post autor: norwimaj »

Myślę że linia 5 jest źródłem kłopotów. Powinny być trójki zamiast dwójek.
vokus
Użytkownik
Użytkownik
Posty: 50
Rejestracja: 8 lis 2008, o 00:03
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

transponowanie macierzy

Post autor: vokus »

jej, ale bajzel w tym kodzie...miałem chwilkę wolnego czasu i maznąłem Ci programik transponujący macierz o dowolnym rozmiarze.

Nie wiem czy dobrze zrozumiałem treść zadania, ale chyba chodziło o to, że macierz ma być do 3x3, czyli może być 3x2, 2x3, 3x1, 1x3, 2x2 itd.? Jeśli tak to nie wiem jak Ty to chciałeś zrobić na tablicach statycznych ( nie widzę nigdzie malloca). Na statycznych musiałbyś zrobić if'y dla każdego takiego przypadku...może i tak jest w tym kodzie, ale ja nie mogę się połapać w tych 8 ( !! 0_0 ) zmiennych.

Od siebie dodałem kilka ficzerów, jak automatyczne wypełnienie liczbami w danym zakresie, bo jak rand() generował mi liczby z górnego zakresu int to wychodziła jakaś kaszanka, tj. nic nie było widać. Już nie chciało mi się tego programu jakoś specjalnie dopracowywać, dlatego trzeba ilość wierszy i kolumn podać dwa razy.

Kod: Zaznacz cały

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


int ** tworzenietablicy (int a, int b, int n, int m);
void transponuj(int ** w, int n, int m);
int main(int argc, char *argv[])
{
    
 transponuj(tworzenietablicy (1, 20, 10, 10), 10, 10);


  system("PAUSE");	
  return 0;
}


int ** tworzenietablicy (int a, int b, int n, int m){

// n -ilosc wierszy, m -ilosc kolumn, a-b - zakres
    int ** w;
    int i, j; 

              w=(int**)malloc(n*sizeof(int*));
              for(i=0; i<n; i++){ 
              *(w+i)=(int*)malloc(m*sizeof(int)); 
              for (j=0; j<m; j++){      
              w[i][j]= rand()%(b-a+1)+a;
}}
   for (i=0; i<n; i++){
       printf("\n");
       for(j=0; j<m; j++){
        printf("%d\t", w[i][j]);
               


}}

         printf ("\n\n\n\n\n\n");
         return w;         
}
         
         
void transponuj(int ** w, int n, int m){
     int i,j;
     
              for(j=0; j<m; j++){
              printf("\n");
              for (i=0; i<n; i++){
        printf("%d\t", w[i][j]);
        }}
        }
jak jakieś pytania to chętnie odpowiem :D
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

transponowanie macierzy

Post autor: norwimaj »

vokus pisze: Jeśli tak to nie wiem jak Ty to chciałeś zrobić na tablicach statycznych ( nie widzę nigdzie malloca). Na statycznych musiałbyś zrobić if'y dla każdego takiego przypadku...
A nie pomyślałeś o tym, że jak maksymalnym rozmiarem tablicy jest \(\displaystyle{ 3\times3}\), to można zrobić właśnie taką tablicę statyczną i z niektórych jej komórek nie korzystać? Skoro autor zadania dał takie ograniczenie, to pewnie o takie rozwiązanie mu chodziło.
vokus
Użytkownik
Użytkownik
Posty: 50
Rejestracja: 8 lis 2008, o 00:03
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

transponowanie macierzy

Post autor: vokus »

takie marnotrawstwo pamięci !? Nie pomyślałem o takim rozwiązaniu, bo jak mawia mój wykładowca jest ono tandetne ( zostałem skutecznie przez niego oduczony wpadania na pomysły takie jak ten przedstawiony )
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

transponowanie macierzy

Post autor: norwimaj »

Oba rozwiązania używają tyle pamięci co kot napłakał. Myślę że do takiego zadania jak to, rozwiązanie zaproponowane przez kokosa jest lepsze bo prostsze.
vokus pisze: Nie pomyślałem o takim rozwiązaniu, bo jak mawia mój wykładowca jest ono tandetne
Równie dobrze można powiedzieć, że Twoje rozwiązanie jest tandetne, bo wywoływanie malloca w tej sytuacji to tylko strata czasu.
vokus
Użytkownik
Użytkownik
Posty: 50
Rejestracja: 8 lis 2008, o 00:03
Płeć: Mężczyzna
Lokalizacja: Warszawa
Podziękował: 2 razy

transponowanie macierzy

Post autor: vokus »

dobra spoko. Pokazałem inne rozwiązanie, które może sobie przeanalizować i w jakiś sposób pomóc mu w nauce C. Ale nikt tego nie doceni, nie. Lepiej napisać, że tandeta, że niepotrzebnie pisałem, że w ogóle nic nie umiem. Poświęciłem chwilę swojego czasu na napisanie tego programu, bo mogłem przecież olać to i mieć głęboko gdzieś. Nie...lepsze są wasze ("ekspertów") odpowiedzi, które generalnie nie niosą za sobą, żadnej treści i lepiej by było jakbyście nic nie pisali. Nikt tu nic nie wytłumaczy, nie podpowie, tylko rzuci lakoniczne " błąd w piątej linijce". I tak jest w każdym dziale, szczególnie w analizie matematycznej. Jej, co za ludzie...
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

transponowanie macierzy

Post autor: norwimaj »

Dobrze że pokazałeś swoje rozwiązanie. Zawsze warto widzieć różne rozwiązania a nie tylko jedno.
Ja tylko wyraziłem opinię, że nie ze wszystkim co napisałeś się zgadzam.
vokus pisze:jej, ale bajzel w tym kodzie...
Moim zdaniem kod dosyć czytelny.

vokus pisze: Ale nikt tego nie doceni, nie. Lepiej napisać, że tandeta, że niepotrzebnie pisałem, że w ogóle nic nie umiem. Poświęciłem chwilę swojego czasu na napisanie tego programu, bo mogłem przecież olać to i mieć głęboko gdzieś.
Przeczytaj jeszcze raz co napisałem. Nie nazwałem Twojego rozwiązania tandetą. Jeśli piszesz rozwiązania tylko po to, żeby być docenionym, to niestety nie wiem jak Ci pomóc.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

transponowanie macierzy

Post autor: Afish »

vokus pisze:takie marnotrawstwo pamięci !? :D Nie pomyślałem o takim rozwiązaniu, bo jak mawia mój wykładowca jest ono tandetne ( zostałem skutecznie przez niego oduczony wpadania na pomysły takie jak ten przedstawiony )
Ciężko tutaj mówić o marnotrawieniu pamięci biorąc pod uwagę wymiary macierzy. Można nawet pokusić się o stwierdzenie, że koszt wywołania każdej z funkcji jest porównywalny z pamięcią zmarnowaną przez nadmiarową tablicę. Za to statyczna tablica ma tę niezaprzeczalną zaletę, że jest łatwiejsza w zarządzaniu - nie trzeba alokować pamięci, nie trzeba jej ręcznie zwalniać. No i stosowanie statycznych tablic o większym rozmiarze nie jest wcale rzadkim rozwiązaniem, przykładowo w zadaniach algorytmicznych jest to często stosowane.
kokosa
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 6 lut 2009, o 22:13
Płeć: Mężczyzna

transponowanie macierzy

Post autor: kokosa »

heyka
dzieki za twoj kod napewno nie jest tandetny, ale niestety nie jestem na tym stopniu zaawansowania abym mogl go uzyc, potrzebuje tablic statycznych i prosze tylko o pomoc w jednym momencie ktory juz podalem, j.w. z gory dzieki:)
norwimaj
Użytkownik
Użytkownik
Posty: 5101
Rejestracja: 11 mar 2011, o 16:31
Płeć: Mężczyzna
Lokalizacja: 52°16'37''N 20°52'45''E
Podziękował: 4 razy
Pomógł: 1001 razy

transponowanie macierzy

Post autor: norwimaj »

kokosa pisze:

Kod: Zaznacz cały

        printf("
 Macierz przed transponowaniem:
");
                                  for(a=0;a<i;a++){printf("
");
                                                    for(b=0;b<j;b++)
                                  printf("%.1f 	", mac[a][b]);}
        printf("
 
 Macierz po transponowaniu:
");
                                  for(b=0;b<j;b++){printf("
");
                                                    for(a=0;a<i;a++)
                                  printf("%.1f 	", mac[b][a]);}
                                  
Obie te pętle robią prawie to samo, a różnią się tylko nazwami i zakresami zmiennych. Jesteś pewien że program źle działa tylko gdy liczba kolumn jest różna od liczby wierszy? Zamień ostatni wiersz na

Kod: Zaznacz cały

                                  printf("%.1f 	", mac[a][b]);}

Poza tym zastosuj się do tego co napisałem wyżej. Tablica ma mieć rozmiar \(\displaystyle{ 3\times3}\) a nie \(\displaystyle{ 2\times2}\).

Jeszcze jedna kwestia estetyczna. Na końcu przydałoby się

Kod: Zaznacz cały

printf("
");
ODPOWIEDZ