C++ macierz
Ostatnio zmodyfikowano 2016-03-19 12:33
jolkaaa3 Temat założony przez niniejszego użytkownika |
C++ macierz » 2016-03-18 18:39:23 Witam, potrzebuję pomocy w napisaniu programu w języku C++. Chodzi o transpozycję macierzy bez użycia macierzy pomocniczej, macierz jest zapisana w postaci tabeli dwuwymiarowej. Napisana transpozycja działa tylko dla macierzy kwadratowych, dla niekwadratowych niestety nie. Proszę o pomoc bo nie mam pojęcia jak można poprawić program aby działał dla wszystkich macierzy. #include<iostream> using namespace std;
const int maks = 20;
struct macierz { int l_wierszy; int l_kolumn; double elementy[ maks ][ maks ]; };
void wczytaj_macierz( macierz & m ) { cout << "Podaj liczbe wierszy: " << endl; cin >> m.l_wierszy; cout << "Podaj liczbe kolumn: " << endl; cin >> m.l_kolumn; for( int i = 0; i < m.l_wierszy; i++ ) { for( int j = 0; j < m.l_kolumn; j++ ) { cin >> m.elementy[ i ][ j ]; } } }
void wyswietl_macierz( macierz & m ) { for( int i = 0; i < m.l_wierszy; i++ ) { for( int j = 0; j < m.l_kolumn; j++ ) { cout << m.elementy[ i ][ j ]; if( m.l_kolumn - 1 > j ) { cout << ", "; } } cout << endl; } }
void transpozycja_macierzy( macierz & m ) { int tmp = m.l_wierszy; m.l_wierszy = m.l_kolumn; m.l_kolumn = tmp; for( int i = 0; i < m.l_wierszy - 1; i++ ) { for( int j = i + 1; j < m.l_kolumn; j++ ) { double tmp; tmp = m.elementy[ i ][ j ]; m.elementy[ i ][ j ] = m.elementy[ j ][ i ]; m.elementy[ j ][ i ] = tmp; } } }
int main() { macierz m1; macierz m2; macierz wynik; wczytaj_macierz( m1 ); transpozycja_macierzy( m1 ); wyswietl_macierz( m1 ); } |
|
pekfos |
» 2016-03-18 18:44:23 Zamień wymiary macierzy po pętli. |
|
jolkaaa3 Temat założony przez niniejszego użytkownika |
» 2016-03-18 18:55:46 Po zamianie macierz transponowana nie wyświetla się dobrze, np. gdy wpisuje macierz 3x2 1 2 3 4 5 6
Program wyświetla taką macierz transponowaną 1 3 1.2374e+268 2 4 2.16749e+268
Nie mam pojęcia jak to poprawić. |
|
carlosmay |
» 2016-03-18 19:09:26 Najprawdopodobniej pomylone są wiersze z kolumnami. Tak to wygląda. |
|
jolkaaa3 Temat założony przez niniejszego użytkownika |
» 2016-03-18 19:35:13 A w jaki sposób mogę to poprawić? |
|
carlosmay |
» 2016-03-18 19:40:41 Wpisz macierz 2x3? |
|
AdamDy |
» 2016-03-18 19:42:03 Jolkaaa3, nie słuchaj carlosmay, transpozycja działa dla kwadratowych dlatego ze tylko te elementy transponujesz, już podsyłam rozwiązanie, moment. |
|
AdamDy |
Dzialajacy kodzik » 2016-03-18 20:26:10 Uzylem #include<algorithm> tylko po to żeby użyć "min()" w: int swaparea = min( m.l_wierszy, m.l_kolumn );
ale wiadomo mozna to zrobic bez tej biblioteki i sobie samemu latwo zrobic mina ;p #include<iostream> #include<algorithm> using namespace std;
const int maks = 20;
struct macierz { int l_wierszy; int l_kolumn; double elementy[ maks ][ maks ]; };
void wczytaj_macierz( macierz & m ) { cout << "Podaj liczbe wierszy: " << endl; cin >> m.l_wierszy; cout << "Podaj liczbe kolumn: " << endl; cin >> m.l_kolumn; for( int i = 0; i < m.l_wierszy; i++ ) { for( int j = 0; j < m.l_kolumn; j++ ) { cin >> m.elementy[ i ][ j ]; } } }
void wyswietl_macierz( macierz & m ) { for( int i = 0; i < m.l_wierszy; i++ ) { for( int j = 0; j < m.l_kolumn; j++ ) { cout << m.elementy[ i ][ j ]; if( m.l_kolumn - 1 > j ) { cout << ", "; } } cout << endl; } }
void transpozycja_macierzy( macierz & m ) { int swaparea = min( m.l_wierszy, m.l_kolumn ); for( int i = 0; i < swaparea - 1; i++ ) { for( int j = i + 1; j < swaparea; j++ ) { double tmp; tmp = m.elementy[ i ][ j ]; m.elementy[ i ][ j ] = m.elementy[ j ][ i ]; m.elementy[ j ][ i ] = tmp; } } if( m.l_kolumn > m.l_wierszy ) { for( int i = m.l_wierszy; i < m.l_kolumn; i++ ) { for( int j = 0; j < m.l_wierszy; j++ ) { m.elementy[ i ][ j ] = m.elementy[ j ][ i ]; } } } else { for( int j = m.l_kolumn; j < m.l_wierszy; j++ ) { for( int i = 0; i < m.l_kolumn; i++ ) { m.elementy[ i ][ j ] = m.elementy[ j ][ i ]; } } } int tmp = m.l_wierszy; m.l_wierszy = m.l_kolumn; m.l_kolumn = tmp; }
int main() { macierz m1; macierz m2; macierz wynik; wczytaj_macierz( m1 ); transpozycja_macierzy( m1 ); cout << endl; wyswietl_macierz( m1 ); return 0; }
|
|
« 1 » 2 |