sabato, dicembre 30, 2006

esercizi

1. Che cosa succede all'istogramma di questo link, se l'operatore di assegnazione (operator=()) viene chiamato su se stesso? In altre parole, se si programma:

istogramma mioIstogramma (/* parametri */) ;
mioIstogramma = mioIstogramma ;

che cosa succede a mioIstogramma?

2. implementare il copy constructor e l'operator=() per la classe vettore tenendo presenti le considerazioni del punto 1.

mercoledì, dicembre 27, 2006

Insieme di Mandelbrot: proposta di soluzione.

Ciao a tutti,
ho svolto l'esercizio sull'insieme di Mandelbrot.
Sul gruppo potrete trovare il file MandelbrotKri_02.cpp da scaricare .
Ditemi cosa ne pensate!! Ogni commento è gradito!
P.s.: ricordatevi di scaricare anche i file sui complessi (complessiKri.he complessiKri.cc ) altrimenti non funziona.

N.B.: il programma genera anche un file chiamato output.txt che contiene la lista dei valori assunti dalla funzione RunOut per ogni numero complesso analizzato.

A grande richiesta (da leggersi... me l'ha chiesto Enzo) potrete trovare il file MandelbrotKri_ASCII.txt che è la copia di un output ottenuto con il programma di cui sopra usando i numeri:
z1 = -3-3i
z2 = 3+3i
intervalli = 8100.

Modifica 28-dic: Ho aggiunto un altro file dell'output : MandelbrotKri_ASCII02.txt.


mercoledì, dicembre 20, 2006

procedure in una classe

Ciao!
Stavo facendo qualche "vecchio" esercizio ed avevo una curiosità.
In particolare mi stavo occupando della classe istogramma (che non ho ancora fatto perchè mi ero occupato della classe complessi, ndt).
Dopo aver creato l'header file.h ho iniziato a scrivere il file .cc con l'implementazione della funzione riempi()
dichiarata nel seguente modo nel file .h:
void riempi(const double dato);
la funzione serve a inserire un dato nell'istogramma.
Mi è venuto in mente che servirebbe qualche controllo a proposito del dato inserito, per esempio:
"Cosa si fa se il dato inserito è minore del minimo valore rappresentato o maggiore del massimo?"
a questo punto l'idea è stata (prendiamo per esempio dato < min):
i) perdere il dato (scelta sconsigliata, credo)
ii) salvare il dato, ma non rappresentarlo (sono possibili diverse soluzioni)
iii) rappresentare il dato (modificando non poco l'istogramma), in particolare in questo caso potrei:
a] modificare il minimo in modo da rappresentare il nuovo dato e aggiungere tanti bin con lo stesso step di quelli dell'istogramma precedente (in pratica, se lavorassi con carta e matita allungherei il foglio e aggiungerei tante colonne (vuote) e poi una colonna in fondo a sx nella quale rappresento il nuovo dato)
b] modificare il minimo e calcolare un nuovo step (per esempio mantendo il numero di colonne uguale a quello precedente (di nuovo in pratica, cancello con una gomma le etichette degli intervalli delle colonne dell'istogramma e metto intervalli più larghi in modo da arrivare a contenere anche l'ultimo dato )
c] chiedo all'utente di scegliere di nuovo il numero di colonne che gli aggradano
Sia i punti i), ii), iii), come pure a], b], c] richiedono scelte da parte dell'utente che sarebbe bello poter fare run-time (leggi: l'utente inserisce il dato dall'esterno il programma vede che non va bene e allora si mette a chidere all'utente come si deve comportare).
La domanda che volevo fare è la seguente:
si può inserire scrivere tutta questa procedura di controllo come una funzione all'interno di una classe, senza che sia un metodo della classe. (come se fosse una funzione a parte, insomma, perchè è una specie di sottometodo)?
Da notare che per tutto il lavoro che ci sarebbe da fare sul vettore dei bins dell'istogramma sarebbe utile avere a disposizione un bell'array dinamico riallocabile (quindi prima dovrei mettermi a fare l'esercizio sulla classe dei vettori, oppure usare gli std::vector).
Dite che è troppo complicata tutta questa procedura?
Allora... se sì abbiamo tre possibilità I), II), III)... se no abbiamo... vabbhé lasciate perdere... sto delirando.
Fatemi sapere.
Ciao ciao
Cristian

