Kiepski ze mnie specjalista, ale nikt się nie kwapi, żeby odpowiedzieć
Ale trudno, postaram się wyjaśnić jak tylko potrafię, choć nie do końca wiem w czym problem xd
1. Ogólnie
C++ w wejściu i wyjściu posługuje się strumieniami, czyli pewnymi (pewnymi, bo ich długość nie jest określona) ciągami bajtów (wydaje się to dość logiczne, spójrz na nazwę pierwszej biblioteki, którą dodałeś - input output stream).
cin.ignore służy do tego na co wskazuje jej nazwa - do odrzucania kolejnych znaków w strumieniu. Jeśli np. zechcesz sobie pobrać dane:
int number;
string myStr;
cin >> number;
getline(cin,myStr);
cout << number << " + " << myStr << endl;
i wpiszesz sobie 123 > enter > cokolwiek > enter, wówczas otrzymasz wynik
123 +
Stanie się tak dlatego, że naciskając enter do strumienia dostaje się znak nowej linii - \n. W strumieniu znajduje się więc 123\n. 123 zostanie sparsowane na liczbę i przypisane zmiennej number, natomiast znak nowej linii zostanie w tym strumieniu. Getline natomiast działa tak, że wczytuje ze strumienia wszystko, aż do napotkania znaku nowej linii. Skoro więc napotka go na samym początku, zatem sparsuje wielkie nic i przypisze to do myStr.
To był jedynie przykład, ale głównie z jego powodu należy strumień wejściowy oczyścić przed wczytywaniem kolejnych danych. Celem jest uniknięcie niezamierzonego parsowania tego co z jakiegoś powodu znalazło się w strumieniu, albo zwyczajne usunięcie wadliwych danych.
2. cin.ignore
Załóżmy strumień 234324_2354_123 Powiedzmy, że znaki podłogi dostają się tam z pewnej specyfikacji programu, jednakże przy odczycie nam przeszkadzają. Należy więc po każdym sparsowaniu cyfr na liczbę oczyścić z nich bufor. Gdy odczytamy pierwszą liczbę pozostanie nam _2354_123. Wówczas korzystając z cin.ignore(1000,'_') strumień zostanie oczyszczony i będzie wyglądał tak 2354_123, ponieważ będzie on odrzucał kolejne znaki pod dwoma warunkami. Dopóki nie odrzuci 1000 znaków, albo nie znajdzie znaku podłogi. Dalej działamy analogicznie.
3. Podsumowanko
Musisz więc zwyczajnie czyścić bufor przy każdym kolejnym odczycie danych. Czyli już po tym kiedy pobierzesz informację o tym czy wystąpił jakiś błąd czy nie.
Btw. chyba dobrze zrozumiałeś na czym polega wykorzystanie cin.ignore, jednakże użyłeś go tylko raz, a więc tylko przy pierwszym pobraniu danych bufor zostanie oczyszczony z śmieci. Co więc kiedy coś nieodpowiedniego dostanie się przy drugim wprowadzeniu?
4. return
Jest potrzebny i nie. Zależy od języka, w którym piszesz. Np. w takim C++ funkcja obędzie się bez returna, nawet jeśli jej typ sugeruje, że powinna go mieć. Warto jednak wiedzieć do czego on jest. Dosłownie zwraca pewną wartość. Ponieważ jednak funkcje to wyższy szczebel w programowaniu, a nie chcę Ci niczego mieszać, skoro i tak zdążysz do tego dojść, to powiem Ci tylko tyle, że return 0 w tym przypadku informuje programistę, że program wykonał się bez błędu (jakiś runtime'ów czy innego badziewia).
Ale się rozpisałem xd
Jeśli jednak nie zrozumiałeś mojego bełkotu to zajrzyj tutaj odnośnie cin.ignore: