Wyświetlanie "piramidki" z dużych liter, weryfikacja sposobu wykonania programu

0

Witajcie. Miałem utworzyć program, który wyświetli znaki w następujący sposób, np:
A
BAB
CBABC
itd.

Troszkę - choć może wstyd się przyznać - musiałem nad nim pomyśleć i stworzyłem w pełni działający program, którego kod zamieszczam poniżej:
[code = c]
#include <stdio.h>
/#define n_wierszy 5/
void odstep (int a, int n_wierszy);
int main (void)
{
int i, n, n_wierszy;
char c;
printf("Wprowadz duza litere: \n");
scanf("%c", &c);
n_wierszy = c + 1 - 'A';
for (n=1; n<=n_wierszy; n++)
{
odstep (n, n_wierszy);
for(i=n_wierszy-1; i>=n_wierszy - n; i--)
printf("%c", c-i);
for(i=n-1; i>0; i--)
printf("%c", (c-n_wierszy) + i);
printf("\n");
}

return 0;
}
void odstep (int a, int n_wierszy)
{
while (n_wierszy -a > 0)
{
printf(" ");
a++;
}
}
[/code]
Program jest w 100% sprawny, działa dokładnie tak jak sobie bym tego życzył (zmodyfikowałem wcześniejszą wersję, która była sztywno ustawiona na 5 wierszy). Tu pytanie do was - czy program można było zrobić w prostszy sposób (bez użycia instrukcji if i ogólnie, bardziej zaawansowanych od pętli elementów języka C) i czy wpłynie to jakoś na wydajność programu? (tj wiem że przy takim prostym programie nie ma to znaczenia, ale chciałbym się uczyć optymalizacji kodu od piaskownicy ;))
Z góry dziękuję wszystkim za pomoc

0
#include <iostream>
#include <cmath>
void drawPyramid(unsigned int height)
{
    for(int i = 1; i<=height;i++, std::cout << "\n")
        for(int j = 0; j<=height+i-2;j++)
            std::cout << char(('A' + fabs(height-.5-j-.5)) * !(j < height-i));
}
int main()
{
    drawPyramid(23);
}

brakuje tylko zabezpieczenia przez nieprawidłowym argumentem funkcji ale to szczegół

ps. Można skrócić do dwóch linii (przenosząc couta do drugiego for) ale jest konieczne niepewne ++j-1 w wyrażeniu
ps2. NA PEWNO da się to machnąć w jednej linii, ale to już się niech ktoś inny bawi ;p

0

Może wolniej, ale bardziej elegancko - rekurencyjnie:

void print(char c)
{
    printf("%c", c);
    if (c == 'A')
        return;
    print(c-1);
    printf("%c", c);
}

void spaces(int n)
{
    while (n-- > 0)
        printf(" ");
}

int main(int argc, char** argv)
{
    char letter, c;
    printf("Podaj duza litere: ");
    scanf("%c", &letter);
    for (c = 'A'; c <= letter; ++c) {
        spaces(letter - c);
        print(c);
        printf("\n");
    }
    return 0;
}
0

Ach, zapomniałem dodać, było polecenie, aby korzystać z pętli zagnieżdżonych.

I na tym etapie (253 (...) strona książki "Język C. Szkoła programowania") nie ma jeszcze ifów (choć wiem co robi if, else, else if). Chodzi mi głównie o to, czy to, że przekombinowałem troszkę (prawdopodobnie) ten program wpłynie negatywnie na wydajność?
Druga sprawa - nie wiem co znaczą te zmienne (chyba) w zbiorze argumentów f-cji main. Książka przed którą siedzę powiedziała mi póki co, że standard dla C to "int main(void)".

@Sopelek
Nie znam biblioteki cmath, jestem na w/w etapie dopiero... Ale brnę do przodu :).
No i C++ się nie uczę póki co :).
Zauważyłem problem który zgłosiłeś, był już rozwiązany przed twoją odpowiedzią, tu kod:

#include <stdio.h>
/*#define n_wierszy 5*/
void odstep (int a, int n_wierszy);
int main (void)
{
    int  i, n, n_wierszy;
    char c;
    printf("Wprowadz duza litere: \n");
    scanf("%c", &c);
    n_wierszy = c + 1 - 'A';
    for (n=1; n<=n_wierszy && n_wierszy > 0 && n_wierszy < 27; n++)
            {
             odstep (n, n_wierszy);
            for(i=n_wierszy-1; i>=n_wierszy - n; i--)
                printf("%c", c-i);
            for(i=n-1; i>0; i--)
                printf("%c", (c-n_wierszy) + i);
            printf("\n");
            }

return 0;
}
void odstep (int a, int n_wierszy)
{
    while (n_wierszy -a > 0)
        {
            printf(" ");
            a++;
        }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1