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

Lekcja IX , skoroszyt - problem z tablicami.

Ostatnio zmodyfikowano 2010-11-27 18:23
Autor Wiadomość
whiz_max
Temat założony przez niniejszego użytkownika
Lekcja IX , skoroszyt - problem z tablicami.
» 2010-11-27 15:23:34
Witam wszystkich forumowiczów:)

Mam pewien problem z tablicami to znaczy nie potrafię rozgryźć dlaczego mój program nie chce podstawiać wartości z tablic jednowymiarowych do jednej tablicy 3-wymiarowej.. podstawiam tak ponieważ nie wiem jak :cin.get(tab1, 50); zastąpić od razu tablicą 3 - wymiarową. Nie wiem na ile to ważne ale używam ubuntu i kompilatora code::blocks więc nie kożystam z biblioteki conio .. Za każdą pomoc bardzo dziękuje.

C/C++
#include <iostream>
#include <stdio.h>

int main()
{
    using namespace std;
    int x;
    cout << "Podaj liczbe osob: ";
    cin >> x;
    cin.get();
    char tab1[ 50 ], tab2[ 50 ], tab3[ 50 ], tab4[ 50 ], tab[ x ][ 4 ][ 50 ];
   
    for( int k = 1; k <= x; k++ )
    {
        cout << "Osoba numer: " << k << endl;
        cout << "Imie: " << endl;
        cin.get( tab1, 50 );
        cin.get();
        cout << "Nazwisko: " << endl;
        cin.get( tab2, 50 );
        cin.get();
        cout << "Telefon: " << endl;
        cin.getline( tab3, 50 );
        cin.get();
        cout << "T: " << endl;
        cin.getline( tab4, 50 );
        cin.get();
        for( int j = 0; j <= 50; j++ ) //<-
        {
           
            tab[ k ][ 1 ][ j ] = tab1[ j ];
            tab[ k ][ 2 ][ j ] = tab2[ j ];
            tab[ k ][ 3 ][ j ] = tab3[ j ];
            tab[ k ][ 4 ][ j ] = tab4[ j ];
        }
    }
   
    for( int k = 0; k <= x; k++ )
    {
        cout << endl << endl << tab[ k ][ 1 ] << endl << tab[ k ][ 2 ] << endl << tab[ k ][ 3 ] << endl << tab[ k ][ 4 ] << endl;
    } //<-
   
    getchar();
    return 0;
}
P-24552
ison
» 2010-11-27 15:42:48
jeśli deklarujesz tablicę w sposób
C/C++
char tab[ 3 ];
to indeksy kolejnych komórek to: 0,1,2
nie istnieje element o indeksie 3

dlatego u Ciebie w kodzie robi się rozbajzel (odwołując się do komórki 4 odwołujesz się nie do tego co myślisz)
C/C++
char tab[ x ][ 4 ][ 50 ];
C/C++
tab[ k ][ 4 ][ j ] = tab4[ j ];

nie wiem jak :cin.get(tab1, 50); zastąpić od razu tablicą 3 - wymiarową
chociażby tak:
C/C++
char tab[ 30 ][ 30 ][ 30 ];
std::cin.get( tab[ 0 ][ 0 ], 30 );

//
musisz zawsze pamiętać o tym że indeksowanie rozpoczyna się od 0 i kończy na n-1 gdzie n to rozmiar tablicy jaki podałeś w programie
C/C++
for( int j = 0; j <= 50; j++ )
w tym miejscu powinien znaleźć się operator '<' a nie '<=' gdyż element o indeksie 50 nie istnieje
C/C++
tab[ k ][ 1 ][ j ] = tab1[ j ];
tab[ k ][ 2 ][ j ] = tab2[ j ];
tab[ k ][ 3 ][ j ] = tab3[ j ];
tab[ k ][ 4 ][ j ] = tab4[ j ];
tu podobnie, zamiast 1,2,3,4 - 0,1,2,3
C/C++
tab[ k ][ 0 ][ j ] = tab1[ j ];
tab[ k ][ 1 ][ j ] = tab2[ j ];
tab[ k ][ 2 ][ j ] = tab3[ j ];
tab[ k ][ 3 ][ j ] = tab4[ j ];

tu jak wyżej:
C/C++
cout << endl << endl << tab[ k ][ 1 ] << endl << tab[ k ][ 2 ] << endl << tab[ k ][ 3 ] << endl << tab[ k ][ 4 ] << endl;

C/C++
for( int k = 0; k <= x; k++ )
albo
k = 0; k < x;
 albo
k = 1; k <= x;
gdyż w Twoim przypadku przelecisz o 1 element za dużo

C/C++
for( int k = 1; k <= x; k++ )
tu preinkrementacja (++k) jest lepsza od postinkrementacji(k++)
Przy preinkrementacji nie tworzysz obiektu tymczasowego, w takich przypadkach raczej i tak to prawie nic nie zmieni ale lepiej już sobie wyrobić taki nawyk na przyszłość

w Twoim kodzie zamiast cin.get() możesz użyć
C/C++
cin.sync();
cin.get() potrzebowałeś zapewne, gdyż cin.getline() nie działał poprawnie, prawda? ;)
jeśli już się decydujesz na taki formularz (Imie, Nazwisko...) to lepiej jakbyś wszędzie używał cin.getline(...);
co jak ktoś przy podawaniu imienia wpisze 2 słowa? :)

zamiast
C/C++
for( int j = 0; j <= 50; j++ )
{
    tab[ k ][ 1 ][ j ] = tab1[ j ];
    tab[ k ][ 2 ][ j ] = tab2[ j ];
    tab[ k ][ 3 ][ j ] = tab3[ j ];
    tab[ k ][ 4 ][ j ] = tab4[ j ];
}
możesz użyć funkcji strcpy (chociaż w tym przypadku i tak lepiej nie bawić się w kopiowanie stringów tylko od razu wczytać tab[x][y])


C/C++
int x;
...
char tab[ x ][ 4 ][ 50 ];
nie powinno się tak robić (chodzi mi o to x przy deklarowaniu tablicy)
jeśli chcesz mieć tablicę o nieznanym przy kompilacji rozmiarze to zapoznaj się z dynamiczną alokacją pamięci

C/C++
#include <stdio.h>
piszesz w C++ więc dołączaj
C/C++
#include <cstdio>
pomijając fakt, że w Twoim programie ta biblioteka i tak jest zbędna
różnica między stdio.h a cstdio jest taka, że w cstdio wszystko jest upchnięte w przestrzeni nazw std, nic poza tym
(to że aktualnie nie musisz pisać std:: przy wywoływaniu chociażby printf nie oznacza, że w przyszłości nie będziesz musiał)
P-24555
whiz_max
Temat założony przez niniejszego użytkownika
» 2010-11-27 18:23:27
dziekuje:)
P-24560
« 1 »
  Strona 1 z 1