Muszę przyznać, że postarałeś się o to by Twój kod był trudny w interpretacji. Powinieneś używać zdecydowanie bardziej oczywistych nazw zmiennych, bo tak wiele pojedynczych liter potrafi namieszać w głowie.
Szczególnie jeśli chcesz by ktoś pomógł ci rozwiązać problem, powinieneś ułatwić mu zrozumienie Twojego toku myślenia (oczywiście dla ciebie kod jest zrozumiały, bo sam go napisałeś).
Weź pod uwagę, że z punktu widzenia kompilatora, nie ma absolutnie, żadnej różnicy w tym jak nazywasz zmienne, więc po co utrudniać sobie życie.
Do rzeczy:
Żeby zawsze wyświetlać poprawną liczbę trójkątów, powinieneś inaczej obliczać a (liczbę wierszy do narysowania):
int a = 2 + (h * (h + 1)) / 2;
Jeśli chodzi o rysowanie podstawy trójkąta: możesz wprowadzić sobie dodatkową zmienną do procedury poziomy, która będzie określać czy należy narysować podstawę (np. typu bool):
void poziomy(int f, int n, int toth, bool podstawa)
a następnie w if-ie z lini nr 27 sprawdzać, czy ta wartość wynosi true.