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