C++ nie uznaje zapisu liczb po przecinku tylko po kropce. W prawdzie większość świata używa kropki a nie przecinka, to my mamy problem. Kiedy wpiszesz np. '123,456' to program uzna to za tekst i cin uzna, że jest to błąd - chcesz przypisać do liczby tekst, przez następne obiegi pętli cin już z pierwszego obiegu ma zapisany tekst w sobie i najpierw próbuje się go pozbyć znowu próbując zrobić to samo - zapisać tekst do liczby i znowu niepowodzenia, kolejny obieg - nawet nie masz możliwości nic wpisać bo po pierwszym razie już w std::cin zalegają dane, które nie zostały użyte. Zainteresuj się wychwytywaniem błędów:
#include <limits> // na poczatku programu dla std::numeric_limits
// dalej w programie
std::cin >> oceny[i];
if(std::cin.fail() || !std::cin.good())
{
std::cin.clear(); // wyczysc informacje o bledzie
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); // czyszczenie bufora
std::cout << "Wystapil blad, musisz podac liczbe, nie tekst." << std::endl;
i--; // zmniejszamy i by w nastepnym obiegu znowu wczytac ten sam indeks.
}