PDA

View Full Version : [C] Istogramma lunghezza parole


masteryuri
13-11-2008, 15:01
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.


/* 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);
}


La mia mira (che soddisfa le richieste dell'esercizio) sarebbe quella di porre in output un simbolo o una serie, ad esempio "|+|" per ogni carattere di ogni parola alla fine del programma. Eventualmente fuori dal ciclo while. Vorrei rappresentare nell'istogramma ogni parola come una serie di "|+|" per ogni riga, una riga per parola. Quindi orientando l'istogramma in orizzontale. Non riesco a farmi venire in mente nente purtroppo ... :muro:

Se qualcuno ha delle idee in merito potrebbe darmi una mano? Anche se fosse necessario un cambiamento radicale del programma.

masteryuri
14-11-2008, 12:08
Nessuna idea? Sto impazzendo...

MrX87
15-11-2008, 12:18
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...

#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;
}

gugoXX
15-11-2008, 12:29
Ma questo non conta la frequenza dei caratteri?

MrX87
15-11-2008, 12:54
come non conta la frequenza dei caratteri?! e allora cosa intendi per la frequenza dei caratteri?

gugoXX
15-11-2008, 13:30
come non conta la frequenza dei caratteri?! e allora cosa intendi per la frequenza dei caratteri?

No, era una domanda la mia.
Lo vedo che il tuo codice conta la frequenza dei caratteri, ma non era il testo del problema o sbaglio?

Vincenzo1968
15-11-2008, 15:22
Io farei così:


#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;
}

MrX87
15-11-2008, 15:41
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:
Per un'esercitazione devo scrivere un programma C che disegni un istogramma che rappresenti la lunghezza delle parole inserite.
vedo che allora non serve fare quella roba che conta le lettere ma bisogna solo contare le lettere inserite e tramutarle in asterischi a quanto ho capito...giusto?

gugoXX
15-11-2008, 15:47
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:

vedo che allora non serve fare quella roba che conta le lettere ma bisogna solo contare le lettere inserite e tramutarle in asterischi a quanto ho capito...giusto?

Direi cge bisogna fare un programma che, una volta accettato un certo numero di parole, le raggruppi per lunghezza e dica qualcosa tipo:
- Lunghezza 3: 10 parole
- Lunghezza 4: 8 parole
- Lunghezza 5: 3 parole
- Lunghezza 9: 1 parola

Vincenzo1968
15-11-2008, 15: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;


No, una sola parola no. Una frase intera. Il programma termina con la pressione del tasto invio.


vedo che allora non serve fare quella roba che conta le lettere ma bisogna solo contare le lettere inserite e tramutarle in asterischi a quanto ho capito...giusto?

Boh! :confused: Alla fine faccio stampare l'istogramma che rappresenta la lunghezza delle parole inserite.

Vincenzo1968
15-11-2008, 15:54
Questo è un esempio di output del mio programma:

http://www.guidealgoritmi.it/images/ImgForums/Istogrammi.jpg

^TiGeRShArK^
15-11-2008, 16:01
ma non era (giustamente) vietato postare le soluzioni complete per esercizi/esercitazioni et similia? :mbe:

MrX87
15-11-2008, 16:11
ah scusate...avevo capito male...adesso ho capito come funziona...

masteryuri
15-11-2008, 19:02
ma non era (giustamente) vietato postare le soluzioni complete per esercizi/esercitazioni et similia? :mbe:
Davvero? E perchè? E' un esercizio personale, non me lo ha assegnato nessuno e non sono in una sede d'esame. :)

Comunque grazie ragazzi, ora do uno sguardo ai codici.

gugoXX
15-11-2008, 21:35
Ah.
Allora posto anche io.

Ah, e' in C#? Peccato :D


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();
}