Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

C++ macierz

Ostatnio zmodyfikowano 2016-03-19 12:33
Autor Wiadomość
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.

C/C++
#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; //Pobieramy macierz
    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++ ) { // i - wiersz, j - kolumna
        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 );
}
P-146158
pekfos
» 2016-03-18 18:44:23
Zamień wymiary macierzy po pętli.
P-146159
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ć.
P-146160
carlosmay
» 2016-03-18 19:09:26
Najprawdopodobniej pomylone są wiersze z kolumnami. Tak to wygląda.
P-146161
jolkaaa3
Temat założony przez niniejszego użytkownika
» 2016-03-18 19:35:13
A w jaki sposób mogę to poprawić?
P-146162
carlosmay
» 2016-03-18 19:40:41
Wpisz macierz 2x3?
P-146163
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.
P-146164
AdamDy
Dzialajacy kodzik
» 2016-03-18 20:26:10
Uzylem #include<algorithm> tylko po to żeby użyć "min()" w:
C/C++
int swaparea = min( m.l_wierszy, m.l_kolumn );
ale wiadomo mozna to zrobic bez tej biblioteki i sobie samemu latwo zrobic mina ;p
C/C++
#include<iostream>
#include<algorithm>
using namespace std;

const int maks = 20;

struct macierz {
    int l_wierszy;
    int l_kolumn;
    double elementy[ maks ][ maks ]; //pierwszy to wiersz, drugi to kolumna
};

void wczytaj_macierz( macierz & m ) {
    cout << "Podaj liczbe wierszy: " << endl; //Pobieramy macierz
    cin >> m.l_wierszy;
    cout << "Podaj liczbe kolumn: " << endl;
    cin >> m.l_kolumn;
    for( int i = 0; i < m.l_wierszy; i++ ) { //najpierw idziemy po wierszach od 0 do ml-1 jest dobrze
        for( int j = 0; j < m.l_kolumn; j++ ) { //teraz idziemy od 0 do ml-1 jest dobrze
            cin >> m.elementy[ i ][ j ]; //[wiersz][kolumna]
        }
    }
}

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 ) { //daloby sie tutaj przyspieszyc ale jest ok
                cout << ", ";
            }
        }
        cout << endl;
    }
} //jest ok

void transpozycja_macierzy( macierz & m ) {
    /*
    int tmp = m.l_wierszy;
    m.l_wierszy = m.l_kolumn;
    m.l_kolumn = tmp;
    ^^ten swap jest okej, ale my tak naprawde odnosimy sie do elementow w tablicy m.elementy,
    która jest niezależna od m.l_wierszy, m.l_kolumn, czyli mozemy to zrobic na koniec
    moglibyśmy to zrobić teraz ale dla nas ważniejsze są te elementy które mamy a one
    są uporządkowane bez tego swapa
    */
    int swaparea = min( m.l_wierszy, m.l_kolumn ); //bo kwadrat to idą do min
    for( int i = 0; i < swaparea - 1; i++ ) { // i - wiersz, j - kolumna
        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;
        }
    }
    //teraz elementy poza kwadratem
    if( m.l_kolumn > m.l_wierszy ) { //gdy wiecej kolumn
        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 { //gdy wiecej wierszy
        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;
}
P-146166
« 1 » 2
  Strona 1 z 2 Następna strona