Elementi di Programmazione dinamica
venerdì 27 novembre 2009
sabato 14 novembre 2009
Tabelle Hash
introduzione all'hashing
Correzione pag.7 il 16/11/2009 ore 12.51
Correzione pag.2 il 27/11/2009 ore 17.48
domenica 1 novembre 2009
TCL\OTCL (Tool Command Language\Object TCL)
% set y 4
Assegna alla variabile y il valore 4
% set x y+5
Assegna alla variabile x il valore stringa “y+5”
%set w $y+10
Assegna alla variabile w il valore stringa “4+10”. Il simbolo $ permette di accedere alla variabile memorizzata con il nome indicato subito dopo il carattere stesso.
Per effettuare le operazioni aritmetiche si ricorre al comando
Dove espressione rappresenta l’espressione aritmetica che vogliamo calcolare. Il nome di una variabile può contenere lettere , numeri e underscore. Non è necessario definire variabili prima del loro uso. Con la sintassi [ comando ] è possibile inserire comandi come parametri di altri comandi. Ad esempio
Assegnerà ad x ed a y il valore 10. In alternativa si può usare “ ”.
%set x “ b-5 vale [ expr $b-5] ”
Ora x varrà “b-5 vale 0”.
I caratteri speciali come $ possono essere ignorati se preceduti dal caratter \ . Ad esempio
%set x \$
Assegnerà ad x il valore stringa $ . Può anche permettere di scrivere un comando su più linee ignorando il carattere “invio”.
Il comando puts permette la scrittura su un determinato device. Per stampare su schermo scriviamo
%puts “ Esempio di stampa su schermo”
I commenti vanno preceduti dal carattere #
Adesso lavoriamo con le stringhe. Possiamo utilizzare i tradizionali caratteri speciali
? un singolo carattere
[ x-y] un carattere del set compreso dalle lettere qui indicate come x e y
[ ] un set tra i caratteri presenti all’interno delle parentesi.
Le stringhe possono essere manipolate mediante il comando
%String option ?args? ?args?
Vediamo alcune opzioni.
%string first pattern stringa2 ?start_index?
Cerca pattern in stringa2 a partire da start_index se specificato. Ritorna la posizione della prima occorrenza trovata, altrimenti ritorna -1. Possiamo usare l’opzione last al posto di first per avviare la ricerca a partire dall’ultimo carattere.
%string length stringa
ritorna il numero di caratteri presenti in stringa.
%stringa match ?-nocase? pattern stringa
verifica se pattern corrisponde a stringa, altrimenti ritorna -1. Con –nocase è possibile il match è case-unsensitive.
%string range stringa inizio fine
ritorna il range di caratteri trovati in stringa a partire dal pattern inizio e a finire con il pattern fine.
%string tolower stringa ?first? ?last?
ritorna la conversione in minuscolo di stringa a partire da first e a finire con last se questi sono specificati. Al posto di tolower si può specificare toupper per convertire in maiuscolo.
Effettua il parsing dei parametri indicati come var_name secondo la convenzione specificata da string_format. Ad esempio si può usare
%d per intero decimale
%o per intero ottale
%x per intero esadecimale
%b per intero binario
%c per singolo carattere
%format format_string ?arg1? ?arg2?...
Formatta arg1,arg2…. Second la convenzione specificata da format_string
Per ulteriori comandi potete consultare il manuale.
2.0 Liste e Array
Adesso vediamo come usare le liste. In tcl gli elementi di una lista vanno racchiusi tra {}. È possibile annidare più liste per creare matrici. Per creare una lista useremo il comando
mentre con il comando
%list nome_lista { elemento1 elemento2 ….}
si ottiene la stampa a video della lista ma non viene memorizzata.
Il primo elemento di una lista viene indicato con l’indice 0 mentre l’ultimo con l’indice end. Il comando
%lindex nome_lista ?indice?
restituisce l’elemento di indice ‘indice’ se specificato, altrimenti restituisce tutta la lista. Possiamo ordinare alfabeticamente una lista con il comando
%lsort nome_lista
Il comando supporta diverse opzioni.
Il comando
%lappend nome_lista elemento
inserisce ‘elemento’ alla fine della lista. In questo comando non va specificato il simbolo $ quando ci si riferisce ad una lista memorizzata . Ad esempio se creiamo la lista chiamata elenco e vogliamo inserire l’elemento ‘ultimo’ useremo
%lappend elenco ultimo
E non %lappend $elenco ultimo
Possiamo inserire un elemento nella posizione desiderata con il comando
%llength nome_lista
Passiamo ora agli array. In tcl gli array sono associativi. Ciò vuol dire che l’indice è una stringa che possiamo scegliere a nostro piacere. Per creare una lista o per inserire un elemento usiamo il comando
%set array nome_array(indice) valore
Possiamo creare un array a partire da una lista con il comando
%set array nome_array [ list indice1 elemento1 indice2 elemento2 …]
Possiamo ottenere l’insieme delle coppie indice-valore con il comando
%array get nome_array
Qui non bisogna specificare $.Non otteniamo gli indici ordinati alfabeticamente ne secondo l’ordine di inserimento, ma secondo uno schema utilizzato da tcl per memorizzare la struttura dati. Per ottenere una lista di indici a partire da un pattern specifico usiamo
%array names nome_array ?pattern?
Se pattern non è specificato ritorna tutti i valori. Anche qui non va utilizzato il $.
3.0 Strutture di Controllo
Le strutture di controllo non differiscono molto dagli altri linguaggi. Qui però è importante rispettare la spaziatura tra un carattere e l’altro. Per maggiore chiarezza guardare gli esempi allegati.
Per la selezione:
if {espressione} {
body
} elseif {condizione} {
body
} else {
body
}
Per switch:
Switch ?option? string {
pattern1 body1
…..
}
Per while:
while {espressione} {
body
}
Per for:
body
}
foreach variabile { elem1 elem2 … } {
body
}
4.0 I/O su file
%open nome_var [ open "nome_file" "mod"]
dove mod indica la modalità di accesso e può essere:
Per scrivere un file usiamo il comando puts con parametro la nostra variabile.
%puts nome_var stringa
Chiudiamo il file con il comando
%close nome_var
Per leggere byte usiamo il comando read
%read nome_var n
Dove n è il numero di byte che vogliamo leggere. La scrittura e la lettura verrà effettuata nella posizione in cui si trova il puntatore al file. Per muovere il puntatore nella posizione 'n' usiamo il comando:
%seek nome_var n
Per conoscere l'attuale posizione del puntatore invece diamo:
5.0 Procedure
In tcl le procedure possono essere definite per accettare un numero predefinito di elementi oppure un numero variabile. Inoltre possono essere richiamate ricorsivamente, possono ritornare valori o essere "void". Si definisce una procedura mediante la sintassi
proc nome_procedura args1... {
body
}
Se si decide di accettare un numero variabile di parametri, quando la procedura sarà invoca bisognerà racchiudere tutti i parametri tra " " oppure passarli come lista altrimenti l'interprete non sarà in grado di riconoscerli. Una procedura può anche accedere a variabile globali ma queste vanno prima definite prima della procedura, e poi bisognerà indicare all'interprete di cercare quella variabile fuori dalla procedura definita mediante il comando "%global var_name". Se ad esempio vogliamo usare la variabile globale "ciao" nella procedura "saluti" dobbiamo scrivere:
%set ciao ciao
%proc saluti tuo_nome {
global ciao
puts "$ciao $tuo_nome"
}
6.0 OTCL
Otcl è l’estensione ad oggetti di TCL. Anche se si parla di programmazione ad oggetti, OTCL non va pensato come un normale linguaggio Object Oriented come java o C++. In OTCL le classi possono essere definite in maniera incrementale, ovvero i metodi possono essere aggiunti in runtime. Ogni oggetto è un comando, ogni sottocomando è un argomento dell’oggetto. Possiamo definire una classe con il comando
%Class Nome_classe
e un oggetto con il comando
%Nome_classe nome_oggetto
Tutti le variabili e i metodo sono pubblici e tutte le classi ereditano dalla superclasse Object. Questa superclasse fornisce alcuni metodo per reperire informazioni sulle classi o sugli oggetti. Un oggetto può essere distrutto con il comando
%nome_oggetto destroy
%nome_oggetto set nome_variabile valore
Se non specifichiamo il valore il comando fornità come risultato il valore attuale della variabile.
Una variabile di classe può essere instanziata con il comando
%nome_classe set nome_variabile valore
e può essere richiamata all'interno delle procedure mediante il comando
%class instvar nome_variabile
Da questo momento in poi, all'interno della procedura, la variabile di classe sarà disponibile.
Possiamo aggiungere un metodo ad una classe con il comando
%nome_classe instproc nome_metodo args1…. {
body
}
I metodi possono essere richiamati con il comando:
%nome_oggetto nome_metodo ?args?
La parola chiave $self può essere utilizzata per riferirsi all’interno di un metodo all’attuale oggetto instanziato . Il comando
%$self instvar nome_variabile
Permette di accedere alla variabile definita da qualche parte all’interno della classe grazie al comando 'instavar'. Un metodo particolare è il costruttore. Serve all’interprete per poter richiamare il costruttore di Object. Se non viene definito dal programmatore verrà implementato dall’interprete. Un metodo costruttore ha la forma:
%nome_classe instproc init {args} {
……body….
eval $self next $args
}
L’ultimo rigo di comando permette all’interprete di richiamare il costruttore della superclasse.
Otcl ammette l'ereditarietà multipla. Per per ereditare da una serie di classi usiamo:
%Class nome_classe -superclass {nome_superclasse1 nome_superclasse2....}
Nel caso in cui le superclassi implementassero metodi con stess prototipo e firma, uno soltanto dei metodi verrà ereditato. Sarà l'ordine con cui sono indicate le superclassi a stabilire quale sarà il metodo ereditato. Le classe indicata per prima avrà priorità maggiore rispetto alle successive. E' possibile scrivere classi in file script diversi. Basta scrivere il codice su file, ad esempio, un file per ogni classe, scrivere il "main" su di un file aggiungendo come primissime istruzioni i comandi
%source nome_script
uno per ogni file che abbiamo scritto. Il "main" sarà l'unico file che dovremmo eseguire direttamente.
Archivio Download1 aggiornato il 07/11/2009 alle 14.15
Archivio Download2 inserito il 10/11/2009 alle 19.55
Correzione post il 12/11/2009 alle 12.26
lunedì 24 agosto 2009
K
G
Grid Computing: infrastruttura informatica costituita da numerosi calcolatori distribuiti, distanti geograficamente, basata sulla condivisione organizzata delle risorse hardware, al fine di risolvere un problema comune all'intera struttura.











