ricerca di una parola..

Discuti dei problemi relativi alla programmazione nel tuo linguaggio preferito!

Moderatori: cb_123, thrantir, tonertemplum

ricerca di una parola..

Messaggiodi `knives` il 06 giu 2006, 11:42

aiutatemi a sviluppare un programma che partendo da una stringa di tot caratteri e inserendo il numero di lettere di cui è composta una parola, restituisca un elenco di parole appunto che corrispondano ai requisiti detti su, cercandoli tra vari file contenenti un listato di parole in italiano.
i file dizionari sono 21, sono file di testo, uno per lettera dell'alfabeto e all'interno di questo file (chiamato per esempio italiano.a, italiano.b) sono contenute delle parole di varie lunghezze e genere elencati in ordine decrescente di lunghezza e in ordine alfabetico...

esempio file
Codice: Seleziona tutto
autoblindomitragliatrice
autoresponsabilizzazione
antialternativistiche
antioccidentalistiche
antialternativistica
antioccidentalistica
aerocinematografiche
antialternativistici
antialternativistico
anticostituzionalita
autoregolamentazione
autoregolamentazioni
aerotrasporterebbero
antioccidentalistici


linguaggio di sviluppo ansi C, io conosco questo.. ma se magari qualcuno conosce un linguaggio piu portato a queste cose.. dia pure un contributo.. vedro di studiarmelo.

io pensavo di fare un programma senza menu, di scorrimento lineare, il vero problema sta nel lavorare col file.. cioè io inserisco tramite tastiera le stringhe di lettere che mi servono, e la lunghezza.. che funzioni o procedure in C sono in grado di farmi impazzire di meno coi vettori e caricamenti da file a ram? diciamo che la ricerca di un termine deve avvenire in un tempo abbastanza limitato.

idee?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

 

Messaggiodi thrantir il 06 giu 2006, 12:42

allora, probabilmente il piu' comodo da usare sarebbe python, ma andiamo sul c++ :twisted:

Codice: Seleziona tutto

#include <fstream>

void getWords(int aLength, std::list<std::string>& aList)

const final std::string myPrefix("italiano.");

