PDA

Visualizza la versione completa : [C++] Conteggio e stampa frequenze dei caratteri


frinciola
01-12-2007, 17:35
ciao,mi chiamo francesca e ho appena inizaito un corso di programmazione.Ho da svolgere degli esercizi e non sono molto pratica.Il progarmma seguente dovrebbe contare la frequenza delle lettere delle parole che dai in input; la prima parte del codice l'ha giÓ scritta il mio professore mentre io ho scritto solo

if (isalpha(ch))

{ch=ch-'a';
++freq[ch];}
}


questo programma nei computer in facoltÓ funzionava senza problemi mentre sul mio (uso knoppix per la prima volta) dopo che do l'imput non da alcun risultato e non capisco il perchŔ dato che il compilatore Ŕ lo stesso dei computer in facoltÓ ovvero g++.

#include <iostream>
#include <vector>
#include <cctype> // Per le funzioni isalpha e tolower.
using namespace std;

// Programma che conta e stampa le frequenze delle lettere.
int main()
{
vector<int> freq(26); // Caselle automaticamente azzerate.

while (true)
{
char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
if (!cin) { break; } // Uscire dal ciclo, se non ci sono piu` caratteri da leggere.
ch = tolower(ch); // Converte maiuscole in minuscolo
if (isalpha(ch))

{ch=ch-'a';
++freq[ch];}
}

// Stampiamo le frequenze...
cout << "Lettera Frequenza\n";
for (int i=0; i < 26; ++i)
{
cout << " " << char('a'+i) << " " << freq[i] << endl;
}
return 0;
}

grazie.

MItaly
01-12-2007, 17:43
Cosa succede esattamente dopo che dai l'input? Sparisce la finestra? Hai provato ad aggiungere prima del return 0; un


cout<<"Premere Invio per uscire...";
cin.ignore();
?

frinciola
02-12-2007, 20:18
ho provato ad aggiungere le due linee di codice che mi hai consigliato ma il risultato non cambia:quando do invio il cursore si sposta alla linea successiva che per˛ rimane vuota..ho provato anche con un altro compilatore (devc++) perchŔ non ho sempre la possibilitÓ di usare il computer con g++ ma anche questo mi da lo stesso risultato...praticamente Ŕ come se non leggesse l'imput..non capisco davvero cos'Ŕ che non va..

Xaratroom
02-12-2007, 21:12
Premetto che dev usa g++ di default e che non Ŕ un compilatore ma un IDE ...


while (true)
{
char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
if (!cin)
{
break;
} // Uscire dal ciclo, se non ci sono piu` caratteri da leggere.
ch = tolower(ch); // Converte maiuscole in minuscolo
if (isalpha(ch))
{
ch=ch-'a';
++freq[ch];
}
}

Cosa significa if (!cin) ??
Un alternativa pu˛ essere: if (ch == '\n')
(<cctype> puoi toglierla)

frinciola
02-12-2007, 22:18
non so bene cosa significhi (!cin) perchŔ quella parte di codice l'ha scritta il mio professore..ho aggiunto il codice che mi hai sugggerito e il programmino funziona!l'alternativa che hai proposto ovvero if (ch == '\n') significa che esce dal ciclo se trova uno spazio,giusto? per esercizio dovrei modificare lo stesso programmino in maniera che conti solo la freq delle ultime lettere delle parole:io avevo pensato di fare cosi



int main()
{
vector<int> freq(26); // Caselle automaticamente azzerate.
char ult;
while (true)
{
char ch = cin.get(); // Legge un carattere dall'input e lo mette in ch
if (ch=='\n') { break; }
ch = tolower(ch); // Converte maiuscole in minuscolo
if (isalpha(ch))
{ch=ult;}
else ch=ult-'a';
++freq[ch];

}




per˛ chiaramente non funziona..qualche suggerimento su dove ho sbagliato?

Xaratroom
03-12-2007, 00:31
non so bene cosa significhi (!cin) perchŔ quella parte di codice l'ha scritta il mio professore..ho aggiunto il codice che mi hai sugggerito e il programmino funziona!l'alternativa che hai proposto ovvero if (ch == '\n') significa che esce dal ciclo se trova uno spazio,giusto?

Esce se viene premuto invio ...
Che intendi per ultime lettere delle parole ?
Se ti riferisci all'ultima lettera di ogni parola ti basta mantenere uno storico della lettera precedente alla lettura di uno spazio ...
Tuttavia cin.get trascura gli spazi quindi devi cambiare metodo di acquisizione ...

frinciola
03-12-2007, 09:11
il metodo l'avevo capito,il problema Ŕ che non sapevo esattamente il funzionamento di cin.get.Quale altro metodo di acquisizione posso usare in modo che legga un carattere alla volta (che Ŕ quello che fa cin.get giusto?) senza ignorare gli spazi? scusate le domande banali ma sono alle primissime armi..

XWolverineX
03-12-2007, 19:53
Che brutto ciclo... un while(true) e poi un break all'interno di esso...perchŔ non un
while (cin.get() = '\n')

shodan
03-12-2007, 20:52
Occhio che per˛ non recuperi il carattere.


char ch;
while ((ch = cin.get()) != '\n') {
cout << ch;
}
cout << endl;

Risolve il problema.

Xaratroom
04-12-2007, 15:34
Il problema Ŕ che cin.get () trascura gli spazi ...
Personalmente, non trovo una funzione cpp che non li ignori ...

Loading