Contare ricorrenze sottostringa

di il
11 risposte

Contare ricorrenze sottostringa

Salve avrei un problemino in c++ con il conteggio delle sottostringhe

ad esempio " oggi sono stato a Foggia " se inserisco sottostringa gi deve contare 2 ricorrenze

tutto quello che sono riuscito a fare è questo ma ho problemi con i puntatori

#include <iostream>
#include <string>


using namespace std;

int main()
{
cout << " *** Programma che ricevuto da input un elenco di parole, insieme *** \n";
cout << " *** ad una sottostringa passata da input, contera\' quante volte *** \n";
cout << " *** questa e\' presente nell\'elenco*** \n " << endl;
string str; // stringa contenente la serie di parole
string trova; // sottostringa da ricercare
int conta=0; // contatore inizializzato a 0
int uguale=0; // altro contatore
char elemento;
cout << " inserisci le parole digitando invio per terminare la digitazione " << endl << endl;
getline (cin,str);
cout << " Inserisci la sottostringa \n " << endl;
cin >> trova;
cout << " la parola chiave da te inserita e\' " << trova << endl;
for(int i=0; i<str.size(); i++)
{ char elemento = str.at(i);
for(int j=0; j<trova.size(); j++)
{ i++;
if (elemento==trova.at(j))
uguale++;
if (uguale==trova.size())
conta++;
}
}

cout << " la parola chiave " << trova << " compare nell\'elenco " << conta << " volte " << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

Dove sbaglio??

Grazie e buona Epifania

11 Risposte

  • Re: Contare ricorrenze sottostringa

    Perche fai tutte sti algoritmi custom quando per string ne esistono già e sono molto meglio implementati.
    
    string str = "oggi sono stato a Foggia";
    string trova = "gi";
    size_t found = -1;
    int count = 0;
    while((found = str.find(trova,found+1)) != string::npos)
         count++;
    
    cout << count;
    
  • Re: Contare ricorrenze sottostringa

    Perchè sto studiando con un amico e devo risolvere il problema con le sole conoscenze in mio possesso...

    size_t found ad esempio non l'ho ancora studiato, se mi spiegassi dove sbaglio nell'incrementare i puntatori nel mio listato sarebbe la cosa ideale....
  • Re: Contare ricorrenze sottostringa

    Il problema è che studi male. Avete imparato le stringhe? si allora devi sapere che le stringhe hanno come posizione non valida il npos. Le stringhe hanno delle funzioni già implementate x cercare una sottostringa. Tu stai imparando il C++ ma stai risolvendo il problema come se stessi lavorando in C. size_t non è nient'altro che un unsigned int. found quindi è una variabile unsigned int. str.find trova la prima occorenza della stringa "trova" partendo dalla posizione found+1. Siccome found all'inizio è uguale a -1 found +1 corrisponde a 0 (inizio stringa). str.find ti ritorna la poszione in cui inzia la sottostringa. Questa posizione viene salvata in found e alla prossima iterazione str.find partirà con la ricerca nella posizione found+1 e così fino alla fine. Una riga che risolve tutto usando CIO CHE DOVRESTI AVER IMPARATO sulle stringhe e non soluzioni custom che non fanno altro che abbassare la valutazione.
  • Re: Contare ricorrenze sottostringa

    Sì hai perfettamente ragione e il concetto fila, così come il programma che ho provato pure al compilatore....

    Il punto è che devo sbattermi per usare bene i puntatori e i cicli e le stringhe sono uno dei modi per esercitarsi, sarebbero potuti anche essere numeri tanto per capirci....

    Ecco il perchè di questi algoritmi custom
  • Re: Contare ricorrenze sottostringa

    Allora mettiamo a posto il tuo listato . in un thread precedente avevo postato una soluzione in C ma adesso non mi ricordo che thread era. Centravano le sottostringhe cmq.
  • Re: Contare ricorrenze sottostringa

    Ipotizzando il solo ciclo per contare le ricorrenze

    for (int i=0; i<str.size();i++)
    {
    char carattere=str.at(i);
    int pos=-1;
    for (j=0; pos <0 && j<trova.size();j++)
    {
    if (carattere==trova.at(j))
    {
    pos=j;
    if (pos>0)
    conta++;
    if (conta==trova.size())
    uguale++;
    }
    }
    }
    cout << uguale;

    tuttavia se inserisco come str ca fa ca fa ca

    mi dice che ca è presente solo 1 volta, per cui sbaglio ancora qualcosa
  • Re: Contare ricorrenze sottostringa

    Evidentemente si. Prova un attimo sto codice.
    
    #include <iostream>
    #include <string>
    
    
    using namespace std;
    
    int main()
    {
    	cout << " *** Programma che ricevuto da input un elenco di parole, insieme *** \n";
    	cout << " *** ad una sottostringa passata da input, contera\' quante volte *** \n";
    	cout << " *** questa e\' presente nell\'elenco*** \n " << endl;
    	string str; // stringa contenente la serie di parole
    	string trova; // sottostringa da ricercare
    	int conta=0; // contatore inizializzato a 0
    	int uguale=0; // altro contatore
    	char elemento;
    	cout << " inserisci le parole digitando invio per terminare la digitazione " << endl << endl;
    	getline (cin,str);
    	cout << " Inserisci la sottostringa \n " << endl;
    	cin >> trova;
    	cout << " la parola chiave da te inserita e\' " << trova << endl;
    	
    	int posInizioOccorrenza = 0;
    	for(int i=0; i<str.size(); i++)
    	{ 
    		bool trovatoInizioOccorrenza = false;
    		uguale = 0;
    		for(int j=0; j<trova.size(); j++)
    		{ 
    			if (str.at(i)==trova.at(j))
    			{
    				if(trovatoInizioOccorrenza == false)
    				{
    					posInizioOccorrenza = i;
    					trovatoInizioOccorrenza = true;
    				}
    				uguale++;
    				i++;
    			}
    			else
    			{
    				if(trovatoInizioOccorrenza == true)
    				{
    					trovatoInizioOccorrenza = false;
    					i = posInizioOccorrenza;
    				}
    				uguale = 0;
    				break;
    			}
    			if (uguale==trova.size())
    				conta++;
    		}
    	}
    	cout << conta;
    	return 0;
    }
    
  • Re: Contare ricorrenze sottostringa

    Non va esce dal compilatore senza nessun risultato, mi succede spesso
  • Re: Contare ricorrenze sottostringa

    Va ma non riesci a vedere il risultato
    metti un
    
    cin.ignore(1000);
    cin.get();
    
    prima del return;
  • Re: Contare ricorrenze sottostringa

    Intanto credo che ste 2 ultime istruzioni parecchie volte mi abbiano fatto credere di aver sbagliato perchè sennò nn si spiega....

    in sostanza a che servono ?

    ora mi studio il codice per capire dove sbagliavo

    getline (cin, grazie1000)
  • Re: Contare ricorrenze sottostringa

    Cin.ignore() svuota il buffer del stdin, cin.get() resta in attesa di un carattere, in sostanza dici al programma di aspettare a chiudersi perche li devi passare qualcosa.
    
    string str = "prego";
    string::iterator it;
    for(it = str.begin(); it!= str.end(); ++it)
          cout << *it;
    
    sembriamo due defficenti con sti saluti ma va bene lo stesso.
Devi accedere o registrarti per scrivere nel forum
11 risposte