View Full Version : [C] - Esercizio sulle stringhe
88MIKI88
05-08-2009, 12:18
Sul libro "Il linguaggio C - Principi di programmazione e manuale di riferimento" nel capitolo dei vettori mi trovo questo esercizio:
"Si scriva un programma che stampi l'istogramma relativo ai diversi caratteri contenuti nel testo di ingresso"
C'è qualcuno che sà darmi qualche input??
88MIKI88
05-08-2009, 15:06
Nessuno sa darmi un input??
scanf("%s",&88MIKI88); :p
Non hai capito il testo?
un istogramma puoi farlo stampando per esempio degli asterischi in questo modo
**********
******
*************
****
dove il numero degli asterischi indica la frequenza di ciascuna lettera nella stringa
88MIKI88
05-08-2009, 16:23
Il testo l'ho capito xkè prima ne avevo svolto uno che chiedeva di stampare l'istogramma relativo alla lunghezza delle parole.
Il problema invece nasce quando devi crearlo su ogni singolo carattere che il prog. legge...
Nell'altro es. avevo usato getchar.
Di seguito posto l'altro esercizio:
include <stdio.h>
#define MAX 10
main ()
{
char c;
int nc,i, Vet[MAX];
for (i=0;i<=MAX;i++)
Vet[i]=0;
nc=0;
while ((c=getchar())!=EOF) {
printf("%c",c);
if(c=='\n'){
Vet[nc-1]++;
break;
}
if (c== ' ') {
Vet[nc-1];
nc=0;
}
else {
nc++;
}
}
for (i=0;i<=MAX;i++)
printf("Lunghezza\t%d\occorrenze:\t%d\n", i+1, Vet[i]);
}
wingman87
06-08-2009, 01:36
Mi sembra che ci sia qualche errore in quest'ultimo codice che hai postato. Comunque il principio da adottare per risolvere quest'altro esercizio è lo stesso, crei un array di dimensione 256 che sono i possibili valori di un char poi per ogni carattere letto incrementi il contatore corrispondente. Alla fine stampi il carattere e gli asterischi in base al contatore di quel carattere (magari considerando solo quelli con contatore >0)
88MIKI88
06-08-2009, 09:15
Sorry c'hai ragione in effetti il codice corretto è questo:
#include "stdio.h"
#define LEN_MAX 10
int main(int argc, char* argv[])
{
char c;
int i,contatore,conteggi[LEN_MAX];
for(i=0;i<LEN_MAX;i++){
conteggi[i]=0;
}
contatore=0;
while(c=getchar()){
printf("%c",c);
if(c=='\n'){
conteggi[contatore-1]++;
break;
}
if(c==' '){
conteggi[contatore-1]++;
contatore = 0;
}
else{
contatore++;
}
}
for(i=0;i<LEN_MAX;i++){
printf("Lunghezza:\t%d\toccorrenze:\t%d\n",i+1,conteggi[i]);
}
return 0;
}
Ma quindi devo usare più di un contatore o sbaglio?
banryu79
06-08-2009, 09:16
crei un array di dimensione 256 che sono i possibili valori di un char poi per ogni carattere letto incrementi il contatore corrispondente
256 caratteri possibili == 256 contatori, uno per ogni carattere possibile ;)
88MIKI88
06-08-2009, 09:20
Si ma allora con 256 contatori è un esercizio lunghissimo o sbaglio?=
banryu79
06-08-2009, 09:53
L'insieme dei contatori potrebbe essere un array di tipo int di 256 elementi.
I char sono 256, ogni singolo char puoi anche vederelo come un intero, quindi da un singolo char letto potresti prendere il suo valore intero da usare come indice per incrementare il corrispondente elemento dell'array dei contatori.
[è proprio questa corrispondenza che ti permette di evitare di codificare a mano 256 confronti, se era questo il tuo dubbio]
In pratica, quello che devi fare, è ciclare sul vettore di caratteri, recuperare un char alla volta, usare il valore di quel char come indice per accedere all'elemento specifico dell'array dei contatori e incrementarne il valore di 1.
Alla fine del 'parsing' del vettore, cicli sull'array dei contatori e recuperi un elemento alla volta: stampi il carattere relativo che è il valore dell'indice dell'elemento corrente + 1 castato a tipo char e stampi (altro ciclo) un numero di caratteri '*' pari al valore dell'elemento dell'array dei contatori corrente, infine stampi il carattere di newline, per andare a capo riga.
88MIKI88
06-08-2009, 10:46
Potresti farmi un esempio pratico?
banryu79
06-08-2009, 11:31
Ad esempio, supponiamo di avere un array di char come vettore dei caratteri (mi esprimo in pseudocodice):
- char* caratteri
Supponiamo anche di creare un array di 256 interi, che usiamo come contatore per i caratteri trovati. Il valore di ogni elemento intero nell'array rappresenta il valore del contatore associato con il carattere che ha lo stesso valore dell'indice di quell'elemento.
- int counters[256]
Ora esaminiamo un elmento del vettore di caratteri che dobbiamo contare.
Se io accedo a un elemento, supponiamo il primo, cosa ottengo? Ottengo un char.
- char c = caratteri[0]
Ora voglio incrementare il valore del contatore corrispondente al carattere 'c' che ho appena estratto, come fare?
Semplice: il valore del carattere (il valore di 'c') è, alla fine, un valore di tipo intero! Quindi uso il valore di 'c' (che essendo un char avrà un valore che va da 0 a 255, vedi immagine a fine post) come valore dell'indice dell'elemento da incrementare nell'array 'counters'.
- counters[(int)c] += 1
http://www.cs.utk.edu/~pham/ascii_table.jpg
http://www.asciitable.com/extend.gif
E' più chiaro adesso?
P.S.: non ti faccio un esempio pratico nel senso con codice vero e proprio per due ragioni:
1) non ricordo bene il C (non lo uso da 3 anni) e per evitare strafalcioni (leggi: figure da chiodo :D) dovrei perdere un po' di tempo per controllare di scrivere tutto senza cappellate;
2) e cosa più importante, è un esercizio e nel forum è vietato postare soluzioni complete agli esercizi; ma come vedi spendo volentieri il tempo cercando di fornire spiegazioni più chiare affinchè tu arrivi da solo a capire (e a quel punto scrivere il codice diventa semplice e divertente) ;)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.