giovedì, dicembre 13, 2007

root su vista

domanda di carattere tecnico: ho delle difficoltà nel far partire ROOT su Vista.
s i installa correttamene ma poi non riesco ad utilizzrlo.
consigli?
ciao

lunedì, dicembre 03, 2007

mercoledì, novembre 28, 2007

introduzione all'ereditarieta'

Ecco alcune slide di introduzione all'ereditarieta', da sfogliare come lettura serale prima della lezione del 3/4 dicembre.

lunedì, novembre 26, 2007

mercoledì, novembre 21, 2007

varie

Precisazioni dell'esercizio per la prossima volta.

  1. Partendo dalle indicazioni e dai suggerimenti sulle slide, scrivere una classe vettore per la gestione di array dinamici, templata sul tipo di dati da allocare nel vettore.
  2. Compilare ed eseguire questo semplice programma. Riconoscete l'origine di ogni riga stampata come output?
  3. Scrivere una funzione doppio_di, esterna alla classe (ovvero non un metodo della classe), che prenda come unico argomento, passato per valore, un oggetto V della vostra classe vettore e restituisca un vettore W i cui elementi W[i] sono ciascuno il doppio di V[i].
  4. Scrivere una funzione void raddoppiami che prenda come unico argomento il riferimento di un vettore e raddoppi il valore di ciascun suo elemento.
  5. Implementare gli opportuni metodi (e aggiungere eventualmente gli opportuni attributi) perchè la classe vettore consenta il cambiamento della dimensione dell'array dinamico. In particolare, consenta sia di ridurre il numero di elementi (preservando il valore dei primi elementi sopravvissuti) e sia di aumentarne (preservando il valore dei primi elementi già esistenti). Inutile dirlo: attenzione ai new e delete!
Nel risolvere gli esercizi 3 e 4, far tesoro dell'esercizio 2...

Nota tecnica: con linux, per connettersi ad internet con un modem telefonico (non-ADSL), è possibile usare i seguenti programmi: gnome-ppp (se usate gnome come) o kppp (se usate KDE). Se la versione di linux non e' troppo vecchia, tutto dovrebbe essere molto semplice e intuitivo: basta trovare una di queste due applicazioni nel menu e utilizzarle nel modo più naturale possibile. Per ulteriori dettagli (ma non dovrebbe essercene bisogno...) potete leggere qui.

lunedì, novembre 19, 2007

martedì, novembre 13, 2007

complessi & istogramma

Esercizio facile-facile: dato il seguente header-file complesso.hpp per una possibile classe dei numeri complessi, scriverne l'implementazione in un corrispondente file complesso.cpp (e ovviamente, com'è sempre sottinteso, scrivere una test-unit per tale classe, ovvero un semplice programma capace di testare tutte le funzionalità implementate per la classe).
Esercizio facile: scrivere una classe istogramma da usare per l'analisi della soluzione all'esercizio 10. La classe istogramma non dovrà contenere al suo interno il generatore di numeri casuali, ma dovrà contenere solo quei metodi e quegli attributi che gli sono necessari per poter gestire una situazione del tutto generica in cui si vuole

  • popolare l'istogramma inserendo un valore alla volta
  • disegnare l'istogramma allo stato corrente (ovvero corrispondente alla popolazione di valori inseriti fino a quel momento)
  • restituire il valore della media e della varianza della popolazione allo stato corrente
Ulteriori specifiche (come la possibilità di indicare il numero di bin dell'istogramma, la possibilità di poter cambiare al volo il numero di bin, ovvero di poter cambiare il numero di bin quando l'istogramma è già stato creato e (parzialmente) riempito, la possibilità di cambiare al volo il numero bin soltanto accorpando i bin correntemente usati, e così via...) sono lasciati alla libertà dello studente.

NOTA BENE
Se avete domande (ed è bene per voi che ne abbiate!) sfruttate almeno la mailinglist del gruppo, ovvero scrivete una mail a labinfodocet@googlegroups.com

giovedì, novembre 08, 2007

allora...?

...chi è che racconta qui sul blog qual è la sottigliezza cui bisogna prestare attenzione nel risolvere l'esercizio 6, rispetto alla soluzione dell'esercizio 5?
...e chi è che mette un bello screenshot dell'ASCII-istogramma che ha ottenuto? Va bene con qualsiasi generatore random...!

mercoledì, novembre 07, 2007

strutture

Per chi le ha già viste durante la seconda lezione, per chi le vedrà nella prossima lezione, ecco le slide sulle strutture.
Vi ricordo che le slide delle lezioni precedenti si trovano qui.

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)).