PDA

View Full Version : [c] lista dinamica - tempo


mto89
10-12-2008, 21:07
ciao, sto sviluppando un programmino e per scopi didattici devo tenere conto del tempo impiegato dall'utente a inserire una frase, il tutto tramite lista dinamica.

Io pensavo di rilevare il tempo prima della battitura della frase e successivamente dopo.
Poi come potrei proseguire per valutare il tempo migliore tramite lista? consigli?

inoltre se ho lista in una funzione, ad esempio
struct cella *head;

e la voglio modificare in un'altra funzione, quindi passandola per indirizzo per esempio alla funzione elabora....come devo scrivere?

elabora (struct cella ** head); (dichiarazione funzione)

elabora(struct cella **head)
{
cella.xxx=10; ( non posso accedere cosi poi vero per far si che i cambiamenti vengano applicati alla lista anche fuori da elabora?)

spero di essermi spiegato! grazie dell'attenzione

Alex_87_xelA
10-12-2008, 21:17
ciao, sto sviluppando un programmino e per scopi didattici devo tenere conto del tempo impiegato dall'utente a inserire una frase, il tutto tramite lista dinamica.

Io pensavo di rilevare il tempo prima della battitura della frase e successivamente dopo.
Poi come potrei proseguire per valutare il tempo migliore tramite lista? consigli?

inoltre se ho lista in una funzione, ad esempio
struct cella *head;

e la voglio modificare in un'altra funzione, quindi passandola per indirizzo per esempio alla funzione elabora....come devo scrivere?

elabora (struct cella ** head); (dichiarazione funzione)

elabora(struct cella **head)
{
cella.xxx=10; ( non posso accedere cosi poi vero per far si che i cambiamenti vengano applicati alla lista anche fuori da elabora?)

spero di essermi spiegato! grazie dell'attenzione

per la 2a domanda

puoi fare così
typedef struct cella *pCella;

elabora(pCella &pc) //e la usi come un normale puntatore
{
pc->xxx = 10; //oppure (*pc).xxx = 10; //dovrebbe essere così :D
}

oppure

elabora(pCella *pc)
{
(*pc)->xxx = 10; // oppure (**pc).xxx = 10; // dovrebbe essere così :D
}

ma è una lista di caratteri ?
puoi spiegarti meglio sul primo passaggio ?

DanieleC88
11-12-2008, 00:15
elabora(pCella &pc) //e la usi come un normale puntatore
{
pc->xxx = 10; //oppure (*pc).xxx = 10; //dovrebbe essere così :D
}
Attento che con quella e commerciale stai definendo un riferimento, che è un concetto ignoto al linguaggio C; in C esistono solo puntatori, quello è codice C++. ;)

Tornando al problema originale, non ho capito cosa ci sia bisogno di fare: registrare i tempi di ogni inserimento? E trovare il minimo? Be', per farlo puoi anche calcolare il tempo (prendi il tempo attuale, ricevi l'input, prendi il tempo attuale, fai la differenza tra i due tempi) impiegato per ogni inserimento, ed aggiornare il valore minimo ogni volta che questo viene battuto. Altrimenti, se ti vuoi esercitare sulle liste (e se ho capito bene ciò che intendi) puoi accodare ogni volta un nuovo nodo alla lista che conservi il tempo impiegato, ed alla fine scorrere la lista facendo lo stesso che ti ho detto prima.

ciao ;)

Alex_87_xelA
11-12-2008, 11:14
Attento che con quella e commerciale stai definendo un riferimento, che è un concetto ignoto al linguaggio C; in C esistono solo puntatori, quello è codice C++. ;)


hai ragione ... ma non avevo visto il titolo :D avevo letto C ... ma in testa a me era anche c++ :D :doh:

Alex_87_xelA
11-12-2008, 11:16
per quanto riguarda il tempo puoi fare una cosa del genere


clock_t start, finish;
double duration;

start = clock();
...
...
...
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%2.1f seconds\n", duration );


poi devi aggiungere il cotnrollo per il minimo
Questo è solo un esempio per capire come si prende il tempo ... ora lo devi adattare tu al tuo programma (se ti serve OVVIAMENTE :D)

mto89
11-12-2008, 13:13
ok grazie dei consigli...quindi pensavo di procedere cosi:

-prendo tempo
-input dati vari
-riprendo il tempo e faccio differenza.

poi tramite malloc alloco una cella della lista, dove gli inserisco il numero della mossa(in totale sono 8) e il relativo tempo, e metto la cella in cima a una lista...poi ad esempio in una funzione a parte scorro la lista cercando il tempo piu basso e ripeto quest'ultima cosa 5 volte (nel caso mi servano le 5 mosse piu rapide).
Integrando il precedente una cosa così puo andare?

