Impazzendo con programma stringe di caratteri

di il
9 risposte

Impazzendo con programma stringe di caratteri

Salve sto letteralmente impazzendo come già impazzito lo è il programma. Nel "code" trovate il mio codice con descrizione i problemi sono questi:
- Il programma me lo compila, quando ad esempio inserisco "ciao" mi conta quanti caratteri sono, vocali e consonanti ma non quante volte si ripete una lettera
- Se inserisco la stessa parola compilando più volte, mi va in loop ed esce "Errore di segmentazione (core dump creato)". Non so assolutamente cosa sia.
- Ci sono altri errori di compilazione che potrebbero essere abbreviati?
Ringrazio in anticipo
/* Programma che legge una frase introdotta da tastiera. La frase termina con l'introduzione di invio da tastiera. La frase contiene 
   sia caratteri minuscoli che caratteri maiuscoli, e complessivamente 100 caratteri. Il programma deve stampare: 
	- Per ognuna delle lettere dell'alfabeto, il numero delle volte che essa compare nella stringa
	- Il numero di consonanti e vocali presenti nella stringa							*/


#include <iostream>
#include <cstring>
using namespace std;
const int MAXDIM = 100;			// dimensione massima stringa di caratteri
const int ALFABETO = 26;		// numero lettere alfabeto
int main () {
		char frase[MAXDIM];		// stringa di caratteri inserita
		int lung_stringa;		// lunghezza stringa di caratteri inserita
		int vocali, consonanti;		// contatore vocali e consonanti
		int contatori[ALFABETO];	// contatore lettere alfabeto
		int posizione_alfabeto;		// posizione nell'alfabeto di una lettera
		int i;				// cicli

		cout << "\nInserisci una frase (massimo " << MAXDIM << " caratteri): ";
		cin >> frase;

		lung_stringa = strlen (frase);

		cout << "\nLa frase inserita e': " << frase;
		cout << "\nLa frase inserita contiene " << lung_stringa << " caratteri (compresi gli spazi)\n";

		for (i = 0; i < ALFABETO; i++)
			contatori[i] = 0;

		for (i = 0; i < lung_stringa; i++)
		{
			if (frase[i] >= 'A' && frase [i] <= 'Z')
			{
				posizione_alfabeto = frase[i] - 'A';
				contatori[posizione_alfabeto] ++;
			}
			else
			{
				if (frase[i] >= 'a' && frase[i] <= 'z')
				{
					posizione_alfabeto = frase[i] - 'a';
					contatori[posizione_alfabeto] ++;
				}
			}
		}

		for (i = 0; i < contatori[ALFABETO]; i= i+1)
			cout << "La lettera " << 'A' + 1 << " compare " << contatori[i] << " volte";

		vocali = contatori ['A' - 'A'] + contatori ['E' - 'A'] + contatori ['I' - 'A'] +
			 contatori ['O' - 'A'] + contatori ['U' - 'A'];

		consonanti = 0;
		for (i = 0; i < ALFABETO; i++)
			consonanti = consonanti + contatori[i];

		consonanti = consonanti - vocali;

		cout << "Il numero di vocali e': " << vocali << endl;
		cout << "Il numero di consonanti e': " << consonanti << endl;

 return 0;
}

