mercoledì, ottobre 31, 2007

materiale per cominciare

A parte un po' di filosofia sui numeri casuali, ecco le slides della prima lezione (cliccate sulle singole diapositive per vederle ingrandite).
Per avere una bozza di codice in C/C++ da cui partire, ecco il piccolo programma visto in classe.
Per gli affezionati di Windoz™, un modo per giocare col C/C++ è quello di usare DevCpp: leggete qui per sapere come scaricarlo e come usarlo.
Vi ricordo gli esercizi step-by-step richiesti per la prossima volta. Va da sè che la "soluzione" ad ogni esercizio (tipicamente la funzione che si richiede di scrivere) va testata in un main che la usa e mostra in qualche modo che il suo funzionamento e' quello richiesto. Per tutti questi esercizi si darà per scontato la conoscenza e l'utilizzo della funzione rand() del C/C++ che abbiamo visto in classe.
  1. scrivere un(a funzione che costituisca da) generatore di numeri casuali interi distribuiti uniformemente nell'intervallo [0,RAND_MAX];
  2. scrivere un generatore di numeri casuali floating-point (float o double) distribuiti uniformemente nell'intervallo [0,1];
  3. scrivere un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [0,1), ovvero 1 escluso;
  4. scrivere un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [0,6);
  5. scrivere un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [1,6);
  6. scrivere un generatore di numeri casuali interi distribuiti uniformemente nell'intervallo [1,6];
  7. scrivere un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [-2,2);
  8. scrivere un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [-M_PI,M_PI);
  9. scrivere una funzione che accetta due argomenti di tipo floating-point (a e b) e che costituisca un generatore di numeri casuali floating-point distribuiti uniformemente nell'intervallo [a,b);
  10. scrivere un generatore di numeri casuali floating-point distribuiti nell'intervallo [-M_PI/2,M_PI/2) con una probabilità proporzionale alla funzione coseno;

IMPORTANTE: siete caldamente invitati a scrivere post e commenti su questo blog per condividere problemi, idee, dubbi e — sì — anche soluzioni. Non è escluso che qualche problema, idea, dubbio e — sì — soluzione possa venire anche da parte nostra...
Buon lavoro!

sabato, ottobre 27, 2007

Benvenuti!

Inizia il corso per l'anno accademico 2007-2008.

Questo blog, al quale sono registrati anche diversi studenti che hanno seguito il corso del 2006-2007, e' pensato come luogo di discussione fra gli studenti, di scambio di problemi e soluzioni, di condivisione di trucchi, link e scoperte (riguardo agli argomenti del corso ;) ).

Chiunque si iscriva, mandando uno dei seguenti email
valentina.tancini [at] mib.infn.it
vincenzo.miccio [at] mib.infn.it
verra' inserito fra gli amministratori, con tutte le prerogrative (ad esempio, potra' lui stesso inserire nuovi autori).

mercoledì, luglio 04, 2007

lista di algoritmi

dalla wikipedia, una lista di algoritmi.

giovedì, giugno 21, 2007

TPad

Ciao a tutti,
Volevo mettere in evidenza un nuovo oggetto di ROOT che ho scoperto da poco, si tratta del TPad. (documentazione e tutorial con un istrogramma riempito con numeri casuali). Utilizzando questo oggetto si possono rappresentare in un TCanvas più grafici contemporaneamente. Le opzioni sono molto simili a quelle del TCanvas.
Da segnalare anche (sempre nel TCanvas) l'azione "Inspect" che si può attivare facendo clic con il tasto destro del mouse è utile perchè da l'elenco dello stato di tutte le variabili che compongono l'oggetto, insieme ad una breve descrizione.
Posto un file di esempio con un TCanvas nel quale sono rappresentati due grafici (una carica di un circuito RC e la stessa relazione linearizzata) e qui l'output.

lunedì, giugno 11, 2007

forum in web

Ecco un forum di sviluppatori, interessante da consultare per vedere se qualcuno ha gia' posto il problema che non riusciamo a risolvere

thescripts developers network

venerdì, giugno 01, 2007

