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

petla do...while i tablice dwu wymiarowe

Ostatnio zmodyfikowano 2011-02-27 17:03
Autor Wiadomość
neke
Temat założony przez niniejszego użytkownika
petla do...while i tablice dwu wymiarowe
» 2011-02-27 11:41:36
Jak tak dalej pójdzie to nazwę forum będzie można zmienić na "Pytania neke" :)

Na wstępie zaznaczę, że czytałem kurs, wszystko było zrozumiałe. Nie znalazłem tam jednak odpowiedzi na moje pytania, dlatego pozwoliłem sobie zadać pytanie osobom bardziej doświadczonym.

Cel:
1. Program tworzący tablice z imionami i numerami tel a następnie wyświetlający ja na ekranie. Wielkość tablicy jest definiowana przez użytkownika.
2. Program, który pobiera oprócz imienia również nazwisko (i przechowuje je w tablicy dwuwymiarowej)

Ad. 1- Rozwiązanie:
C/C++
#include <iostream>
#include <conio.h>

int main()
{
    using namespace std;
    int ile;
    cout << "Podaj liczbe osob" << endl;
    cin >> ile;
    char imie[ ile ];
    int tel[ ile ];
    int licznik = 0;
   
    do
    {
        cout << "Podaj imie" << endl;
        cin >> imie[ licznik ];
        cin.sync();
        cout << "Podaj tel" << endl;
        cin >> tel[ licznik ];
        cin.sync();
        licznik++;
    } while( licznik < ile );
   
    licznik = 0;
    cout << "Wprowadziles nastepujace dane" << endl;
   
    do
    {
        cout << imie[ licznik ] << " ";
        cout << tel[ licznik ] << endl;
        licznik++;
    } while( licznik < ile );
   
   
    getch();
    return 0;
}

Problem:
Program zamiast podawać pełne imię zwraca tylko pierwszą jego literę.


Ad.2 - Rozwiązanie
C/C++
#include <iostream>
#include <conio.h>

int main()
{
    using namespace std;
    int ile;
    cout << "Podaj liczbe osob" << endl;
    cin >> ile;
    int dlugosc = 30;
    char imie_nazwisko[ ile ][ dlugosc ];
    int tel[ ile ];
    int licznik = 0;
   
    do
    {
        cout << "Podaj imie i nazwisko" << endl;
        cin.getline( imie_nazwisko[ licznik ][ dlugosc ], dlugosc ); //problem w argumencie 1
        cin.get();
        cout << "Podaj tel" << endl;
        cin >> tel[ licznik ];
        cin.get();
        cin.get();
        licznik++;
    } while( licznik < ile );
   
    licznik = 0;
    cout << "Wprowadziles nastepujace dane" << endl;
   
    do
    {
        cout << imie_nazwisko[ licznik ][ dlugosc ] << " ";
        cout << tel[ licznik ] << endl;
        licznik++;
    } while( licznik < ile );
   
   
    getch();
    return 0;
}

Problem
Pierwszy argument w cin.getline jest źle zdefiniowany. Pytanie jak powinno być poprawnie, żeby program wypełniał tablicę dwuwymiarową?

Mam nadzieję, że post tym razem nie jest dużo za długi :)


P-28647
BlackDante
» 2011-02-27 12:00:24
Ad2. a to trzeba używać getline'a od razu ? nie lepiej
C/C++
cin >> Dane[ licznik ][ 'imie_nazwisko' ];
oczywiście dane muszą być oddzielone spacją wtedy, w dodatku tak łatwo możesz stworzyć program który w odzielnych częściach tablicy będzie miał odzielnie imie i nazwisko, ale do tego to już chyba lepiej użyć kontenera map, a co do pierwszego to chyba zbyt zaspany jestem xD

P-28648
ison
» 2011-02-27 12:04:24
1)
otóż pisząc
C/C++
char nazwa[ x ];
deklarujesz tablicę znaków a nie tablicę stringów
zatem pisząc
cin >> imie[ licznik ];
 wczytujesz tylko jeden znak

C/C++
char imie[ ile ][ maksymalna_dlugosc_imienia ];
 - w ten sposób zadeklarujesz ile ciągów znaków

2)
tutaj podobnie jak wyżej
próbujesz przekazać tylko 1 znak do metody cin.getline() podczas gdy ten oczekuje tablicy ;)
P-28649
neke
Temat założony przez niniejszego użytkownika
» 2011-02-27 13:34:55
Ad.1
Dzienx. Problem rozwiązany po zmianie zniennej int na string.

Ad.2
To dalej nie jest dla mnie jasne.
Pomimo, że usunąłem z cin.getline drugą zmienną ("dlugość"), dalej nie idzie

Obecnie tworzę tablicę, która wygląda tak:
np.
ile=2
jan kos
ola kos

imie_nazwisko [0] [0] ='j';
imie_nazwisko [0] [1] ='a';
imie_nazwisko [0] [2] ='n';
imie_nazwisko [0] [3] =' ';
imie_nazwisko [0] [4] ='k';
imie_nazwisko [0] [5] ='o';
imie_nazwisko [0] [6] ='s';
imie_nazwisko [0] [...] =0;
imie_nazwisko [1] [0] ='o';
imie_nazwisko [1] [1] ='l';
imie_nazwisko [1] [2] ='a';
...
Wydaje się więc OK.

Będę wdzięczny za poprawienie kodu przy użyciu getline.
Podejrzewam, że problem będzie również przy wyświetlaniu tablicy dwuwymiarowej :)

C/C++
int main()
{
    using namespace std;
    int ile;
    cout << "Podaj liczbe osob" << endl;
    cin >> ile;
    int dlugosc = 30;
    string imie_nazwisko[ ile ][ dlugosc ];
    int tel[ ile ];
    int licznik = 0;
   
    do
    {
        cout << "Podaj imie i nazwisko" << endl;
        cin.getline( imie_nazwisko[ licznik ], dlugosc ); /*problem w argumencie 1
        */
        cin.get();
        cout << "Podaj tel" << endl;
        cin >> tel[ licznik ];
        cin.get();
        licznik++;
    } while( licznik < ile );
   
    licznik = 0;
    cout << "Wprowadziles nastepujace dane" << endl;
   
    do
    {
        cout << imie_nazwisko[ licznik ] << " ";
        cout << tel[ licznik ] << endl;
        licznik++;
    } while( licznik < ile );
   
   
    getch();
    return 0;
P-28651
ison
» 2011-02-27 16:05:09
char to znak
string to ciąg znaków

pisząc
C/C++
string imie_nazwisko[ ile ][ dlugosc ];
tworzysz 2 wymiarową tablicę ciągów znaków

zdecyduj się albo na
char imie_nazwisko[ ile ][ dlugosc ];

albo
string imie_nazwisko[ ile ];

poza tym metoda getline (http://www.cplusplus.com/reference/iostream/istream/getline/) jest dla cstringów czyli tablic charów a funkcja getline (http://www.cplusplus.com/reference/string/getline/) jest dla STLowych stringów
P-28659
neke
Temat założony przez niniejszego użytkownika
» 2011-02-27 17:03:06
dzięki.
Pomogła zmiana zmiennej ze string na char
P-28661
« 1 »
  Strona 1 z 1