Programma in linguaccio C

frenky46
Data una sequenza di caratteri alfabetici dire quante volte è presente in essa ciascuna lettera.

Questa è la traccia del programma, non riesco a capire come far cercare ciascuna lettera, avevo pensato di inserire diverse variabili ma ciascuna per il conteggio di ogni lettera dell'alfabeto utilizzando switch, però mi sembra un procedimento troppo lungo. C'è un modo più semplice e pratico per risolverlo?

Grazie :(

Risposte
giozh
Non so se avete letto il mio post precedente, ma in pratica c'è stato un errore nell'interpretare la traccia.
L'esercizio è molto più semplice, devo solo dire quante volte è presente ciascuna lettera della sequenza, vi faccio un esempio :

Se io immetto come sequenza la seguente :
a
g
v
r
f
h
e
a
a
a

il programma deve dirmi :

la lettera a è presente 4 volte
la lettera g è presente 1 volte
la lettera v è presente 1 volte
la lettera r è presente 1 volte
la lettera f è presente 1 volte
la lettera h è presente 1 volte
la lettera e è presente 1 volte

Ho gia postato nel post precedente quello che sono riuscito a fare, ma ho dei problemi uno su tutti che non mi fa inserire 10 valori ma solo 5. Qualcuno può aiutarmi?

ma tu immetti una stringa o un carattere alla volta? perche se metti un carattere alla volta l'algoritmo è molto piu semplice


SI credo di aver capito, l'unico problema è nell ' if che forse c'è qualche errore di parentesi, comunque ora provo a risolverlo e vedo.
non guardare le parentesi, il mio è solo pseudo-pseudo codice, ma l'importante è che quelle condizioni siano soddisfatte contemporaneamente (a prescindere dal linguaggio in cui scrivi)

apatriarca
Ho dato un occhiata al tuo codice e la lettura dei caratteri è sbagliata. Come ho già avuto modo di discutere in una recente discussione su questo forum, scanf("%c", &a) legge anche gli spazi e non solo le lettere che hai inserito. Nell'input che hai visualizzato:
a
g
v
r
f
h
e
a
a
a
ogni riga è costituita da due caratteri (la lettera e il carattere di a capo '\n') e quindi il tuo array apparirà dopo la lettura nella forma a[10] = {'a', '\n', 'g', '\n', 'v', '\n', 'r', '\n', 'f', '\n'}. La soluzione è comunque abbastanza semplice e l'avevo postata in quella discussione: AGGIUNGERE UNO SPAZIO PRIMA DI %c NELLO SCANF.

Il tuo algoritmo non sembra funzionare comunque. Ci sono almeno due problemi: ogni lettera viene controllata n volte (dove n è il numero di volte che compare nell'array) e volte non riparte da 1 quando viene verificata una nuova lettera. Un metodo semplice per risolvere questo problema è il seguente:
#include <stdio.h>

int main()
{
    char a[10], visitato[10];
    unsigned i;

    puts("Inserire la sequenza di caratteri.");
    
    for (i = 0; i < 10; ++i) {
        scanf(" %c", &a[i]);
        visitato[i] = 0;
    }

    for (i = 0; i < 10; ++i) {
        if (0 == visitato[i]) {
            int j, volte;
            for (j = i+1, volte = 1; j < 10; ++j) {
                if (a[j] == a[i]) {
                    visitato[j] = 1;
                    ++volte;
                }
            } 
            printf("Il carattere %c e' presente %d volte\n", a[i], volte); 
        }
    }

    return 0;
}

Non l'ho controllato ma credo sia corretto. L'idea del codice è simile alla tua con l'unica differenza si usare un secondo array per segnare le lettere che sono già comparse precedentemente.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.