[C++] Anagram i pętle

maximus403
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 11 lis 2013, o 14:14
Płeć: Mężczyzna
Lokalizacja: Polska

[C++] Anagram i pętle

Post autor: maximus403 »

Witam, mam do napisania aplikację w języku c++, która sprawdza czy wyraz przeze mnie wpisany jest anagramem, program ma to sprawdzać tyle razy ile ktoś sobie zażyczy. Jednak wyniki do wszystkich testów (zależnie od ich liczby) mają być pokazywane na końcu.

Przykładowo:

Kod: Zaznacz cały

(wejście)

Pierwszy wyraz>>lato
l. testów>>3
Następny wyraz>>atlo
Następny wyraz>>armata
Następny wyraz>>tloa

(wyjście)

TAK
NIE
TAK
Mój problem polega na tym, że mam ułożony program, który wykonuje tyle testów ile zechcę, nie sprawdza czy wyraz jest anagramem, a jedynie jego długość, a wynik przychodzi zawsze po kolejnym wyrazie.
Jeżeli ktoś mógłby mi podpowiedzieć co z tym zrobić, szczególnie żeby program sprawdzał czy wyraz jest anagramem, będę wdzięczny. Jeżeli chodzi o te wyniki to wydaje mi się, że brakuje gdzieś dodatkowej pętli for, ale też nie mogę tego rozgryźć.

tutaj kod do programu:

Kod: Zaznacz cały

#include <iostream>
#include <cstring>
using namespace std;

bool sprawdz (string s1, string s2)
{
 int dl=s1.size();
 if (dl!=s2.size()) return false;
 else
 {
  int T1[2]={0, 0}, T2[2]={0, 0}; 
  for (int i=0;i<dl;i++)
  {
   if (s1[i]=='X') T1[0]++;
   else T1[1]++;
   if (s2[i]=='X') T2[0]++;
   else T2[1]++;
  }
  for (int i=0;i<2;i++)
   if (T1[i]!=T2[i]) return false;
 }
 return true;
}

int main()
{
 string s1, s2;
 int ile;
 cout<<"Podaj pierwszy wyraz: ";
 cin>>s1;
 cout<<"Podaj liczbe testow: ";
 cin>>ile;
	for(int anagram=1;anagram<=ile;anagram++)
	{
    cout<<"Podaj kolejny wyraz: ";
	cin>>s2;
	if (sprawdz(s1,s2)) cout<<"\nTAK"<<endl;
	else cout<<"\nNIE"<<endl;
	}
 return 0;
}
Pozdrawiam ;)
Ostatnio zmieniony 25 lis 2013, o 10:49 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
lemoid
Użytkownik
Użytkownik
Posty: 199
Rejestracja: 24 maja 2012, o 23:36
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 5 razy
Pomógł: 30 razy

[C++] Anagram i pętle

Post autor: lemoid »

Można to zrobić na kilka sposobów.

Kod: Zaznacz cały

http://www.cplusplus.com/reference/string/string/find/
można tak, i jeżeli znak występuje w bazie i w sprawdzanym stringu to z obu go usunąć, w przeciwnym wypadku wyraz nie jest anagramem. Można tablicować wyniki, sortować wartości ASCII znaków, etc etc.
Jeżeli chcesz żeby wyniki były pokazywane na końcu, możesz użyc std::list albo std::vector, chociażby tak:

Kod: Zaznacz cały

 std::vector <string> results; 
...
...
...
if(isAnagram(text)) { results.push_back("Yes"); } else { results.push_back("No"); }
...
na koniec iteracja po vectorze i drukowanie wyników
maximus403
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 11 lis 2013, o 14:14
Płeć: Mężczyzna
Lokalizacja: Polska

[C++] Anagram i pętle

Post autor: maximus403 »

lemoid pisze:Można to zrobić na kilka sposobów.

Kod: Zaznacz cały