lunedì, dicembre 18, 2006

esercizio con i vector

Un esercizio semplice per prendere dimestichezza con i std::vector : provare a sostituire l'array dentro alla classe istogramma con std::vector.
Come sempre, pubblicate il risultato!

venerdì, dicembre 15, 2006

Istogramma (un po' in ritardo)

Finalmente ho capito come si riescono a fare i link per pubblicare i programmi
Per adesso, meglio tardi che mai, metto a vostra disposizione il programma sulla classe istogramma (vedi i files pubblicati da davide 1986). In particolare mi piacerebbe ricevere qualche commento sui metodi per visualizzare a schermo l'istogramma: ho tentato di ingegnarmi come meglio potevo, anche se sono sicuro che ci sono dei metodi più eleganti e precisi dei miei.

giovedì, dicembre 14, 2006

Lezione di domani

Domani si terra' regolarmente lezione.

slide sulla standard template library

qui

giovedì, dicembre 07, 2006

slides sui template

qui

mercoledì, dicembre 06, 2006

discussione sul gruppo!

Se non lo faccio io, voi non ci pensate! Informo dunque tutti quelli che consultano solo il blog (visto che il gruppo ha solo 9 membri, oltre ai docenti...) che sul gruppo di google si sta svolgendo una discussione su un esempio, uploadato da un vostro collega, di una classe template per l'allocazione dinamica di array.

venerdì, dicembre 01, 2006

classe di vettori

Trovate qui e qui due esempi di implementazione di una classe di vettori template rispetto al tipo. Divertitevi ad ampliarle, ad esempio aggiungendo il copy-constructor come abbiamo fatto a lezione, l'overloading dell'operator=, e qualche metodo per ri-definire la taglia del vettore (allungarlo, accorciarlo), per resettarlo (eliminare — rilasciare la memoria del — l'array), riallocarlo, et cetera...
Ricordo che c'è ancora una lezione prima delle vacanze di natale, il 15 dicembre.
Non vorrei spaventarvi (anzi, forse sarebbe meglio se vi spaventaste un po'...!), ma l'esame si avvicina: più aspettate a prender confidenza concreta con la programmazione, più difficile sarà prepararsi!
Buona doppia settimana, e sfruttate il fatto che settimana prossima non avrete argomenti nuovi per consolidare (!) il programma fatto fin'ora, perchè poi (finalmente) cominceremo con cose nuove...

martedì, novembre 28, 2006

ancora esercizi

Allora, avete risolto i precedenti esercizi? Eccone un altro, semplice ma importante. Questo, ancor più degli altri, è importante che lo risolviate entro la prossima lezione! A proposito: ricordatevi il cambiamento d'orario!!!

domenica, novembre 26, 2006

esercizi

Ecco qualche esercizio per venerdì prossimo.
Ricordatevi il cambiamento d'orario!!!

sabato, novembre 25, 2006

***ATTENZIONE***
lezione del 1.12.06

Per venerdì prossimo è confermata la "compressione" dei due turni di laboratorio (solo per i gruppi 1 e 3, ne abbiamo già parlato a lezione), ma cambia l'orario: i due turni saranno al mattino, nei seguenti orari:
  • 10.30-12.00: gruppo 3
  • 12.00-13.30: gruppo 1
Nel primo turno ci sarà il gruppo (3) che aveva in programma il turno della mattina, quindi nel secondo turno ci sarà il gruppo (1) che aveva in programma il turno del pomeriggio.
Siete gentilmente ma caldamente invitati a spargere la voce anche ai compagni di corso che leggono la posta e/o il blog con meno regolarità!

Ci scusiamo ancora per il cambiamento improvviso di orario.

istogramma.cc

Ecco qui una possibile implementazione di istogramma.cc

venerdì, novembre 24, 2006

Insieme di Mandelbrot

Ho provato ad ottemperare al punto C) degli esercizi ed ho uploadato sul gruppo di discussione la mia modesta soluzione.

In particolare, non ho trovato il modo soddisfacente per:

  1. rappresentare le etichette dei valori dell'asse x del piano di Argand-Gauss senza che tutto risulti un po' sballato.
  2. rappresentare il suddetto piano come Dio comanda (e cioè con l'asse immaginario crescente verso l'alto) - Mi rendo conto che l'insieme di Mandelbrot è simmetrico rispetto all'asse reale e quindi la cosa non è fondamentale, ma è estremamente seccante - appunto per via delle etichette. Avevo pensato ad un algoritmo correttivo ma funziona bene solo per intervalli simmetrici rispetto a Im=0; se qualcuno ha voglia di perderci sopra del tempo, mi piacerebbe una bella soluzione universale (e che cioè vada bene per rappresentare a terminale tutti i grafici di R2, sapendo che per forza il computer deve scrivere dall'alto).

PS: Mentre scrivevo ho trovato una possibile soluzione che passo a testare: se, invece di fare il ciclo con (i=0;i < n_int ;i++)
, si fa con (i=n_int ; i > 0 ; i--), funziona?

Funziona. Bene.

lunedì, novembre 20, 2006

Ricordatevi del gruppo

Ciao a tutti,
volevo ricordarvi che oltre al Blog ed ai Quaderni esiste anche un gruppo di discussione di Google relativo al laboratorio, si chiama LabInfoDocet.
Trovate il link (permanente) a destra.
Il gruppo è utile perchè:
1. riporta tutti i messaggi del blog.
2. da la possibilità di caricare facilmente files (come se fossero allegati di una e-mail) che diventano disponibili per tutti (e così non dovete fare "copia-incolla" nel blog).
3. ci si può iscrivere al servizio di ricezione dei post via e-mail (così sarete sempre aggiornati).
... and much more.
Un assaggio, qui di seguito i link a due file (uno di Eugenio e l'altro mio) che riguardano le classi "complesso" e "istogramma":
Istogramma Eugenio.cc
complessiKri.h
(p.s. Eugenio non mi ha mai chiesto di sbattere il suo file in prima pagina sul blog... però spero che non si arrabbi per questo!!)

venerdì, novembre 17, 2006

compiti

Tassativo: per settimana prossima dovete arrivare in laboratorio con questi esercizi svolti completamente! Molti di voi hanno già svolto il punto A (meglio: l'abbiamo svolto quasi completamente insieme in classe...), e alcuni persino il punto B: non avete scuse!

giovedì, novembre 16, 2006

domani lezioni regolarmente

Turno del mattino:

  • 10:30-13:30 (direttamente in laboratorio)
Turno del pomeriggio:
  • 14:30-17:30

martedì, novembre 14, 2006

singleton

a seguito di una domanda in laboratorio, trovate fra i quaderni un link ad una pagina web sui singleton.

sabato, novembre 11, 2006

spunti

Ricordo che avevamo già messo nei quaderni del blog, qui, parte delle slide che stiamo vedendo in queste ultime lezioni. Ora ne abbiamo aggiunte altre quattro (allo stesso indirizzo), per cui chi le avesse già viste ne troverà di nuove...
Usando i goolge-groups siamo anche riusciti a rendere disponibile per il download queste slide sulla programmazione ad oggetti (direttamente in formato pps, invece che gif...): per scaricarla, cliccate (o clickate) col tasto destro del mouse qui e selezionate l'opzione "save link as...", oppure "salva oggetto con nome...", o, insomma, l'opzione per salvare su disco e non per seguire il link (ovvero aprirlo nel browser...)
Per avere qualche spunto sulla programmazione ad oggetti, è disponibile anche una (rozza) versione di una classe per i numeri complessi: potete farne il download qui. Per la fretta, ho fatto tutto in un solo file .cc: sapreste "spezzarlo" in un header file .h e in un .cc che non contiene la definizione della classe (ma solo dei suoi metodi...)?
La risposta alla domanda precedente deve ovviamente essere sì. Ma provatevi, invece, a divertirvi usando quella classe per visualizzare l'insieme di Mandelbrot! Magari semplicemente in formato ASCII, come abbiamo fatto con gli istogrammi...

mercoledì, novembre 08, 2006

minimizzare funzioni

ecco un'altra possibile implementazione di una funzione di ricerca di un minimo locale di una funzione.

martedì, novembre 07, 2006

uso dei gruppi di google

A grande richiesta, ecco alcune indicazioni per utilizzare i gruppi (di discussione) di google.

Prologo: come di blogger, anche dei gruppi esiste una versione "vecchia" e una "beta": la versione beta offre maggori funzionalità, per cui d'ora in poi (il link che avevamo fornito prima era, ahinoi, alla versione vecchia...) privilegeremo quella. Inoltre metteremo d'ora in avanti i link già settati in italiano, così rendiamo le cose più facili...
Vi conviene loggarvi col vostro account di google (che avete creato quando vi siete iscritti al blog), prima di seguire i link che seguono, così che google riconoscerà chi siete e potrete iscrivervi al gruppo e settare tutte le personalizzazioni del caso (nonchè usufruire dei servizi che mette a disposizione...)

Il gruppo che abbiamo creato per il corso è a questo indirizzo:
http://groups-beta.google.com/group/labinfodocet?hl=it
che vi presenta una homepage generale dei servizi web-2.0 che offre. Questi sono essenzialmente 3 e trovate i link a ciascuno di essi nel menu che vi ritroverete sulla destra:

Discussioni
Questa è il nucleo del servizio originario dei gruppi di discussione: la mailing list. Abbiamo tirato in ballo i gruppi solo perchè questo poteva essere un modo semplice di avvisare via mail quando qualcuno avesse pubblicato sul blog un post o un commento. Per questo essenzialmente in questa sezione vedrete delle mail che riportano i commenti e i post che chiunque di voi/noi pubblicherà sul blog. E' possibile utilizzare questa sezione per mandare delle mail a tutti gli iscritti (senza che la mail venga pubblicata sul blog), ma sappiamo bene (ancora) se sconsigliare o meno tale pratica...
File
Questa è il servizio che per primo ci è apparso interessante, dopo quello di notifica-via-email: è possibile in questa sezione uploadare (riversare sul web, nei server di google) dei propri file, in modo che possano essere visibili da chiunque sia connesso alla rete. Rocco è già riuscito a farlo!
Pagine
Si tratta di una specie di modalità di pubblicazione à la blog: si scrivono delle pagine in un editor wysiwyg, eventualmente modificabile nel loro codice HTML. Attualmente a me non funzionano (!), ma ad esempio Rocco sembra sia riuscito a pubblicare una pagina...!

Buon divertimento!

lunedì, novembre 06, 2006

Uso di "vettori dinamici"

Ecco fatto, ho finalmente modo di chiedere consigli:ho scritto un programmino che genera la distribuzione, traccia il solito istogramma attraverso una funzione alla quale passo dei vettori.Per questi utilizzo l'allocazione dinamica.Ma DevC++ mi segnala alcune cose che riguardano i vettori e la funzione. Peto auxilium socios.
Ho corretto un po' di stupidate che non andavano e lo ripropongo.Spero che sia possibile chiamare un vettore ed una singola variabile con lo stesso nome, ma mi hanno già ripreso a proposito(sono testardo).Ecco il codice(18.46).Grazie per la pazienza.
P.s. Ecco la versione testo del codice.

post via email

ciao,

per ricevere via email i post sottomessi al blog, ci si puo' registrare alla mailing list di google linkata qui:

http://groups.google.com/group/labinfodocet/about?hl=en

variabili globali (nient'affatto una questione di stile!)

Attenzione attenzione!!!
Nel mio post sulle procedure/funzioni ho fatto ricorso a variabili globali (i e j) usandole all'interno delle funzioni. Il motivo era quello di spiegare il modo con cui vengono gestite le variabili (globali, locali, passate per riferimento e passate per valore) all'interno delle funzioni, e in particolare quali sono le azioni che si ripercuotono all'interno del programma principale e quali invece hanno effetto solo all'interno (e per la sola durata) della funzione.
Di fatto, però, l'uso di variabili globali all'interno delle funzioni è fortemente sconsigliato. Di più, per quanto riguarda il corso, tale pratica è da considerarsi BANDITA, esattamente come l'uso di costrutti non-strutturati come il goto.
Il motivo è che la funzione, per sua stessa natura, deve essere il più possibile indipendente dal contesto o, meglio, deve potersi adattare a qualsiasi contesto. Per questo, tutto ciò di cui una funzione ha bisogno deve essere creato all'interno della funzione stessa (se il prosieguo del programma principale non ne ha più bisogno) oppure passato come parametro (se deve esserci una qualche comunicazione fra programma principale e funzione, sia essa in un senso, nell'altro o in entrambi).

A questo proposito, è forse il caso di anticipare in questo post dei quaderni, una discussione più dettagliata sul modo ottimale con cui passare parametri a una funzione.

problemi di registrazione con blogger

Molti di voi lamentano problemi a registrarsi al blog. Non credo siano problemi di browser, mentre magari qualcuno di questi consigli di blogger potrebbe fare al caso vostro (ho re-inviato una mail di invito agli indirizzi che ancora non si sono registrati).
Un'altra possibile fonte di problemi è che abbiate già un account blogger, ma "vecchio tipo" (mentre il blog è già nella versione nuova, "beta", di blogger). In questo caso (il suggerimento credo abbia funzionato col lupo rock) non tentate di usare il vostro vecchio account, ma createne uno nuovo (eventualmente con lo stesso userID e pwd) e usate poi quello per registrarvi al blog di lab-info.
Provate a seguire questi consigli, e se ancora non ci riuscite... boh! (ma teneteci informati, che se nessuno di voi più si lamenta, diamo per risolto il problema!)
PS
I problemi a registrarsi dal laboratorio, invece, temo siano dovuto a un qualche filtro in dipartimento, perchè è proprio questione di irraggiungibilità di certi indirizzi (ad esempio gmail stessa...). Tradotto: provate a registrarvi da casa!

domenica, novembre 05, 2006

Ehm...

Allora allora...ho messo insieme le informazioni sulle classi inventandomi un piccolissimo programma, soltanto che ci sono delle cose che non mi sono ancora chiare e così lo posto, chiedendo a Enzo se mi potrebbe correggere i milioni di errori che ho commesso...
Mi vergogno un po' dopo i sofisticati programmi di Eugenio a postare i miei banali dubbi...però siccome vorrei imparare...!!!
Temo di aver fatto confusione coi vettori e le loro dichiarazioni...Aspetto correzioni (e sgridate!)

# include 
# include
# include


//Mi scuso in anticipo per gli strafalcioni, il fatto è che vorrei vedere come
//andrebbe fatto
//un programma di questo tipo e non so come fare se non postandolo...
//promettete di non ridere per la mia incapacità!!

class data //domanda1: posso usare dei vettori come componenti della classe?
{
int dd[2];
int mm[2];
int yy[4];
}

data Chegiorno(data oggi)
//temo di aver sbagliato qualcosa qui...
{
data domani;
data domani= oggi.dd[]+
1; //non so bene come rendere questo, so che è sbagliato..
return domani;
};

int main()
{
data oggi,domani;
//istanza della classe data
oggi.dd[]= 05;
oggi.mm[]=
11;
oggi.yy[]=
2006;

domani= Chegiorno(oggi);

std::cout <<
"la data di oggi è: " << //cosa scrivo qui?? << std::endl;
std::cout << "la data di domani è: " << //e qui??? << std::endl;
return 0;
}
Grazie e buona domenica a tutti!!!
Fra

sabato, novembre 04, 2006

Riferimenti e valori, puntatori ed array, etc etc...

Ecco dei brevi promemoria sugli argomenti trattati nell'ultima lezione. A parte gli operatori del C++ new e delete, dovrebbero essere tutti argomenti di non nuovi, ma pensiamo possano risultare comunque di una qualche utilità:
1. Array
2. Puntatori
3. Allocazione dinamica della memoria
4. Algebra dei puntatori
5. Procedure e funzioni

Ancora sugli estremi del codominio di una pdf

Buona sera a tutti. Vorrei proporre qualche idea per qanto riguarda la questione degli estremi del codominio della pdf.
1: Estremo inferiore. Per definizione, una pdf è una funzione da R in R, non negativa e normalizzata (come sottolineava Enzo). Dunque, è necessario che l'estremo inferiore del codominio sia zero: infatti, se l'inf fosse negativo questa sarebbe una contraddizione della non negatività della funzione, e se fosse positivo renderebbe impossibile la convergenza dell'integrale su tutto il dominio (cioè R) a un valore finito. Questo dovrebbe tranquillizzarci..
2: Estremo superiore. Ho provato, seguendo le indicazioni nei link, a scrivere una funzione che calcoli il massimo della pdf. La cosa che ho preparato (qua sotto trovate il codice) si ferma quando trova un massimo relativo, ed è quindi adatta a funzioni con un solo massimo (o che assumano lo stesso valore su ogni max relativo). Ho provato a implementarla nel codice di Pietro, e funziona, nonostante sia un po' rozza e non proprio un capolavoro di eleganza. Spero che i commenti siano sufficienti a renderla comprensibile.

brentmax.cc

//L'algoritmo restituisce il primo max relativo che trova calcolandolo con un errore relativo tol, guardando prima a destra dell'intervallo iniziale e poi a sinistra.

#include <iostream>
#include <cmath>

double
goldmax(double func(double), double ax, double bx, double cx, double tol);
double expsearch(double func(double), double a, double b, double c, double tol, int k, double a0, double b0);

//Brentmax effettua una prima sezione aurea di [a,c] e passa i tre punti trovati a goldmax (se sono già 'buoni') oppure a expsearch.

//>>------------------------------
double brentmax(double func(double), double a, double c, double tol){
float b=c-((3.0-sqrt(5))/2)*(c-a);
if ((func(a) < func(b) && func(b) < func(c)) || (func(a) > func(b) && func(b) > func(c))){
return expsearch(func, a, b, c, tol, 0, a, b);
}
else{
return goldmax(func, a, b, c, tol);
}
}
//>>-------------------------------


//Goldmax applica il metodo della sezione aurea per trovare il massimo a partire da un intervallo a<b<c tale che f(a)>f(b), f(c)>f(b). (questo codice è più o meno tradotto da quello che ho trovato all'indirizzo http://linneus20.ethz.ch:8080/1_5_2.html, da dove ho preso anche l'idea per il metodo esponenziale di brent)
double goldmax(double func(double), double ax, double bx, double cx, double tol){
double C=(3.0-sqrt(5))/2.0;
double R=1-C;

double x0=ax;
double x1;
double x2;
double x3=cx;

if (fabs(cx-bx) > fabs(bx-ax)){
x1=bx;
x2=bx+C*(cx-bx);
}
else{
x2=bx;
x1=bx-C*(bx-ax);
}
double f1=func(x1);
double f2=func(x2);

int k=0;
while (fabs(x3-x0) > tol*(fabs(x1)+fabs(x2))){ //sul modo in cui questa condizione tiene d'occhio l'errore relativo ho qualche vaga idea, ma non sono troppo sicuro.. però funziona..

//std::cout << "k=" << k << "|a-b|=" << fabs(x3-x0) <<"<-->";
if (f2 > f1){
x0=x1;
x1=x2;
x2=R*x1+C*x3;
// x2=x1+C*(x3-x1)

f1=f2;
f2=func(x2);
}
else{
x3=x2;
x2=x1;
x1=R*x2+C*x0;
// x1=x2+C*(x0-x2)
f2=f1;
f1=func(x1);
}
++k;
}

double xmax;
if(f1 > f2){
xmax=x1;
}
else{
xmax=x2;
}
return xmax;
}





//Expsearch è una funzione ricorsiva. Prepara a goldmax un intervallo adatto, partendo da un intervallo qualunque. Se quello fornito da fuori non va bene, comincia dilatandolo verso destra (metodo della ricerca esponenziale di brent); se dopo 100 passaggi non ha trovato un massimo in questa direzione, torna all'intervallo di partenza e ripete la procedura verso sinistra. Se non trova niente nemmeno qui fornisce 1234567890 come valore 'di errore'. Non sono riuscito a farle dare Inf come output..
double expsearch(double func(double), double a, double b, double c, double tol, int k, double a0, double b0){
if ((func(a) <= func(b) && func(b) <= func(c)) || (func(a) >= func(b) && func(b) >= func(c))){
double R=2/(sqrt(5)-1);
++k;
if(k<100){
//std::cout << "Expsearch (destra): livello " << k << "<-->";

double x=c+R*(c-b);
return expsearch(func, b, c, x, tol, k, a0, b0);
}
else if(k==100){
//std::cout << "Expsearch (sinistra, primo): livello " << k << "Valore" << "<-->";

double x=a0-R*(b0-a0);
return expsearch(func, x, a, b, tol, k, a0, b0);
}
else if(k<200){
//std::cout << "Expsearch (sinistra): livello " << k << "Valore" << a << "<-->";

double x=a-R*(b-a);
return expsearch(func, x, a, b, tol, k, a0, b0);
}
else{
return 1234567890;
}
}
return goldmax(func,a,b,c,tol);
}





giovedì, novembre 02, 2006

Indentare il codice

La lezione scorsa, fra le altre cose, abbiamo avuto modo di verificare l'utilità, per la programmazione strutturata, di indentare il codice, così da poterlo leggere più facilmente e più facilmente accorgersi di errori banali quali il parent mismatching o di malformazione di blocchi subordinati e annidati.
Ecco qualche approfondimento a riguardo.
E voi, di che indent style siete? Rispondete al sondaggio nella colonna a destra del blog!

organizzare il codice in librerie

nei quaderni c'e' un post a riguardo, a questo link.

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.

mercoledì, ottobre 25, 2006

Visualizzare un istogramma


Ok, avete scritto una funzione per generare numeri casuali con una distrubuzione arbitraria (ad esempio con il metodo di reiezione). Ma come fate a capire se avete scritto davvero una cosa sensata? Provate a generare un campione di questi numeri casuali e provate a guardare come si distribuiscono! Ad esempio visualizzando un (rozzo) istogramma come quello che visualizza questo codice!

lunedì, ottobre 23, 2006

soluzione esercizio 3a

Questa può andare come soluzione dell'esercizio 3a? (e così avete capito anche qual è la sintassi per passare una funzione come argomento di una funzione...)
Ma se questa funzione-argomento è una probabilità, l'estremo inferiore (miny) non dovrebbe essere per forza zero? Funziona dunque lo stesso, l'algoritmo proposto? (c'è da aggiustare qualcosa, per quella questione di moltiplicare per quasi-uno il valore massimo della probabilità?)

Domanda da 100 punti: come faccio ad evitare di passare anche gli estremi del codominio della funzione di probabilità?

soluzioni esercizio 3

Avete provato a risolvere l'esercizio 3? Che ne dite di questa soluzione? e di questa?
Perchè nel generare y non ho usato semplicemente max_p, ma l'ho moltiplicato per quasi-uno?

C/C++ IDE per Windows

Un ambiente di sviluppo integrato (IDE) per programmare in C/C++ sotto windows è Dev-C++, che potete scaricare gratuitamente al seguente indirizzo:

http://www.bloodshed.net/dev/devcpp.html

NB Sotto windows, i programmi che scrivete vengono fatti girare in una finestra stile MS-DOS che viene aperta contingentemente quando lanciate il vostro eseguibile e chiusa immediatamente al termine dello stesso; in generale questo impedisce, nella maggior parte dei casi, di poter controllare l'output. Un piccolo accorgimento è sufficiente per mantenere la finestra aperta (e poterla chiudere con un invio): nel main, prima dell'ultima riga di uscita dal programma

return 0;


è sufficiente chiedere all'utente di inserire il valore di una variabile, così che il programma non risulti "davvero" terminato che quando l'utente non prema per un'ultima volta il tasto invio. Ad esempio, basta aggiungere le seguenti due righe:

char esci;

std::cin >> esci;


venerdì, ottobre 20, 2006

prima lezione

Riportiamo del materiale che, in qualche modo, riproduce quello visto nella prima lezione introduttiva: uno striminzito promemoria per l'input/output in C/C++, e una parziale riproduzione delle slide viste a lezione sulla funzione rand().

Probabilità e caso

Riportiamo, nello spazio degli approfondimenti (trovate il link nella colonna a destra, in alto), alcune brevi considerazioni sul concetto di probabilità. Per quanto riguarda un corso di programmazione, queste note vorrebbero essere una premessa all'uso (frequente) del concetto di numero casuale, così come verrà illustrato a lezione. L'inevitabile riferimento al concetto di (in)determinismo per sistemi dinamici non apparirà troppo fuori luogo, essendo questo un corso di laurea in Fisica.

Benvenuti

Questo blog e' inteso come uno spazio di confronto pubblico per voi studenti del corso di Laboratorio di Informatica per la Fisica II del corso di laurea in Fisica dell'Universita' di Milano-Bicocca. Con, in più, la possibilita' di interazione anche con i docenti.
Potrete iscrivervi, postare i vostri dubbi, le vostre domande, e le risposte alle domande e ai dubbi che altri hanno posto.
Buon lavoro (reciproco)!