Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [C] Calcolare il periodo di una stringa

    Salve a tutti

    Ho un problema con un esercizio in C. In breve, devo creare una funzione con prototipo int strperiod(char *str) che ritorna la lunghezza del più breve periodo della stringa. Una stringa ha periodo k se è uguale alla concatenazione di una o più ripetizioni di una stringa di lunghezza k. Ad esempio, la stringa "ciaociao" ha periodo 4 ed anche 8 ma la funzione restituisce 4 perché è il periodo più breve; la stringa "01010101" ha periodo 2, 4 e 8 ma la funzione ritorna soltanto 2 per lo stesso motivo. In generale, una stringa ha periodo almeno pari alla sua lunghezza: ad esempio, la stringa "periodo" ha periodo 7 perché non esiste una sottostringa che si ripete almeno una volta.

    Spero di avervi fornito una spiegazione sufficientemente chiara.

    Ora, devo implementare questa funzione con l'aritmetica dei puntatori e allora ho pensato a questa soluzione che però non funziona. Per favore, qualcuno mi dia una mano...

    codice:
    int strperiod(char *str) {
        
        int offset = 0;
        int period = 0;
        
        while (*str != *(++str) && *str != '\0') {
            offset++;
        }
        
        char *j = str + offset;
        
        while (*str != '\0') {
            if (*str == *j)
                period++;
            str++;
        }
        
        return period;
    }

  2. #2
    Ciao,
    suppongo che anche tu stia facendo gli homework del corso di fondamenti di programmazione
    Io non sto ancora facendo questo,quindi la soluzione gia' fatta con cui confrontare non ce l'ho,
    pero' ho notato alcune cose nel tuo codice che a prima vista non mi sono molto chiare,e qualche errore che intanto potrebbe essere corretto.
    Il primo dubbio e' sul primo while
    codice:
     while (*str != *(++str) && *str != '\0') {
            offset++;
        }
    cosa avrebbe dovuto fare?
    Cosi com'e',l'unica cosa che fa e' controllare se un carattere e' uguale al successivo.
    Quindi se io scrivessi come stringa "ciao" all'uscita avrei un offset di 3,mentre se io scrivessi qualsiasi cosa che comincia con due lettere uguali,tipo "aassddfgdfg" mi uscirebbe al primo controllo dandomi un offset di 0.
    Se quello che volevi era che il ciclo uscisse quando incontra un carattere uguale al primo a prescindere dalla distanza tra essi,la soluzione piu semplice che mi viene in mente e' di creare un secondo puntatore char uguale a str,e riscrivere il ciclo cosi
    codice:
    char *str2=str;
        while (*str != *(++str2) && *str2 != '\0') {
            offset++;
        }
    inizializzerei anche l'offset a 1 invece che a 0,cosi se come stringa inserissi "asdasd" in uscita mi dara' un offset di 3,in modo tale che nell'inizializzazione di j la faccia puntare alla quarta lettera.

    Il problema principale pero' secondo me e' che stai sbagliando l'approccio al problema,devi tener conto che per avere un offset giusto devi gia sapere quanto e' lungo il periodo minimo all'interno della stringa,e di conseguenza devi gia aver risolto il tuo problema.
    Ti faccio un esempio,se io inserissi come stringa "asdaseasdase" il sottoperiodo della stringa e' 6,ma col controllo che faresti tu ti darebbe un offset puntante alla prima a che incontra,e nel secondo while non sarebbe in grado di riconoscere il sottoperiodo giusto.
    Insomma secondo me il secondo while non ti serve,sistema tutto nel primo e in uscita da esso l'offset ti dara' la lunghezza del periodo minimo.

    Ricorda anche che nonostante stai lavorando coi puntatori,se hai bisogno di controllare il carattere successivo non hai bisogno di fare str++,puoi scrivere str[i+1],e' perfettamente legittimo e ti risparmia problemi a mio parere.
    Scusami se non ti scrivo la soluzione esatta ma come gia detto non ci ho ancora lavorato,spero pero' di esserti stato un minimo d'aiuto xD
    ciau

  3. #3
    Ciao!

    Eh sì, anch'io sto facendo gli homework e sto completamente in alto mare
    Tu di quale canale fai parte? Io sono del canale A-D e per noi questi homework sono impossibili, non tanto perché siano difficili quanto soprattutto perché noi ancora non abbiamo visto a lezione argomenti come l'allocazione dinamica e gli array di puntatori e dubito che ce la faremo prima della data di consegna. Comunque mi sto arrangiando come posso, anche chiedendo aiuto a qualcuno...

    Ti ringrazio per avermi chiarito qualche dubbio, ho sistemato le cose che mi hai consigliato nel primo while e ora provo a cercare un altro approccio al problema.
    Tu a che punto sei? Io in tutta la giornata sono riuscito a finire soltanto l'esercizio sul numero di Smith e almeno quello sembra che funzioni... Se possiamo darci una mano a vicenda, posso lasciarti il mio contatto in privato se ti va...

    Fammi sapere e buon proseguimento!

  4. #4
    Guarda,io sono del secondo anno(nonostante l'anno scorso non abbia dato neanche un esame,ma questa e' un'altra storia.. xD ) quindi il canale me lo scelgo io a seconda del prof che preferisco.Con informatica sto nel canale P-Z e ti assicuro che anche li' non stanno messi bene in quanto ad argomenti trattati,probabilmente staranno quasi tutti nei casini con gli homework
    Praticamente non li ho neanche cominciati,piu che altro perche' rimando sempre all'ultimo lol
    Ho fatto anche io soltanto quello sui numeri di smith,che se non fosse stato per il fatto che voleva il numero long long non era difficile in se'.
    Per quanto riguarda questo del periodo ci ho riflettuto un po' sopra e io avevo pensato a un ciclo che facesse una cosa di questo genere:
    Prima creo un puntatore *j=str
    1)cerco la prima lettera che incontro uguale alla prima della stringa,e faccio partire j da quell'offset li'.
    2)comincio a controllare se la successiva e' uguale alla seconda,e cosi via.
    3)se tutti i controlli fino alla fine sono positivi,l'offset sara' il periodo minimo (controllando anche i casi di una stringa tipo "ciaocia" in cui nonostante tutti i controlli saranno positivi,il periodo e' la stringa.)
    4)Se un controllo da esito negativo riporto il puntatore della stringa al carattere iniziale, e faccio puntare j al carattere nella posizione offset(aumentato di 1 per puntare al successivo) e ricomincio a cercare un carattere uguale al primo.
    Quando usciro' da questo ciclo, il mio periodo minimo sara' l'offset oppure la lunghezza dell'intera stringa.

    Non l'ho ancora implementato quindi non posso assicurarti che il ragionamento sia perfetto,potrei aver dimenticato di contemplare alcuni casi

    Vabe' poi ti faro' sapere se funziona xD

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.