giovedì, maggio 10, 2007

un altro sito interessante sulle STL

http://www.ishiboo.com/~nirva/c++/stl-ref/

vector, buono a sapersi

Ecco una serie di membri di std::vector, fra gli altri non conoscevo "at".

http://www.cppreference.com/cppvector/all.html

pietro

venerdì, febbraio 02, 2007

Singleton

Ciao a tutti,
oggi c'è stato il primo appello d'esame... a me è stato chiesto, durante la parte informatica della prova orale, di implementare la seguente classe "singleton" (vedere il collegamento nei Quaderni oppure qui).La particolarità di un singleton è che può esistere al più UNO ED UN SOLO oggetto di tipo singleton. Se leggete l codice infatti potete vedere che il costruttore è "private" e perciò non è possibile fare una dichiarazione standard, come del tipo.
singleton pluto;
Il costruttore viene chiamato con il metodo istanza() che fa parte esso stesso della classe singleton. Ma come è possibile usare un metodo di una classe se nessun oggetto del tipo di "classe" è stato dichiarato.
La soluzione sta nell'utilizzo della parola chiave static che in pratica permette che il metodo esista "di per sè" senza l'esistenza della classe ( e quindi può essere utilizzato anche senza dichiarare la classe stessa).
L'operatore di scope :: (come quello che si utilizza in std::cout) utilizzato in singleton::istanza() permette invece di mettersi nel namespace... (di cui posseggo solo un vago concetto intuitivo) della classe singelton.
Potete trovare l'header file singleton.h (con l'implementazione) e il programma singleton.cpp nei file del gruppo.
Ciao ciao

giovedì, febbraio 01, 2007

puntatori di una classe dentro la classe stessa

Mi e' stato chisto in merito all'esercizio numero 5 se si possa definire, come membro di una classe, un puntatore ad un oggetto del tipo della classe stessa.
La risposta e' SI, perche' un puntatore e' un indirizzo di memoria, quindi un numero: questo signifca che il compilatore riesce a definirlo prima di aver costruito la classe (insomma, non va in cortocircuito del tipo: per creare una classe devo prima creare i componenti che contengono la classe che contiene i componenti che contengono la classe che contiene i componenti...).

mercoledì, gennaio 31, 2007

Iscrizione esame

Ciao,
Volevo chiedere un chiarimento. Guardando sul SIFA ho notato che c'è un appello orale di informatica previsto per il giorno 16/02. Non vorrei aver capito male... l'esame non consisteva in una prova in laboratorio + orale da sostenersi interamente il giorno 02/02?. Se sì, è necessario iscriversi al SIFA? (non c'è l'appello... non vorrei che fosse scaduto il termine di iscrizione...)
Gli appelli non erano solamente il 02/02 e 02/03?
Grazie per i chiarimenti.

martedì, gennaio 30, 2007

TProfile e statistica

Mi e' stato chiesto come mai i fit sui TProfile si comportino "come ci si aspetta" solamente ad alta statistica: cio' e' dovuto al fatto che i TProfile mediano, bin per bin, gli eventi che vengono inseriti.
Se il numero di eventi per bin e' basso, inevitabilmente ad ogni media effettuata dal TProfile e' associata come errore una grande RMS. Questo implica che il fit, che si basa anche sugli errori associati ai punti, non riesce a trovare la miglior funzione possibile che faccia il fit dei vari punti.

lunedì, gennaio 22, 2007

ROOT (esercizi)

Ciao a tutti,
ho provato a risolvere un paio degli esercizi proposti da Pietro (qui). Ho caricato tra i file del gruppo i seguenti:
1. histoKri.C2. fitKri.C
Lasciate qualche commento!! (se volete)
Ciao ciao

mercoledì, gennaio 17, 2007

Friend functions

Ciao a tutti,
volevo postare un esempio di relazione di amicizia tra una classe e una funzione (esterna alla classe stessa) si tratta dell'overload dell'operator<<.
Per fare in modo che la classe complessi diventi amica dell'operator<< basta scrivere nel file .h:
/* operator<< */
friend std::ostream& operator<< (std::ostream &out, const complesso &original);

