Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6

    [C] Spiegazione esercizio vettori

    Ciao a tutti...mi sono fatta aiutare per scrivere un programma per capire se una parola è un anagramma di un'altra, ma non sono riuscita a capire il funzionamento di una parte...qualcuno potrebbe spiegarmi il significato dei due vettori letter1[] e letter2[]??

    Ecco il programma per intero:

    /* CREARE UN PROGRAMMA CHE DATE DUE STRINGHE VERIFICHI SE ESSE CONTENGANO ESATTAMENTE LE STESSE LETTERE CIOE' UNA E' L'ANAGRAMMA DELL'ALTRA.*/




    #include <stdio.h>
    #define N 10
    int main ()
    {
    int k=0, i, x=0, letter1[26]={0}, letter2[26]={0};
    char vect1[N], vect2[N];

    printf("Inserisci due stringhe:\n");
    scanf("%s %s", vect1, vect2);

    while (vect1[i]!='\0')
    {
    letter1[vect1[i]-'a']++;

    i++;
    }

    while (vect2[x]!='\0')
    {
    letter2[vect2[x]-'a']++;
    x++;
    }

    while (k<26)
    {
    if (letter1[k]==letter2[k])
    k++;
    else
    {
    printf("Non è anagramma\n");
    break;
    }

    if (k==26)
    printf("E' un anagramma\n");

    }


    }


    Grazie in anticipo! Attendo risposta!

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Mh, in quel programma c'è sicuramente un errore: i dovrebbe essere inizializzato a 0.
    In più direi che può essere semplificato. Ad ogni modo quei due vettori contano il numero di volte che ogni lettera appare. Poi si confrontano coppia coppia le occorrenze delle singole lettere per vedere se corrispondono.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    6
    Ho corretto i e l'ho inizializzato a 0. Come potrei semplificarlo??

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    In realtà esistono mille modi diversi di scriverlo. Io personalmente lo scriverei così
    codice:
    #include <stdio.h>#include <string.h>
    
    
    #define N 10
    
    
    int main ()
    {
      int i=0, letter1[26]={0}, letter2[26]={0};
      char vect1[N], vect2[N];
    
    
      printf("Inserisci due stringhe:\n");
      scanf("%s %s", vect1, vect2);
      int len = strlen(vect1);
        
      if(len != strlen(vect2)) {
        printf("Non è anagramma\n");
        return 0;
      }
      
      for(i = 0; i < len; ++i) {
        ++letter1[vect1[i]-'a'];
        ++letter2[vect2[i]-'a'];
      }
      
      for(i = 0; i < 26; ++i) {
        if(letter1[i] != letter2[i]) {
          printf("Non è anagramma\n");
          return 0;
        }
      }
    
    
      printf("E' un anagramma\n");
    
    
      return 0;
    }
    Ciò non toglie che la tua soluzione sia corretta.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Quote Originariamente inviata da Cetty93 Visualizza il messaggio
    Ho corretto i e l'ho inizializzato a 0. Come potrei semplificarlo??
    Oltre al valido metodo suggerito dal giovane Scara95, un approccio risolutivo da considerare perché fortemente paradigmatico del problem solving discreto è il seguente:
    codice:
    #define ALPHA_SIZE 26
    #define STR_SIZE 16
        ...  
        char s1[STR_SIZE], s2[STR_SIZE];
        size_t alpha[ALPHA_SIZE];
        size_t i, sz1, sz2;
    
        memset(alpha, 0, ALPHA_SIZE * sizeof(size_t));
        ...
        sz1 = strlen(s1);
        for (i = 0; i < sz1; ++i)
        {
            ++alpha[s1[i] - 'a'];
            --alpha[s2[i] - 'a'];
        }
    
        printf("\nLa parola \"%s\"", s1);
        for (i = 0; i < ALPHA_SIZE; ++i)
        {
            if(alpha[i] != 0)
            {
                printf(" non");
                break;
            }
        }
        printf(" e' anagramma di \"%s\"\n", s2);

    In questo caso (dopo essersi accertati che le parole immesse abbiano identica lunghezza e contengano solo caratteri alfabetici minuscoli, ma tale codice - assieme a quello che impedisce potenziali overflow dei buffer di stringa - è stato deliberatamente escluso al fine di semplificare la lettura) si impiega un unico array delle occorrenze e si sfrutta il principio della somma (algebrica) pesata, assegnando nello specifico peso unitario ma negativo ad uno dei due contatori.
    Se per ogni carattere alfabetico presente nelle due stringhe immesse le occorrenze totali sono uguali, è ovvio che il relativo contatore deve risultare ancora nullo al termine della scansione, rendendo facilissimo (e potenzialmente anche più efficiente, su molte architetture) rilevare i simmetrici casi di disuguaglianza.
    Ultima modifica di M.A.W. 1968; 17-09-2014 a 17:55
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  6. #6
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    codice:
        size_t alpha[ALPHA_SIZE];
    Non è corretto, per una svista di cut&paste. Si usano interi segnati, quindi ovviamente deve essere:
    codice:
        int alpha[ALPHA_SIZE];
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.