Transpozycja macierzy problem

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!

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.

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

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

0

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

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;
}
0

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

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