Strona główna » Algorytmy » Artykuły » Choinka w Konsoli
 

Choinka w Konsoli

Zadanie

Zadanie polega na narysowaniu choinki bezpośrednio w systemowej konsoli. Algorytm powinien rysować tyle warstw ile zdecyduje użytkownik. Napisz dwie wersję: wypełnioną choinkę oraz tylko kontury. Przyjmujemy, że każda warstwa choinki przypomina swoim wyglądem trójkąt. Dodatkowo drzewko powinno posiadać pieniek oraz opcjonalnie gwiazdkę na czubku.

Implementacja

Wypełniona Choinka

Choinka będzie się składać z kolejnych linijek tekstu. Części choinki można wyśrodkować dopisując z lewej strony odpowiednią ilość znaków przerwy. Jak można poniżej zauważyć przyjmujemy, że każda warstwa zaczyna się od jednego znaku, a kolejne linie warstwy to kolejne liczby nieparzyste: 1, 3, 5, ...

  1.   #
  2.  ###
  3.   #
  4.  ###
  5. #####
  6.   #

Do narysowania takiej choinki potrzebne są tylko dwa znaki: # oraz spacja. Poniższy kod funkcji rysujChoinke() generuje powyższy przykład.

  1. void rysujChoinke(int warstw) {
  2.   int max = warstw * 2 + 1;
  3.   for (int i = 1; i <= warstw; i++) {
  4.     for (int j = 0; j <= i; j++) {
  5.       int znakow = 2 * j + 1;
  6.       cout << string((max - znakow)/2, ' ');
  7.       cout << string(znakow, '#');
  8.       cout << endl;
  9.     }
  10.   }
  11.   cout << string(max / 2, ' ') << "#";
  12. }

Przed rozpoczęciem rysowania choinki należy określić jak szeroka jest na dole. Bez tego nie będzie możliwe jej wyśrodkowanie. Wśrodku funkcji znajdują się dwię pętle: pierwsza rysuje kolejne warstwy, a druga części rysowanych warstw.

Kontury Choinki

Bardziej skomplikowanie wygląda choinka składająca się z samych konturów. Wykorzystuje ona więcej znaków, ale różni się jedynie sposobem wypisania kolejnych wierszy. Tym razem dodatkowo została dorysowana opcjonalna gwiazdka na szczycie.

  1.    *
  2.   / \
  3.  /___\
  4.   / \
  5.  /   \
  6. /_____\
  7.   | |

Oto zaktualizowany kod funkcji rysujChoinke(), która wypisuje choinkę jak wyżej.

  1. void rysujChoinke(int warstw) {
  2.   int max = (warstw + 1) * 2 + 1;
  3.   cout << string(max / 2 + 1, ' ') << "*" << endl;
  4.   for (int i = 1; i <= warstw; i++) {
  5.     for (int j = 0; j <= i; j++) {
  6.       int znakow = 2 * j + 1;
  7.       cout << string((max - znakow) / 2, ' ');
  8.       cout << "/";
  9.       cout << string(znakow, (j == i) ? '_' : ' ');
  10.       cout &lt;< "\\" << endl;
  11.     }
  12.   }
  13.   cout << string(max / 2, ' ') << "| |";
  14. }

Przed rozpoczęciem pętli rysowany jest czubek. Podczas rysowania warstwy należy sprawdzić czy środek choinki ma być pusty czy mają się tam znaleźć podkreślniki. Jednak niezależnie od wypisywanego znaku zawsze przed nimi należy dostawić znak slasha "/", a na koniec backslasha "\". Tutaj uwaga warto zauważyć, że są one dopisywane jako dwa dodatkowe znaki w każdej linijce, więc należy zwiększyć zmienną max, która przechowuje długość najdłuższej linijki, o 2.

Testowanie funkcji

W celu narysowania choinki wystarczy wpisać:

  1. int main() {
  2.   rysujChoinke(3);
  3.   system("pause");
  4.   return 0;
  5. }

Zadania

Zadanie 1

Napisz funkcję rysujChoinke(), która dla 2 warstw wypisze choinkę taką jak poniżej:

  1.    *
  2.   /^\
  3.  /___\
  4.  /^^^\
  5. /_____\
  6.   |_|