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

[C++] Przypadkowe wartości zmiennych w strukturach.

Ostatnio zmodyfikowano 2017-08-26 21:57
Autor Wiadomość
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)
C/C++
#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.
P-164311
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.
C/C++
cin >> numer;
//numer++; <<-- to po co?
if( numer > 0 && numer <= 20 )
     wypisz( towar[ numer - 1 ] ); // indeksowanie jest od zera

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()
.
P-164312
« 1 »
  Strona 1 z 1