[C++] Zamykanie okna konsoli przed wykonaniem programu

Witam,

Mam program, który pobiera wartości int z klawiatury, po wpisaniu innej wartości niż int np. znaku ‘|’ wychodzi z pętli i… no własnie wychodzi również z konsoli, a nie pozwala wpisać wartości n(ile liczb początkowych chcę zsumować).

vectorliczby;

	int liczba;

	while(cin >> liczba){

		if(cin)

			liczby.push_back(liczba);

		else

			cout << "Zle dane wejsciowe: " << endl;

	}

	cout << "Podaj liczbe N: " << endl;

	int n;

	cin >> n;

	int suma = 0;

	if (n <= liczby.size()){

		for (int i = 0; i < n; ++i)

			suma += liczby[i];

	} else 

		cout << "Za duza wartosc n, maksymalna wartosc n to: " << liczby.size() << endl;


	cout << "Suma trzech pierwszych liczb: " << suma << endl;

Wychodzi z pętli bo nie pytasz o tą liczbę. Napisz lepiej czego oczekujesz, oraz czego nie rozumiesz :slight_smile:

Chcę napisać program, który wczytuje serię liczb za pomocą pętli while i zapisuje je w vector. Gdy użytkownik skończy podawanie liczb(wpisując dowolny znak w pętli while zamiast wartości int)powinien przerwać wczytywanie liczb i spytać (cin >> n) ile wartości początkowych z wektora ma zsumować. Ostatnim krokiem jest wypisanie sumy n pierwszych liczb.

Nie rozumiem dlaczego po wpisaniu np: 2, 4, 6, | program kończy zadanie zamiast wypisać “Podaj liczbe N:”?

while(cin >> liczba){

      if(cin)

         liczby.push_back(liczba);

      else

         cout << "Zle dane wejsciowe: " << endl;

   }

Tak to raczej nie zadziała. Wczytuj liczby w w pętli niestkończonej (while(true)) a po wystąpieniu warunku końcoqwego rób po prostu breaka.

Poza tym to sumowania cześci kontenera służy funkcja partial_sum

Zrobiłem tak ale nadal nie działa prawidłowo - zamyka konsole.

while(true){

		cin >> liczba;

		if(cin)

			liczby.push_back(liczba);

		else

			break;

	}

Strumień wejściowy CIN posiada swoje falagi:

goodbit - wszystko ok;

eofbit - koniec strumienia z pliku;

failbit - błąd zwiazany ze złym typem przyjętej danej, tak jak tu pobiera char zamiast int;

badbit - w ogóle jakaś klapa :stuck_out_tongue:

Po wystąpieniu któryś z tych trzech ostatnich, aby strumień mógł dalej pracować trzeba go wyczyścić, a następnie zsynchronizować, żeby usunąć wszystko z bufora :

cin.clear(cin.rdstate() & ~ios::failbit); // tu czyścimy tylko flagę failbit;

lub poprostu 

cin.clear(); // czyścimy cały strumień;

cin.sync(); // synchronizacja;

no i w programie :

while(true)

{

	if(cin >> liczba)

		liczby.push_back(liczba);

	else

		break;

}

cin.clear();

cin.sync();

Wszystko działa dzięki:)