ricerca di una parola..

Discuti dei problemi relativi alla programmazione nel tuo linguaggio preferito!

Moderatori: cb_123, thrantir, tonertemplum

Messaggiodi `knives` il 08 giu 2006, 09:19

si, ma io conosco a priori la lunghezza delle parole perchè nella lista che ho in quella procedura, sono tutti termini della stessa lunghezza.
io so che una parola massimo è lunga 20, quindi per forza la prima posso stamparla. nell' if controllo se cè spazio, ma questo controllo comincia a fare il suo effetto solo dopo la prima iterazione, perchè in ogni caso la prima + il separatore, non occupa tutto lo spazio.



dai dai ora mi cerco un esercizio nuovo. 8)
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

 

Messaggiodi thrantir il 08 giu 2006, 11:36

no, non funziona, se hai parole lunghe 16 mette un mySeparator di troppo
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 thrantir il 08 giu 2006, 11:42

allora, funziona se fai questa modifica: dopo che ahi stampato myIter, decrementi myFreeSpace della dimensione di myIter, e fai il controllo con la lunghezza di mySeparator. In pratica il tuo errore e' che quando fai
Codice: Seleziona tutto
if(myFreeSpace > mySeparator.length())

in realta' il tuo spazio libero e' minore, perche' hai gia' stampato myIter, quindi lo spazio che ti rimane va decrementato.
Ovviamente sotto non fai piu'
Codice: Seleziona tutto
myFreeSpace = myFreeSpace - myIter->length() - mySeparator.length();

ma fai
Codice: Seleziona tutto
myFreeSpace = myFreeSpace - mySeparator.length();
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 thrantir il 08 giu 2006, 11:43

allora, io una soluzione elegante ce l'ho, ma e' un po piu' avanzata, perche' richiede la definizione di una classe

dimmi tu
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 thrantir il 08 giu 2006, 11:48

ah, tra l'altro, essendo tutti termini della stessa lunghezza, conviene assegnare questa lunghezza ad una costante, in modo da non chiamare ogni volta length(), che non e' efficiente in terminni di prestazioni

quindi

Codice: Seleziona tutto
const int myElementLength = aListFinal.begin()->length();
const int mySeparatorLength = mySeparator.length();
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 08 giu 2006, 12:26

vediamo la soluzione avanzata..
volevo chiederti come mai nel main
Codice: Seleziona tutto
int main(int argc, char* argv)

e a cosa servono.
per l'errore che dici.. ok lo capito.. vedo di fare la modifica e vedere cosa cambia.
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 08 giu 2006, 12:31

quella e' la signatura classica del main da consolle (con signatura si intende il tipo restituito dalla funzione, il numero e il tipo di parametri)

quando tu chiami un programma da riga di comando, puoi passargli dei parametri. I sistema si preoccupera' di contarli e di passare al main, in argc, il numero degli argomenti passati (il primo, lo 0-simo, e', per default, nome del programma. Il secondo parametro e' la lista dei parametri. Grazie alla tua precisazione, mi sono accorto che e' sbagliato, infatti deve essere
Codice: Seleziona tutto
int main(int argc, char* argv[])

perche' e' un array di char*
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 thrantir il 08 giu 2006, 12:32

per la soluzione avanzata, vedo se ho tempo dopo senno' stasera
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 08 giu 2006, 12:35

thrantir ha scritto:per la soluzione avanzata, vedo se ho tempo dopo senno' stasera


si si con calma.. il programma è gia efficace cosi.. tutto cio che ci faro ora saranno miglioramenti, ed esercizi per prendere dimestichezza con il c++;
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi `knives` il 08 giu 2006, 15:54

Codice: Seleziona tutto
// Inserimento parametri.
void getParam (int &aLength, std::string &aStringToFind)
{
    do
    {
       std::cout << "Quanti caratteri devono formare la parola? "  ;
       std::cin >> aLength;
    }while(aLength > 21);
    do
    {
        std::cout << "Che sillaba cerchi? " ;
        std::cin >> aStringToFind;
     }while((aStringToFind.length()>5) && (aStringToFind.length() < aLength));
}


ho da migliorare l'inserimento dei paramentri. cioè io non posso permettere che l'utente inserisca la stringa che cerca piu lunga di aLength.
solo che fa in crash pure il compilatore quando faccio cosi

