Strona główna » Algorytmy » Artykuły » Litery Dowolnego Rozmiaru
 

Litery Dowolnego Rozmiaru

Cel

Napisz funkcję, która wypełni pusty kwadrat o rozmiarze n określonym znakiem tak, aby wzór przypominał wybraną literę. Napisz uniwersalną funkcję, która narysuje literę na podstawie pewnych informacji. Przykładowo literka X o rozmiarze 5 powinna wyglądać następująco:

  1. X   X
  2.  X X 
  3.   X  
  4.  X X 
  5. X   X

Analiza

Kluczem do efektywnego rozwiązania zadania jest napisanie wzoru funkcji uniwersalnego dla każdej litery. Otóż jeśli wyobrazimy sobie, że rysujemy po pustym kwadracie o boku n to dla każdego pola chcemy wybrać czy je zamalowywujemy czy zostawiamy puste. Można to zrobić przy pomocy warunku lub wielu warunków. Do dyspozycji są, aż trzy zmienne: pozycja (x, y) oraz bok n. Przykładowo, aby zamalować pierwszy wiersz wystarczy sprawdzić, że x == 0. Z kolei, aby narysować przekątną to należy sprawdzić, że x == y.

Podsumowując wzór funkcji uniwersalnej polagałby na napisaniu pętli przechodzącej po kolejnych polach, a następnie sprawdzałby warunek przypisany do danej litery. Warunek ten można przenieść do oddzielnej funkcji, ponieważ korzystanie z instrukcji switch lub ifów wewnątrz podwójnej pętli mogłoby znacząco utrudnić czytanie kodu.

Przykłady

Litera U

Najprostszym sposobem na literę "U" polega na narysowaniu lewej i prawej krawędzi oraz dolnej. W tym celu sprawdzamy warunek x == 0 lub x == n-1 lub y == n-1. Uwaga: n-1 to indeks ostatniego wiersza / kolumny.

  1. X   X
  2. X   X
  3. X   X
  4. X   X
  5. XXXXX

Litera X

Z kolei litera "X" wymaga sztuczki polegającej na porównaniu x == y lub x == n-y-1, aby narysować dwie skośne linie. Pierwszy warunek rysuje linię z lewego górnego rogu do prawego, dolnego.

  1. X   X
  2.  X X 
  3.   X  
  4.  X X 
  5. X   X

Litera T

Choć litera "T" składa się z zaledwie dwóch linii to problem może stanowić narysowanie trzonka. Otóż wystarczy sprawdzić x == n/2 i x == 0.

  1. XXXXX
  2.   X  
  3.   X  
  4.   X  
  5.   X  

Litera W

Czasem warunki muszą być jednak trochę bardziej skomplikowane. Przykładowo, aby napisać literę "W" warunek na środkową kreskę to koniunkcja x == n/2 oraz y >= n/2.

  1. X   X
  2. X   X
  3. X X X
  4. X X X
  5. XXXXX

Pozostałe litery

Zostały tutaj podane jedynie cztery przykładowe litery, ale schemat, aby napisać warunki jest dla każdej taki sam. Czasem jednak trzeba będzie napisać ich więcej, a czasem mniej. Najlepiej jest rysować każdy fragment litery oddzielnie, aby mieć pewność, że na końcu wszystko wyjdzie jak należy.

Implementacja

Funkcja uniwersalna

Funkcja rysujLitere() przyjmuje trzy argumenty: rozmiar litery n, funkcja - adres funkcji, która zwróci prawdę / fałsz czy na daną pozycję "zamalować" oraz opcjonalny argument znak, który określi na jaki kolor zamalować.

  1. void rysujLitere(int n, bool funkcja(int, int, int), char znak = '#') {
  2.   for (int x = 0; x < n; x++) {
  3.     for (int y = 0; y < n; y++) {
  4.       cout << (funkcja(x, y, n) ? znak : ' ');
  5.     }
  6.     cout << endl;
  7.   }
  8. }

Funkcja składa się z dwóch pętli: pierwsza przechodzi po kolejnych wierszach, a druga kolumnach. Po narysowaniu pełnego wiersza wpisywany jest znak nowej linii.

Przykładowa funkcja

Oto przykładowa funkcja, która przekazana do rysujLitere() narysuje literę "X":

  1. bool literaX(int x, int y, int n) {
  2.   return x == n - y - 1 || x == y;
  3. }

Testowanie funkcji

W celu wywołania funkcji i narysowania litery o rozmiarze wprowadzonym przez użytkownika wystarczy wpisać:

  1. int main() {
  2.   int n;
  3.   cout << "Podaj rozmiar litery\n n = ";
  4.   cin >> n;
  5.   rysujLitere(n, &literaX);
  6.   system("pause");
  7.   return 0;
  8. }

Zadania

Zadanie 1

Napisz kod głównej funkcji w taki sposób, aby zawierała tylko jedną pętlę i odwołanie do warunku. Postaraj się wykorzystać tylko jedną zmienną w pętli oraz n.