| prof. Nunzio Brugaletta |
C++:
programmazione e oggetti |
Il primo programma proposto si occupa di verificare se alcune parole acquisite da input, sono contenute in un vocabolario. Il vocabolario è un vettore di stringhe che contiene tutte le parole che ne fanno parte e che sono acquisite da input.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> vocab; /*1*/
string parcerc,stinp;
int i,pos;
bool trovata,continua;
// Acquisisce parole da inserire nel vocabolario
cout << “Vocabolario” << endl;
continua=true;
for(i=0;continua;i++) { /*2*/
cout << "\nParola " << i << " " ;
getline(cin,stinp);
if(stinp!="") /*3*/
vocab.push_back(stinp);
else
continua=false; /*4*/
}
// Acquisisce la parola da cercare
cout << "\n\nParola da cercare (Invio per finire) ";
getline(cin,parcerc);
while (parcerc!="") { /*5*/
// Cerca la parola
trovata=false;
for (i=0;i<vocab.size();i++) { /*6*/
if (parcerc==vocab.at(i)) { /*7*/
trovata=true;
pos=i;
break; /*8*/
}
}
if (trovata)
cout << "\nParola trovata, posizione " << pos;
else
cout << "\nParola non trovata";
// Prossima parola da cercare
cout << "\n\nParola da cercare (Invio per finire) ";
getline(cin, parcerc);
}
return 0;
}
Nella 1 si dichiara vocab come vettore di stringhe.
Il ciclo di acquisizione delle parole contenute nel vocabolario, è controllato dal valore della variabile booleana continua (2). Se l'input è vuoto (3), il valore viene posto a false (4) e il ciclo termina.
Anche il ciclo per l'input delle parole da cercare (5) si comporta allo stesso modo: se la stringa è vuota, l'elaborazione termina. L'unica differenza con il ciclo precedente è che, qui, non si visualizza un conteggio delle parole.
Nel ciclo 6 viene effettuata una scansione del vocabolario alla ricerca, se esiste, di una corrispondenza con la stringa cercata (7). Se la parola è presente nel vocabolario la 8 si occupa di forzare l'uscita dal ciclo. È inutile continuare la scansione delle parole del vocabolario.
Il secondo programma proposto estrae da un testo tutte le parole che lo compongono e le inserisce in un vettore:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
string testo,estratta;
vector<string> token;
int inizio,fine,i,lparola;
bool continua;
cout << "Estrae tutte le parole contenute in un testo" << endl;
cout << "\nTesto : ";
getline(cin,testo);
// Estrazione parole (parola racchiusa fra spazi)
// fra due parole c'e' un solo spazio
continua = true;
inizio = -1; /*1*/
while(continua){
fine = testo.find(' ',inizio+1); /*2*/
// ultima parola
if(fine==-1){ /*3*/
continua = false;
fine = testo.length(); /*4*/
}
// Estrazione parola
lparola = (fine-inizio)-1; /*5*/
estratta = testo.substr(inizio+1,lparola); /*6*/
token.push_back(estratta); /*7*/
inizio = fine; /*8*/
}
// Elenco parole
cout << "\nParole che compongono il testo" << endl;
for(i=0;i<token.size();i++)
cout << token.at(i) << endl;
return 0;
}
Si comincia l'elaborazione inizializzando la variabile inizio (1) che sarà la posizione, dello spazio che precede la parola, da cui iniziare la ricerca dello spazio che delimita la parola da estrarre (2). La parola è delimitata dagli spazi che si trovano nella posizione inizio e nella posizione fine (sempre 2). La coppia di valori, contenuti nelle suddette variabili, viene utilizzata per calcolare la quantità di caratteri che compongono la parola.
Se si è arrivati alla fine del testo da elaborare (controllo della 3), oltre che rendere falsa la condizione di controllo del ciclo al fine di chiudere l'elaborazione, viene assegnata a fine la lunghezza del testo (4). È come se si posizionasse fine nello spazio dopo l'ultimo carattere del testo.
La lunghezza della parola, e quindi la quantità di caratteri da estrarre, è calcolata in 5. L'estrazione dei caratteri è effettuata dal metodo substr richiamato per la stringa testo, passandogli la posizione da cui estrarre (quella dopo la posizione dello spazio che precede la parola) e la quantità di caratteri da estrarre (6). La parola viene successivamente (7) inserita in un vettore.
L'assegnazione della 8 ha lo scopo di passare avanti nella ricerca della prossima parola, assegnando come punto di partenza, il punto finale dell'elaborazione precedente.
| http://ennebi.solira.org |
ennebi@solira.org |