|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Caserta
Messaggi: 1056
|
[C] Istogramma lunghezza parole
Per un'esercitazione devo scrivere un programma C che disegni un istogramma che rappresenti la lunghezza delle parole inserite.
Alcune limitazioni: devo necessariamente utilizzare la funzione getchar() come input, non posso inventare funzioni, posso usare i costrutti for, if e while e devo utilizzare i vettori. Non posso utilizzare altre funzioni di input, non posso utilizzare vettori di caratteri. Al momento sono riuscito soltanto a scrivere un programma che conti il numero di caratteri e parole in input. Codice:
/* Questo programma conta caratteri e parole */
#include <stdio.h>
#define IN 1
#define OUT 0
main()
{
printf("Inserire il testo di seguito\n");
int c, nc, nw, interruzione, state;
c = nc = nw = interruzione = 0;
state = OUT;
while ((c=getchar()) != EOF)
{
++nc;
if ( c == '\n' || c == '\t' || c == ' ' ) { state = OUT; ++interruzione; }
else if (state == OUT) { state = IN; ++nw;}
}
printf("\n");
printf("Numero interruzioni: %d\n", interruzione);
printf("Numero caratteri: %d\n", nc);
printf("Numero parole: %d\n", nw);
}
Se qualcuno ha delle idee in merito potrebbe darmi una mano? Anche se fosse necessario un cambiamento radicale del programma. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Feb 2006
Città: Caserta
Messaggi: 1056
|
Nessuna idea? Sto impazzendo...
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ciao io ho provato a fare a trovare una soluzione a quello che chiedevi..vedi un pò se va bene...se non ti è chiaro qualcosa chiedi pure...
Codice:
#include <stdio.h>
#define IN 1
#define OUT 0
int main()
{
printf("Inserire il testo di seguito\n");
int c, nc, nw, interruzione, state, i, j, flag=0, max=0;
int vet[26]; //lettere alfabeto ricorrenze
char alfa[26]; //lettere alfabeto contenente lettere
for ( c=0; c<26; c++ ) {
alfa[c] = 97 + c;
}
for ( c=0; c<26; c++ ) {
vet[c]=0; //azzera il vettore
}
c = nc = nw = interruzione = 0;
state = OUT;
while ((c=getchar()) != EOF)
{
++nc;
vet[c-'a']++;
if ( c == '\n' || c == '\t' || c == ' ' ) {
state = OUT;
++interruzione;
}
else if (state == OUT) {
state = IN;
++nw;
}
}
printf ("\nCreazione istogramma:\n");
for ( c=0; c<26; c++ ) {
printf ("%c ", alfa[c]);
}
printf ("\n");
for ( i=0; i<26; i++ ) { //ricerca massimo in vet
if ( vet[i] > max ) {
max = vet[i];
}
}
//istogramma
for ( i=0; i<max; i++ ) {
for ( j=0; j<26; j++ ) {
if ( vet[j] > 0 ) {
printf ("* ");
vet[j]--;
}
else printf (" ");
}
printf ("\n");
}
printf("\n");
printf("Numero interruzioni: %d\n", interruzione);
printf("Numero caratteri: %d\n", nc);
printf("Numero parole: %d\n", nw);
getchar();
return 1;
}
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ma questo non conta la frequenza dei caratteri?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
#5 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
come non conta la frequenza dei caratteri?! e allora cosa intendi per la frequenza dei caratteri?
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
Lo vedo che il tuo codice conta la frequenza dei caratteri, ma non era il testo del problema o sbaglio?
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 15-11-2008 alle 14:32. |
|
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Io farei così:
Codice:
#include <stdio.h>
int main()
{
int c, nc, nw, interruzione;
char sz[1024];
printf("Inserire il testo di seguito\n");
c = nc = nw = interruzione = 0;
//while ((c=getchar()) != EOF)
while ((c=getchar()) != '\n')
{
if ( c == '\n' || c == '\t' || c == ' ' )
{
++interruzione;
sz[nc++] = '\n';
++nw;
}
else
{
sz[nc++] = '+';
}
}
sz[nc] = '\0';
++nw;
printf("\n");
printf("Numero interruzioni: %d\n", interruzione);
printf("Numero caratteri: %d\n", nc);
printf("Numero parole: %d\n", nw);
printf("\nIstogramma:\n%s\n", sz);
return 0;
}
Ultima modifica di Vincenzo1968 : 15-11-2008 alle 16:28. |
|
|
|
|
|
#8 | |
|
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
si ma scusa così come fai tu, fa introdurre una sola parola e se viene premuto return già finisce il programma, mentre nel caso che ho fatto io puoi introdurre più parole e premere return quante volte vuoi; comunque rilegendo:
Quote:
|
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Quote:
- Lunghezza 3: 10 parole - Lunghezza 4: 8 parole - Lunghezza 5: 3 parole - Lunghezza 9: 1 parola
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
|
|
#10 | ||
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Quote:
|
||
|
|
|
|
|
#11 |
|
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Questo è un esempio di output del mio programma:
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Jul 2002
Città: Reggio Calabria -> London
Messaggi: 12112
|
ma non era (giustamente) vietato postare le soluzioni complete per esercizi/esercitazioni et similia?
__________________
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Feb 2008
Messaggi: 49
|
ah scusate...avevo capito male...adesso ho capito come funziona...
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Feb 2006
Città: Caserta
Messaggi: 1056
|
Quote:
Comunque grazie ragazzi, ora do uno sguardo ai codici. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Ah.
Allora posto anche io. Ah, e' in C#? Peccato Codice:
static void Main(string[] args)
{
List<string> input = new List<string>();
Console.WriteLine("Inserisci le stringhe");
for (string inp = Console.ReadLine(); !string.IsNullOrEmpty(inp); inp = Console.ReadLine())
{
input.Add(inp);
}
var isto = from word in input
group word by word.Length into grp
let cnt = grp.Count()
orderby cnt descending
select new { len = grp.Key, occ = cnt };
Console.WriteLine();
Console.WriteLine("Results:");
foreach (var v in isto)
{
string barra = new string('+', v.occ);
Console.WriteLine("{0} - {1}", v.len, barra);
}
Console.ReadKey();
}
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:36.



















