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

Zachowanie oryginału tablicy

Ostatnio zmodyfikowano 2016-12-28 00:01
Autor Wiadomość
mat06
Temat założony przez niniejszego użytkownika
Zachowanie oryginału tablicy
» 2016-12-27 13:25:03
Mam do napisania program, który będzie zamieniał ze sobą dane wiersze/kolumny. Ma on jednak nie zmieniać oryginału tablicy.
Funkcja wygląda tak:
 
C/C++
double zamiana( double tablica[ 4 ][ 3 ], int n, int m, int i, int j )
{
    double c;
    for( int k = 0; k < n; k++ )
    {
        c = tablica[ k ][ i ];
        tablica[ k ][ i ] = tablica[ k ][ j ];
        tablica[ k ][ j ] = c;
    }
Co zrobić, aby oryginał tablicy nie zostawał zmieniany?
I jeszcze drugie pytanie. Czy/jak można napisać funkcję w ten sposób, żeby nie podawać rozmiarów tablicy tylko przyjmować je jako n i m?
Przykładowo: 
double zamiana( double tablica[][], int n, int m, int i, int j )


Z góry dziękuję za pomoc.
P-155516
pekfos
» 2016-12-27 13:33:36
Użyj std::vector<std::vector<double>>, lub sam alokuj tablicę dynamicznie. W zwykłej tablicy wielowymiarowej, część wymiarów musi być znana z góry.
P-155517
mat06
Temat założony przez niniejszego użytkownika
» 2016-12-27 13:36:47
A co zrobić, aby oryginał tablicy nie zostawał zmieniany?
P-155519
pekfos
» 2016-12-27 14:56:46
Kopiuj.
P-155526
mat06
Temat założony przez niniejszego użytkownika
» 2016-12-27 16:30:13
A mogę prosić o jakieś dokładniejsze wytłumaczenie?
P-155535
pekfos
» 2016-12-27 18:23:10
Kopiuj tablicę, modyfikuj kopię. Siłą rzeczy, nie zmodyfikujesz oryginału w ten sposób.
P-155555
mokrowski
» 2016-12-28 00:01:59
Lepiej użyć vector. Jeśli jednak upierasz się "bo nie", to masz uniwersalne rozwiązanie na szablonach:
C/C++
#include <iostream>

using namespace std;

template < typename T, size_t N, size_t M >
void rotate_table( const T( & table_src )[ N ][ M ], T( & table_dst )[ M ][ N ] ) {
    for( size_t row = 0; row < N; ++row ) {
        for( size_t column = 0; column < M; ++column ) {
            table_dst[ column ][ row ] = table_src[ row ][ column ];
        }
    }
}

int main() {
    int t1[ 3 ][ 2 ] = {
        { 10, 20 },
        { 50, 33 },
        { 45, 44 }
    };
    int t2[ 2 ][ 3 ];
    rotate_table( t1, t2 );
   
    // Złamane DRY do testu..
    cout << "Tablica oryginalna:" << endl;
    for( size_t i = 0; i < 3; ++i ) {
        for( size_t j = 0; j < 2; ++j ) {
            cout << t1[ i ][ j ] << ", ";
        }
        cout << "\n";
    }
   
    cout << "Tablica obrócona:" << endl;
    for( size_t i = 0; i < 2; ++i ) {
        for( size_t j = 0; j < 3; ++j ) {
            cout << t2[ i ][ j ] << ", ";
        }
        cout << "\n";
    }
}

PS. Przepraszam ale formatowanie kodu na tym forum jest .... takie sobie :-/
P-155579
« 1 »
  Strona 1 z 1