[C++] Przypadkowe wartości zmiennych w strukturach.
Ostatnio zmodyfikowano 2017-08-26 21:57
SzymSzym Temat założony przez niniejszego użytkownika |
[C++] Przypadkowe wartości zmiennych w strukturach. » 2017-08-26 21:42:32 Program ma za zadanie zapisać w tablicy struktur kilka informacji na temat towarów - nazwę towaru, cenę, ilość i nazwę dostawcy, a następnie pozwolić odczytać informacje na temat dowolnego z towarów. Problem leży w tym, że przy odczytywaniu zmienne przyjmują przypadkowe wartości, np. Nazwa towaru: Cena: 3.30498e-039 Ilosc: 0 Nazwa dostawcy: Wartości te są takie same, cokolwiek wpiszę. Tu kod (cały, co nie wiem w którym fragmencie leży problem) #include <iostream> #include <cstdio> #include <string> using namespace std;
struct dane { string nazwa; float cena; int ilosc; string dostawca; };
struct dane wczytaj() { static struct dane towar; cout << "Nazwa towaru: "; cin >> towar.nazwa; cout << endl << "Cena: "; cin >> towar.cena; cout << endl << "Ilosc: "; cin >> towar.ilosc; cout << endl << "Nazwa dostawcy: "; cin >> towar.dostawca; cout << endl; return towar; } void wypisz( struct dane towar ) { cout << "Nazwa towaru: " << towar.nazwa << endl; cout << "Cena: " << towar.cena << endl; cout << "Ilosc: " << towar.ilosc << endl; cout << "Nazwa dostawcy: " << towar.dostawca << endl; }
int main() { cout << "Podaj dane:" << endl << endl; struct dane towar[ 20 ]; char spr; int numer = 0; for( int i = 0; i < 20; i++ ) { towar[ i ] = wczytaj(); cout << "Czy chcesz wczytac kolejne dane? (Y/N) "; cin >> spr; if( spr != 'Y' && spr != 'y' ) { break; cout << endl << "Zapisales dane pod numerem " << i + 1 << endl; } cout << endl << "Zapisales dane pod numerem " << i + 1 << endl; cin.clear(); cin.sync(); } do { cout << "Czy chcesz odczytac dane? Jesli tak, podaj numer, jesli nie, wpisz 555. "; cin.clear(); cin.sync(); cin >> numer; numer++; if( numer > 0 && numer <= 20 ) wypisz( towar[ numer ] ); } while( numer != 555 ); return 0; }
Próbowałem już (jak zresztą widać na kodzie) czyścić bufor funkcjami cin.clear() i cin.sync() i ustawiać zmienne w funkcjach jako statyczne, co nie zadziałało. Dodam jeszcze kilka być może istotnych szczegółów: Program działał dobrze, kiedy polegał tylko na odczytaniu i wypisaniu owych danych (wtedy w int main było tylko wywołanie funkcji wczytaj i wypisz), ale nie potrafił wczytać danych przez getline (co ciekawe potrafił wczytać w ten sposób nazwę towaru, ale nazwę dostawcy już nie). Poza tym używania struktur uczyłem się z dość starej książki i być może część jest nieaktualna. |
|
karambaHZP |
» 2017-08-26 21:57:35 Wypisujesz inne dane niż tego oczekujesz. Indeksowanie tablic jest od zera więc numer++ tutaj nie ma sensu, chyba że ma inne znaczenie, ale i tak psuje ci całość. Naucz się korzystać z debuggera. cin >> numer;
if( numer > 0 && numer <= 20 ) wypisz( towar[ numer - 1 ] );
Jest jeszcze kilka niuansów: - w C++ nie trzeba stosować słowa struct przed każdym użyciem własnego typu dane . - zapomnij o std::cin.sync() i przyzwyczaj do std::cin.ignore() . |
|
« 1 » |