Lettura di una parola e incremento dell'array

di il
29 risposte

Lettura di una parola e incremento dell'array

Salve.
Sto cercando di fare un esercizio di programmazione che chiede di verificare se una parola è anagramma dell'altra. L'esercizio dà delle indicazioni precise, ovvero: lettura della prima parola e incremento delle celle di un array da 26. Quindi ad ogni cella corrisponde una lettera dell'alfabeto. Le celle, corrispondenti alle lettere che costituiscono la parola inserita, dovranno essere incrementate di uno. In questo modo si avrà traccia delle lettere presenti e della loro frequenza.
Per il momento mi fermo qua visto che il problema che ho è con questa prima parte. Quando vado ad eseguire, inserisco la parola ma la lettura non viene completata, non capisco dove è l'errore.
Questo è il codice:

#include<stdio.h>
#define N 26
int main(void){

char letter,ch;
int i,a[N]={0};

printf("Inserisci una parola:");

for(i=0;i<N;i++){
for(letter='a'; letter<'z';letter++){

while((ch=getchar())!='\n')
{if(letter==ch)
a[i]=a[i]+1;
}

}
}
printf("a[N]\n");



return 0;
}

29 Risposte

  • Re: Lettura di una parola e incremento dell'array

    Isa i tag code per il codice hai visto che non si capisce nulla?

    Comunque quel codice non ha senso... a cosa serve il vettore di 3 elementi?
  • Re: Lettura di una parola e incremento dell'array

    In pratica devi implementare una sorta di tabella hash, in ogni caso non è così che va "popolata", basta infatti un solo for che scorre la stringa contenente la parola.
  • Re: Lettura di una parola e incremento dell'array

    Nippolo ha scritto:


    In pratica devi implementare una sorta di tabella hash, in ogni caso non è così che va "popolata", basta infatti un solo for che scorre la stringa contenente la parola.
    Allora in realtà non so cosa siano le tabelle hash ad ogni modo per il mio livello non credo che si debba risolvere così. Inoltre la mia idea era quella di far scorrere con letter tutte le lettere dell'alfabeto e al contempo scannerizzare la parola.
    Faccio un esempio:
    Durante la prima iterazione letter si imposta sulla lettera 'a'.
    A questo punto la i è 0 che punta la prima cella dell'array.
    Inizia la lettura della parola lettera per lettera, quando si incontra un 'a', la prima cella dell'array assume come valore 1. Poi mettiamo caso che incontra un'altra 'a', a[0] diventa 2 e così via.
    Finita la prima iterazione.
    Seconda iterazione, letter si imposta su 'b'... e così via. Questa è l'idea.
  • Re: Lettura di una parola e incremento dell'array

    oregon ha scritto:


    Isa i tag code per il codice hai visto che non si capisce nulla?

    Comunque quel codice non ha senso... a cosa serve il vettore di 3 elementi?
    Il vettore di 3 elementi è un errore mio, dato che ho provato a fare un caso particolare. In realtà il vettore è di 26 elementi. Però ad ogni modo credo di essere stato chiaro nella descrizione del problema dove ho scritto chiaramente che il vettore è di 26 elementi. Quindi credo che tu non abbia letto la mia descrizione ma ti sia limitato soltanto a leggere il codice non contestualizzando. Nel caso tu abbia letto la mia introduzione allora credo che tu lo abbia fatto con superficialità. Per quanto riguarda il tag code, mi sono dimenticato di usarlo, però ho scritto tutto cercando di essere il più ordinato e chiaro possibile, quindi userò i tag code ma non mi venire a dire che non si capisce nulla. Per il resto ti consiglio di leggere la risposta che ho dato all'altro utente dove ho fatto un esempio dello scopo del codice. Magari puoi aiutarmi.
  • Re: Lettura di una parola e incremento dell'array

    Armen ha scritto:


    Nippolo ha scritto:


    In pratica devi implementare una sorta di tabella hash, in ogni caso non è così che va "popolata", basta infatti un solo for che scorre la stringa contenente la parola.
    Allora in realtà non so cosa siano le tabelle hash ad ogni modo per il mio livello non credo che si debba risolvere così. Inoltre la mia idea era quella di far scorrere con letter tutte le lettere dell'alfabeto e al contempo scannerizzare la parola.
    Faccio un esempio:
    Durante la prima iterazione letter si imposta sulla lettera 'a'.
    A questo punto la i è 0 che punta la prima cella dell'array.
    Inizia la lettura della parola lettera per lettera, quando si incontra un 'a', la prima cella dell'array assume come valore 1. Poi mettiamo caso che incontra un'altra 'a', a[0] diventa 2 e così via.
    Finita la prima iterazione.
    Seconda iterazione, letter si imposta su 'b'... e così via. Questa è l'idea.
    Ah inoltre non ho fatto ancora le stringhe.
  • Re: Lettura di una parola e incremento dell'array

    Se non hai ancora fatto le stringhe sarà dura

    Come registri la parola?
  • Re: Lettura di una parola e incremento dell'array

    Sistema il tag CODE come ti è già stato suggerito.

    Armen ha scritto:


    Allora in realtà non so cosa siano le tabelle hash ad ogni modo per il mio livello non credo che si debba risolvere così. Inoltre la mia idea era quella di far scorrere con letter tutte le lettere dell'alfabeto e al contempo scannerizzare la parola.
    Faccio un esempio:
    Durante la prima iterazione letter si imposta sulla lettera 'a'.
    A questo punto la i è 0 che punta la prima cella dell'array.
    Inizia la lettura della parola lettera per lettera, quando si incontra un 'a', la prima cella dell'array assume come valore 1. Poi mettiamo caso che incontra un'altra 'a', a[0] diventa 2 e così via.
    Finita la prima iterazione.
    Seconda iterazione, letter si imposta su 'b'... e così via. Questa è l'idea.
    Quindi se hai una parola lunga 100 caratteri e la percorri 26 volte in totale iteri per 2600 volte. Non mi sembra ottimale, e assolutamente non lo è.

    La tabella hash è un array che utilizza chiavi diverse da quelle intere. Di solito esistono strutture come HashMap in Java, Dictionary in C# e std::map in C++.

    Quello che a te interessa è associare ad ogni carattere dell’alfabeto da 'a' a 'z' una chiave intera. Il miglior modo è utilizzare un array di dimensione 26 e la chiave è data da <carattere> - 'a' (ossia per <carattere> = 'a' dà 0, ad esempio, per 'c' dà 2 ecc…).
    In questo modo puoi scorrere la parola una sola volta (nel caso precedente quindi solo 100 iterazioni) e incrementare il valore corrispondente alla lettera come chiave nell’array.

    “Tabella hash” è solo un modo sofisticato (e corretto) di descrivere la cosa. Non ti devi far spaventare dalle strutture dati.
  • Re: Lettura di una parola e incremento dell'array

    Capisco quello che dite e avete ragione, però questo strategia non è un qualcosa che parte da me, ma è la consegna dell'esercizio che dà queste indicazioni. Quello che devo fare e soltanto tradurlo in codice. A questo punto o ho interpretato male la consegna se volete posso mandarvela.
  • Re: Lettura di una parola e incremento dell'array

    Ecco la consegna:
    Scrivete un programma che controlli se due parole sono degli anagrammi (cioè delle permutazioni delle stesse lettere):

    Enter first word: smartest Enter second word: mattress The words are anagrams.
    Enter first word: dumbest Enter second word: stumble The words are not anagrams.

    Scrivete un ciclo che legga la prima parola carattere per carattere, usando un vettore di 26 interi per tenere traccia del numero di occorrenze di ogni lettera. (Per esempio dopo che la parola smartest è stata letta il vettore dovrebbe contenere i valori 1 OOO1 OOOOOOO 1 OOOO1 2 2 OOOOO riflettendo il fatto che smartest contiene una a, una e, una m, una r, due se due t). Usate un altro ciclo per leggere la seconda parola, ma questa volta per ogni lettera letta decrementate l'elemento corrispondente nel vettore. Entrambi i cicli devono ignorare i caratteri che non sono lettere ed entrambi devono trattare le lettere maiuscole allo stesso modo in cui trattano le minuscole. Dopo che la seconda parola è stata letta usate un terzo ciclo per controllare se tutti gli elementi del vettore sono uguali a zero. Se è così allora le due parole sono anagrammi. Suggerimento: se volete potete usare le funzioni presenti nell'header <ctype.h> come isalpha o tolower.
  • Re: Lettura di una parola e incremento dell'array

    Armen ha scritto:


    oregon ha scritto:


    Isa i tag code per il codice hai visto che non si capisce nulla?

    Comunque quel codice non ha senso... a cosa serve il vettore di 3 elementi?
    Il vettore di 3 elementi è un errore mio, dato che ho provato a fare un caso particolare. In realtà il vettore è di 26 elementi. Però ad ogni modo credo di essere stato chiaro nella descrizione del problema dove ho scritto chiaramente che il vettore è di 26 elementi. Quindi credo che tu non abbia letto la mia descrizione ma ti sia limitato soltanto a leggere il codice non contestualizzando. Nel caso tu abbia letto la mia introduzione allora credo che tu lo abbia fatto con superficialità. Per quanto riguarda il tag code, mi sono dimenticato di usarlo, però ho scritto tutto cercando di essere il più ordinato e chiaro possibile, quindi userò i tag code ma non mi venire a dire che non si capisce nulla. Per il resto ti consiglio di leggere la risposta che ho dato all'altro utente dove ho fatto un esempio dello scopo del codice. Magari puoi aiutarmi.
    Oh guarda che se rispondi così ti arrangi. Auguri
  • Re: Lettura di una parola e incremento dell'array

    A me la soluzione migliore sembra quella di @_Achille. Questa cosa di iterare migliaia di volte gli array mi sembra assurda
  • Re: Lettura di una parola e incremento dell'array

    orion99 ha scritto:


    A me la soluzione migliore sembra quella di @_Achille. Questa cosa di iterare migliaia di volte gli array mi sembra assurda
    A me più che altro interessa capire cosa c'è di sbagliato nel codice, il quale si limita a tradurre ciò che dice la consegna. Tutto qui.
  • Re: Lettura di una parola e incremento dell'array

    Il testo dice di scorrere la parola lettera per lettera (della parola, mica dell’alfabeto) e di incrementare il corrispondente valore nell’array.

    Se tu vuoi comunque:
    1. Non attenerti alla consegna, che mica dice (e giustamente, direi) di implementare un algoritmo di complessità 100n invece di n
    2. Implementare un algoritmo pessimo (ricordo che fino a n<100, 100n è pure peggio di n^2)
    Sei libero di farlo
  • Re: Lettura di una parola e incremento dell'array

    _Achille ha scritto:


    Il testo dice di scorrere la parola lettera per lettera (della parola, mica dell’alfabeto) e di incrementare il corrispondente valore nell’array.

    Se tu vuoi comunque:
    1. Non attenerti alla consegna, che mica dice (e giustamente, direi) di implementare un algoritmo di complessità 100n invece di n
    2. Implementare un algoritmo pessimo (ricordo che fino a n<100, 100n è pure peggio di n^2)
    Sei libero di farlo
    Ok.Però per esempio se metto una parola:"albero". Come faccio ad incrementare la corrispondente cella dell'array.Cioè con la lettera 'a' si trova nella prima cella e va tutto bene. Però già con la 'l' se io scorro semplicemente l'array non mi trovo più.Io quello vorrei sapere è cosa c'è di erroneo nel codice. In pratica quando lo eseguo e inserisco una parola in input è come se si aspettasse (all'infinito) altri input. A cosa potrebbe essere dovuto?
Devi accedere o registrarti per scrivere nel forum
29 risposte