|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
[c] lista dinamica - tempo
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
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
Quote:
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ì } oppure elabora(pCella *pc) { (*pc)->xxx = 10; // oppure (**pc).xxx = 10; // dovrebbe essere così } ma è una lista di caratteri ? puoi spiegarti meglio sul primo passaggio ? Ultima modifica di Alex_87_xelA : 10-12-2008 alle 22:20. |
|
|
|
|
|
|
#3 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
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
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
per quanto riguarda il tempo puoi fare una cosa del genere
Codice:
clock_t start, finish; double duration; start = clock(); ... ... ... finish = clock(); duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%2.1f seconds\n", duration ); Questo è solo un esempio per capire come si prende il tempo ... ora lo devi adattare tu al tuo programma (se ti serve OVVIAMENTE |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
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 ...in piu le modifiche che faccio su cerca_minimi si ripercuotono pure sugli elementi della lista del main giusto?
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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).
Codice:
struct cella *testa; Codice:
new = (struct cella *)malloc (sizeof (struct cella) ); new = NULL; ![]() 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
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2007
Città: villa verucchio
Messaggi: 1921
|
si giusto non volevo scrivere new=NUKLL ma testa =NULL
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
__________________
CPU: Amd Phenom II 955--MB: Gigabyte GA-890GPA-UD3H--RAM:4 GB DDR3--SV: ATI Radeon HD 5770--HD: Western Digital Caviar Black 500 gb--ALI:: Corsair 650w--MONITOR: SyncMaster P2270--ROUTER: Netgear DG834G--SO: Win 7 Professional 64 bit |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
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).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
Codice:
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;
}
}
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 Codice:
if(!testa)
printf("non c'è il minimo");
else
//fai stampare il minimo :D
Ultima modifica di Alex_87_xelA : 11-12-2008 alle 21:06. |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Nov 2008
Messaggi: 530
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 05:17.





















