Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [C] Contare caratteri uguali fra due stringhe

    Allora dato un array di char tipo parola[20][30] devo fare un ciclo che conti i caratteri uguali fra l'ultima parola inserita e quella precedente nell'elenco.
    Questa soluzione è sbagliata però volevo farla cosi in modo da contare i caratteri = e poi fare dei controlli in base al risultato.

    codice:
    while( parola[k][h] == '\0' || parola[k-1][h] == '\0'){                                                                            
      if( parola[k][h] == parola[k-1][h]){                                      
       
           carattere++;                   
    
        }                                                                        
     h++;               
    }

  2. #2

    Re: [C] Contare caratteri uguali fra due stringhe

    Originariamente inviato da nasuka89
    Allora dato un array di char tipo parola[20][30] devo fare un ciclo che conti i caratteri uguali fra l'ultima parola inserita e quella precedente nell'elenco.
    Questi conteggi come devi accumularli? Va bene un unico contatore? Alla fine del ciclo questo contatore deve contenere la somma di tutti i caratteri uguali di tutte le parole?
    Il confronto va fatto per posizione (1° carattere con 1°carattere), oppure ogni carattere va confrontato con tutta la seconda stringa?

    Questa soluzione è sbagliata però volevo farla cosi in modo da contare i caratteri = e poi fare dei controlli in base al risultato.

    codice:
    while( parola[k][h] == '\0' || parola[k-1][h] == '\0'){                                                                            
      if( parola[k][h] == parola[k-1][h]){                                      
       
           carattere++;                   
    
        }                                                                        
     h++;               
    }
    Dipende da come rispondi alle domande che ti ho fatto.
    Se puoi accumulare la somma dei caratteri uguali in un'unica variabile e se devi fare il confronto posizione per posizione il tuo codice è ok, ovviamente k viene inizializzato a 1 e h azzerato ogni volta che incrementi k.
    ...

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Io ti espongo un mio approccio alla soluzione:
    potresti risolvere con un'array che utilizza come indice i caratteri (i caratteri sono solo numeri infondo), considerando solo i caratteri stampabili gli indici vanno da 0 a 94;
    setti tutti i valori a 0, scorrendo i caratteri della prima parola imposti i bit corrispondenti 1 :

    array[carattere-32] = 1;

    poi fai il ciclo sulla seconda parola e controlli impostando un secondo arrai quali sono presenti anche nella seconda:

    array2[carattere-32] = array[carattere-32] & 1;

    ora solo gli indici (carattere - 32) di array2 con le lettere comuni sono impostati a 1.

    questo algoritmo è un po' dispendioso di memoria e può essere molto migliorato...

    P.s. se non capisci il -32 leggi lo standard ASCII
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Allora praticamente l'esercizio è cosi:il primo giocatore inserisce una parola poi il secondo giocatore per ottenere 1 punto deve inserire una lettera nella parola precedente ma può anche togliere un qualsiasi numero di lettere e perdere 1 punto sempre formando una parola. Il caso in cui le parole sono uguali l'ho già fatto.
    Quindi praticamente mi serviva un ciclo per contare i caratteri uguali esempio:

    cane cioè pinserita[k-1]

    Aggiungo r: carne cioè pinserita[k]

    Voglio esaudire questa condizione in questo caso
    if(carattere == strlen(pinserita[k-1]) && strlen(pinserita[k]) - strlen(pinserita[k-1]) == 1)

    Ma il ciclo non funziona cosi.

    Scara95 grazie dei suggerimenti ma ormai ho impostato tutto l'esercizio in questo modo volevo finirlo cosi.

  5. #5
    Cosi mi entra nel ciclo ma ad ogni nuova parola carattere aumenta solo di 1 invece di fare il controllo


    codice:
    while( parola[k][h] != '\0' || parola[k-1][m] != '\0'  ){  
                 
                   if(  parola[k-1][m] == parola[k][h] ){
                      
                       carattere++;
                       m++;
                       h++;
                       }
                  
                   else{
                       
                       h++;
                       
                       }   
        
                 
                  }

  6. #6
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Se vuoi contare il numero di caratteri uguali in due stringhe, il ciclo deve essere doppio.
    Questo perché se ad esempio confronti "cane" con "carne", devi prendere ogni singola lettera di "cane" e confrontarla con ogni singola lettera di "carne", per cui i controlli sono 4x5=20.
    Per cui il tuo ciclo controlla solo che le lettere in posizioni uguali siano uguali, non considera quelle in posizioni diverse.
    Considera questa soluzione:

    codice:
    int h=0, m=0;
    while( parola[k][h] != '\0')
    {  
        while( parola[k-1][m] != '\0')
        {
            if(  parola[k-1][m] == parola[k][h] )
            {
                carattere++;
            }
            m++;
        }
        h++;
        m=0;
    }
    Spero sia chiaro il perché del doppio ciclo, se non hai capito chiedi pure.

  7. #7
    Grazie Who am I era proprio quello che cercavo di fare.

  8. #8
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    Questo codice non fa esattamente ,quello che ti aspetti !
    codice:
    int h=0, m=0;
    while( parola[k][h] != '\0')
    {  
        while( parola[k-1][m] != '\0')
        {
            if(  parola[k-1][m] == parola[k][h] )
            {
                carattere++;
            }
            m++;
        }
        h++;
        m=0;
    }
    IMMAGINA parola[k-1]="cane" e parola[k]="carniere"
    carattere sarebbe uguale a 5 , invece ti aspetteresti 4
    questo perchè, conta la presenza della prima ' e ' 1 , e della seconda ' e '1
    piu evidente se le parole sono invertite , se deve cercare "cane" in "carniere" , conta due e
    Tecnologia

  9. #9
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Grazie, non l' avevo notato.
    Ho modificato il codice così:

    codice:
    counted=(bool*) calloc (strlen(parola[k-1]),sizeof(bool));
        while( parola[k][h] != '\0')
        {  
            while( parola[k-1][m] != '\0')
            {
                if( parola[k-1][m] == parola[k][h] && !counted[m])
                {
                    carattere++;
                    counted[m]=true;
                    break;
                }
                m++;
            }
            h++;
            m=0;
        }
        free(counted);
    Però è da riadattare per l' utente perché è dispendioso allocare ogni volta un array di bool, la cosa si potrebbe gestire con un array di dimensioni fisse, premesso che si conosce la dimensione massima che ogni stringa può avere.
    Da notare che il break dentro l' if è fondamentale, altrimenti come diceva torn, conterebbe due volte la stessa lettera nell' esempio di "cane" e "carniera".
    Se invece non c'era l' array di booleani, contava due volte lastessa lettera nel caso di "ccane" e "carniera".

  10. #10
    Non riesco a risolvere il problema di contare due volte la stessa lettera nel caso di "ccane" e "carniera"..
    più che altro non capisco la soluzione con un array di booleani.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.