9 Risposte

  • Re: Impazzendo con programma stringe di caratteri

    Qui c'è senz'altro un errore
          for (i = 0; i < contatori[ALFABETO]; i= i+1)
             cout << "La lettera " << 'A' + 1 << " compare " << contatori[i] << " volte";
    
    i deve arrivare fino a ALFABETO, non contatori[ALFABETO].
    Dopodiché per prima cosa limitati a stampare i contatori con qualcosa del tipo
             cout << "La lettera #" << i << " compare " << contatori[i] << " volte";
    
    perché 'A' + 1 di sicuro non dipende da i !!!
  • Re: Impazzendo con programma stringe di caratteri

    Modificato:
                 for (i = 0; i < ALFABETO; i++)
                            contatori[i] = 0;
                            cout << "La lettera " << i  << " compare " << contatori[ALFABETO] << " volte\n";
    
                    vocali = contatori ['A' - 'A'] + contatori ['E' - 'A'] + contatori ['I' - 'A'] +
                             contatori ['O' - 'A'] + contatori ['U' - 'A'];
    
                    consonanti = 0;
                    for (i = 0; i < ALFABETO; i++)
                            consonanti = consonanti + contatori[i];
    
                    consonanti = consonanti - vocali;
    
                    cout << "Il numero di vocali e': " << vocali << endl;
                    cout << "Il numero di consonanti e': " << consonanti << endl;
    
     return 0;
    }
    
    Ora mi da:
    "La lettera 26 compare 1837181298 volte"
    "Il numero di vocali è 0"
    "Il numero di consonanti è 0"

    Gli ultimi due credo perchè ho inizializzato contatore = 0

    P.S. C'è un corrispettivo di puts(frase) in c++? Perchè se inserisco una frase con spazi, mi conta soltanto quello che viene prima del primo spazio.
  • Re: Impazzendo con programma stringe di caratteri

    Gli ultimi due credo perchè ho inizializzato contatore = 0

    Se credi che qualcosa possa risolvere non ti costa meno provarla invece che postarla sul forum ???
  • Re: Impazzendo con programma stringe di caratteri

    Si l'ho provato e infatti mi da 0 vocali e 0 consonanti.
    Però voglio prima risolvere il problema delle volte che compare una lettera.

    P.S. Cosa significa Errore di segmentazione (core dump creato)?
  • Re: Impazzendo con programma stringe di caratteri

    Ti consiglio di affrontare un problema alla volta.
    Nella mia prima risposta ti avevo dato la soluzione ma non mi sembra che l'hai applicata.
  • Re: Impazzendo con programma stringe di caratteri

    Ho capito ora il tuo consiglio. Quindi la stringa
     for (i = 0; i < ALFABETO; i=i+1)
                            cout << "La lettera " << 'A'+1 << " copare " << contatori[i] << " volte\n";
    
    Va sostituita con una stringa del tipo:
     for (i = 0; i < ALFABETO; i=i+1)
                            cout << "La lettera (A,B,C.....Z)" << i << " compare " << contatori[i] << " volte\n";
    
    Devo farlo sia con le lettere maiuscole che minuscole?
  • Re: Impazzendo con programma stringe di caratteri

    Devo farlo sia con le lettere maiuscole che minuscole?
    Intanto stampa il contenuto dell'array contatore[] e prova con diversi input che contengano sia maiuscole che minuscole e studia i risultati e cerca di darti delle spiegazioni a quello che vedi in output.
  • Re: Impazzendo con programma stringe di caratteri

    Sto capendo meglio. Ora con il codice cosi (ALFABETO E' DIVENTATO NUMLETTERE)
    for (i = 0; i < NUMLETTERE; i= i+1) 
                            cout << "La lettera A compare " << contatori[i] << " volte\n";
    
    Mi stampa bene il numero delle volte in cui viene inserita una lettera, ma mi escono tutte A (ovviamente). Es:

    La lettera A compare 0 volte
    La lettera A compare 0 volte
    La lettera A compare 1 volte

    Come faccio a fare in modo che si incrementino anche le lettere dell'alfabeto?
  • Re: Impazzendo con programma stringe di caratteri

    davide9797 ha scritto:


    Sto capendo meglio. Ora con il codice cosi (ALFABETO E' DIVENTATO NUMLETTERE)
    for (i = 0; i < NUMLETTERE; i= i+1) 
                            cout << "La lettera A compare " << contatori[i] << " volte\n";
    
    Mi stampa bene il numero delle volte in cui viene inserita una lettera, ma mi escono tutte A (ovviamente). Es:

    La lettera A compare 0 volte
    La lettera A compare 0 volte
    La lettera A compare 1 volte

    Come faccio a fare in modo che si incrementino anche le lettere dell'alfabeto?
    guardati una tabella di codici ascii e ragionaci un po' su, non è complicato fare ciò che vuoi tu.
Devi accedere o registrarti per scrivere nel forum
9 risposte