To co opisałeś dzieje się dlatego, że po pierwszym pobraniu wartości program nie wie co to jest '2', którą wprowadzasz. Uwzględniłeś tylko co dzieje się, gdy użytkownik wprowadzi jedynkę. Gdy wpiszesz '2', to przy pierwszym if program nie ma żadnych instrukcji co zrobić z taką wartością więc nie robi nic. Kilka instrukcji później wartość jest pobierana ponownie i tutaj z kolei program zrobi cokolwiek tylko w przypadku, gdy wprowadzisz '2', bo nie ma poleceń co robić z innymi wartościami. Podobna sytuacja będzie przy trzecim pobraniu wartości, gdybyś w tym miejscu nagle zażyczył sobie obliczyć pole kwadratu to program nie zrobiłby nic bo ma instrukcje do wykonania tylko w sytuacji, gdy wartość jest równa '3'.
Co do poprawienia tego, to jak już ktoś wspomniał wcześniej, wprowadzona liczba powinna wpadać na if, który uwzględnia wszystkie możliwości, a później program na podstawie tej wartości powinien wskoczyć w odpowiedni blok instrukcji do wykonania.
Gdybyś zapisał to np.
if(prostokat == 1)
{
//instrukcje na pole prostotkata
}
else if(prostokat == 2)
{
//instrukcje na pole kwadratu
}
else if(prostokat == 3)
{
//instrukcje na pole trojkata
}
wtedy program odczyta wartość i sprawdzi pierwszy warunek, jeśli nie uda się go spełnić wtedy sprawdzi drugi itd. a wskoczy tylko tam, gdzie uda mu się uzyskać zgodność.
Zamiast instrukcji if można też użyć instrukcji switch:
switch(prostokat)
{
case 1:
//jakieś instrukcje
break;
case 2:
// jakieś instrukcje
break;
itd.
}
efekt będzie taki sam.