To może tak:
1. Zamiast sprawdzać czy ze strumieniem jest wszystko dobrze, sprawdź czy strumieniowi coś się nie stało:
if(std::cin.fail()) {
break;
}
Przerwie to pętlę i pokaże ostateczny wynik. Jeżeli chcesz, aby strumień działał dalej, to użyj funkcji clear i sync:
if(std::cin.fail()) {
std::cin.clear();
std::cin.sync();
}
2. Jak dla mnie najlepiej byłoby zrobić tak:
while(std::cin >> ocena && ocena != 0) {
// Obliczenia...
}
W warunku pętli wczytujemy ocenę, jednocześnie sprawdzając czy ze strumieniem wszystko dobrze oraz sprawdzamy czy ocena jest różna od 0.
Pozdrawiam! :D