Program sprawdzający czy dany wyraz jest anagramem

0

Na razie mam tyle:

# include <stdlib.h>
# include <stdio.h>
#include <string.h>

int czy_anagram1(char napis1[],char napis2[])
{ if (strlen(napis1)==strlen(napis2))
    printf("Możliwe że Twój napis jest anagramem\n");
  else
    { 
        printf("Twój napis nie może być anagramem\n");      
        return 0;
    }
    return 1;
}   

int licz_znaki(

int main ()
{
    char napis1 [255];
    char napis2 [255];

printf ("Podaj napis pierwszy\n");
gets (napis1);
//strlen(napis1);

printf("Podaj napis drugi\n");
gets (napis2);
//strlen(napis2);

if (czy_anagram1(napis1,napis2))
    printf("Tak\n");
    else
    printf("Nie\n");
return 0;
}

I teraz mam problem nie wiem jak napisać funkcję żeby sprawdzała ilość danej litery w każdym z napisów. Potem chciałabym te ilości porównać i po tym stwierdzić, że to anagram. Nie chcę robić tego 0 miejsc w tablicy.

3

Może zamiast liczyć litery, posortuj napisy. Anagramy będą po posortowaniu identyczne.

1

albo zrób histogramy dla obu wyrazów i porównaj histogramy (złożoność liniowa).

offtopic: co do stylu kodowania czy_anagram1(char napis1[],char napis2[]) powinien zwracać wartość logiczną i nie powinien wyświetlać wyniku.

0

A wytłumaczyłby mi ktoś jak w C napisać takie sortowanie?

0

Udało mi się coś takiego:

# include <stdlib.h>
# include <string.h>

void iloscznakow(char napis1[], int alfabet[26])
{
    int i;
    for (i=0;i<26;i++)
    {
        alfabet[i]=0;
    }
    for (i=0;napis1[i]!='\0';i++)
    {
        if (napis1[i]>='A'&&napis1[i]<='Z')
            alfabet[napis1[i]-'A']++;
        else if (napis1[i]>='a'&&napis1[i]<='z')
            alfabet[napis1[i]-'a']++;
    }
}
int porownanienapisow (char napis1[], char napis2[])
{
    int alfabet1[26];
    int alfabet2[26];
    iloscznakow (napis1, alfabet1);
    iloscznakow (napis2, alfabet2);
    int i;
    for(i=0;i<26;i++)
    {
        if (alfabet1[i]!=alfabet2[i])
            return 0;
    }
    return 1;
}
void main ()
{
    char napis1[200];
    char napis2[200];
    printf("Podaj napis pierwszy: ");
    fgets("%s",&napis1);
    printf("\n Podaj napis drugi: ");
    fgets("%s",&napis2);

    if (porownanienapisow (napis1, napis2))
        printf("Twój napis to anagram.\n");
    else
    printf("Niestety Twój napis nie jest anagramem.\n");
    system ("pause");
}

Kiedy chcę wpisać drugie zdanie wyskakuje napis core dumped i już nic się nie da zrobić, co mogę poprawić?

0

Zamiast:

fgets("%s",&napis1);

Spróbuj:

fgets("%s", napis1);
1

Popatrz sobie tutaj ile i jakie argumenty przyjmuje fgets: http://www.cplusplus.com/reference/cstdio/fgets/?kw=fgets
Alternatywnie możesz zamienić fgets na scanf i będzie cacy. Poza tym ma być int main i na końcu return 0;.

0

Może spróbuj w łatwiejszy sposób z podejściem C++ a nie C (tak tylko sugeruję :P) :


#include <iostream>
#include <string>

bool isAnagram(std::string lhs, std::string rhs);

int main() {
  std::string lhs, rhs;
  std::cin >> lhs >> rhs;

  std::cout << (isAnagram(lhs, rhs) ? "Tak" : "Nie");

  return 0;
}

bool isAnagram(std::string lhs, std::string rhs) {
  if (lhs.size() != rhs.size()) {
    return false;
  }

  for (int i = 0; i < lhs.size() - 1; ++i) {
    for (int j = 0; j < lhs.size() - 1; ++j) {
      if (lhs[j + 1] < lhs[j]) {
        std::swap(lhs[j + 1], lhs[j]);
      }
      if (rhs[j + 1] < rhs[j]) {
        std::swap(rhs[j + 1], rhs[j]);
      }
    }
  }

  if (lhs == rhs) {
    return true;
  }
  else {
    return false;
  }
}
2

Jak już C++ to zamiast pisać nieczytelny i niewydajny kod bubblesorta możesz użyć biblioteki standardowej:

bool isAnagramOf(std::string s1, std::string s2)
{
    if(s1.size() != s2.size()) return false;
    sort(s1.begin(), s1.end());
    sort(s2.begin(), s2.end());
    return s1 == s2;
}

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