Lettura di una parola e incremento dell'array

di Armen il
29 risposte

29 Risposte - Pagina 2

  • Armen ha scritto:


    In pratica quando lo eseguo e inserisco una parola in input è come se si aspettasse (all'infinito) altri input. A cosa potrebbe essere dovuto?
    Le due for sono sbagliate. Dovrebbero essere semplicemente eliminate.

    L'unico ciclo corretto è il while e per arrivare all'elemento di indice corretto devi semplicemente usare il codice ASCII, che avrai sicuramente studiato.
  • oregon ha scritto:


    Armen ha scritto:


    In pratica quando lo eseguo e inserisco una parola in input è come se si aspettasse (all'infinito) altri input. A cosa potrebbe essere dovuto?
    Le due for sono sbagliate. Dovrebbero essere semplicemente eliminate.

    L'unico ciclo corretto è il while e per arrivare all'elemento di indice corretto devi semplicemente usare il codice ASCII, che avrai sicuramente studiato.
    Va bene, grazie. Ci provo.
  • Leggiti bene il mio primo messaggio.
    Credo di essere stato chiaro su come implementare la mappa
  • Buona sera, ho modificato il codice cercando di seguire le vostre istruzioni e funziona.
    Nel caso qualcuno si dovesse ritrovare nella mia stessa situazione, questo è il codice:
    #include<stdio.h>
    #define N 26
    int main(void){
    
    char ch;
    int i,a[N]={0};
    
    printf("Inserisci una parola:");
    
    
    while((ch=getchar())!='\n')
    {i=ch-'a';
    a[i]=a[i]+1;}
    
    
    for( i=0; i < N; i++)
    printf("%d ", a [i]);
    printf("\n");
    
    
    
    return 0;
    }
    
  • Ok anche se bastava

    a[ch-'a']++;

    Tieni presente che non funziona con le maiuscole.
  • oregon ha scritto:


    Ok anche se bastava

    a[ch-'a']++;

    Tieni presente che non funziona con le maiuscole.
    Si hai ragione.
  • Però la cosa è assolutamente ininfluente, dato che si tratta di una imposizione del testo dell'esercizio
  • StandardOil ha scritto:


    Però la cosa è assolutamente ininfluente, dato che si tratta di una imposizione del testo dell'esercizio
    Veramente io leggo

    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.

    e quindi c'è altro da fare nel codice ...

  • Concordo

    Mi ero spiegato male
    Intendevo che ignorare la differenza maiuscole minuscole fa parte delle prescrizioni
  • StandardOil ha scritto:



    Concordo

    Mi ero spiegato male
    Intendevo che ignorare la differenza maiuscole minuscole fa parte delle prescrizioni
    Ah ... d'accordo ... e anche ignorare il fatto che l'utente possa usare altri caratteri ...
  • Questo è il codice finale:
    
    #include<stdio.h>
    #include<ctype.h>
    #define N 26
    int main(void){
    
    char ch;
    int i,a[N]={0};
    
    printf("Inserisci la prima parola:");
    
    
    while((ch=getchar())!='\n'){
    isalpha(ch);
    a[(tolower(ch))-'a']++;}
    
    
    
    printf("Inserisci la seconda parola:");
    
    
    while((ch=getchar())!='\n'){
    isalpha(ch);
    a[(tolower(ch))-'a']--;}
    
    for( i=0; i < N; i++){
    if(a[i]!=0){
    printf("Le due parole NON sono anagrammi\n");
    return 0;
    }
    }
    
    printf("Le due parole SONO anagrammi\n");
    
    return 0;
    }
    
    
    Ho provato a mettere(sicuramente in modo errato) isalpha insieme a tolower però non funzionava bene, come si dovrebbe fare?
  • Come va adesso?:
    
    #include<stdio.h>
    #include<ctype.h>
    #include<stdbool.h>
    #define N 26
    
    void read_word(int parola[26]);
    bool equal_array(int counts1[26], int counts2[26]);
    int main(void){
    
    
    int i,parola1[N]={0}, parola2[N]={0};
    
    printf("Inserisci la prima parola:");
    
    read_word(parola1);
    
    
    printf("Inserisci la seconda parola:");
    
    read_word(parola2);
    
    printf("le due parole sono anagrammi:%d\n",(equal_array(parola1, parola2)));
    
    
    return 0;
    }
    void read_word(int counts[26]){
    char ch;
      while((ch=getchar())!='\n'){
      if(isalpha(ch))
      counts[(tolower(ch))-'a']++;
    }
    }
    bool equal_array(int parola1[26], int parola2[26]){
      int i;
      for(i=0; i<N; i++){
      if(parola1[i]!=parola2[i])
      return false;
      }
      return true;
    }
    
    
  • Prima avevo scritto delle grandi boiate e me ne scuso


    A parte il fatto che usi due vettori di conteggio quando ne viene prescritto uno

    Direi che va bene

    In particolare mi piace come usi direttamente il valore di ritorno delle funzioni invece che passare attraverso inutili variabili di appoggio, come purtroppo fanno in molti
  • StandardOil ha scritto:


    Prima avevo scritto delle grandi boiate e me ne scuso


    A parte il fatto che usi due vettori di conteggio quando ne viene prescritto uno

    Direi che va bene

    In particolare mi piace come usi direttamente il valore di ritorno delle funzioni invece che passare attraverso inutili variabili di appoggio, come purtroppo fanno in molti
Devi accedere o registrarti per scrivere nel forum
29 risposte