LA PROGRAMMAZIONE 1 ALGORITMI, LINGUAGGI DI PROGRAMMAZIONE.....................................................................1 1.1 ALGORTIMI E FORMALISMI DI CODIFICA.......................................................................... 1 2 INTRODUZIONE ALLA PROGRAMMAZIONE.............................................................................. 2 2.1 I DATI..................................................................................................................................... 2 2.1.1 TIPI DI DATI.....................................................................................................................2 2.1.2 COSTANTI ...................................................................................................................... 2 2.1.3 VARIABILI ....................................................................................................................... 3 2.2 LE OPERAZIONI.................................................................................................................... 3 2.2.1 ASSEGNAZIONE ............................................................................................................3 2.2.2 OPERATORI ................................................................................................................... 3 2.2.3 ESPRESSIONI ................................................................................................................3 2.2.4 INPUT/OUTPUT ELEMENTARE .................................................................................... 4 2.2.5 BLOCCO DI ISTRUZIONI ...............................................................................................4 2.2.6 STRUTTURE DI CONTROLLO....................................................................................... 4 2.4 SOTTOPROGRAMMI: LE FUNZIONI ................................................................................... 5 3 ESERCIZI: L`Ambiente Matlab/Octave.......................................................................................... 6 1 ALGORITMI, LINGUAGGI DI PROGRAMMAZIONE 1.1 ALGORTIMI E FORMALISMI DI CODIFICA Un algoritmo e` una successione di operazioni elementari che possono essere eseguite da un calcolatore per risolvere un determinato problema. Sulla base di un insieme di dati d’ingresso l’algoritmo produrra` un insieme di dati di uscita. Da leggere: http://it.wikipedia.org/wiki/Algoritmo Un algoritmo deve avere le seguenti caratteristiche: o generalità e completezza: deve dare una risposta corretta per tutti i possibili dati del problema; o eseguibilità: deve risolvere il problema con un numero finito di azioni. Gli algoritmi possono essere deterministici o non deterministici. Se l’algoritmo e` deterministico a fronte degli stessi dati di ingresso esiste un solo percorso dell’algoritmo e quindi un solo risultato. Viceversa un algoritmo non deterministico avra` diversi possibili percorsi di esecuzione a fronte dello stesso insieme di dati i ingresso. Un algoritmo e` corretto ed efficiente se raggiunge ad una soluzione del problema nel minor tempo possibile. Un formalismo di codifica deve fornire al programmatore una modalità per la dichiarazione dei passi elementari che un algoritmo puo` compiere. Le principali operazioni elementari sono: o o o o o o o o o 1 Input di un dato Output di un dato Calcolo di una espressione e assegnazione del risultato in una variabile Dichiarazione di una sequenza di operazioni (blocco) Esecuzione di un blocco condizionata sulla base del risultato di una espressione logica (IF) Esecuzione iterata N volte di un blocco (FOR) Iterazione condizionata di un blocco (WHILE) Esecuzione di sottoprogrammi (funzioni) Fine del programma o della funzione La Programmazione [email protected] Ultima modifica: 29/9/2004 Esistono diversi formalismi di codifica per la rappresentazione degli algoritmi; i piu` comunemente utilizzati sono i Diagrammi di flusso e la Pseudocodifica. Da leggere: http://it.wikipedia.org/wiki/Pseudocodice Le operazioni dell’algoritmo devono essere tradotte nel linguaggio macchina del calcolatore per poter essere eseguite. Tale linguaggio e` molto lontano dal modo di pensare dell’uomo ed e` molto piu` vicino all'hardware del calcolatore. Per questo esistono i linguaggi di programmazione, ovvero linguaggi per la codifica degli algoritmi dotati di un formalismo (grammatica e sintassi) molto piu` vicini alla logica umana (e alla pseudocodifica), che l'uomo utilizza per formulare gli algoritmi. Esistono diversi linguaggi di programmazione che si differenziano in base alla tipologia di problemi a cui sono orientati. Il programmatore sceglierà il linguaggio di programmazione più adatto alla tipologia di problema da risolvere e codificherà l’algoritmo mediante il linguaggio scelto. Il programma è quindi la codifica dell’algoritmo in un particolare linguaggio di programmazione. Il programma dovrà infine essere tradotto dal linguaggio di programmazione (spesso denominato linguaggio di alto livello) al linguaggio macchina (linguaggio di basso livello) mediante un opportuno programma traduttore. Esempi di linguaggi di alto livello: Matlab e' adatto per la computazione scientifica. Integra calcolo, visualizzazione e programmazione utilizzando una notazione matematica familiare. Il linguaggio e' stato ideato dalla societa' Mathworks la quale continua ad aggiornarlo e ad estenderlo e fornisce (a pagamento) un ambiente di sviluppo interattivo. Octave e' un progetto Open Source che ha costruito un ambiente interattivo di programmazione compatibile con Matlab. C/C++ e' un linguaggio molto diffuso in ambito scientifico le cui specifiche sono definite da ANSI/ISO (Organizzazioni internazionali per la definizione di standard). Consente una programmazione strutturata di alto livello ma e' anche adatto per programmare codice di basso livello in modo efficiente e veloce (sistemi operativi, device driver, ..). Java e' un linguaggio Object Oriented derivato da C++ dalla societa' Sun MicroSystems. E' dotato di diverse librerie di alto livello e di un meccanismo a Macchine Virtuali che consente lo sviluppo di codice indipendente dalla piattaforma di utilizzo, adatto per la programmazione di rete. 2 INTRODUZIONE ALLA PROGRAMMAZIONE Da leggere: http://it.wikipedia.org/wiki/Linguaggio_di_programmazione 2.1 I DATI 2.1.1 TIPI DI DATI Quando si utilizza un linguaggio di programmazione e’ necessario conoscere i tipi di dati che il linguaggio puo’ gestire. Per ogni tipo di dato il linguaggio di programmazione fornira’ un insieme di operatori e funzioni per l’elaborazione. Generalmente i tipi di dati sono classificabili in: o Semplici: interi, reali e caratteri o Strutturati: vettori, array multidimensionali e strutture 2.1.2 COSTANTI 2 La Programmazione [email protected] Ultima modifica: 29/9/2004 Una costante e` un possibile valore di un tipo di dato espresso nel programma mediante una rappresentazione simbolica. Ad esempio nel linguaggio C la costante 1 rappresenta un intero, la costante 1.0 rappresenta un reale, mentre la costante '1' rappresenta un carattere. 2.1.3 VARIABILI Una variabile di un programma é un insieme contiguo di celle della memoria centrale destinato a contenere valori di un determinato tipo di dato. Ogni variabile sarà composta dal numero di byte richiesti dal tipo di dato e avrá un nome mnemonico. Per "valore" di una variabile si intende il contenuto corrente della memoria associata alla variabile. Alcuni linguaggi di programmazione richiedono la dichiarazione delle variabili prima del loro utilizzo (C, Java, ..) altri linguaggi (Matlab, Perl, ..) allocano automaticamente in memoria la variabile al primo utilizzo. Ad esempio: int a; e` la dichiarazione (nei linguaggi C C++ e Java) di una nuova variabile intera (4 byte in memoria) di nome a. 2.2 LE OPERAZIONI 2.2.1 ASSEGNAZIONE L’assegnazione é una istruzione che permette di attribuire un nuovo valore ad una variabile. Ad esempio: a= -3; assegna il valore intero -3 alla variabile a; Il linguaggio C richiederebbe la dichiarazione della variabile, mentre ad esempio Matlab, alloca la variabile a al suo primo utilizzo (il tipo della variabile è determinato dal tipo del valore assegnato). 2.2.2 OPERATORI Tutti i linguaggi di programmazione di alto livello gestiscono gli operatori aritmetici (+ - * / ), logici ( & | ! ) e relazionali (< > == ~= >= <=). Nota: alcuni linguaggi utilizzano il simbolo ! per rappresentare l’operatore NOT, mentre altri utilizzano il simbolo ~ 2.2.3 ESPRESSIONI Le espressioni servono per rappresentare calcoli a livello simbolico. Una espressione puo` essere utilizzata per determinare il valore di una assegnazione. Ad esempio in: B= (B+1.0)/A i valori delle variabili A e B vengono valutati nell’espressione per il calcolo del nuovo valore della variabile B. 3 La Programmazione [email protected] Ultima modifica: 29/9/2004 2.2.4 INPUT/OUTPUT ELEMENTARE Qualunque programma deve comunicare con l’esterno per avere dati su cui lavorare e fornire i risultati prodotti. La forma piú semplice di Input/Output avviene attraverso il terminale del programmatore: lettura da tastiera e scrittura su video. Qualunque linguaggio di programmazione possiede strumenti per realizzare queste 2 operazioni. Ad esempio con Matlab: X=input('inserire un numero: ') attende un dato da tastiera e lo assegna alla variabile X mentre disp(X+1) visualizza l’espressione sul display. 2.2.5 BLOCCO DI ISTRUZIONI Per "blocco" di istruzioni si intende una sequenza di istruzioni che devono essere eseguite una dopo l’altra. I linguaggi di programmazione strutturati posseggono una specifica sintassi per delimitare un blocco. In C C++ e Java il blocco e’ delimitato da parentesi graffe { blocco}. Ecco un esempio di blocco di 4 istruzioni in Matlab: X=input('inserire un numero: ') Y=input('inserire un numero: ') Z=(X+Y)/2 disp(Z) 2.2.6 STRUTTURE DI CONTROLLO Tutti i linguaggi di programmazione possiedono strumenti per controllare il normale flusso sequenziale nell’esecuzione delle istruzioni. I 3 costrutti principali per il controllo del flusso sono: if while e for o IF Un blocco di istruzioni puo` essere eseguito o meno a seconda del risultato di una espressione logica: if (logical_expr) blocco end oppure if (logical_expr) blocco1 else blocco2 end Ad esempio con Matlab: X=input ('inserire X: '); Y=input ('inserire Y: '); if X>Y disp ('X maggiore di Y '); else disp ('X minore di Y'); end o WHILE Un blocco di istruzioni puo` essere eseguito piu` volte fintanto che una condizione logica e` verificata: while (logical_expr) blocco1 end Ad esempio con Matlab: 4 La Programmazione [email protected] Ultima modifica: 29/9/2004 X=27; Y=input ('indovina il numero (tra 1 e 99): '); while Y~=X if Y>X disp ('troppo alto!') else disp ('troppo basso') end Y=input ('indovina il numero (tra 1 e 99)'); end disp ('esatto!'); o FOR Un blocco di istruzioni puo` essere iterato N volte. Utilizzando la sintassi di Matlab: for index=start:increment:end blocco1 end Dove index e` una variabile intera che conta il numero di iterazioni. index inizia a contare da start; ad ogni iterazione si incrementa di increment (che e` uguale a 1 se omesso); le iterazioni terminano quando index raggiunge end Questo esempio viene iterato 5 volte: for i=2:6 x(i)=2*x(i-1) end Esercizio: Determinare se il numero N preso in input da tastiera e` un numero primo. Y=input('verifica se il seguente numero primo: '); if Y==2 disp ('primo'); return end p=[ ]; for i=2:(Y/2+1) if (rem(Y,i)==0) p = [p, i]; end end if length(p)==0 disp ("primo") else disp ("divisibile per "), disp (p) end 2.3 SOTTOPROGRAMMI: LE FUNZIONI Quando il programma che codifica un algoritmo raggiunge una certa complessita` risulta piu` conveniente scomporlo in sottoproblemi mediante sottoprogrammi specializzati (funzioni). Esistono numerose funzioni che vengono messe a disposizione dal linguaggio di programmazione per risolvere i problemi piu` comuni (funzioni matematiche, per la gestione delle stringhe, per l`Input/Output, ecc.). Inoltre il programmatore puo` costruire funzioni proprie. Ogni programma e` quindi composto da un programma principale e da un insieme di funzioni fornite dal sistema o scritte direttamente dall’utente. Ogni funzione viene eseguita passando alla funzione zero o piu` dati da elaborare (parametri); la funzione restituisce il risultato dell’elaborazione. Per utilizzare la funzione e` necessario inserire il nome della funzione nel programma chiamante, elencando fra parentesi rotonde i parametri da elaborare. Tutti i linguaggi di programmazione dispongono di una serie di funzioni gia` pronte che risolvono i problemi piu` comuni. Ad esempio con matlab l’istruzione: 5 La Programmazione [email protected] Ultima modifica: 29/9/2004 mu= mean(F); richiama la funzione predefinita mean() che calcola il valore medio di un vettore. F e` vettore che deve essere elaborato dalla funzione. Il risultato della funzione viene scritto nella variabile mu Il programmatore ha la facolta` di definire funzioni proprie. La definizione di una funzione e` caratterizzata da una testata (nome della funzione e lista dei parametri su cui agisce) e dal corpo del programma. Con Matlab ogni funzione deve essere scritta in un file separato che prende il nome della funzione e l’estensione .m Ad esempio se vogliamo costruire una funzione "gauss" che calcola il valore della funzione di Gauss ad un certo valore X in una distribuzione normale con un determinato valor medio e sigma, dovremo scrivere il seguente file gauss.m: function F=gauss(X, media,sigma) F=exp(-((X-media).*(X-media))/(2.0*sigma*sigma)); F=F/sqrt(2*pi*sigma*sigma); return La prima riga e’ la testata, mentre le righe successive rappresentano il corpo della funzione. Esercizio: Scrivere una funzione che somma 2 matrici, passate come parametro, e restituisce il risultato. La funzione deve verificare che le 2 matrici abbiano la stessa dimensione. Soluzione: function Y=somma(a,b) %funzione somma di 2 martici a e b [a1,a2]=size(a); [b1,b2]=size(b); if a1!=b1 | a2 !=b2 disp('ATTENZIONE: matrici di diversa dimensione'); return; end Y=a+b; return; 3 ESERCIZI: L`Ambiente Matlab/Octave Matlab e’ un linguaggio di programmazione ad alto livello, dotato di una particolare semplicita’ e potenza nell’uso delle matrici e nella visualizzazione grafica dei dati. Matlab include diversi Toolbox, ovvero collezioni di funzioni di alto livello per la soluzione di problemi nei principali ambiti tecnico/scientifici (algebra lineare, finanza, immagini, suono, reti neurali, processamento di segnali, statistica, ecc). Matlab e’ anche il nome dell'ambiente di sviluppo prodotto dalla stessa societa' MathWorks. Esistono diversi programmi con licenza Free Software analoghi a Matlab che utilizzano un linguaggio di programmazione in gran parte compatibile con Matlab. I piu’ diffusi sono Octave e Scilab. Quando Matlab (o Octave) viene lanciato si apre una finestra principale detta finestra di comando con un Prompt al quale si puo’ rispondere digitando interattivamente i comandi del linguaggio. Ogni comando inserito viene interpretato, tradotto in linguaggio macchina ed eseguito. Una sequenza di comandi puo’ essere editata in un file di testo con estensione .m (che prende il nome di Matlab Script) ed eseguita digitando il nome dello script nella finestra di comando. Matlab possiede un proprio editor denominato medit, il quale aiuta il programmatore nel controllo sintattico dello script. Con Octave e’ necessario utilizzare un editor a caratteri generico. Le variabili utilizzate da Matlab sono definite in uno spazio di lavoro denominato WorkSpace. 6 La Programmazione [email protected] Ultima modifica: 29/9/2004 Alcuni comandi per la gestione dell’ambiente di lavoro: who, whos clear save filename load filename path help comando PS1=”prompt” ; % Lista le variabili contenute nel Workspace Azzera il Workspace Salva su file il Workspace Ripristina il Workspace Elenca i percorsi per la ricerca dei comandi Descrizione del comando Modifica Prompt Il ; al termine di un comando inibisce l'output dei risultati parziali Il % e' il commento: cio' che segue nella riga viene ignorato Alcuni comandi di shell: ls ls –l pwd cd cd .. cd /cygdrive/z type filename.m which filename.m Lista il contenuto di una cartella Lista con dettagli Stampa la dir di lavoro Cambia la dir di lavoro sulla home dir Cambia la dir di lavoro sulla dir genitore Cambia disco di lavoro (Octave per Windows) Visualizza il contenuto dello script Visualizza il nome completo dello script Alcuni operatori e funzioni per la rappresentazione e l’elaborazione di matrici: A=[3 5; 7 9] A=[1:2:5;7:9;10 20 30] c=A(2,1) B=A’ C=A*B A.*B S=sum(A) rows(A) columns(A) size(A) length(A) zeros(r,c) ones(r,c) eye(n) B=inv(A) rand(r,c) randn(r,c) mean(A) std(A) std(A(:,2)) normal_pdf(X,m,s) plot(Y) plot(X,Y) bar(Y) title(‘titolo’) grid hold 7 La Programmazione Crea una matrice 2x2 Crea una matrice 3x3 Scrive in c l'elemento (2,1) della matrice A Scrive in B la trasposta della matrice A Prodotto matriciale Prodotto scalare Calcola il vettore delle somme colonna per colonna Determina il numero di righe Determina il numero di colonne Determina il vettore [num_righe num_colonne] Dimensione massima della matrice Matrice rxc di 0 Matrice rxc di 1 Matrice identita' nxn Inversa di A ( A*B = matrice Identita') Matrice rxc di numeri casuali tra 0 e 1 Matrice rxc di casuali con distribuzione normale (mean=0, std=1) Valor medio di ogni colonna di A Deviazione standard di ogni colonna A Std della seconda colonna Densita' di prob. per ogni elemento di X, con mean=m e std=s Grafica gli elementi del vettore Y Grafica del vettore Y con ascissa in X Grafico a barre Scrive il titolo nel grafico Inserisce la griglia nel grafico Mantieni il disegno corrente nel grafico (per plot sovrapposti) [email protected] Ultima modifica: 29/9/2004 Alcuni comandi per la gestione delle stringhe: c=’stringa’ d=”altrastringa” s=num2str(n) n=str2num(s) Le stringhe si scrivono tra singoli apici oppure tra doppi apici Conversione da numero a stringa Conversione da stringa a numero Esercizio: Graficare la funzione distribuzione normale (Gauss) utilizzando la funzione di Matlab normal_pdf (vedi help normal_pdf): X=-3:1/100:3; plot(X,normal_pdf(X,0,1)) Esercizio: Creare un vettore di 500 valori con distribuzione normale, calcolare il valor medio e la deviazione standard e calcolare e disegnare la distribuzione di densita’ di probabilita’ per ogni valore. X=2*randn(500,1) +1; m=mean(X); s=std(X); Y=normal_pdf(X,m,s); gset terminal postscript % Questi comandi di gnuplot consentono di esportare gset output "freq.ps" % il grafico in un formato esterno. Il comando gset term lista i terminali supportati plot(X,Y,'.'); Tips: Con Octave per cambiare la directory di lavoro su di un altro disco (ad esempio Z) digitare il comando cd /cygdrive/z Questo comando, se inserito nel file .octaverc (oppure bin/start_octave.sh), consente di configurare automaticamente la directory di lavoro al momento del lancio di Octave. • 8 La Programmazione [email protected] Ultima modifica: 29/9/2004