potrebbe essere perchè non trova quello che cerco.. mah vediamo..
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 08 giu 2006, 16:21

per fare una prova decente, dovresti mandarmi i files che usi come vocabilario
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 08 giu 2006, 16:28

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

Messaggiodi `knives` il 08 giu 2006, 16:34

ti salvi l'oggetto con nome e poi lo rinomini in .zip

sono due file italiano.a e italiano.b

Codice: Seleziona tutto
/***********************************************************************************************/
/*     Antisillabah by RaZaL                                                                   */
/*     superviosione Thrantir                                                                  */
/***********************************************************************************************/

#include <iostream>
#include <list>
#include <fstream>
#include <sstream>   
#include <string> 

//crea la lista con le parole della lungheza cercata.
void createList(const int aLength, std::list<std::string>& aListLength)
{
    for(char myChar = 'a'; myChar < 'z'; ++myChar)
    {
        std::stringstream myPrefix;
        myPrefix << "italiano." << myChar;
        std::ifstream myVocabulary(myPrefix.str().c_str());
        if(myVocabulary.good())
        {
            std::string myLine;
            while(getline(myVocabulary, myLine))
            {
                if(aLength == myLine.length())
                             aListLength.push_back(myLine);
                if(aLength > myLine.length())
                           break;             
             }
        }
    }
}
// ricerca nella lista dei termini di lunghezza cercata, le parole che contengono la striga richiesta.
void findWord (std::string aStringToFind,const std::list<std::string>& aListLength, std::list<std::string> &aListFinal)
{
     std::list<std::string>::const_iterator myIter;
     for(myIter = aListLength.begin(); myIter != aListLength.end(); ++myIter)
     {
          if(myIter->find(aStringToFind) != myIter->npos)
                                         aListFinal.push_back(*myIter);                   
     }
     if(aListFinal.empty())
                           aListFinal.push_front("NESSUNA PAROLA TROVATA");
}
// Inserimento parametri.
void getParam (int &aLength, std::string &aStringToFind)
{
    do
    {
       std::cout << "Quanti caratteri devono formare la parola? "  ;
       std::cin >> aLength;
    }while(aLength > 21);
    do
    {
        std::cout << "Che sillaba cerchi? " ;
        std::cin >> aStringToFind;
     }while((aStringToFind.length()> 5)|| (aStringToFind.length()>aLength));
}
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    const int myElementLength = aListFinal.begin()->length();
    int myFreeSpace = 78;
    std::string mySeparator(5,' ');
    int myContWord=0;
    int mySeparatorLength = mySeparator.length();
    std::list<std::string>::const_iterator myIter;
    std::cout << "  ";
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
         while(mySeparatorLength >= myElementLength && myElementLength != 1)
         {
                                 mySeparatorLength--;     
                                 std::string buffer(mySeparatorLength,' ');
                                 mySeparator=buffer;                       
         }
         std::cout << *myIter;
         myFreeSpace= myFreeSpace - myElementLength ;
         if(myFreeSpace > mySeparatorLength)                           
                     std::cout << mySeparator;
         myFreeSpace = myFreeSpace - mySeparatorLength;
        if(myFreeSpace < myElementLength)
        {
                       std::cout << std::endl;
                       std::cout << "  ";       
                       myFreeSpace=78;               
        }
        std::string myEmptyListIndicator("NESSUNA PAROLA TROVATA");
        if(*myIter == myEmptyListIndicator )
                      {            myContWord=0;}
        else                                 
        {                    myContWord++; }
    }
    std::cout << std::endl;
    std::cout << std::endl << "totale corrispondenze trovate: " << myContWord ;
}

// main
int main(int argc, char* argv[])
{
    int aLength=0;
    std::string aStringToFind(5,'a');
    char myMainLoop;
   
   do
     {     
           system("cls");
           getParam (aLength, aStringToFind);
           std::cout << std::endl;
           std::list<std::string> aListLength;
           createList(aLength, aListLength);
           std::list<std::string> aListFinal;
           findWord (aStringToFind, aListLength, aListFinal);
           stampList(aListFinal);
           std::cout << std::endl;
           do
           {
                             std::cout << std::endl;
                             std::cout << "prossima manche ?(s per si, altrimenti n)";
                             std::cin >> myMainLoop;
           }while((myMainLoop != 's') && (myMainLoop != 'n'));
     } while(myMainLoop == 's');
}
/*EOF*/