Alcune annotazioni:
1. Se pensate di mettere un const dopo la dichiarazione della funzione, ossia di scrivere
friend std::ostream& operator<< (std::ostream &out, const complesso &original) const;

per evitare che la funzione friend giochi qualche tiro mancino alla vostra classe, incapperete in un errore infatti la funzione non appartiene alla classe e allora non potrete usare il const.
2. Potete notare che il "const" è messo in un altro punto, ossia:
friend std::ostream& operator<< (std::ostream &out, const complesso &original);
questo vi permette di essere sicuri che operator<< style="font-style: italic;">.
In altre parole se scrivete all'interno dell'implementazione
original.Re = 5;
vi viene restituito un errore che vi dice che original è const e non può essere modificato
(se la funzione non fosse stata dichiarata friend l'errore sarebbe stato: "Re" è privato.)
3. La dichiarazione di amicizia va fatta nel file .h ma l'implementazione può essere fatta in un file qualsiasi (nel mio caso stream_operator.cc)
Potete trovare il file caricato nel gruppo.
Un altro esempio potrete trovarlo all'indirizzo:
http://www.bo.infn.it/alice/alice-doc/mll-doc/ali-note/node23.html
Insieme a vari appunti sul C++.

giovedì, gennaio 11, 2007

Overload dell'operator << (classe complessi)

Ciao a tutti,
qualche tempo fa, mentre si facevano i primi overload di operatori nelle classi "complesso" e "istogramma", era nata l'idea di overloadare (!!) l'operator <<
int main() {
complesso z(2,5);
std::cout <<>
...
}
In modo tale da visualizzare a schermo un numero complesso trattandolo come se fosse una variabile qualsiasi (float, double, int...).
Ho caricato nel gruppo il file complessiKri.cc (2) che contiene l'overload dell'operator <<.
Mi permetto di sottilineare alcune particolarità che ho notato:
1. l'overload è dichiarato nel seguente modo: std::ostream & operator<< (std::ostream & out, const complesso &original) quindi questo overload non è un metodo della classe complessi (altrimenti ci sarebbe stato scritto &complesso::operator<<).
2. Per questo motivo uno degli argomenti è proprio complesso &original che è il numero complesso che viene stampato a schemo.
3. operator<<> può accedere ai membri/metodi della classe che sono dichiarati "private" , infatti, ho dovuto utilizzare le funzioni Rez() e Imz() per ottenere la parte reale e immaginaria del numero, inoltre le ho dovute chiamare con la sintassi original.Rez() e original.Imz().
4. Per overloadare operator<< std::ostream, che è di un nuovo tipo rispetto a quelli inontrati finora.
Spero possa essere utile.
Ciao ciao
Cristian

Classe istogramma

Ciao a tutti,
Volevo dirvi che ho postato i files istogrammaKri.h, istogrammaKri.cc e istogrammaKri.cpp che sono rispettivamente l'header file, l'implementazione e il codice di test della classe istogramma.
Purtroppo... non funziona!! Mi viene segnalato un errore (Segmentation fault) all'interno del metodo "visualizza_verticale" che (teoricamente) dovrebbe visualizzarmi l'istogramma in verticale.
Non riesco proprio a trovare l'errore!
Grazie dell'aiuto.
Ciao ciao
Cristian
MODIFICA: Ho modificato il file istogrammaKri.cc (2) e istogrammaKri.cpp (2) per aggiungere l'overload dell'operator= (che mi ero dimenticato di fare). Ho caricato nei file del gruppo le nuove versioni.
Inserisco anche un file di testo contenente l'ultimo output che ho ottenuto (!!!!!) Istogramma_output.txt(Non capisco perxhè ora mi da problemi anche la funzione visualizza_orizzontale ?!?).
MODIFICA 23-Gen-07 : Ora il problema è stato risolto (da Enzo)! Potrete trovare la mia versione dell'istogramma tra i file del gruppo (istogrammaKri.cc (3)).

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!