RISOLTO Ricercare due lettere in una Stringa

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Non litigate, facciamo un esempio pratico e si taglia la testa al toro.
Una stringa come "abcdefgh" è lunga 8 caratteri (size=8), indicizzati da 0 a 7 (poi internamente il C aggiunge il terminatore \0 e la stringa in memoria è come se fosse da 9 caratteri)
se cerchi una sequenza di lunghezza 2, per es. "gh", basta controllare (solo nel while...) fino al penultimo carattere ('g' di indice 6) incluso
ossia fino a size-1=7 ESCLUSO
quindi i va da 0 a 6 (il carattere 'g'), non c'è bisogno di ripetere il controllo nell'if e non può mai succedere un errore di "fuori stringa" perché controllando fino al penultimo carattere al massimo i+1 ti arriva sulla 'h'
poi la stringa può essere lunga 100, 1000, ... il ragionamento è lo stesso;
se la sequenza da cercare è lunga N, controlli al massimo fino a size-N+1 ESCLUSO (in questo caso N=2 -> controlli fino a 8-2+1=7 ESCLUSO)
oppure se preferisci fino a size-N incluso
 
Ultima modifica:
Dimenticavo: per evitare di bloccare il programma dentro al ciclo, basta uscire da questo mettendo tutte le condizioni necessarie nel while e senza inserirne all'interno. Considera, per esempio di valutare la stringa a coppie di caratteri e cercare "nc" dato da p+p[i+1]... un ciclo e un'istruzione... sai se ha trovato la ricorrenza se, in uscita, l'indice è inferiore alla lunghezza!!!
Moooolto più elegante!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Non litigate, facciamo un esempio pratico e si taglia la testa al toro.
Una stringa come "abcdefgh" è lunga 8 caratteri (size=8), indicizzati da 0 a 7 (poi internamente il C aggiunge il terminatore \0 e la stringa in memoria è come se fosse da 9 caratteri)
se cerchi una sequenza di lunghezza 2, per es. "gh", basta controllare (solo nel while...) fino al penultimo carattere ('g' di indice 6) incluso
ossia fino a size-1=7 ESCLUSO
quindi i va da 0 a 6 (il carattere 'g'), non c'è bisogno di ripetere il controllo nell'if e non può mai succedere un errore di "fuori stringa" perché controllando fino al penultimo carattere al massimo i+1 ti arriva sulla 'h'
poi la stringa può essere lunga 100 e 1000, il ragionamento è lo stesso;
se la sequenza da cercare è lunga N, controlli al massimo fino a fino a size-N+1 ESCLUSO (in questo caso N=2 -> controlli fino a 8-2+1=7 ESCLUSO)
Giuro! Ho letto solo ora.. praticamente la stessa cosa che stavo scrivendo!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
ho modificato il mio post contemporaneamente alla tua risposta
 
Uscire da un programma in quel modo è assolutamente deprecabile perché fonte di errore,
Sarà che sono abituato in Java.
Ma se metto il return perchè dovrebbe essere errore scusami? Faccio terminare il programma correttamente...
Metti caso che devi fare un'operazione su un file grande. Scorri l'intero file anche se trovi prima quello che ti serve?
 
Non è un errore, ma fonte di possibili errori, poca leggibilità del codice, difficoltà di debug... Sarebbe preferibile bloccare e forzare l'uscita dal ciclo, ma non dal programma.
Il fatto che lo usi in Java non vuol dire che diventa giusti: stai usando modalità possibili ma non consone in entrambi i linguaggi!

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Il fatto che lo usi in Java non vuol dire che diventa giusti: stai usando modalità possibili ma non consone in entrambi i linguaggi!
Si, intendo che usando sempre Java avrò perso dimestichezza con il C e mi p venuto spontaneo il return.
Comunque tutto ok, abbiamo risolto il problema all'utente ;)
 
Metti caso che devi fare un'operazione su un file grande. Scorri l'intero file anche se trovi prima quello che ti serve?

Se non sbaglio c'è break pure in Java
E non sono un programmatore ma un sysadmin
 
Sarà che sono abituato in Java.
Ma se metto il return perchè dovrebbe essere errore scusami? Faccio terminare il programma correttamente...
Metti caso che devi fare un'operazione su un file grande. Scorri l'intero file anche se trovi prima quello che ti serve?

Il punto è un altro. Ciò che vuole dire rtc non è quello; ci sono altri modi per interrompere un ciclo e tornare al chiamante.
Un esempio? L'utilizzo di un flag. Poi verrà valutato al termine del ciclo (interrotto con un break o meglio ancora dalla condizione stessa, per evitare il break).

Se non sbaglio c'è break pure in Java
E non sono un programmatore ma un sysadmin

Si, credo esista in *tutti".
 
Si c'è il break ovviamente.
Ma se devi bloccarti a quel passo li e non fare altro il return credo sia la scelta migliore.
Devo provare da debug per curiosità cosa accade, dato che non mi sono mai capitati errori con questa maniera.
 
Si c'è il break ovviamente.
Ma se devi bloccarti a quel passo li e non fare altro il return credo sia la scelta migliore.
Devo provare da debug per curiosità cosa accade, dato che non mi sono mai capitati errori con questa maniera.
Tranquillo, non sforzarti di capire. Nessuno ha detto che si tratta di un errore, ma l'uso del break o addirittura del ritorno al sistema (uscita dal programma) sono soluzioni estreme e poco eleganti per risolvere il problema.. è un po' come dire: "sono disperato, non so cosa fare e chiudo tutto"!

Per risolvere l'algoritmo con eleganza non è necessario percorrere tutta la stringa, ma se hai davvero passione per questa materia dovresti dimostrare un po' di elasticità mentale e cercare di riformulare la soluzione del problema.

Le info ti sono state date: metti le due condizioni di uscita dal ciclo nel while.. le due condizioni sono: l'indice a fine stringa oppure trovare una ricorrenza. Il risultato, fuori dal ciclo, sarà positivo solo se l'indice sarà superiore alla lunghezza (vuol dire che il ciclo è terminato prima del tempo perché è stata ritrovata una ricorrenza).. niente flag!
Dentro al ciclo individui la parte di stringa da ricercare e poi incrementi l'indice..

Mi pare una soluzione molto essenziale e lineare.. perché non provi a scriverla in C, o ancora meglio, in pseudocodice?

Inviato dal mio Nexus 6P utilizzando Tapatalk
 
Allora:

1) la scelta di dare il codice è del singolo utente e non va contro il regolamento, mentre l'autore del post se non lo mette si
2) un problema come questo va oltre il linguaggio e si poteva optare per il solo algoritmo
3) l'utente ha avuto la soluzione ed un lungo dibatitto su come scrivere meglio un codice

Penso che si possa chiudere qui, che dite?
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top