int main(){
struct cella{
int num_mossa;
double tempo;
struct cella *next;
}

clock_t start, finish;
double duration;
struct cella *testa;
struct testa *new;

for ( i=0; i<numero_utenti; i++)
{
start = clock();
...
...
...
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
new = (struct cella *)malloc (sizeof (struct cella) );
new = NULL;
new->mossa = i;
new->tempo = duration;
new->next = testa;
testa = new;

cerca_minimi ( testa );
}
}


cerca_minimi ( testa )
{
int min[5];

while ( testa != NULL )
{
if (testa->tempo


fin qui è ok? poi però non so come andare avanti:doh: ...in piu le modifiche che faccio su cerca_minimi si ripercuotono pure sugli elementi della lista del main giusto?

DanieleC88
11-12-2008, 16:39
No, non è corretto: innanzitutto la struct definiscila fuori dalla funzione, poi nella funzione la utilizzi. Considera la possibilità di usare typedef per alleggerire la notazione. Magari fai una funzione per la creazione di nuovi nodi e l'inserimento in coda alla lista (ti semplifichi il codice).

struct cella *testa;
Inizializzala a NULL. ;)

new = (struct cella *)malloc (sizeof (struct cella) );
new = NULL;
Che senso ha fare ciò che hai appena fatto? :asd:

Per il resto, la funzione di ricerca del minimo ha bisogno di una sola variabile di appoggio: la inizializzi al primo elemento della lista, e poi confronti nodo per nodo della lista partendo dal secondo fino alla fine. Ogni volta che trovi un nuovo minimo, lo sostituisci alla vecchia variabile. Alla fine la restituisci.

ciao ;)

mto89
11-12-2008, 17:52
si giusto non volevo scrivere new=NUKLL ma testa =NULL:D
comunque, per trovare il minimo avevo pensato anchio al tuo metodo, il problema è che a me serrvono i 5 valori minimi, non solo il minimo, non cambia la procedura? pensavo magari di fargli memorizzare tutti i tempi anche in un array a partire dalla lista, per lavorarci piu agevolmente, seno come potrei procedere? grazie dell'aiuto

DanieleC88
11-12-2008, 18:20
I 5 minimi? Be' puoi fare un'array di 5 elementi inizializzati a 0, poi per ogni chiave nella lista cerchi l'indice del minimo nell'array e lo sostituisci con la chiave (ovviamente solo se è minore del minimo).

Alex_87_xelA
11-12-2008, 19:01
struct cella{
int num_mossa;
struct cella *next;
}

int main(){

clock_t start;
double duration, min;
struct cella *testa;
struct testa *new;

for ( i=0; i<numero_utenti; i++)
{
start = clock();
...
...
...
duration = (double)(clock() - start) / CLOCKS_PER_SEC;
new = (struct cella *)malloc (sizeof (struct cella) );
new = NULL; NOOOOO !!! così prima crei lo spazio per una nuova cella (con l'istruzione precedente) e poi (con quest'istruzione) lasci quello spazio creato (lasciandolo poi ancora occupato :D) ... poi in questo modo ... le istruzioni successive non funzionerebbero perchè hai un puntatore NULL :D
new->mossa = i;
new->next = testa;
testa = new;

if(!i || min > duration)
min = duration;

}
}



Ciao ... sono appena rientrato e solo ora ti posso rispondere ... comunque così dovresti trovare il minimo

NB : ATTENZIONE ho fatto qualche piccola modifica :
- tolta tempo dalla struct
- aggiunta la variabile min nel main
- struct fuori dal main
- ricerca del minimo

comunque si puo ancora migliorare ... ad esempio fuori il ciclo for ... se non hai inserito celle ... dovresti fare un


if(!testa)
printf("non c'è il minimo");
else
//fai stampare il minimo :D


fammi sapere se trovi errori (anche di raggionamento) nel mio pseudo codice

Alex_87_xelA
11-12-2008, 19:10
cerca_minimi ( cella *testa )
{
int min[5];

while ( testa != NULL )
{
if (testa->tempo

in piu le modifiche che faccio su cerca_minimi si ripercuotono pure sugli elementi della lista del main giusto?

se fai modifiche sugli elementi di testa ... SI ... le modifiche si avranno "diciamo" "anche nel main" (anche se non è corretto da dire) ... mentre il puntatore ... "testa" ... anche se gli fai cambiare area puntata ... essendo passato per valore (IL PUNTATORE ... non gli oggetti ... quelli sono passati per indirizzo) ... all'uscita della funzione ... il puntatore sarà ancora quello che si aveva prima dell'ingresso a tale funzione :D