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!

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!!!