PDA

Visualizza la versione completa : [C++] Confronto stringa e file di testo


Zierf92
12-07-2012, 20:52
Salve a tutti, avrei bisogno di un aiuto per un programma.
Ho il codice che mi genera gli anagrammi di una certa parola data in input, io vorrei fare in modo che mi stampi solamente le parole di senso compiuto; il metodo migliore che mi è venuto in mente è stato quello di comparare ogni anagramma generato (salvato su una variabile stringa) con un file di testo che contiene praticamente tutte le parole italiane, una per riga, senza spazi.
Potete aiutarmi?

Ecco il programma

#include <iostream>
#include <string>
#include <fstream>

using namespace std ;

void anagramma(string radice, string s, int livello)
{
for (int i = 0; i < s.size(); i++)
{
string t = radice + s[i];

if (t.size() == livello)
{
cout << t << endl ;
}

anagramma(t, s.substr(0, i) +
s.substr(i + 1), livello);
}
}

void calcola_anagrammi(string s)
{
anagramma("", s, s.size());
}

int main()
{
string my_string;

cout << "Inserire la stringa da anagrammare : ";
cin >> my_string;

calcola_anagrammi(my_string);

return 0 ;
}

mi servirebbe il controllo per la variabile t

oregon
12-07-2012, 20:57
Cosa non sai fare ? Non sai leggere da un file ?

Zierf92
12-07-2012, 21:04
Non so come controllare una riga intera alla volta, non so cosa usare... penso sia uno tra cin.get o cin.getline con cin.ignore ma non ho mai capito bene come funzionano dato che li ho visti utilizzare spesso per apparentemente lo stesso motivo.

MItaly
12-07-2012, 21:04
Credo che una soluzione più furba potrebbe essere questa:

apri il file con tutte le parole;
crei una multimap<string, string>
leggi dal file una parola alla volta e fanne due copie; in una metti i caratteri in ordine alfabetico, l'altra la tieni così;
memorizza la parola nella multimap, usando la versione ordinata come chiave e quella originale come valore;
quando cerchi un anagramma di una parola, fanne una copia, metti i caratteri in ordine alfabetico ed effettua una ricerca nella multimap; otterrai tutti gli anagrammi validi.

Zierf92
12-07-2012, 22:36
Purtroppo non conosco la multimap, e sono convinto che sarebbe più semplice, però vorrei riuscire a capire perchè non riesco a farlo in questo modo.


#include <iostream>
#include <string>
#include <fstream>

using namespace std ;

fstream input;

void anagramma(string radice, string s, int livello)
{
char parola[30];
string q;

for (int i = 0; i < s.size(); i++)
{
string t = radice + s[i];

if (t.size() == livello)
{
while(input.eof()){
input.getline(parola, 30);
q.assign(parola);
if(q.compare(t)==0)
cout << t << endl ;
}
}

anagramma(t, s.substr(0, i) +
s.substr(i + 1), livello);
}
}

void calcola_anagrammi(string s)
{
anagramma("", s, s.size());
}

int main()
{
string my_string;
input.open("words.italian.txt", ios::in);

cout << "Inserire la stringa da anagrammare : ";
cin >> my_string;

calcola_anagrammi(my_string);

return 0 ;
}

Così non mi da nessun anagramma, quindi il controllo non va bene, ma in altri programmi che ho fatto questo controllo andava bene, non capisco come mai.

Zierf92
13-07-2012, 12:28
Sono riuscito a farlo, però sono venuto incontro ad un altro inconveniente...
Per ogni anagramma che trova, deve controllare se la parola è presente nel file di testo, e praticamente smette di funzionare per timeout prima ancora di finire la lettera A, infatti mi genera solo le parola di inizio alfabeto controllate sul primo anagramma che calcola.

Loading