|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
[C] - Esercizio sulle stringhe
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??
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Nessuno sa darmi un input??
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 314
|
scanf("%s",&88MIKI88);
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
__________________
Athlon64 x2 5600 - AsRock ALiveNF5eSata2+ - kingston 2GB ddr2 800 - GeForce 8800gts 320MB |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
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: Codice:
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]);
}
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ Ultima modifica di 88MIKI88 : 05-08-2009 alle 18:31. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2788
|
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)
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Sorry c'hai ragione in effetti il codice corretto è questo:
Codice:
#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;
}
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Quote:
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
|
|
|
|
|
|
#8 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Si ma allora con 256 contatori è un esercizio lunghissimo o sbaglio?=
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 06-08-2009 alle 10:44. |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Dec 2007
Città: .......
Messaggi: 188
|
Potresti farmi un esempio pratico?
__________________
------------------------------------------------------------------------------------------------------------ Intel Core 2 Duo 2.66Ghz - 3gb Ram - Hard Disk 250gb - Scheda Video: GeForce 8500 Gt da 512mb - Windows Xp Pro SP3 IPHONE 3GS 16GB BLACK MACBOOK PRO 15,4" 2.40GHz - 4GB RAM 320GB HD ------------------------------------------------------------------------------------------------------------ |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
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 ![]() ![]() 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 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)
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) Ultima modifica di banryu79 : 06-08-2009 alle 17:14. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:52.






















