PDA

Visualizza la versione completa : [C++] Frequenza delle lettere usate in una stringa


Mr_Flash
15-09-2004, 16:44
Ciao ragazzi,
dovrei realizzare un programmino che mi permetta di:

1)inserire una stringa
2) visualizzare quante volte viene ripetuta ogni singola lettera della stringa digitata

Esempio:

Stringa: ciccio

C=3
i=2
c=3
c=3
i=2
0=1

Sto testando il tutto utilizzando prima un array:

#include <iostream>
#include <stdlib.h>
#include <iomanip>

using namespace std;

int main()
{
const int responsesize = 40, frequencysize = 10;
int m[responsesize] = {1,6,8,3,9,8,4,4,5,7,4,6,2,3,4,5,4,1,1,4,6,8,9,7,
5,6,9,9,4,8,4,7,6,4,3,4,5,6,1,4};
int frequency[frequencysize] = {0};

for (int i = 0; i < responsesize; i++)
++frequency[m[i]];

cout <<"Voto" << setw(17) << "Frequenza" << endl;

for (int voto = 1; voto<frequencysize; voto++)
cout << setw(4) << voto << setw(16) << frequency[voto] << endl;


system("PAUSE");
return 0;
}


ma con le stringhe ho qualche problemino...qualcuno mi sa dare una mano??

Grazie

:ciauz:

/dev/null
15-09-2004, 17:01
Fai prima a fare cosi':
1: Crei un array di interi con tanti elementi quanti il numero di lettere:
2: Azzeri tutti gli elementi
3: Scanni la stringa lettera per lettera, incrementando il valore dell'array corrispondente

Eccoti uno spunto minimale... dovrai definire le variabili che uso e correggere gli errori che sicuramente ci commettero':

int lettere[26];
for ( i = 0; i < 26; i ++ ) {
lettere[i] = 0;
}

for ( i = 0; i < strlen(stringa); i ++ ) {
if ( stringa[i] >= 'a' && stringa[i] <= 'z' )
lettere[ stringa[i] - 'a' ] ++;
if ( stringa[i] >= 'A' && stringa[i] <= 'Z' )
lettere[ stringa[i] - 'A' ] ++;
/* else
non e' una lettera */
}

for ( i = 0; i < 26; i ++ ) {
if ( lettere[i] )
cout << "Sono state trovate " << lettere[i] << " '" << (char)('a'+i) << "'.\n";
}Ovviamente la stringa che vuoi scannare sara' la variabile "stringa"


Fammi sapere


:ciauz: :ciauz:

Mr_Flash
15-09-2004, 18:01
Scusami ma sono alle prime armi..
stringa come va definita nel main? :master:

/dev/null
15-09-2004, 20:19
Puoi fare:
char stringa [1024];


:ciauz:

Mr_Flash
19-09-2004, 19:01
Grazie Dev, funziona tutto alla perfezione.

Un'ultima cosa: mi potresti spiegare i vari cicli for ed if del programma? E poi perchè "sottrai" la 'A' - la 'a' ?

Grazie

:ciauz:

Mr_Flash
20-09-2004, 15:14
E se volessi poi invece visualizzare le sole lettere della stringa inserita nell'ordine in cui sono digitate con il valore della frequenza a fianco??

Esempio:

C: 1
i: 1
a: 1
o: 1


Qualcuno mi aiuta?

:ciauz:

Mr_Flash
21-09-2004, 10:33
Nessuno sa darmi una mano? :cry:

Molten
21-09-2004, 16:10
Ho usato le mappe , sono molto utili.


#pragma warning(disable:4786)
#include <iostream>
#include <map>
#include <string>
int main()
{
typedef std::map<char,int> strint_map;
strint_map lett_freq;
strint_map::iterator lett_freqIt;

int i=0;

//Frase
//std::string str = "Questa qui e' molto grande per vedere come funziona";
std::string str = "ciao a tutti";

//Raccoglie le frequenze
for(i=0;i<str.size();i++)
{
lett_freq[str[i]]++;
//std::cout<<""<<str[i]<<" "<<lett_freq[str[i]]<<std::endl;
}

std::cout<<std::endl;

//Primo tipo di stampa
lett_freqIt = lett_freq.begin();
do{
std::cout<<"["<<(*lett_freqIt).first<<"] = "<<(*lett_freqIt).second<<std::endl;
}while(++lett_freqIt!=lett_freq.end() );

std::cout<<std::endl;

//Secondo tipo di stampa
for(i=0;i<str.size();i++)
std::cout<<"["<<str[i]<<"]= "<<lett_freq[str[i]]<<std::endl;

return 0;
}
/*Output
[ ] = 2
[a] = 2
[c] = 1
[i] = 2
[o] = 1
[t] = 3
[u] = 1

[c]= 1
[i]= 2
[a]= 2
[o]= 1
[ ]= 2
[a]= 2
[ ]= 2
[t]= 3
[u]= 1
[t]= 3
[t]= 3
[i]= 2
*/

Vedi se ti va bene.

Mr_Flash
21-09-2004, 16:31
Molten sei stato gentilissimo però per me è troppo difficile, non so nemmeno cosa siano le mappe! :cry: Sono alle prime armi con il c++ e sono arrivato a manipolare array,stringhe,puntatori e strutture :dhò:


Puoi spiegarmi il perchè di questa "sottrazione" lettere[ stringa[i] - 'a' ] ++;

e magari rifare il programmino in maniera moooolto + semplice??

Grazie mille

Mr_Flash
24-09-2004, 10:28
E se volessi ricercare, usando il codice sopra, l'elemento che ricorre più volte come dovrei fare?

Esempio: cout << "L'elemento " << ???? << " ricorre più volte";

Please help
:ciauz:

Loading