Esercizio su vettori in C

di Anonimizzato28411 il
61 risposte
Buongiorno, ho un problema, non riesco a risolvere questo problema:
Si scriva un programma che visualizzi un istogramma delle frequenze dei diversi caratteri contenuti nel testo di ingresso.
Questo è quello che sono riuscito a fare in base a quello che ho imparato:

#include <stdio.h>
// conta la frquenza dei diversi caratteri contenuti nel testo d' ingresso
main()
{
	int c, i;//carattere in input
	int frequenza[10];// vettore di frequenze
	int v[10];

	for (i = 0;i < 10;++i)
	{
		frequenza[i] = 0;
	}

	while ((c = getchar()) != EOF)
	{
		v[i] = c;
		for (i = 0; i < 10; ++i)
		{
			if (v[i] == v[i + 1]) printf("*");
		}
	}
}
Devo per forza usare getchar() e anche i vettori possibilmente.

61 Risposte

  • Guarda che sei fuori strada.

    Le lettere sono 26 non 10 e l'input lo devi fare su un vettore di char di lunghezza adeguata.
  • Ok grazie
  • Ma con vettore di char intendi vettore di caratteri? Perché se si volevo non usarlo possibilmente
  • Perché i vettori di caratteri è un argomento successivo a quello che sto facendo sul mio libro
  • Puoi anchenon usarlo. Usasolamente il vettore di 26 int senza memorizzare i char.
  • Ok grazie, lo faccio.
  • Scusa ma e' un esercizio sui vettori ?

    In questo caso ti si chiede:
    1) scrivere in input un testo qualsiasi, magari metti un controllo che ti permetta di non andare oltre un numero di caratteri, altrimenti un utente potrebbe scriverci dentro la divina commedia.
    2) contare quante volte gli stessi caratteri si ripetono all'interno del testo appena scritto. Ovviamente potresti utilizzare una variabile diversa per ogni lettera dell'alfabeto, ma questo metodo credo sia poco ortodosso (diciamo cosi...), quindi come effettui il conteggio e dove lo memorizzi per essere rappresentato successivamente ? Potresti usare un vettore, meglio ancora una matrice... vabbe' fai tu.
    3) il testo dovra' essere ripassato tutto, contando le singole lettere, e memorizzando in un vettore, volta per volta, la somma delle lettere uguali all'interno del vettore, con un bel ciclo che si fermera' alla fine del testo.
    4) ripassi con un ciclo il vettore, e cella dopo cella del vettore disegni gli asterischi corrispondenti al numero delle lettere del testo, sempre tutto in un altro ciclo.

    Questo e' un metodo semplice, perche' potresti farlo anche con un unico ciclo, ma perche' no... anche senza vettore... tutto dipende dalla complessita' e dalla tua preparazione.
    Puoi provare diverse soluzione e sperimentare, ovvio.

    Alla fine dovresti ottenere qualcosa del genere:
    
    -----------------------------------------------------------------
    INSERISCI UN TESTO: ciao il mio nome e giorgio
    
              *         *
              *         *
              *         *
              *         *         *         *    *
         *    *    *    *    *    *    *    *    *    * 
         c    i    a    o    l    m    n    e    g    r
    -----------------------------------------------------------------
    
  • Ramcrack...non è necessario memorizzare e ripassare il testo.i caratteri si possono contare senza memorizzati. Si usa un vettore di 26 int per le sole lettere o di 256 int per comodità per tutti i caratteri ascii
  • Ok grazie mille appena ho un attimo di tempo mi ci metto e poi vi dico cosa ho fatto
  • Si è un esercizio sui vettori o almeno fa parte di quell' argomento sul mio libro
  • oregon ha scritto:


    Guarda che sei fuori strada.

    Le lettere sono 26 non 10 e l'input lo devi fare su un vettore di char di lunghezza adeguata.
    Quindi tipo cosi l 'input su un vettore di char? Però come indice cosa metto al' elemento del vettore c in input?:
    while((c[indice] = getchar()) !)= EOF){...}
  • oregon ha scritto:


    Ramcrack...non è necessario memorizzare e ripassare il testo.i caratteri si possono contare senza memorizzati. Si usa un vettore di 26 int per le sole lettere o di 256 int per comodità per tutti i caratteri ascii
    Ovviamente le soluzioni possono essere tante... quella scritta da me, e' stata la prima che mi e' venuta in mente di getto, mentre scrivevo sul thread.
    Anzi un esercizietto come questo, offre spunti per diverse soluzioni perfezionabili.
  • SuperManPC ha scritto:


    oregon ha scritto:


    Guarda che sei fuori strada.

    Le lettere sono 26 non 10 e l'input lo devi fare su un vettore di char di lunghezza adeguata.
    Quindi tipo cosi l 'input su un vettore di char? Però come indice cosa metto al' elemento del vettore c in input?:
    while((c[indice] = getchar()) !)= EOF){...}
    Ho provato a seguire il tuo consiglio oregon, però non so come fare per l' indice dell' elemento c che è uguale a getchar():
    
    #include <stdio.h>
    // conta la frquenza dei diversi caratteri contenuti nel testo d' ingresso
    main()
    {
    	int c[26], i;//carattere in input
    	int frequenza[26];// vettore di frequenze
    	int v[26];
    
    	for (i = 0;i < 26;++i)
    	{
    		frequenza[i] = 0;
    	}
    
    	while ((c[indice] = getchar()) != EOF)//qua non so che indice mettere a c[]
    	{
    		v[i] = c;
    		for (i = 0; i < 26; ++i)
    		{
    			if (v[i] == v[i + 1]) printf("*");
    		}
    	}
    }
    
  • Ti serve solo il vettore frequenza. Il vettore v non ti serve e tutto quello che hai messo nella while è sbagliato. Devi mettere una if che controlli che c sia una lettera minuscola e poi usi c come indice del vettore frequenza togliendo il codice ascii di 'a'.

    Se vi danno questi esercizi è evidente che dovete sapere cosa sia il codice ascii quindi non lo chiedere
Devi accedere o registrarti per scrivere nel forum
61 risposte