http://www.cplusplus.com/reference/string/string/find/
można tak, i jeżeli znak występuje w bazie i w sprawdzanym stringu to z obu go usunąć, w przeciwnym wypadku wyraz nie jest anagramem. Można tablicować wyniki, sortować wartości ASCII znaków, etc etc.
Jeżeli chcesz żeby wyniki były pokazywane na końcu, możesz użyc std::list albo std::vector, chociażby tak:

Kod: Zaznacz cały

 std::vector <string> results; 
...
...
...
if(isAnagram(text)) { results.push_back("Yes"); } else { results.push_back("No"); }
...
na koniec iteracja po vectorze i drukowanie wyników

Próbowałem coś zrobić, ale co do tych wyników, to nie umiem tego zrobić.
Mógłby ktoś zademonstrować ten sposób wyżej na przykładzie kodu poniżej?

Kod: Zaznacz cały

#include <iostream>
#include <algorithm>
using namespace std;

string sort(string s)
{
int l=s.size();
for(int i = 0; i < l; i++)
    {
for(int j = 0; j < l - i - 1; j++)
        {
if(s[j]>s[j+1])
    swap(s[j],s[j+1]);
        }
    }
return s;
}

int main()
{
int ile;
string sSlowo1, sSlowo2;
    cout<<"Podaj pierwszy wyraz: "<<endl;
    cin >>sSlowo1;
    cout<<"Podaj liczbe testow: ";
    cin>>ile;
    cout<<"Podaj kolejne wyrazy: "<<endl;
for(int anagram=1;anagram<=ile;anagram++)
    {
    cin>>sSlowo2;
        {
sSlowo1 = sort(sSlowo1);
sSlowo2 = sort(sSlowo2);
if (sSlowo1 == sSlowo2)
    cout << "TAK" << endl;
else
    cout << "NIE" << endl;
        }
    }
return 0;
}
witekkq
Użytkownik
Użytkownik
Posty: 145
Rejestracja: 16 lis 2007, o 09:06
Płeć: Mężczyzna
Lokalizacja: Gniezno
Podziękował: 2 razy
Pomógł: 27 razy

[C++] Anagram i pętle

Post autor: witekkq »

Co do Twojego kodu..
1. Nawet nie wiem od czego zacząć naprowadzanie Cię na dobry tor... ;/

Przeanalizuj to poniżej i zedytuj do swoich potrzeb...

Kod: Zaznacz cały

#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

int main()
{
	int ile;
	string sSlowo1, sSlowo2;
	cout<<"Podaj liczbe testow: ";
    cin>>ile; 
//utwórz tablice dynamiczna lub wektor
	while(true)
	{
		cout<<"Podaj wyraz: "<<endl;
		cin>>sSlowo1;     
		sSlowo2 = sSlowo1; 
		reverse(sSlowo1.begin(), sSlowo1.end());
		if (sSlowo1.compare(sSlowo2) == 0)
			cout << "TAK" << endl;
		else
			cout << "NIE" << endl;
                //dopisz wynik do wektora lub tablicy
		ile--;
		if(ile==0) break;
	}
        //wyświetl wektor lub tablice
return 0;
}
maximus403
Użytkownik
Użytkownik
Posty: 6
Rejestracja: 11 lis 2013, o 14:14
Płeć: Mężczyzna
Lokalizacja: Polska

[C++] Anagram i pętle

Post autor: maximus403 »

Nie jestem pewien, czy chciałeś żebym zedytował Twój kod, czy po prostu użył wskazówek na nim jakie dodałeś żeby zrobić podobną rzecz na swoim, ale obstawiam tą drugą opcję.
W każdym razie miałem ten sam pomysł dziś po południu i dzięki za pomoc, ale kombinowałem z tablicami i nie udaje mi się poprawnie tego zastosować.

Więc zostaję dalej z tym co wstawiłem przedostatnim razem.
ODPOWIEDZ