ricerca di una parola..

Discuti dei problemi relativi alla programmazione nel tuo linguaggio preferito!

Moderatori: cb_123, thrantir, tonertemplum

Messaggiodi thrantir il 07 giu 2006, 17:50

non nel main, nella signatura della funzione

Codice: Seleziona tutto
void findWord (
    std::string aStringToFind,
    const std::list<std::string>& aList,
    std::list<std::string> &finalList)
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 07 giu 2006, 18:58

che ne pensi

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);
                }
            }
        }
    }
}
// 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);                   
     }
}
// Inserimento parametri.
void getParam (int &aLength, char aStringToFind[])
{
    do
    {
     std::cout << "inserisci la lunghezza che deve avere la parola: " ;
     std::cin >> aLength;
    }while(aLength > 21);
    do
    {
     std::cout << "inserisci la sillaba che ricerchi: " ;
     std::cin >> aStringToFind;
     }while(strlen(aStringToFind)>5);
}
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
     int myContWord=0;
     int myIterIndentazione=1;
     std::list<std::string>::const_iterator myIter;
     for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
          {
                if(myIterIndentazione > 3)
                            myIterIndentazione=1;
                if(myIterIndentazione <= 2)
                 {             
                                 std::cout << *myIter << "   ";
                                  myIterIndentazione++;
                }                 
                if(myIterIndentazione == 3)
                 {
                                   std::cout << *myIter << "\n" ;
                                   myIterIndentazione++;
                 }                 
             myContWord++;   
          }
     std::cout << std::endl;
     std::cout <<  "totale parole trovate: " << myContWord ;
     
}

// main
int main(int argc, char* argv)
{
    int aLength=0;
    char aStringToFind[] = "aaaaa";
    char myMainLoop;
   
   do
     {     
           getParam (aLength, aStringToFind);
           std::list<std::string> aListLength;
           createList(aLength, aListLength);
           std::list<std::string> aListFinal;
           findWord (aStringToFind, aListLength, aListFinal);
           stampList(aListFinal);
           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*/
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 07 giu 2006, 21:42

ora me lo copio e ci do uno sguardo :wink:
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 07 giu 2006, 21:51

nuova versione di getParam, con la std::string al posto del char[]

Codice: Seleziona tutto
// Inserimento parametri.
void getParam (int &aLength, std::string& aStringToFind)
{
    do
    {
        std::cout << "inserisci la lunghezza che deve avere la parola: " ;
        std::cin >> aLength;
    }while(aLength > 21);
    do
    {
        std::cout << "inserisci la sillaba che ricerchi: " ;
        std::cin >> aStringToFind;
    }while(aStringToFind.length()>5);
}


di conseguenza, nel main si ha
Codice: Seleziona tutto
std::string aStringToFind("aaaaa");
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 07 giu 2006, 22:01

che ne pensi dell 'algortimo di stampa indentata? tu come avresti fatto per creare delle colonne?
o a voler fare qualcosa di piu raffinato del tipo "inteligente".. cioè crea il numero di colonne in base alla lunghezza della parole in modo da starci senza andare a capo.
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 07 giu 2006, 22:18

ti ho risistemato la stampa della lista

eccola

Codice: Seleziona tutto
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
        std::cout << *myIter << "\t";
        myContWord++;
        if((myContWord%3) == 0)
        {
            std::cout << std::endl;
        }
    }
    std::cout << std::endl;
    std::cout <<  "totale parole trovate: " << myContWord ;
}


in pratica, tu volevi andare a capo ogni 3 parole. Siccome già contavi le parole, questo lo puoi fare semplicemente con l'istruzione
Codice: Seleziona tutto
if((myContWord%3) == 0)
        {
            std::cout << std::endl;
        }

che vuol dire: "quando myContWord diviso 3 da resto 0, aggiungi un endline"

invece del "\n" metti sempre std::endl, così se per caso un giorno il carattere di accapo cambiasse, non devi cambiare il codice
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 07 giu 2006, 22:20

uhm, allora

si potrebbe tenere una variabile intera che tiene conto della lunghezza della riga finora raggiunta, quando eccede un valore che imposti tu va a capo

ora lo scrivo
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 07 giu 2006, 22:25

thrantir ha scritto:
Codice: Seleziona tutto
if((myContWord%3) == 0)
        {
            std::cout << std::endl;
        }

che vuol dire: "quando myContWord diviso 3 da resto 0, aggiungi un endline"

invece del "\n" metti sempre std::endl, così se per caso un giorno il carattere di accapo cambiasse, non devi cambiare il codice



è vero questa cosa me la sono proprio scordata.. cè anche nel C.
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 07 giu 2006, 22:28

prima versione

