• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

[C++] [vector] [wysypywanie sie]

Object Storage Arubacloud
0 głosów
762 wizyt
pytanie zadane 27 września 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)

Hej,
napisałem program, który ma wczytać serię liczb i zapisać je w wektorze.Następnie, gdy użytkownik skończy wpisywanie liczb, program pyta, ile z nich ma zsumować (zaczynając od początku wektora ofc).

Problem polega na tym, że program w ogóle nie czaka na cina, tylko od razu wykonuje się pętla. Dlaczego? frown

//zapisuje podane przez użytownika liczby do wektora tab, a następnie wypisuje sumę n pierwszych z nich

#include <iostream>
#include <vector>


using namespace std;

int main()
{
    vector <double> tab;
    double liczba, suma=0;
    int ile;

    cout<<"Witaj, podaj liczby: "<<endl;

        while(cin>>liczba) tab.push_back(liczba);

    cout<<"Podaj ile liczb wyswietlic: "<<endl;
    cin>>ile;

    for (int i=0; i<tab[ile]; i++) {suma+=tab[i];}
    cout<<"Suma wynosi: "<<suma<<endl;

return 0;
}

 

1
komentarz 28 września 2017 przez criss Mędrzec (172,590 p.)
Tzn. od razu wykonuje się for z 22. linii?

Btw. dlaczego warunkiem fora jest i<tab[ile] ?
komentarz 28 września 2017 przez Szahid Pasjonat (20,930 p.)
Co ma zakończyć wprowadzanie danych ?

1 odpowiedź

+1 głos
odpowiedź 27 września 2017 przez j23 Mędrzec (194,920 p.)
edycja 27 września 2017 przez j23

A nie tak przypadkiem powinno być:

cout << "Podaj ile liczb: \n";
cin >> ile;

cout <<"Podaj liczby: \n";

while(ile-- && cin >> liczba) tab.push_back(liczba);

czyli najpierw podajesz, ile liczb chcesz wprowadzić, a później podajesz liczby.

 

Można też tak:

cout <<"Podaj liczby (oddzielone spacja): ";
    
string s;
    
if(getline(cin, s))
{
     istringstream iss(move(s));
     while(iss >> liczba) tab.push_back(liczba);
}

 

PS. warunek w for poprawny nie jest...

komentarz 27 września 2017 przez Geralt_z_Rivii Nowicjusz (240 p.)

No wydaje mi się, że nie.
Na tym polega zaleta wektora, że nie trzeba od początku podawać ile będzie elementów (jak w tablicy), tylko przerywa się wczytywanie w odpowiednim momencie, wklepaniem elementu innego niż deklarowany. Tutaj wektor ma zawierać double, więc wystarczy wpisać literę i już.
To chyba działa jak należy.

Jakaś wskazówka dot. tej pętli? 

1
komentarz 28 września 2017 przez j23 Mędrzec (194,920 p.)

Po wpisaniu litery strumień wchodzi w stan błędu i dlatego nie czeka na ile. Wyczyść flagę błędu (clear()) i usuń zalegające znaki w linii (ignore()).

komentarz 28 września 2017 przez Geralt_z_Rivii Nowicjusz (240 p.)

Ok, chyba mamy to! 
Oczywiście poprawiłem też pętlę i dodałem małą kontrolę błędów. Teraz wygląda tak:

//zapisuje podane przez u¿ytownika liczby do wektora tab, a nastêpnie wypisuje sumê n pierwszych z nich

#include <iostream>
#include <vector>


using namespace std;

int main()
{
    vector <double> tab;
    double liczba, suma=0;
    int ile;

    cout<<"Witaj, podaj liczby: "<<endl;

        while(cin>>liczba) tab.push_back(liczba);

        cin.clear();
        cin.ignore();

    cout<<"Podaj ile liczb wyswietlic: "<<endl;
    cin>>ile;

    if (ile>tab.size())                                                  //sprawdzenie zakresu
    {cerr<<"Wektor nie zawiera tylu liczb!";
    return 0;}

    for (int i=0; i<ile; i++) {suma+=tab[i];}
    cout<<"Suma wynosi: "<<suma<<endl;

return 0;
}

 

1
komentarz 28 września 2017 przez j23 Mędrzec (194,920 p.)
cin.ignore(numeric_limits<streamsize>::max(), '\n');

Tak daj, będziesz miał pewność, że wszystko, co użytkownik wpisał, zostało usunięte i że cin będzie czekać na podanie ile.

Podobne pytania

0 głosów
0 odpowiedzi 184 wizyt
0 głosów
1 odpowiedź 259 wizyt
pytanie zadane 19 marca 2022 w C i C++ przez pasjonat_algorytmiki Pasjonat (19,540 p.)
0 głosów
2 odpowiedzi 501 wizyt

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...