Transpozycja macierzy problem

Odpowiedz Nowy wątek
2012-03-10 22:42
Raty
0

Witam serdecznie!
Dopiero zaczynam programować w c++. Piszę program na zajęcia w szkole i mam kłopot. Otóż nie wiem jak napisać transpozycję macierzy o wymiarach 8x4. Pisze w dev-c++. Oto mój kod:
macierz.cpp :

void Macierz::transpozycja()
{
for(int i=0; i<iloscW; i++){
        for(int j=0; j<iloscK; j++){
            int w =(int) tab[i][j];
            for (int k=0; k<iloscK; k++){
                for (int l=0; l<iloscW; l++){
                    tab2[l][k] =(int) w;
                    break;
                }break;
            }
        }
}
} 

macierz.hpp (jest tutaj pełno zmiennych i funkcji, których używam w reszcie programu, jednak na wszelki wypadek wklejam całosć) :


class Macierz{
    //domyślnie private
        int tab[20][30];
        int tab2[30][20];   //macierz 20 wierszy x 30 kolumn
        const int maxW;     //maksymalna ilosc wierszy
        const int maxK;     //maksymalna ilosc kolumn
        int iloscW;         //aktualna ilosc wierszy
        int iloscK;         //aktualna ilosc kolumn
    public:
        Macierz();                          //konstruktor bezargumentowy
        Macierz(int iloscW, int iloscK);    //konstruktor dwuargumentowy
        bool ustaw_iloscW(int iloscW);      //ustala nowa wartosc zmiennej iloscW
        int daj_iloscW();                   //zwraca wartosc zmiennej iloscW
        bool ustaw_iloscK(int iloscK);      //ustala nowa wartosc zmiennej iloscK
        int daj_iloscK();                   //zwraca wartosc zmiennej iloscK
        inline bool ustaw_iloscWK(int iloscW, int iloscK); //ustala nowa wartosc zmiennych iloscW i iloscK
        bool ustaw(Indeks i, int wartosc); //ustala wartosc elementu pod indeksem i
        int daj(Indeks i);                 //zwraca wartosc elementu pod indeksem i 

        int sumaWiersz(int w);//zwraca sume elementow w wierszu w
        double sredniaWiersz(int w);//zwraca srednia wartosc z wiersza w
        Indeks elementMax(); //zwraca indeks pierwszego wystapienia wartosci maksymalnej
        int wartoscMax();    //zwraca wartosc maksymalna w macierzy 
        int wierszMaxSuma(); //numer wiersza o maksymalnej sumie elementow
        int kolumnaMinIloczyn(); //numer kolumny o minimalnym iloczynie elementow kolumny   
        int jestWMacierzy(int liczba); //czy liczba wystepuje w macierzy
        bool roznowartosciowa(); //czy macierz jest roznowartosciowa
        void transpozycja();  //wykonuje transpozycje macierzy  
        int iloscParzystych(); //zwraca ilosc elementow przystych w macierzy
};

#endif

no i main.cpp wywołuję metodę następująco :

cout << "Macierz transponowana wyglada nastepujaco:" << endl;
cout << endl;
m1.transpozycja();
for (int i=0; i<m1.daj_iloscK(); i++){
    for (int j=0; j<m1.daj_iloscW(); j++)
    cout << m1.daj(Indeks(i,j)) << " ";
    cout << endl;
}
cout << endl; 

jest tam również klasa indeks stąd funkcja m1.daj(Indeks(i,j)), jednak myślę że nie jest to potrzebne. Gdyby jednak było to mogę wkleić calutki kod programu. Problem polega na tym, że mając przykłądowo macierz wyglądającą tak:
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
spodziewam się wyniku:
1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4
a otrzymuję coś takiego:
1 2 3 4 -1 -1 -1 -1
1 2 3 4 -1 -1 -1 -1
1 2 3 4 -1 -1 -1 -1
1 2 3 4 -1 -1 -1 -1
Wiem że -1 pojawia się, gdyż bazowa macierz nie ma argumentów w tych miejscach, jednak nie mam pojęcia co zrobić, aby zapisywało mi poprawnie.
Bardzo prosiłbym o pomoc!

Pozostało 580 znaków

2012-03-10 22:58
0

Coś dużo za mocno namieszałeś z tymi pętlami w transpozycji. Powinny ci wystarczyć dwie pętle i konstrukcja w stylu tab2[i][j] = tab[j][i]. Tak samo te rzutowania są zbędne.


Nadzieja...
edytowany 1x, ostatnio: Sasik, 2012-03-10 22:59

Pozostało 580 znaków

2012-03-10 23:03
Raty
0

W przypadku macierzy o takiej samej liczbie kolumn i wierszy to oczywiście masz rację. Jednak to jest macierz o wymiarach 8x4, czyli po transpozycji musi powstać nowa macierz z wymiarami 4x8. Dlatego też nie działa to co mi napisałeś. I nie mam pojęcia jak to zrobić.

Pozostało 580 znaków

2012-03-10 23:19
0

Niby czemu nie działa? Musi działać, jak tylko przypilnujesz, żeby nie wyjechać z zakresem - czyli jak w twoim kodzie iloscW i iloscK odnosi się do tab i i = od 0 do iloscW, j = od 0 do iloscK, to masz tab2[j][i] = tab[i][j].


Nadzieja...

Pozostało 580 znaków

2012-03-10 23:26
0

Zrob funkcje, zaalokuj w niej pamiec na tavlice o odwrotnych rozmiarach i zwroc wskaznik na nia usuwajac stara tablice


Gdy się nie wie, co się robi, to dzieją się takie rzeczy, że się nie wie, co się dzieje ;-)

Pozostało 580 znaków

2012-03-11 11:46
0

Może takie coś pomoże:

 #define WYSOKOSC 8
#define SZEROKOSC 4

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    srand (0);

    int macierz [WYSOKOSC][SZEROKOSC];
    int macierz_t [SZEROKOSC][WYSOKOSC];

    for (int i = 0; i<WYSOKOSC; ++i)
    {

        for (int j = 0; j<SZEROKOSC; ++j)
        {

            macierz[i][j] = rand() %25;
            cout<<macierz[i][j]<<"\t";
        }
    cout<<endl;

    }

    cout<<"\n\n"; ///KONIEC WCZYTYWANIA MACIERZY. TERAZ TRANSPONOWANIE

    for (int i = 0; i<SZEROKOSC; i++)
    {

        for (int j = 0; j<WYSOKOSC; j++)
        {

            macierz_t[i][j] = macierz[j][i];
            cout<<macierz_t[i][j]<<"\t";

        }

    cout<<endl;

    }

    getchar();
    return 0;
}
edytowany 1x, ostatnio: lordbobstein, 2012-03-11 15:03

Pozostało 580 znaków

2012-03-11 13:07
Raty
0

Ok dzięki Panowie już po problemie! Pokombinowałem tak jak mówiliście i dało radę.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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