Codice: Seleziona tutto
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    final const myLineLengthLimit = 30;
    std::string mySeparator("    ");
    int myLineLength = 0
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
        myLineLength += *myIter.length() + mySeparator.length();
        if(myLineLength > myLineLengthLimit)
        {
            std::cout << std::endl;
            myLineLength = *myIter.length();
        }
        std::cout << *myIter << mySeparator;
        myContWord++;
    }
    std::cout << std::endl;
    std::cout <<  "totale parole trovate: " << myContWord ;
}


ma non mi piace perchè stampa il separatore anche per l'ultimo elemento della riga, che è inutile, vediamo se trovo un modo furbo per non farlo
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 07 giu 2006, 22:37

nuova versione
Codice: Seleziona tutto
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    final const myLineLengthLimit = 30;
    std::string mySeparator("    ");
    int myLineLength = 0
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
        myLineLength += *myIter.length();
        if(myLineLength > myLineLengthLimit)
        {
            myLineLength = *myIter.length();
            std::cout << std::endl;
        }
        std::cout << *myIter;
        myLineLength += mySeparator.length();
        if(myLineLength > myLineLengthLimit)
        {
            myLineLength = *myIter.length();
            std::cout << std::endl;
        }
        else
        {
            std::cout << mySeparator;
        }
        myContWord++;
    }
    std::cout << std::endl;
    std::cout <<  "totale parole trovate: " << myContWord ;
}


non mi piacciono troppo quei due if, ma così, mette il separatore solo se ci sta
ancora, però, potrebbe metterlo quando non serve...
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 07 giu 2006, 22:50

a me da errore qui
Codice: Seleziona tutto
final const myLineLengthLimit = 30;


io pensavo di risolvere cosi questo problema..

io so che i caratteri visibili nella finestra sono fissati ad 80=lineEnd (almeno credo)
e io conosco la lunghezza della parola e anche del separatore..
quindi io
for (che scorre la lista)
{
do{
stampo myiter
LineEnd=LineEnd - lunghezza parola - lunghezza separatore
if (lineend > lunghezza parola)
stampo myiter
}
while(lineend > lunghezza parola + lunghezza separatore)
stampa separatore
}

ora lo scrivo in codice.. e vedo se va.
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 07 giu 2006, 22:53

c'erano un po di errori di sintassi, ecco la verisone che compila
Codice: Seleziona tutto
//stampa a schermo dei termini trovati corrispondenti ai parametri.
void stampList (const std::list<std::string> &aListFinal)
{
    const int myLineLengthLimit = 30;
    std::string mySeparator("    ");
    int myLineLength = 0;
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
        myLineLength += myIter->length();
        if(myLineLength > myLineLengthLimit)
        {
            myLineLength = myIter->length();
            std::cout << std::endl;
        }
        std::cout << *myIter;
        myLineLength += mySeparator.length();
        if(myLineLength > myLineLengthLimit)
        {
            myLineLength = myIter->length();
            std::cout << std::endl;
        }
        else
        {
            std::cout << mySeparator;
        }
        myContWord++;
    }
    std::cout << std::endl;
    std::cout <<  "totale parole trovate: " << myContWord ;
}
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 07 giu 2006, 22:59

già, la mitica consolle di windows con il num di caratteri limitati (non parliamone va...)

metti quindi

const int myLineLengthLimit = 80;
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 07 giu 2006, 23:08

Codice: Seleziona tutto
void stampList (const std::list<std::string> &aListFinal)
{
    int myFreeSpace = 80;
    std::string mySeparator("     ");
    int myContWord=0;
    std::list<std::string>::const_iterator myIter;
    for(myIter = aListFinal.begin(); myIter != aListFinal.end(); ++myIter)
    {
         std::cout << *myIter;
         if(myFreeSpace > mySeparator.length())                           
                     std::cout << mySeparator;
         myFreeSpace = myFreeSpace - myIter->length() - mySeparator.length();
        if(myFreeSpace < myIter->length())
        {
                       std::cout << std::endl;       
                       myFreeSpace=80;               
        }
        myContWord++;
    }
    std::cout << std::endl;
    std::cout <<  "totale parole trovate: " << myContWord ;
}


che ne pensi del mio?
vogliadidolci.wordpress.com
Avatar utente
`knives`
Moderatore
Moderatore
 
Messaggi: 6246
Iscritto il: 24 mar 2005, 01:57

Messaggiodi thrantir il 08 giu 2006, 08:52

allora, nella prima istruzione del corpo del for, tu scrivi una parola quindi il tuo free space e' gia' diminuito, e devi tenere conto di questo nella guardia dell'if. Poi, per sapere se devi andare a capo, utilizzi la lunghezza della parola che hai gia' scritto, non e' detto che la parola dopo non ci stia nella riga...
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

 
PrecedenteProssimo

Torna a Programmare

Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti