GESTIONE INFORMATICA DEI DATI AZIENDALI Alberto ZANONI Centro Vito Volterra Università Tor Vergata Via Columbia 2, 00133 Roma, Italy zanoni@volterra.uniroma2.it
Rudimenti di programmazione Programming is an art, not a science Donald E. Knuth Come tutte le arti, la programmazione si basa su solidi concetti e tecniche, che, appropriatamente combinate, permettono l ideazione e la realizzazione di programmi implementabili usando i vari linguaggi di programmazione disponibili.
Alcuni concetti qua e là... Costanti : Variabili : Funzioni : valori che non cambiano durante l intera esecuzione del programma. (implementate da locazioni di memoria) contengono valori che possono cambiare durante l esecuzione del programma (procedure, sottoprogrammi) sezioni di codice che svolgono un ben specifico compito, usate come componente da programmi più complessi. Le funzioni sono una delle possibilità di implementazione del principio divide et impera: per risolvere un problema difficile lo si scompone in problemi più semplici. Si risolvono prima questi problemi e poi si usano le soluzioni trovate per risolvere il problema originale.
Dichiarazione di variabili, allocazione La dichiarazione di variabili serve al compilatore a capire quanta memoria vada riservata (allocata). E possibile avere allocazione statica o dinamica di memoria. Es. (statica) int x; char c; int vett[10]; Un intero (4 byte) Un carattere (1 byte) Un vettore di interi (10 4 = 40 byte) Si può accedere all i-esimo elemento di un vettore indicando l indice vett[i] L indice può iniziare da 0 o da 1, a seconda dei linguaggi.
Dichiarazione di variabili, allocazione Quando non è noto a priori il numero di variabili che saranno necessarie nel programma (ad es. perchè vengono passate da un altro programma o dall utente) è possibile allocare memoria dinamicamente. puntatoreavariabile = new(t) Alloca memoria sufficiente per una variabile di tipo T. Tipicamente restituisce un puntatore alla (l indirizzo della) memoria allocata. delete(var) Libera la memoria associata alla variabile var, allocata dinamicamente in precedenza da una chiamata a new.
Strutture dati Vi sono tipi di dato più complessi di struttura molto generale: Pile Code Liste Alberi, Grafi,... Strutture LIFO (Last In, First Out): l inserimento e l estrazione di oggetti possono avvenire solo da un lato Strutture FIFO (First In, First Out): l inserimento avviene da un lato, l estrazione dall altro Strutture dinamiche, pensate per inserimento e rimozione dinamica di dati. Possono essere monodirezionali, bidirezionali, ordinate,... Le varie strutture dati si differenziano per la complessità delle operazioni elementari (ricerca di un elemento, inserimento, cancellazione, ordinamento, ecc.)
Comandi... Comando ::= Comando ; Comando Assegnamento Condizionale Ciclo Funzione... Assegnamento : ad una variabile viene assegnato un valore. Il valore ivi contenuto precedentemente viene cancellato. Es. x = 0; var = var + 1; Nel secondo caso, var a sinistra del segno di uguaglianza indica la locazione di memoria in cui verrà scritto il risultato, mentre quello a destra il valore in essa attualmente contenuto. L effetto e di incrementare il valore di var di 1. Condizionale : if( condizione ) then comando1 (... else comando2 ) A seconda del valore di condizione (un espressione booleana, ad es. x > 3, o y == z), vengono effettuate azioni diverse. Se condizione è True viene eseguito comando1. Se il ramo else è presente, comando2 viene eseguito quando condizione è False. In generale, 0 corrisponde a False, qualunque altra cosa a True.
Comandi... Ciclo : Ripetizione di un comando un certo numero di volte, a seconda della condizione booleana (guardia). 1 while ( condizione ) do comando 2 do comando while ( condizione ) 3 repeat comando until ( condizione ) 4 for( iteratore ) do comando 1 il corpo del while viene eseguito finché condizione è True (anche nessuna volta). Quando diventa false, l istruzione termina, e si passa all istruzione successiva. 2 Idem, ma la guardia viene valutata dopo il corpo, che dunque viene eseguito almeno una volta. 3 Come 2, ma il corpo viene eseguito finchè la guardia è False. Quando è True il comando termina. 4 Ripetizione un numero prefissato di volte, noto fin dall inizio: Es. for (i = 1,10) do x = x + i;
Funzioni... tiporisultato Funzione(arg 1,..., arg n ) { Corpo } Le funzioni effettuano calcoli parziali e/o operazioni in genere riguardanti una parte specifica del programma. Possono restituire un valore, ed in generale prendono un certo numero di argomenti. Es. La funzione fatt(int n) calcola il fattoriale di n. int fatt(int n) { int i; int result = 1; for (i = 1,n) do result = result*i; return (result); } Chiamata (uso) della funzione: x = fatt(10); (Ora x = 3628800) i è una variabile locale alla funzione. La memoria necessaria per i viene liberata al termine della funzione.
Funzioni... Es. La funzione/procedura swap(t a, T b) scambia i valori dei due argomenti (entrambi di tipo T). Non restituisce nessun valore (void), ma modifica lo stato della memoria. void swap(t a, T b) { T temp; } temp = a; a = b; b = temp;
Passaggio dei parametri alle funzioni I due principali tipi di passaggio di parametri sono: Es. 1 Per valore : i valori delle espressioni/variabili indicate al momento della chiamata della funzione vengono copiati nelle locazioni di memoria corrispondenti ai parametri. Ogni eventuale elaborazione effettuata sui parametri non si riflette sulle variabili da cui i valori sono stati copiati. 2 Per puntatore : alla funzione viene passato l indirizzo della variabile di cui si vuol passare il valore. Oltre ad averlo a disposizione (diritto di lettura), si ha anche la possibilità di modificare il contenuto della variabile (diritto di scrittura). Per la funzione fatt è ragionevole il passaggio per valore Per la funzione swap è obbligatorio per entrambi i parametri il passaggio per puntatore, poichè scopo della funzione è proprio quello di modificarne i valori.