Anagramy

kategoria: Zadania z programowania

Anagram jest to wyraz (lub całe zdanie) powstały w wyniku przestawiania liter innego wyrazu, wykorzystując wszystkie jego litery. Pojęcie anagramu jest podstawowym pojęciem jakie należy sobie przyswoić, przed przystąpieniem do matury z informatyki. Zadania związane z anagramami trafiają się bardzo często i wszystkie są do siebie podobne.

Anagramy informacje

Aby sprawdzić czy dany wyraz jest anagramem drugiego, należy sprawdzić czy ich długość jest taka sama. Następnie posortować obydwie zmienne za pomocą sortowania bąbelkowego. Jeżeli posortowane zmienne są takie same i mają taką samą długość, oznacza to że są anagramami.

Dla przykładu:

  • anagramem wyrazu karol jest wyraz rolka
  • anagramem wyrazu matura jest wyraz trauma.

Anagramy algorytm

Prosty algorytm w postaci listy kroków, sprawdzający czy wyraz jest anagramem drugiego:

  1. Początek algorytmu
  2. Wczytaj pierwsze słowo do zmiennej słowo1
  3. Wczytaj drugie słowo do zmiennej słowo2
  4. Jeżeli długości zmiennych słowo1 i słowo2 są różne, to wyrazy nie są anagramami
  5. Posortuj bąbelkowo zmienną słowo1 i zapisz do zmiennej słowo1
  6. Posortuj bąbelkowo zmienną słowo2 i zapisz do zmiennej słowo2
  7. Jeżeli słowo1=słowo2 to wyrazy są anagramami
  8. W przeciwnym wypadku nie są anagramami
  9. Koniec algorytmu

Kod programu w C++

Kod jest dość długi, jednak jest bardzo prosty. Funkcja sprawdzająca czy wyrazy są anagramami tak naprawdę tylko sprawdza długość wyrazów oraz sortuje je bąblekowo.

#include <cstdlib>
#include <iostream>
#include <string>

using namespace std;

bool anagram(string wyraz1, string wyraz2)
{
    if (wyraz1.length() != wyraz2.length())
    {
        return false;   // dlugosc sie nie zgadza
    }

    // sortujemy babelkowo obydwa stringi
    // mozna za jednym razem, bo ich dlugosc jest taka sama
    for (int i = 0; i < wyraz1.length() - 1; i++)
    {
        for (int j = 0; j < wyraz2.length() - 1; j++)
        {
            if (wyraz1[j] > wyraz1[j+1])
                swap(wyraz1[j], wyraz1[j+1]);

            if (wyraz2[j] > wyraz2[j+1])
                swap(wyraz2[j], wyraz2[j+1]);
        }
    }

    return wyraz1 == wyraz2; //zwracamy true lub false
}

int main()
{
    string wyraz1, wyraz2;

    cout << "Podaj wyraz pierwszy" << endl;
    cin >> wyraz1;

    cout << "Podaj wyraz drugi" << endl;
    cin >> wyraz2;

    if (anagram(wyraz1, wyraz2))
    {
        cout << "Wyraz jest anagramem!" << endl;
    }
    else
    {
        cout << "Wyraz NIE jest anagramem!" << endl;
    }

    system("PAUSE >NUL");
    return 0;
}