PDA

Visualizza la versione completa : [C] Spiegazione esercizio vettori


Cetty93
13-09-2014, 16:36
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! :)

Scara95
13-09-2014, 17:09
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.

Cetty93
14-09-2014, 20:53
Ho corretto i e l'ho inizializzato a 0. Come potrei semplificarlo??

Scara95
17-09-2014, 15:11
In realtà esistono mille modi diversi di scriverlo. Io personalmente lo scriverei così
#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.

M.A.W. 1968
17-09-2014, 17:46
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:


#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.

M.A.W. 1968
21-09-2014, 22:00
size_t alpha[ALPHA_SIZE];



Non è corretto, per una svista di cut&paste. Si usano interi segnati, quindi ovviamente deve essere:


int alpha[ALPHA_SIZE];

Loading