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

Wczytywanie danych do tablicy

Ostatnio zmodyfikowano 2011-08-24 20:38
Autor Wiadomość
capajera18
Temat założony przez niniejszego użytkownika
Wczytywanie danych do tablicy
» 2011-08-22 18:29:46
Witam wszystkich, na poczatek:
Chce by program działał w taki sposób że uzytkownik podaje ilosc druzyn
Dalej by wpisal nazwy tylu druzyn ile ich podał,
I przekazal te informacje do tabeli.

Moj problem polega na tym ze nie wiem czego mi tu brakuje i co zle napisalem:

W kodzie ponizej, program dziala w taki sposob ze kiedy przekazuje ze chce wpisac 2 druzyny
np. 0 legia Warszawa, 1 FC barcelona, i kiedy juz mi to przekaze do tabeli w 2petli to:
zmienna typu char wpis <- jest nadpisywana i daje mi to podwojne wypisanie -
0 | 0 FC barcelona
1 | 0 FC barcelona

C/C++
#include <iostream>

using namespace std;

int main()
{
    int liczba_dr = 0;
    int licznik = 0;
   
    cout << "Podaj ilosc druzyn: ";
    cin >> liczba_dr;
    cin.get();
   
    int liczba_druzyn[ liczba_dr ];
   
    const int lit = 100;
    char wpis[ liczba_druzyn[ liczba_dr ] ][ lit ];
   
   
    do
    {
        cout << "DRUZYNA nr: " << licznik << endl;
        cin.getline( wpis[ liczba_druzyn[ liczba_dr ] ], lit );
        licznik++;
       
    } while( licznik < liczba_dr );
   
    cout << "\n\nDANE ZESPOLY:: " << endl;
    licznik = 0;
    liczba_druzyn[ liczba_dr ] = 0;
    do
    {
       
        cout << licznik << " | " << liczba_druzyn[ liczba_dr ] << " | " << wpis[ liczba_druzyn[ liczba_dr ] ] << endl;
        licznik++;
       
       
    } while( licznik < liczba_dr );
   
   
    return 0;
}



Problem rozwiazalem dodajac w kazdej petli linijke
C/C++
liczba_druzyn[ liczba_dr ] ++;

CZYLI:

C/C++
#include <iostream>

using namespace std;

int main()
{
    int liczba_dr = 0;
    int licznik = 0;
   
    cout << "Podaj ilosc druzyn: ";
    cin >> liczba_dr;
    cin.get();
   
    int liczba_druzyn[ liczba_dr ];
   
    const int lit = 100;
    char wpis[ liczba_druzyn[ liczba_dr ] ][ lit ];
   
   
    do
    {
        cout << "DRUZYNA nr: " << licznik << endl;
        cin.getline( wpis[ liczba_druzyn[ liczba_dr ] ], lit );
        licznik++;
        liczba_druzyn[ liczba_dr ] ++; // dodana linijka
       
    } while( licznik < liczba_dr );
   
    cout << "\n\nDANE ZESPOLY:: " << endl;
    licznik = 0;
    liczba_druzyn[ liczba_dr ] = 0;
    do
    {
       
        cout << licznik << " | " << liczba_druzyn[ liczba_dr ] << " | " << wpis[ liczba_druzyn[ liczba_dr ] ] << endl;
        licznik++;
        liczba_druzyn[ liczba_dr ] ++; // dodana linijka
       
       
    } while( licznik < liczba_dr );
   
   
    return 0;
}


Musze przyznac ze pomoglo bo wypisalo mi normalnie w kolejnosci podania druzyn przyklad

PODAJ ILOSC DRUZYN: 2
wpisz druzyne 0: Legia Warszawa
Wpisz druzyne 1: FC barcelona

PODANE DRUZYNY:
0 | 0 Legia Warszawa
1 | 1 FC barcelona


AAALE nie wsponialem o gwozdzia problemu w programie otóż,
w obu przypadkach kiedy wpisze ze chce Wypisac 3 lub 4 druzyny, program przestaje nagle dzialac i wykazuje mi blad, ale kiedy ze chce wypisac 5 czy 6 druzyn wtedy juz jest normalnie problem sie
pojawia tez kiedy chce wypisac 7 druzyn .

Coz mam zrobic by  dobrze dzialal moj program ??
Pozdrawiam

P-39684
ison
» 2011-08-22 18:35:37
C/C++
int liczba_druzyn[ liczba_dr ];
const int lit = 100;
char wpis[ liczba_druzyn[ liczba_dr ] ][ lit ];
ten kawałek kodu jest bez sensu ;)
P-39686
capajera18
Temat założony przez niniejszego użytkownika
» 2011-08-22 18:46:41
czyli tj główna przyczyna tych błędów tak ??
godz 19:23
I cisza :-) :-)

godz 19 : 33 > i cisza :-)

To okaże mi ktos pomoc do godz 20:00 ??
Czy wytłumaczy mi ktos co zrobiłem zle , bardzo Prosze
P-39687
malan
» 2011-08-22 21:17:40
C/C++
std::vector < std::string > teams;
?
P-39704
jankowalski25
» 2011-08-22 22:14:15
Wszystkie zmiany wprowadziłem do kodu podanego w pierwszym poście.
C/C++
cin >> liczba_dr;
cin.get();