e questo qui è il sorgente credo finito.
quello che potevo dare lo dato.. se hai tempo di guardarlo e magari dirmi cosa migliorare.. ti ringrazio. :)
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 08 giu 2006, 23:40

che editor hai usato per scrivere i files del dizionario? in fondo alla riga mette qualche carattere che non capisco, di sicuro non standard, mi stava facendo impazzire, perchè, leggendo quel carattere, mi dava le parole più lunghe di uno, e non me le stampava (sotto linux)

ho razionalizzato qualcosa

Codice: Seleziona tutto
/***********************************************************************************************/
/*     Antisillabah by RaZaL                                                                   */
/*     superviosione Thrantir                                                                  */
/***********************************************************************************************/

#include <iostream>
#include <list>
#include <fstream>
#include <sstream>   
#include <string>

//crea la lista con le parole della lungheza cercata.
void createList(const int aLength,
                std::list<std::string>& aListLength)
{
    for(char myChar = 'a'; myChar < 'z'; ++myChar)
    {
        std::stringstream myPrefix;
        myPrefix << "italiano." << myChar;
        std::ifstream myVocabulary(myPrefix.str().c_str());
        if(myVocabulary.good())
        {
            std::string myLine;
            while(getline(myVocabulary, myLine))
            {
                if(aLength == myLine.length())
                {
                    std::cout << myLine.substr(0, myLine.length()) << std::endl;
                    std::cout << "ha lunghezza " << myLine.length() << "c" << std::endl;
                    aListLength.push_back(myLine);
                }
                if(aLength > myLine.length())
                    break;
            }
        }
    }
}
// ricerca nella lista dei termini di lunghezza cercata, le parole che contengono la striga richiesta.
void findWord (const std::string& aStringToFind,
               const std::list<std::string>& aListLength,
               std::list<std::string>& aListFinal)
{
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListLength.begin(); myIter != aListLength.end(); ++myIter)
    {
        if(myIter->find(aStringToFind) != myIter->npos)
            aListFinal.push_back(*myIter);
    }
}
// Inserimento parametri.
void getParam (int &aLength, std::string &aStringToFind)
{
    do
    {
        std::cout << "Quanti caratteri devono formare la parola? "  ;
        std::cin >> aLength;
    }while(aLength > 21);
    do
    {
        std::cout << "Che sillaba cerchi? " ;
        std::cin >> aStringToFind;
    }while((aStringToFind.length()>5) && (aStringToFind.length() > aLength));
}
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    int myElementLength = aListFinal.begin()->length();
    int myFreeSpace = 78;
    int mySeparatorLength = 5;
    if(myElementLength < mySeparatorLength)
    {
        mySeparatorLength = myElementLength - 1;
    }
    std::string mySeparator(mySeparatorLength,' ');
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    std::cout << "  ";
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
        std::cout << *myIter;
        myFreeSpace= myFreeSpace - myElementLength ;
        if(myFreeSpace > mySeparatorLength)
            std::cout << mySeparator;
        myFreeSpace = myFreeSpace - mySeparatorLength;
        if(myFreeSpace < myElementLength)
        {
            std::cout << std::endl;
            std::cout << "  ";
            myFreeSpace=78;
        }
        myContWord++;
    }
    std::cout << std::endl;
    std::cout << std::endl << "totale parole trovate: " << myContWord ;
}

// main
int main(int argc, char* argv[])
{
   
    int myLength = 0;
    std::string myStringToFind;
    char myMainLoop = 's';
   
    do
    {     
        system("cls");
        getParam (myLength, myStringToFind);
        std::cout << std::endl;
        std::list<std::string> myListLength;
        createList(myLength, myListLength);
        std::list<std::string> myListFinal;
        findWord (myStringToFind, myListLength, myListFinal);
        stampList(myListFinal);
        std::cout << std::endl;
        do
        {
            std::cout << std::endl;
            std::cout << "prossima manche ?(s per si, altrimenti n)";
            std::cin >> myMainLoop;
        }while((myMainLoop != 's') && (myMainLoop != 'n'));
    } while(myMainLoop == 's');
}
/*EOF*/
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 09 giu 2006, 17:08

che compilatore usi tu sotto linux?
se uso anjua il programma funziona in modo diverso che sotto win..
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

 
PrecedenteProssimo

Torna a Programmare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite