Linia: if (i > 0) cout << endl;
w tym miejscu gdzie jest wprowadza w błąd czytającego. Jest to chytre ale i tak za każdym razemsprawdzasz, czy i > 0 a wiadomo już dawno że jest za każdym razem [gdy już nie jest zerem].
Więc nic nie zyskujesz, a zmniejszasz czytelność.
Czy nie lepiej robić tego sprawdzania na końcu pętli?:
if (i < ile - 1) cout << endl;
?
Jeżeli piszesz tylko “dla” kompilatora i dla siebie i jest AC to ok, ale jeżeli jest błą to lepiej mieć jasny i czytelny kod.
Czemu masz traki zagmatwany? Pewnie chciałeś uniknąć powtórzeń kodu, ale dzięki temu bardziej zagmatwałeś.
Zrezygnuj ze swojej “chytrej” funkcji rewerse, można się tu bez niej obejść.
Czyli prosto jak cep [w końcu komputer lubi prosto i jasno]"
wczytujemy
jeżeli skala == 0 od razu wypisujemy
jeżeli dodatgnia
w petli od zera do dlugosci
wypisujemy litere
spacej x skala-1
else [jeżeli skala ujemna
w petli od dlugosci do 0
wypisujemy litere
spacje x |skala| -1
Wydaje mi się że to byłoby bardziej czytelne. Ewentualnie wypisywanie spacji, mógłbyś zastąpić funkcją lub wcześniej “budować” string ze spacji o odpowiedniej długości.
Reszta jest milczeniem
ale jak jest Ac to ok, brawo.