int liczba_druzyn[ liczba_dr ];
Nie zabezpieczyłeś programu przed wprowadzeniem nieprawidłowej liczby.
C/C++
const int lit = 100;
char wpis[ liczba_druzyn[ liczba_dr ] ][ lit ];
Tworzysz dwuwymiarową tablicę. Pierwsza jej część powoduje błąd krytyczny, a druga ma rozmiar 100. Stałą lit możesz usunąć. Przyjrzyj się pierwszej części. Próbujesz uzyskać dostęp do tablicy liczba_druzyn o indeksie równym zmiennej liczba_dr. W ten sposób wychodzisz poza zakres tablicy liczba_druzyn. A nawet, gdybyś nie wyszedł poza zakres tablicy, to i tak przypisujesz pierwszemu rozmiarowi tablicy wpis wartość z tablicy liczba_druzyn, która jest przypadkowa. Musisz koniecznie zmienić rozmiar pierwszego elementu tablicy wpis.
C/C++
cin.getline( wpis[ liczba_druzyn[ liczba_dr ] ], lit );
Tutaj zmieniasz lit na 100 oraz modyfikujesz wartość pierwszego elementu tablicy wpis.
C/C++
liczba_druzyn[ liczba_dr ] = 0;
W ten sposób wychodzisz poza zakres tablicy. Poza tym nie zerujesz całej tablicy, więc musisz dać tu pętlę, aby nie zostały w niej przypadkowe wartości.
C/C++
cout << licznik << " | " << liczba_druzyn[ liczba_dr ] << " | " << wpis[ liczba_druzyn[ liczba_dr ] ] << endl;
Tutaj pozmieniaj pierwsze elementy obu tablic i dodatkowo zamiast
C/C++
cout << licznik //dalszy kod
wpisz
C/C++
cout << licznik + 1 //dalszy kod
aby poprawnie wypisać numery drużyn.

Po wprowadzeniu tych modyfikacji u mnie wszystko działa.
P-39715
capajera18
Temat założony przez niniejszego użytkownika
cd...
» 2011-08-24 18:05:26
Troche zmodyfikowałem kod
Brakuje mi zmiennej dzieki ktrej nie beda
nadpysywały się podane dane


C/C++
#include <iostream>

using namespace std;

int main()
{
   
    int licznik = 0;
   
    cout << "Podaj ilosc druzyn: ";
    cin >> licznik;
    cin.get();
   
    int liczba_dr = 0;
   
    char wpis[ licznik ][ 100 ];
   
    do
    {
        cout << "DRUZYNA nr: " << liczba_dr << endl;
        cin.getline( wpis[ licznik ], 100 );
        liczba_dr++;
       
    } while( liczba_dr < licznik );
   
    cout << "\n\nDANE ZESPOLY:: " << endl;
    liczba_dr = 0;
   
    do
    {
       
        cout << liczba_dr << " | " << wpis[ licznik ] << endl;
        liczba_dr++;
       
       
    } while( liczba_dr < licznik );
   
    return 0;
}



Wynik tego programu wyglada tak




Podaj ilosc druzyn: 3
DRUZYNA nr: 0
legia
DRUZYNA nr: 1
lech
DRUZYNA nr: 2
arka

DANE ZESPOŁY::
0 | arka
1 | arka
2 | arka


mecze sie nad tym 6 dzień i nie moge sobie z tym poradzic
P-39865
jankowalski25
» 2011-08-24 20:38:57
C/C++
cin >> licznik;
cin.get();

int liczba_dr = 0;

char wpis[ licznik ][ 100 ];
Ta część programu wciąż nie jest zabezpieczona przed wczytaniem nieprawidłowej liczby. Chodzi o to, że gdy jako liczbę drużyn wpiszesz np. literę, to program może wyświetlić błąd krytyczny. Dzieje się tak dlatego, że liczbą elemetów tablicy nie może być litera. Musisz tuż po wczytywaniu liczby wstawić pętlę, która uniemożliwi podanie nieprawidłowych danych, np. liter.
C/C++
cout << "DRUZYNA nr: " << liczba_dr << endl;
Czy istnieje drużyna o numerze zero? Aby poprawnie wyświetlić numery drużyn, zamiast powyższego kodu, wpisz:
C/C++
cout << "DRUZYNA nr: " << liczba_dr + 1 << endl;
Używasz zmiennej licznik jako element tablicy. Przez to wychodzisz poza jej zakres. Myślę, że powinieneś użyć zmiennej liczba_dr i napisać
C/C++
cin.getline( wpis[ liczba_dr ], 100 );
W następnej pętli zauważyłem dwa błędy. Po pierwsze wypisujesz nazwę drużyny zero. Dodatkowo znowu wychodzisz poza zakres tablicy.
C/C++
cout << liczba_dr << " | " << wpis[ licznik ] << endl;
Zamiast zmiennej licznik użyj zmiennej liczba_dr i wypisz zwiększoną wartość zmiennej liczba_dr, aby nie było drużyny o numerze zero:
C/C++
cout << liczba_dr + 1 << " | " << wpis[ liczba_dr ] << endl;

Aby uniknąć kolejnych błędów z tablicami, zwracaj szczególną uwagę na to, czy nie wychodzisz poza zakres danej tablicy. Jeśli będziesz miał błąd w kodzie, możesz wykomentować niektóre fragmenty, aby sprawdzić, w którym miejscu występuje problem.
P-39878
« 1 »
  Strona 1 z 1