Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Parole Random!
Forum - C/C++ - Parole Random!

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 12:56
Sabato, 01/01/2011
Devo preparare un progetto all'interno del quale mi serve una funzione che mi prelevi una parola random all'interno di un file contenente tutte le voci del dizionario italiano (.txt).
Non so da che parte farmi per la suddetta funzione:(
Aiuto!

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 13:19
Sabato, 01/01/2011
Sarò più preciso, nella fretta sono stato vago;)
Riesco tramite una prima implementazione della funzione a leggere correttamente dal file. Però in maniera ordinata e partendo dalla prima riga. (Ogni riga contiene una sola parola). Come posso fare, ad esempio, a leggere direttamente la 72° riga? Perchè vi spiego, genererei un numero pseudo random e andrei a leggere la riga (e quindi la parola) corrispondere alla posizione casuale generata, è quello il mio scopo. Devo capire come fare a leggere una determinata riga!

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 13:19
Sabato, 01/01/2011
In primis devi conoscere quanti caratteri sono presenti nel file. Estrarre un numero random, attenzione il massimo numero dovrà essere il numero di caratteri presenti nel file. Partendo dall'inizio del file richiamare la funziona fseek: come secondo argomento gli passiamo il numero random. Adesso il file punta in una parte random :rotfl: infine utilizzare la funzione fgetc per prelevare un carattere.

Ciao

Ultima modifica effettuata da Pitagora il 01/01/2011 alle 13:21
PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 13:31
Sabato, 01/01/2011
Ok, certo per il massimo random;)
Ma il punto è che il numero random sarebbe quello che mi indica l'indice della riga!
Non devo puntare in una parte random, ma ad una riga random!
Visto che ogni riga contiene una sola parola puntare ad una riga equivale a puntare ad una parola!
Ed in più, una volta raggiunta la riga come estrarre tutta la parola contenuta e non solo un carattere?

Ultima modifica effettuata da -Meng0- il 01/01/2011 alle 13:32
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:16
Sabato, 01/01/2011
i file di solo testo non sono indicizzati, di conseguenza qualsiasi algoritmo che tu possa escogitare avrà complessità O(n) con n=dimensione del file.

Preso atto di questa triste notizia, implementa un algoritmo che tiri un numero X a caso, legga le prime X-1 righe (buttando via il contenuto che tanto non ti serve) e conservi la X-esima riga in una variabile per poi farne quello che vuoi.

Esistono tanti altri algoritmi, ma partendo da un file ASCII nessuno di questi sarà più veloce (nel caso in cui tu voglia accedere per forza alla X-esima riga in modo diretto).

Un metodo diverso sarebbe quello di puntare su un byte a caso, scansionare il file da quel byte in poi, e prelevare il contenuto della prima coppia di ritorni a capo che incontri (quindi ci vuole una getc() finchè non trovi un'andata a capo e poi una gets() per prelevare la stringa successiva).

In questo caso non puoi sapere qual è la posizione della parola (quindi addio all'X-esima riga di cui sopra), però ottieni comunque una parola rando con uguale probabilità e risparmi tanto tempo di calcolo e soprattutto di accesso al file (che è la parte più lenta).

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 14:23
Sabato, 01/01/2011
Beh sì, in fatto di costo computazionale degli algoritmi di cui stiamo parlando hai pienamente ragione, avevo pensato anche io comunque di arrivare appunto "in fondo" alla riga alla quale mi punterà un byte a caso, scorrere fino a trovare un /n, e iniziare la lettura dalla stringa successiva.
Grazie mille per l'aiuto, ora ci provo e vi faccio sapere;)

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 14:35
Sabato, 01/01/2011
void Preleva_Parola(void)
{  
    FILE *fp = fopen("C:\\Documents and Settings\\-\\-\\Dizionario.txt", "r");
    long random = Genera_Random();
    fseek(fp, random, 1);
    char ch;
    while ((ch = fgetc(fp)) != '\n')
        continue;
    fgets("%s", 30, fp);

    system("pause");
}

Però non va, si impalla proprio l'applicazione chiedendomi di fare "Termina Adesso":(:(

Ultima modifica effettuata da -Meng0- il 01/01/2011 alle 14:42
PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 14:39
Sabato, 01/01/2011
Controlla bene le funzioni; non si richiamano così

PM Quote
Avatar
-Meng0- (Normal User)
Rookie


Messaggi: 40
Iscritto: 01/01/2011

Segnala al moderatore
Postato alle 14:43
Sabato, 01/01/2011
Avevo Copia/Incollato male, mancavano dei pezzi;)
Prova a darci un'occhiata ora per favore ho anche cambiato alcune cose, ma l'errore persiste:(

PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo