martedì, ottobre 31, 2006

Esercitazione di venerdì 27

Ho pensato che forse a qualcuno sarebbe stato utile rivedere un 'riassunto' dell'ultima esercitazione.. purtroppo non ho avuto molto tempo, così questo codice che vi posto è poco più di quello fatto in laboratorio (cioè: stampa un istogramma 'numerico' normalizzato rispetto all' 'altezza' della colonna più alta lavorando con una pfd arbitraria (nel codice ne ho incluse due, che ho dovuto definire perchè (nel caso di y=cosx+1) non erano funzioni di math.h o perchè (nel caso di y=x^2) non erano definite come funzioni di una sola variabile)). In particolare, non ho risolto il problema dell'estremo superiore del codominio della distribuzione (mentre, per quanto riguarda l'estremo inferiore, si usa sempre zero (anche se mi rendo conto che questo potrebbe generare qualche trascurabile incongruenza per pfd identicamente nulle in qualche punto, per via di come ho definito la condizione di ciclo in randFunc)).
Sperando di non aver fatto troppe stupidaggini, ho aggirato la questione del moltiplicare per 'quasi uno' facendo in modo che randFlat generi numeri nel chiuso e non nel semiaperto.
Se c'è qualcosa di sbagliato o incomprensibile fatevi sentire. Ci vediamo giovedì..


PS: cavoli. Non riesco a incollare direttamente qua sotto il codice. Che vergogna. Uso due immagini.

6 commenti:

Unknown ha detto...

ciao Eugenio,

complimenti per il codice, sei il primo ad aver scritto nel blog dopo Enzo (nemmeno io l'ho ancora fatto :) ).
Ora metto in lista una serie di commenti, la maggior parte dei quali di carattere generale, che usano il tuo codice soltanto come spunto.

-- mi piace molto che tu abbia diviso le funzioni dal programma principale nel mettere le immagini in web, questa divisione corrisponde anche ad una divisione di file?
Cioe’, le funzioni sono definite in un file diverso dal quello dove e’ scritto il main?
-- la funzione parabola e’ implementata con pow(x,2), cosi’ come e’ giusto che sia.
Nel caso si volesse ottimizzare il codice in termini di velocita’, scrivere x*x e’ molto piu’ veloce in esecuzione, perche’ l’algoritmo di pow e’ abbastanza sofisticato da elevare numeri positivi a qualsiasi potenza, mentre la moltiplicazione e’ un algoritmo di livello piu’ basso.
-- a proposito del #define FUNC parabola : e’ buona regola di programmazione non utilizzare le istruzioni di pre-compilazione al posto di variabili di compilazione.
Insomma, in questo caso io non avrei usato il #define, ma avrei scritto direttamente randFunc (parabola,min,max,1) nel codice.
-- oltre all'operatore ++ utilizzato di solito dopo una variabile (ad esempio i++), esiste anche quello applicato da sinistra, cioe' ++i.
In generale e' da preferirsi, perche' e' piu' veloce e richiede meno memoria (questo e' importante se l'operatore ++ viene applicato ad oggetti di C++, che non a variabili di tipo intero).

Ora, mi vengono in mente alcune questioni legate all'implementazione.

-- E' necessario definire il vettore bin? Viene utilizzato nel conteggio i dati e trascrivo.... solamente, per capire quale "bin" dell'istogramma vada incrementato dato un numero generato casualmente.
Questa scelta si puo' fare altrimenti?
-- E' necessario salvare tutti i numeri generati in un vettore da trasferire poi nell'istogramma, oppure si puo' riempire l'istogramma "al volo" numero per numero?

Infine, qualche banale dettaglio :)

-- Come mai max e min sono dichiarati const?
Fra l'altro, potrebbero ben essere dichiarati appena prima il ciclo dove vengno utilizzati (con il C++ si puo'), che e' una cosa comoda per fare copia-incolla in futuro.
-- Come mai dici che randFlat genera nell'intervallo chiuso [min,max]?
Siccome rand() non assume mai il valore RAND_MAX, mi aspetterei che il valore max non sia mai restituito, da randFlat.

Ciao,
pietro

Eugenio ha detto...

Allora.. Intanto, ringrazio pietro per l'attenzione. Rispondo ad alcune delle osservazioni..

- In realtà no, le funzioni sono definite nello stesso file. Avevo preso in considerazione la possibilità di dividerle, ma penso che lo avrei fatto solo se fossero diventate molte.. in particolare, credo che in questo caso avrei fatto un file per randFlat, uno per randFunc e uno per tutte le pdf da definire.

- utilizzando #define mi sembrava di mantenere un codice più ordinato: nel senso che in questo modo per scegliere la funzione mi bastava cambiare una parola all'inizio e non in mezzo al testo.. Stesso discorso per min e max: li ho piazzati lì in cima perchè mi piaceva averli a portata di mano. Del resto, ora che me lo fai notare, mi sembra una cosa molto meno intelligente di quanto mi sembrasse prima. Per quanto riguarda la dichiarazione a const, in effetti, c'era motivo di farla solo per l_A ed l_H..

- ops.. mi pareva di ricordare che RAND_MAX fosse a tutti gli effetti un massimo, e non solo un estremo superiore.. pensavo che rand, di suo, generasse in [0, RAND_MAX].

Per tutto il resto non ho niente da aggiungere.. grazie per i consigli!

Unknown ha detto...

errata corrige ho sbagliato! la funzione rand() puo' restituire anche RAND_MAX, quindi il codice che hai scritto fa effettivamente quello che hai detto, scusami.

hronir ha detto...

Oh, finalmente questo blog comincia a prender vita! :-)
In fremente attesa che altri seguano il buon esempio di Eugenio (e scusandomi del ritardo con cui mi rifaccio vivo) aggiungo anch'io qualche commento/domanda...

[ma siccome questo mio commento cominciava a diventare molto lungo, preso dalla mia solita mania di grandezza, ho pensato di trasformarlo in un post a sè stante...!]

hronir ha detto...

Sommessamente fra i commenti, aggiungo qualche altra considerazione sulla scia di quelle di Pietro.
Gli operatori ++, preposti e postposti, sono "sottilmente" diversi non solo, come diceva Pietro, per efficienza, ma anche per il valore restituito.
Cioè - attenzione attenzione - entrambi gli operatori non si limitano ad incrementare la variabile su cui si applicano, ma restituiscono (nel senso tecnico delle funzioni in C/C++) un valore. Provate a "giocare" con espressioni del tipo:
a = b++;
a = ++b;
e provate a fare delle stampe di verifica sui valori di a e b prima e dopo le assegnazioni...

hronir ha detto...

Ecco qui il link al post con qualche mio commento sul post di Eugenio.