Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C] confronto stringhe

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87

    [C] confronto stringhe

    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:

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

  2. #2
    Non ho guardato il resto, ma le righe:
    codice:
                         while(count==0 && j<c);
                         i++;
    e
    codice:
                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.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2009
    Messaggi
    87
    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
    Ultima modifica di Satiro88; 11-11-2013 a 19:04

  4. #4
    Quote Originariamente inviata da Satiro88 Visualizza il messaggio
    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.
    codice:
    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:
    codice:
        for(i=0;i<c;i++)
        {
                         if(string1[i]>='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 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.
    Amaro C++, il gusto pieno dell'undefined behavior.

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.