PDA

Visualizza la versione completa : [C] confronto stringhe


Satiro88
11-11-2013, 13:48
Ciao! devo realizzare un programma che prenda due stringhe,le confronti e determini se sono anagrammi.In pratica vuole semplicemente che si verifichi se entrambe le frasi sono costituite dalle stesse lettere.Solo i caratteri alfabetici bisogna controllare:


#include <stdio.h>#include <stdlib.h>


#define N 15


int main()
{
char string1[N];
char string2[N];
int i,j,c,count,d,verify;

printf("\n\n inserire frase\n\n");
gets(string1);

c=0;
for(i=0;i<N;i++)
{
if(string1[i]>='A' && string1[i]<='Z')
{
c++;
}
}

char string1a[c];
char string2a[c];

for(i=0;i<c;i++)
{
if(string1[i]>='A' && string1[i]<='Z')
{
string1a[i]=string1[i];
}
}

printf("\n\n inserire frase da confrontare\n\n");
gets(string2);

d=0;
for(i=0;i<N;i++)
{
if(string2[i]>='A' && string2[i]<='Z')
{
d++;
}
}

for(i=0;i<d;i++)
{
if(string2[i]>='A' && string2[i]<='Z')
{
string2a[i]=string2[i];
}
}




for(i=0;i<c;i++)
{
printf("%c",string1a[i]);
}



if(d==c)
{
i=0;
verify=0;
do
{
j=0;
count=0;
do
{
if(string1a[i]==string2a[j])
{
verify++;
count++;
string2a[j]=0;
}
j++;
}
while(count==0 && j<c);
i++;
}
while(i<c);
if(verify==c)
{
printf("\n\n sono anagrammi!\n\n");
}
}
else
{
printf("\n\n non sono anagrammi!\n\n");
}

system("pause");
return 0;
}

Questo quanto ho scritto ma non senza problemi......A un certo punto ho messo la stampa di string1a,come si pu notare vengono stampati dei valori che non c'entrano nulla e non capisco dove vada a prenderli sinceramente,credevo che la condizione per verificare che i caratteri siano solo lettere maiuscole fosse giusta....ed effettivamente penso sia cos,perch stampando i contatori i valori tornano, nel momento in cui a string1a vengono assegnati i valori di string1 che succede qualche casino.Sapete dove ho sbagliato?
non entra nemmeno nel dowhile.....

Grazie mille...

MItaly
11-11-2013, 14:51
Non ho guardato il resto, ma le righe:


while(count==0 && j<c);
i++;

e

while(i<c);
sono sicuramente sbagliate: devi togliere il ; in fondo al while, altrimenti il while crede che il corpo del loop sia solo quel punto e virgola (la cosiddetta "istruzione vuota").

Per inciso, l'algoritmo che si usa normalmente per verificare se due parole sono anagrammi l'una dell'altra semplicemente ordinare i caratteri contenuti in ciascuna parola in ordine alfabetico, e confrontare le due stringhe risultanti.

Satiro88
11-11-2013, 17:40
ma nel dowhile ci hanno spiegato che bisogna mettere il ; alla fine del while mentre nel solo ciclo while non si mette.Mentre per il confronto,se si hanno pi lettere che si ripetono in entrambe come si fa a tenerne conto se faccio il classico controllo cella per cella? io pensavo di svuotare mano a mano il vettore in modo che non potesse fare fisicamente delle ripetizioni strane.....Comunque il problema gi prima del while

ho fatto delle prove con due semplici stringhe, in una ho inserito ciao,mamma e se gli dico di copiare nell'altra stringa solo i caratteri compresi tra 'a' e 'z' mi copia anche lo spazio,oppure della punteggiatura se c' quella al posto dello spazio...non capisco proprio

MItaly
11-11-2013, 21:52
ma nel dowhile ci hanno spiegato che bisogna mettere il ; alla fine del while mentre nel solo ciclo while non si mette.
Sorry, scemo io, mi sono perso il "do" per strada; in effetti per evitare di confondersi di solito il while del do...while lo si mette sulla stessa riga della chiusa graffa finale.


do
{
...
} while(condizione);



Mentre per il confronto,se si hanno pi lettere che si ripetono in entrambe come si fa a tenerne conto se faccio il classico controllo cella per cella? io pensavo di svuotare mano a mano il vettore in modo che non potesse fare fisicamente delle ripetizioni strane.....Comunque il problema gi prima del while

ho fatto delle prove con due semplici stringhe, in una ho inserito ciao,mamma e se gli dico di copiare nell'altra stringa solo i caratteri compresi tra 'a' e 'z' mi copia anche lo spazio,oppure della punteggiatura se c' quella al posto dello spazio...non capisco proprio
Non capisco bene cosa voglia fare il tuo codice, mi sembra che tu ti stia complicando un po' troppo la vita... intanto il tuo ciclo per copiare solo i caratteri alfabetici sbagliato:


for(i=0;i<c;i++)
{
if(string1>='A' && string1[i]<='Z')
{
string1a[i]=string1[i];
}
}

qui stai esaminando solo i primi c caratteri, indipendentemente dal fatto che se i caratteri balenghi stanno all'inizio della parola cos vai a troncarla, non copiando degli eventuali caratteri "buoni" finali; inoltre, vero che non copi i caratteri non-alfabetici, ma il risultato netto che al loro posto lasci qualunque spazzatura gi c'era in string1a.

Il mio suggerimento per risolvere questo esercizio di evitare di buttarti in tutte queste manipolazioni di stringhe e cicli nidificati:

fai un array di 26 interi e inizializzalo a zero;
acquisisci entrambe le stringhe;
scorri la prima stringa; ad ogni carattere alfabetico che trovi, incrementa di 1 la posizione corrispondente nell'array di prima; se il carattere non alfabetico, lo ignori (oppure visualizzi un errore, come preferisci);
idem per la seconda stringa, ma in questo caso [i]togli 1;
alla fine scorri l'array: se contiene solo zeri, sono anagrammi (se tutti sono zero vuol dire che per ogni +1 della prima stringa c' stato un -1 corrispondente nella seconda); altrimenti, le due parole non sono anagrammi.

Loading