for(char myChar = 'a'; myChar < 'z'; ++myChar)
{
    std::ifstream myVocabulary(myPrefix+myChar);
    if(myVocabulary.good())
    {
         std::string myLine;
         while(getline(myVocabulary, myLine)
         {
              if(aLength == myLine.length())
              {
                  aList.push(myLine);
              }
         }
    }
}


questo ti restituisce una lista di tutte le parole della lunghezza data. Se vuoi fare una cosa piu' elegante puoi usare una

Codice: Seleziona tutto
std::map<char, std::list<std::string>>


e fai una mappa di liste collegate alla lettera iniziale
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Messaggiodi `knives` il 06 giu 2006, 13:06

sara che conosco poco il c++, ma questa è una procedura unica?
thrantir ha scritto:
Codice: Seleziona tutto

#include <fstream>

void getWords(int aLength, std::list<std::string>& aList)
[b]{[/b]
const final std::string myPrefix("italiano.");

for(char myChar = 'a'; myChar < 'z'; ++myChar)
{
    std::ifstream myVocabulary(myPrefix+myChar);
    if(myVocabulary.good())
    {
         std::string myLine;
         while(getline(myVocabulary, myLine)
         {
              if(aLength == myLine.length())
              {
                  aList.push(myLine);
              }
         }
    }
}
[b]}[/b]


non è necessario includerla tra altre due graffe?

io pensavo di fare una lista di parole appunto e poi in queste cercare la stringa che mi serve.. ora.. questa procedura mi riporta la lista.. come la uso?
è globale o solo locale?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi `knives` il 06 giu 2006, 13:37

ok ho compreso il funzionamento di queste righe.. mi spieghi pero cosa è
Codice: Seleziona tutto
std::list<std::string>& aList


cioè no.. piu che cosa è.. (è la lista in cui verranno salvate le parole che corrispondono alla lunghezza da me fissata) come la uso?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi `knives` il 06 giu 2006, 13:50

altra cosa..
quando usi
Codice: Seleziona tutto
std::string myLine;


myLine è la parola che ha letto dal file?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 06 giu 2006, 14:03

Codice: Seleziona tutto
std::list<std::string>& aList
e' la lista di parole che hanno quella lunghezza, e' un cosiddetto "parametro di output", in pratica, non e' un parametro che serve per la cimputazione ma e' un qualcosa che ti ritorna modificato dopo l'esecuzione della procedura (hai ragione tu, ci vogliono le graffe!)

in pratica succede questo: io potrei dire che la funzione restituisce un std::list<std::string>, creare un std::list<std::string> interno alla funzione e poi restituirlo. Questo, pero', ha l'effetto di creare una copia della lista, che tu ti puoi facilmente evitare nel modo che ti ho descritto: in pratica avrai una cosa del tipo

Codice: Seleziona tutto
std::list<std::string> myList;
getWords(10, myList);


in questo modo, ti ritroverai in myList tutte le parole lunghe 10.

Ora passimao a come usarla. std::list<type T> e' uno dei tanti container presenti nella standard template library. Questi container si usano tutti allo stesso modo, utilizzando gli iteratori.

In pratica, tutti i container hanno un metodo begin() che restituisce un iteratore (che e', in fin dei conti, un puntatore) al primo elemento. Su un iteratore e' definita, in modo corretto, un'algebra, quindi, se fai
Codice: Seleziona tutto
mio_iteratore + 1

ottieni l'iteratore (il puntatore) all'elemento successivo.

per usare quella lista fai
Codice: Seleziona tutto
std::list<std::string>::const_iterator myIterator;
for(myIterator = myList.begin();
     myIterator != myList.end();
     ++myIterator
{
     /* myIterator sara' il puntatore all'i-simo elemento della lista, che e' una stringa*/
}
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Messaggiodi `knives` il 06 giu 2006, 16:31

Codice: Seleziona tutto
std::list<std::string> aList;

error C2039: 'list' : is not a member of 'std'

error C2143: syntax error : missing ';' before '<'

error C2501: 'list' : missing storage-class or type specifiers

error C2143: syntax error : missing ';' before '<'

____________
Ultima modifica di `knives` su 06 giu 2006, 16:51, modificato 1 volte in totale.
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi `knives` il 06 giu 2006, 16:35

non ne vengo piu fuori :roll:

dove trovo documentazione sull'ultilizzo del std?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 06 giu 2006, 17:01

mi sa che ci vuole un

#include <list>

che compilatore stai usando?
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Messaggiodi `knives` il 06 giu 2006, 17:03

visual c++ 6
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 06 giu 2006, 17:07

male :P

comunque, aggiungendo quell'include, ora ti va?
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Messaggiodi `knives` il 06 giu 2006, 17:11

si mi ha trovato altri errori di sintassi dovuti ad errori miei.. tranne questi

error C2734: 'final' : const object must be initialized if not extern
error C2143: syntax error : missing ';' before 'tag::id'

_______________________________-

Codice: Seleziona tutto
std::ifstream myVocabulary(myPrefix+myChar);

error C2784: class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> __cdecl std::operator +(_D,const class std::reverse_iterator<_RI,_Ty,_Rt,_Pt,_D> &)' : could not deduce template argument for ''
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi `knives` il 06 giu 2006, 17:15

error C2065: 'getline' : undeclared identifier..... n che libreria è contenuto? iostream lo messo.


Codice: Seleziona tutto
aList.push(myLine);


error C2039: 'push' : is not a member of 'list<class std::asic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >'
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 06 giu 2006, 17:18

uff, mi sa che non e' definito il '+' tra string e char, allora fai coi':

al posto di

const final std::string myPrefix("italiano.");

scrivi

std::stringstream myPrefix;
myPrefix << "italiano."

dentro il for, al posto di

std::ifstream myVocabulary(myPrefix+myChar);

scrivi

myPrefix << myChar;
std::ifstream myVocabulary(myPrefix.str().c_str());

in cima mi sa che devi mettere

#include <sstream>
Fletto i muscoli e sono nel vuoto
Principi di architettura degli eleboratori
X postare immagini
-----BEGIN GEEK CODE BLOCK-----
GCS/IT/L/MU d- s: a C++$>+++ UL+>++ P L+++>++++ E--- W++ N++>+++ o+>++ K? w O-- M- VMS? V- PS++ Y+ PGP+ t 5? X+ R++>+++ tv+ b+++>++++ DI+++ D++ G e++ h- r++ y++
------END GEEK CODE BLOCK------
Addio Dani, sono più ricco perchè ti ho conosciuto
Avatar utente
thrantir
Moderatore
Moderatore
 
Messaggi: 8897
Iscritto il: 27 mag 2003, 13:32
Località: Pisa

Messaggiodi `knives` il 06 giu 2006, 17:24

Codice: Seleziona tutto
--------------------Configuration: sillaba - Debug--------------------
Compiling...
asd.cpp
asd.cpp: In function `void getWords(int, std::list<std::string, std::allocator<std::string> >&)':
asd.cpp:31: warning: comparison between signed and unsigned integer expressions
asd.cpp:33: error: 'class std::list<std::string, std::allocator<std::string> >' has no member named 'push'

asd.o - 1 error(s), 1 warning(s)
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

 
Prossimo

Torna a Programmare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron