Programma - ABCD - Università di Sassari

Corso di Laurea in DESIGN
Elementi di programmazione
Massimo Tistarelli
DAP - Università di Sassari
Laboratorio di Computer Vision
Graphics and Image Processing
I linguaggi di programmazione
• Programma
– Insieme ordinato di istruzioni elementari impartite
ad un calcolatore per svolgere un compito
– Risponde a requisiti di completezza
– Elabora dati provenienti dai dispositivi di ingresso
– Produce risultati che possono essere memorizzati
temporaneamente, per ulteriori elaborazioni, oppure
trasmessi ai dispositivi di uscita
– L’esecuzione delle istruzioni è effettuata dal
processore e coordinata dal sistema operativo
• Programmazione
– attività che permette di affrontare in modo
sistematico l’ideazione e la realizzazione di un
programma
Fondamenti di Informatica
Massimo Tistarelli
2
I linguaggi di programmazione
• Algoritmo
– Insieme ordinato di passi non ambigui ed eseguibili
che portano alla soluzione di un problema
• Proprietà che un algoritmo deve soddisfare:
–
–
–
–
Essere comprensibile
Non presentare ambiguità
Essere attuabile
Garantire una terminazione
Fondamenti di Informatica
Massimo Tistarelli
3
I linguaggi di programmazione
• Formalizzazione generica di un algoritmo
• Tramite pseudocodice
• Tramite diagrammi di flusso
• Implementazione
– stesura “definitiva” di un algoritmo che utilizza un
linguaggio di programmazione
– Il risultato di tale fase è comunemente chiamato
programma
Fondamenti di Informatica
Massimo Tistarelli
4
I linguaggi di programmazione
• Pseudocodifica
– Linguaggio il più possibile vicino a quello dell’uomo
– Utilizza l’indentazione
– Esempio: leggere un numero; se e’ positivo stamparlo
e terminare l’esecuzione, altrimenti leggerne un altro
Ripeti
Leggi A
Se A > 0
stampa A
Esci dal programma
Fine se
Fine ripeti
Fondamenti di Informatica
Massimo Tistarelli
5
I linguaggi di programmazione
• Diagrammi di flusso (flow chart):
– Visualizzazione grafica del programma:
• Uso di simboli grafici per indicare le singole
operazioni elementari
• I simboli sono connessi da archi orientati
– Evidenziano in modo grafico il flusso delle istruzioni
• Componenti:
Istruzioni di
Input/Output
selezione
Istruzioni
sequenziali
Fondamenti di Informatica
Massimo Tistarelli
Inizio / fine
algoritmo
6
I linguaggi di programmazione
Inizio
int A
ESEMPIO:
leggere un
numero; se e’
positivo stamparlo
e terminare
l’esecuzione,
altrimenti leggerne
un altro
Leggi A
no
A>0?
si
Stampa A
Fine
Fondamenti di Informatica
Massimo Tistarelli
7
I linguaggi di programmazione
Per procedere all’implementazione di un programma
occorre scegliere un LINGUAGGIO di programmazione
• Quali opzioni sono possibili?
–
–
–
–
–
PIU’ DIFFICILE PER L’UOMO
Codice macchina
Codice assembler
Metacodice
Linguaggi di programmazione evoluti
Linguaggi naturali
PIU’ SEMPLICE PER L’UOMO
Fondamenti di Informatica
Massimo Tistarelli
8
I linguaggi di programmazione
• Codice macchina
– È direttamente eseguibile dal processore
– È una sequenza di cifre binarie che rappresentano i
codici operativi delle istruzioni e gli operandi
00100010000000000000000000000101
11111010000000000000000000000000
• Codice assembler
– Sostitituisce ai codici operativi e agli operandi codici
mnemonici che richiamano alla memoria la funzione
dell’istruzione
• LD A 05H - carica il registro A con il valore esadecimale 5
• SLA A
- scala a sinistra il registro A
Fondamenti di Informatica
Massimo Tistarelli
9
I linguaggi di programmazione
• Metacodice
– Codice non direttamente eseguibile dal processore, ne’
comprensibile da parte dell’utente
– È una sequenza di byte che, come il codice macchina,
rappresenta istruzioni e operandi
– È indipendente dalla piattaforma hardware
– Necessita comunemente di un interprete atto a tradurre
il metacodice in linguaggio macchina
• Linguaggi evoluti
– Sono linguaggi caratterizzati da costrutti sintattici che
facilitano la scrittura del codice e la definizione dei dati
– Possiedono strutture di controllo di alto livello (cicli,
blocchi decisionali)
– Necessitano di compilatori o interpreti atti a tradurre i
programmi in linguaggio macchina
Fondamenti di Informatica
Massimo Tistarelli
10
I linguaggi di programmazione
• Compilatori
– programmi che agiscono
su un programma
sorgente, scritto in
linguaggio evoluto,
producendo il
corrispondente codice
macchina
– sono caratterizzati da una
serie di passi, che
convertono il programma
sorgente in altrettanti
oggetti intermedi
Librerie, oggetti
rilocabili
Programma sorgente
compilatore
Programma assembler
assemblatore
Codice macchina rilocabile
Loader/linker
Codice macchina assoluto
Fondamenti di Informatica
Massimo Tistarelli
11
I linguaggi di programmazione
• Interpreti
Programma sorgente
– programmi che effettuano la
conversione in codice macchina
passo dopo passo
– il BASIC e` uno dei più noti
linguaggi interpretati
– un problema comune dei
linguaggi interpretati è la
lentezza di esecuzione
Librerie, oggetti
rilocabili
Fondamenti di Informatica
Massimo Tistarelli
Interprete
(generazione di
codice macchina
assoluto
immediatamente
eseguito)
12
I linguaggi di programmazione
• Compilatori JIT (Just in Time)
– Moderno compromesso tra i compilatori e gli
interpreti
– Traducono il codice come gli interpreti ma ne
memorizzano una parte in modo da velocizzare
il processo
– Aumento notevole delle prestazioni (quasi
come un linguaggio compilato)
– Aumento della quantità di memoria necessaria
(poco preoccupante in relazione alla grande
disponibilità)
Fondamenti di Informatica
Massimo Tistarelli
13
Introduzione al JAVA
• Cos’è JAVA?
– JAVA e` un linguaggio interpretato di recente introduzione (1991!)
– Il successo di JAVA e` legato quasi esclusivamente alla realizzazione
del browser HotJava (1995) ed alla successiva integrazione della
tecnologia JAVA nel browser Netscape
• Quali sono le caratteristiche principali?
– Apprezzare le caratteristiche di JAVA richiede un buon bagaglio di
conoscenza
• Semplicità (deriva da C e C++)
• Programmazione orientata agli oggetti
• Elaborazione distribuita
• Robustezza (non esistono puntatori)
• Sicurezza
• Portabilità
Fondamenti di Informatica
Massimo Tistarelli
14
Introduzione al JAVA
• Alcuni equivoci comuni
– JAVA non ha relazioni con il linguaggio HTML; è
possibile tuttavia richiamare un programma JAVA da
una pagina HTML (applet)
– Come tutti i programmi evoluti, JAVA non è di facile
apprendimento. Ha però caratteristiche che lo
rendono di uso abbastanza immediato
– JAVA non è un ambiente di programmazione.
Ambienti di programmazione sono disponibili per
JAVA come per altri linguaggi
– JAVA diventerà un linguaggio universale di
programmazione?…. È difficile affermarlo con
certezza.
Fondamenti di Informatica
Massimo Tistarelli
15
Introduzione al JAVA
• JAVA è un linguaggio lento?
– JAVA è un linguaggio sia
compilato che interpretato
– L’interpretazione del
metacodice è certamente un
punto debole; il problema è
tuttavia superato dall’utilizzo
di compilatori “just in time”
Programma sorgente
JAVA
Compilatore
(javac)
metacodice (bytecode)
Interprete
Java Virtual
Machine
Librerie, oggetti
rilocabili
Fondamenti di Informatica
Massimo Tistarelli
(java)
16
Fondamenti del linguaggio
• Tipi fondamentali
– Numeri in virgola mobile
range approx. ±3.40282347E+38
(7 cifre decimali significative)
double range approx ±1.79769313486231570 E+308
(15 cifre decimali significative)
float
– Interi
int
long
->
->
short ->
byte ->
Fondamenti di Informatica
da -2.147.483.648 a 2.147.483.647
da -9.223.372.036.854.775.808L
a +9.223.372.036.854.775.807L
da -32.768 a 32.767
da -128 a 127
Massimo Tistarelli
17
Fondamenti del linguaggio
• Tipi fondamentali
– Caratteri
char
codice a due byte (unicode) per 65536
simboli
NB:
Il codice si esprime normalmente come
\uXXXX dove XXXX sono cifre esadecimali
– Booleani
Boolean -> true oppure false
Utilizzati per test logici e per operazioni di confronto
Fondamenti di Informatica
Massimo Tistarelli
18
Fondamenti del linguaggio
• Dichiarazione e assegnazione di variabili
byte b;
int anInteger;
long aLong;
char ch;
char yesch, capitalA;
yesch = ‘Y’;
capitalA = ‘\u0041’; //corrisponde al
carattere A
boolean k=true;
int i; // DICHIARAZIONE
i = 37; // ASSEGNAZIONE
Fondamenti di Informatica
Massimo Tistarelli
19
Fondamenti del linguaggio
• Operatori
int n = 5;
// dichiarazione e inizializzazione
int a = 2+n;
// a vale 7
int b = a-3;
// b vale 4
int c = a*b;
// c vale 28
int d = a/b;
// d vale 1 !!!!
________________________
int m = 7;
int n = 7;
int k;
n++;
m--;
k = m*n;
Fondamenti di Informatica
// dichiarazione e inizializzazione
// dichiarazione e inizializzazione
// k non è inizializzata
// n vale 8
// m vale 6
// k vale 48
Massimo Tistarelli
20
Fondamenti del linguaggio
•Operatori relazionali
–Operatori per effettuare confronti:
Fondamenti di Informatica
Uguale
(a==b)
Diverso
(a!=b)
Maggiore
(a>b)
Minore
(a<b)
Maggiore o uguale
(a>=b)
Minore o uguale
(a<=b)
Massimo Tistarelli
21
Fondamenti del linguaggio
•Operatori booleani
– Il risultato di un confronto è una variabile di
tipo boolean
(5>7) è
false
– Posso combinare i valori delle espressioni
booleane con gli operatori AND OR NOT
AND
OR
NOT
XOR
(a && b)
(a || b)
(~b)
(a^b)
Esempio: ((5==7) && (5>7)) è
Fondamenti di Informatica
Massimo Tistarelli
false
22
Fondamenti del linguaggio
• Stringhe: sequenze di caratteri, racchiuse
tra virgolette
String e = “Hello World”;
String e = “”;
// stringa vuota
• Operazioni sulle stringhe:
–Sottostringhe: tramite la funzione (metodo) substring
String e = “Hello World”;
String s = e.substring(0,5) // sottostringa //
che inizia in posizione 0 e finisce in 5
–Concatenazione: si usa il simbolo +
String e = “Hello ”;
String s = “World”;
Stringe t = e+s;
Fondamenti di Informatica
Massimo Tistarelli
// t
vale “Hello World”
23
Fondamenti del linguaggio
– Lunghezza ed estrazione di caratteri
String e = “Hello World”;
char c = e.charAt(4)
// carattere in posizione 4 (“o”)
int l = e.length()
// lunghezza (11)
– Confronto
String e = “Hello”;
String s = “Hi”;
if (e.equals(s))
// vale false
if (e.compareTo(s)) // vale –1
– Ricerca
String e = “Hello”;
int k = e.indexOf(‘e’); // prima posizione del carattere
//“e” (1) - vale –1 se non trovo corrispondenza
Fondamenti di Informatica
Massimo Tistarelli
24
Fondamenti del linguaggio
• La struttura di un semplice programma
JAVA
Nome classe
public class Hello
{ public static void main(String[] args)
{
Istruzione 1
Programma
Istruzione 2
vero e proprio
Istruzione 3
…
}
}
Fondamenti di Informatica
Massimo Tistarelli
25
Fondamenti del linguaggio
• Esempio 1: somma tra due numeri interi e
un numero con la virgola
int a,b
float c
float tot
leggi b
START
Stampa messaggio chiedendo
all’utente l’inserimento di un numero
con la virgola
Stampa messaggio chiedendo
all’utente l’inserimento di un intero
leggi c
leggi a
tot = a+b+c
Stampa messaggio chiedendo
all’utente l’inserimento di un intero
Stampa tot
Fondamenti di Informatica
Massimo Tistarelli
END
26
Fondamenti del linguaggio
// legge due numeri interi e un numero con la virgola
// ed effettua la somma
import java.util.*;
da tastiera
// libreria…utilità di sistema!
public class esempio1{
public static void main(String[] args) {
int a,b;
float c, tot;
Scanner sc = new Scanner(System.in);
System.out.println("Inserire un numero intero");
a= sc.nextInt();
System.out.println("Inserire un numero intero");
b= sc.nextInt();
System.out.println("Inserire un numero in virgola mobile");
c= sc.nextFloat();
tot = a+b+c;
System.out.print("La somma vale:
"+tot);
}
}
Fondamenti di Informatica
Massimo Tistarelli
27
Fondamenti del linguaggio
• Strutture di controllo: if - else
if (a>b) {
System.out.print(a);
}
else {
System.out.print(b);
}
Stampa a
Stampa b
K>10
if (K>10) {
K = K+1;
}
Fondamenti di Informatica
a>b
K=K+1
Massimo Tistarelli
28
Fondamenti del linguaggio
• Strutture di controllo: while
int x=0;
int y = 2;
while(x<4) {
x ++;
y = y*y;
}
System.out.print(y);
x<4
x++
y=y*y
Stampa y
Fondamenti di Informatica
Massimo Tistarelli
29
Fondamenti del linguaggio
• Strutture di controllo: do while
int x=0;
int y=2;
do {
x ++;
y = y*y;
} while(x<4);
System.out.print(y);
x++
y=y*y
x<4
Stampa y
Fondamenti di Informatica
Massimo Tistarelli
30
Fondamenti del linguaggio
• Strutture di controllo: cicli definiti
I=0
for(int I=0; I<=10; I++) {
System.out.println(I);
}
NB: non è diverso dal while
I<10
Stampa I
I++
Fondamenti di Informatica
Massimo Tistarelli
31
Fondamenti del linguaggio
• Strutture di controllo: selezione multipla
int choice = sc.nextInt();
switch (choice) {
case 1:
…
break;
case 2:
…
break;
.
.
.
default:
…
break;
choice ==1
….
choice ==2
….
caso default
}
Fondamenti di Informatica
Massimo Tistarelli
32
Fondamenti del linguaggio
• Esempio 2: confronto tra due numeri interi
int a,b
START
si
a>b?
no
Stampa messaggio chiedendo
all’utente l’inserimento di un intero
Stampa a
Stampa b
leggi a
END
Stampa messaggio chiedendo
all’utente l’inserimento di un intero
leggi b
Fondamenti di Informatica
Massimo Tistarelli
33
Fondamenti del linguaggio
// legge due numeri interi e stampa il numero più grande
import java.util.*;
// libreria…utilità di sistema!
public class esempio2{
public static void main(String[] args) {
int a,b;
Scanner sc = new Scanner(System.in);
System.out.println("Inserire un numero intero");
a = sc.nextInt();
System.out.println("Inserire un numero intero");
b = sc.nextInt();
if (a>b) {
System.out.print(“Il numero più grande è:
“ + a);
}
else {
System.out.print(“Il numero più grande è:
“ + b);
}
}
}
Fondamenti di Informatica
Massimo Tistarelli
34
Fondamenti del linguaggio
• Esempio 3: conteggio ed eliminazione delle
vocali di una stringa
int contatore
String sin, sout, vocali
i=0
START
no
stampa sout
e contatore
i<lung sin
vocali = “aeiouAEIOU”
sout = vuota
contatore = 0
si
END
si
Stampa messaggio chiedendo
all’utente l’inserimento di una stringa
carattere i-mo
sin!= vocale?
incolla in coda a sout
carattere i-mo sin
no
contatore ++
leggi sin
i=i+1
Fondamenti di Informatica
Massimo Tistarelli
35
Fondamenti del linguaggio
// conta ed elimina le vocali di una stringa
import java.util.*;
public class esempio3{
public static void main(String[] args) {
String vocali, sin, sout;
int contatore=0;
vocali = "aeiouAEIOU";
sout="";
Scanner sc = new Scanner(System.in);
System.out.println("Inserire una stringa arbitraria");
sin = sc.nextLine();
for (int i=0; i<sin.length();i++) {
if (vocali.indexOf(sin.charAt(i))== -1) {
sout = sout+sin.charAt(i);}
else {contatore++;}
}
System.out.println("contate ed eliminate "+ contatore + " vocali");
System.out.print(sout);
}
}
Fondamenti di Informatica
Massimo Tistarelli
36
Fondamenti del linguaggio
• Esempio 4: inversione di una stringa
String sin, sout
i=0
START
i<lung sin
stampa sout
sout = vuota
END
incolla in testa a sout
carattere i-mo sin
Stampa messaggio chiedendo
all’utente l’inserimento di una stringa
leggi sin
i=i+1
Fondamenti di Informatica
Massimo Tistarelli
37
Fondamenti del linguaggio
// inverte una stringa
import java.util.*;
public class esempio4{
public static void main(String[] args) {
String sin, sout;
sout="";
Scanner sc = new Scanner(System.in);
System.out.println("Inserire una stringa arbitraria");
sin= sc.nextLine();
for (int i=0; i<sin.length();i++) {
sout = sin.charAt(i)+sout;
}
System.out.print(sout);
}
}
Fondamenti di Informatica
Massimo Tistarelli
38
Fondamenti del linguaggio
• Esempio 5: Lettura e scrittura su disco di un file di
testo
– preparare un file di testo di nome ingresso.txt che contenga
righe come queste:
Amedeo 22
Giovanni 20
Marco 25
– Si vuole leggere il file ingresso.txt e creare un file uscita.txt dove
i voti siano incrementati di uno, ad esempio:
Amedeo 23
Giovanni 21
Marco 26
Fondamenti di Informatica
Massimo Tistarelli
39
Fondamenti del linguaggio
• Esempio 5: Lettura e scrittura su disco di
un file di testo
String nome
int voto
ci sono elementi
START
leggi nome e voto
chiudi file
apri file di ingresso
END
stampa nome e voto
apri file di uscita
voto = voto+1
scrivi nome e voto
Fondamenti di Informatica
Massimo Tistarelli
40
Fondamenti del linguaggio
import java.io.*;
import java.util.*;
public class LeggiFile{
public static void main(String[] args) throws IOException
{
FileReader inputf;
// stream di ingresso
PrintWriter outputf; // stream di uscita
String nome;
int val;
// Apertura stream di ingresso
inputf = new FileReader("ingresso.txt");
Scanner sf = new Scanner(inputf);
// Apertura stream di uscita
outputf = new PrintWriter("uscita.txt");
//(continua)
Fondamenti di Informatica
Massimo Tistarelli
41
Fondamenti del linguaggio
while (sf.hasNext())
{
nome = sf.next();
val= sf.nextInt();
System.out.println("sto leggendo: " + nome + " " + val);
val=val+1;
outputf.println(nome+ " " + val);
}
// chiusura stream
inputf.close();
outputf.close();
}
}
......e se volessi usare un file con struttura nome, cognome,
voto?
Fondamenti di Informatica
Massimo Tistarelli
42
Fondamenti del linguaggio
• Array: sono oggetti di sistema!
int[] k = new int[100];
int [][] matrice = new int[10][10];
• Notare bene:
– Il programmatore deve CREARE esplicitamente questi
oggetti
– le celle sono indicizzate a partire dal valore 0 fino a 99
– per inizializzare un array occorre utilizzare un ciclo iterativo:
Esempio:
for (int i=0; i<100; i++){
K[i] = 0;
}
Fondamenti di Informatica
Massimo Tistarelli
43
Fondamenti del linguaggio
• Esempio 6: massimo tra quattro numeri
interi
max=N[0]
int i
int [] N
int max
Stampa max
START
i=1
Stampa messaggio
END
i=0
no
max<N[i]
si
max=N[i]
i<4
SI
i=i+1
Leggi N[i]
i=i+1
Fondamenti di Informatica
i<4
Massimo Tistarelli
44
Fondamenti del linguaggio
// massimo tra quattro numeri
import java.util.*;
// libreria…utilità di sistema!
public class esempio6{
public static void main(String[] args) {
// dichiarazione delle variabili necessarie
int[] N = new int[4];
int max,i;
// lettura da tastiera dei valori
Scanner sc = new Scanner(System.in);
System.out.println("Inserire 4 numeri interi");
for (i=0;i<4;i++) {
N[i]= sc.nextInt();
}
// (continua)
Fondamenti di Informatica
Massimo Tistarelli
45
Fondamenti del linguaggio
// inizializzazione variabili
max = N[0];
i = 1;
// ciclo di controllo
do {
if(max<N[i]) {
max = N[i];
}
i=i+1;
} while(i<4);
// stampa massimo
System.out.println("Massimo:" + max);
}
}
Fondamenti di Informatica
// fine del main
// fine della classe esempio6
Massimo Tistarelli
46
Fondamenti del linguaggio
• Esempio 7 : calcolo di media per una
popolazione di 10 numeri in virgola mobile
int i
float [] val
float media
float somma
somma=0
media=somma/i
i=0
START
Stampa media
i=0
i<10
END
SI
i<10
somma=somma+val[i]
SI
leggi val[i]
i=i+1
i=i+1
Fondamenti di Informatica
Massimo Tistarelli
47
Fondamenti del linguaggio
import java.util.*;
// libreria…utilità di sistema!
public class esempio7{
public static void main(String[] args)
{
// dichiarazione delle variabili
float[] val= new float[10];
int i;
float media, somma;
// lettura da tastiera dei valori
Scanner sc = new Scanner(System.in);
for (i=0;i<10;i++)
{
System.out.println("Inserire il numero del
vettore in posizione " + i);
val[i]=sc.nextFloat();
}
Fondamenti di Informatica
Massimo Tistarelli
48
Fondamenti del linguaggio
// ciclo di calcolo
somma=0;
for (i=0;i<10;i++)
{
somma = somma + val[i];
}
media = somma / i;
}
// stampa media
System.out.println("Media:" + media);
} // fine del main
// fine esempio 6
Fondamenti di Informatica
Massimo Tistarelli
49
Fondamenti del linguaggio
// cosa aggiungere per calcolare la varianza?
float var;
var=0;
for (i=0;i<10;i++)
{
var += (val[i]-media) * (val[i]-media);
}
var /= i;
// stampa var
System.out.println(“Varianza:" + var);
Fondamenti di Informatica
Massimo Tistarelli
50
Fondamenti del linguaggio
• Esempio 8 : calcolo del fattoriale
int i, num
long fat
fat=num
i=num
START
Stampa fat
i>1
END
Stampa messaggio
SI
i=i-1
leggi num
fat = fat * i
Fondamenti di Informatica
Massimo Tistarelli
51
Fondamenti del linguaggio
import java.util.*;
// libreria…utilità di sistema!
public class esempio8{
public static void main(String[] args)
{
// dichiarazione delle variabili
int num, i;
long fat; // uso long per codificare numeri grandi
System.out.println("Inserire un numero intero");
// lettura da tastiera del valore
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
Fondamenti di Informatica
Massimo Tistarelli
52
Fondamenti del linguaggio
fat = num;
i=num;
while(i > 1){
i = i-1;
fat = fat * i;
}
}
// stampo il risultato
System.out.print("Il fattoriale di " + num +
" vale:
"+ fat);
} //fine main
// fine classe di programma
Fondamenti di Informatica
Massimo Tistarelli
53
Funzioni e procedure
• Tradizionalmente si indica con il nome di PROCEDURA un insieme
di istruzioni associato ad un nome. La procedura, ovvero l’insieme
di istruzioni associato, può essere richiamato più volte nel corso
del programma.
Stampa()
{
System.out.println("Stampo questa frase");
}
• Una procedura viene chiamata FUNZIONE se restituisce un valore
int Somma( int a, int b)
{
int ris;
ris = a+b;
return ris;
}
Fondamenti di Informatica
Massimo Tistarelli
54
Funzioni e procedure
• In JAVA non c’è differenza tra procedure e funzioni. Si utilizza per
entrambe il nome “metodo”.
• Un metodo deve sempre dichiarare il risultato di ritorno, che
ovviamente può essere vuoto:
void Stampa()
{
System.out.println("Stampo questa frase");
}
• I parametri di un metodo devono sempre avere tipo definito. Di
norma essi vengono COPIATI (passaggio per valore) e quindi LE
VARIABILI ORIGINALI NON POSSONO ESSERE ALTERATE
• Se viene passato un OGGETTO esso non viene copiato. Le
alterazioni all’interno del metodo si rifletteranno quindi
sull’oggetto originale.
Fondamenti di Informatica
Massimo Tistarelli
55
Funzioni e procedure
• Esempio 9 : calcolo del fattoriale ripetuto
int num
long fat
START
num>1
SI
Stampa messaggio
Calcola fattoriale
di num e salva in fat
leggi num
END
Stampa fat
Stampa messaggio
leggi num
Fondamenti di Informatica
Massimo Tistarelli
56
Funzioni e procedure
import java.util.*;
// libreria…utilità di sistema!
public class esempio9{
public static void main(String[] args) {
// dichiarazione delle variabili
int num;
long fat; // uso long per codificare numeri grandi
System.out.println("Inserire un numero intero");
// lettura da tastiera del valore
Scanner sc = new Scanner(System.in);
num = sc.nextInt();
while(num > 1){
fat = calcola_fattoriale(num);
Fondamenti di Informatica
Massimo Tistarelli
57
Funzioni e procedure
System.out.println(“Fatt. di " + num +" = "+ fat);
System.out.println("Inserire un numero intero");
num = sc.nextInt();
} //fine while
}
// fine main
static long calcola_fattoriale(int n){
long f;
int i;
f = n;
i = n;
while(i > 1){
i = i -1;
f = f * i;
}
return (f);
} // fine metodo calcola_fattoriale
}
// fine classe di programma
Fondamenti di Informatica
Massimo Tistarelli
58
Cicli nidificati: ordinamento
di un array
• Esempio 10: ordinamento
i=0
int i, indmin, n
stampa array
START
i<(n-1)
SI
Leggi lunghezza array
e memorizza in n
trova il min tra gli
elementi che vanno
dalla posizione i alla
fine e memorizza la
posizione del minimo in
indmin
n<2
SI
Stampa errore
crea array e
carica array
Scambio elementi
in posizione i e indmin
i=i+1
END
Fondamenti di Informatica
Massimo Tistarelli
59
Cicli nidificati: ordinamento
di un array
• Esempio 10: ordinamento
int i,j, indmin, n
float [] vl
float temp
i=0
Stampa vl
j<n
START
SI
i<(n-1)
SI
SI
Leggi n (lunghezza vl)
vl[j]<vl[indmin]
indmin = i
n<2
SI
Stampa errore
i=0
indmin = j
j = i+1
j=j+1
i<n
SI
leggi vl[i]
Scambio elementi
i e indmin
i=i+1
i=i+1
END
Fondamenti di Informatica
Massimo Tistarelli
60
Cicli nidificati: ordinamento
di un array
import java.util.*; // libreria…utilità di sistema!
public class esempio10{
public static void main(String[] args)
{
// dichiarazione delle variabili
float[] vl;
int n,indmin,i,j;
float temp;
// leggo la lunghezza del vettore
System.out.println("Inserire il numero totale
di valori da caricare nell'array");
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
Fondamenti di Informatica
Massimo Tistarelli
61
Cicli nidificati: ordinamento
di un array
if (n < 2) {
System.out.println("Il numero deve essere
superiore a due - termine del programma");
}
else{
// creo il vettore
vl = new float[n];
// carico l'array
for (i=0; i<n ; i++) {
System.out.println
("Inserire il numero in posizione "+ i);
vl[i] = sc.nextFloat();
}
Fondamenti di Informatica
Massimo Tistarelli
62
Cicli nidificati: ordinamento
di un array
// ordino
for (i=0; i<(n-1) ; i++) {
indmin=i;
for (j=i+1; j<n ; j++) {
if (vl[j]<vl[indmin]) {indmin=j;}
}
// scambio elementi in posiz i e indmin
temp = vl[i];
vl[i]=vl[indmin];
vl[indmin]=temp;
}
//stampo il risultati
for (i=0; i<n ; i++) System.out.println( vl[i]);
} // else
} // main
} // classe di programma
Fondamenti di Informatica
Massimo Tistarelli
63
Esercizi di riepilogo
Leggere da tastiera dieci valori che rappresentano la
rilevazione relativa al
numero di clienti di un albergo nel corso di dieci giorni
consecutivi
• stampare l’istogramma orizzontale di tale dato
giorno
1
xxxx
2
xxxxxxxxxx
3
xxxxx
4
.......
• stampare l’istogramma verticale di tale dato
x
x x
x x x
x x x x
giorno 1 2 3 4 ................
Fondamenti di Informatica
Massimo Tistarelli
64
Esercizi di riepilogo
// soluzione diagramma orizzontale
import java.util.*;
public class esempio11{
public static void main(String[] args) {
int [] vb = new int[10];
int i,j;
Scanner sc = new Scanner(System.in);
// carico l'array
for (i=0; i<vb.length ; i++) {
System.out.print("Inserire il numero in posizione "+ i+ " : ");
vb[i] = sc.nextInt();
}
System.out.println ("giorno");
for (i=0; i<vb.length ; i++) {
System.out.print(i + " ");
for (j=0; j<vb[i] ; j++) { System.out.print("x");}
System.out.println();
}
}
}
Fondamenti di Informatica
Massimo Tistarelli
65
Esercizi di riepilogo
// soluzione diagramma verticale con array bidimensionale
import java.util.*;
public class esempio12{
public static void main(String[] args) {
int [] vb = new int[10];
char [][] isto;
int i,j;
int max=1;
Scanner sc = new Scanner(System.in);
// carico l'array di valori memorizzando il massimo valore
for (i=0; i<vb.length ; i++) {
System.out.print("Inserire il numero in posizione "+ i+ " : ");
vb[i] = sc.nextInt();
if (vb[i] > max) {max = vb[i];}
}
// creo l'array dell'istogramma a 2 dimensioni e carico i simboli
isto = new char[max][vb.length];
for (i=0; i<vb.length ; i++) {
for (j=0; j<vb[i] ; j++) { isto[max-1-j][i]= 'x';}
}
Fondamenti di Informatica
Massimo Tistarelli
66
Esercizi di riepilogo
// soluzione diagramma verticale con array bidimensionale
// stampo
for (j=0; j<max ; j++) {
System.out.print(" "); //spazio ad inizio riga
for (i=0; i<vb.length ; i++) {
System.out.print(isto[j][i]);
System.out.print(" "); // spazio tra i simboli
}
System.out.println(); // nuova riga
}
// stampo la didascalia
System.out.print('\n'+"giorno ");
for (i=0; i<vb.length ; i++) {
System.out.print(i+" ");
}
}
}
Fondamenti di Informatica
Massimo Tistarelli
67
Programmazione orientata
agli oggetti
• Il Record: un nuovo oggetto di sistema definibile
dall’utente
class Employee
{
String name;
double salary;
}
• Notare bene:
– Il programmatore deve CREARE esplicitamente
questi oggetti (come per gli array)
esempio:
Employee e1 = new Employee();
Fondamenti di Informatica
Massimo Tistarelli
68
Programmazione orientata
agli oggetti
import java.util.*;
class Employee
{
String name;
devo utilizzare una classe
aggiuntiva entro il file di
programma
double salary;
}
public class esempio13{
public static void main(String[] args) {
Employee e1= new Employee();
e1.name = "Sechi Giovanni";
e1.salary = 12000;
System.out.println("Reddito "+ e1.name + ": " + e1.salary);
}
}
Fondamenti di Informatica
Massimo Tistarelli
69
Programmazione orientata
agli oggetti
Esempio 14 (testo d’esame)
Una sistema per la gestione telefonica archivia per ogni telefonata i
seguenti dati:
1.
numero chiamato
2.
tipo chiamata (verso telefono fisso o cellulare)
3.
durata chiamata in secondi
Progettare un programma che consenta di caricare i dati sopra
elencati relativi a 5000 interventi. Il programma deve quindi calcolare
e stampare la durata media di una chiamata verso telefono fisso.
Fondamenti di Informatica
Massimo Tistarelli
70
Programmazione orientata
agli oggetti
• Esempio 14: uso record
dur_media=0
cont=0
class Telefonata
{
String numero;
boolean tipo; // false = fisso
// true = mobile
int durata;
}
Telefonata[] elenco_tel
int i, cont
float dur_media
START
stampa risultato
i=0
i< 5000
END
SI
elenco_tel[i].tipo
== false
SI
dur_media = dur_media +
elenco_tel[i].durata
creazione elenco
cont=cont+1
caricamento dati
da tastiera
i++
Fondamenti di Informatica
Massimo Tistarelli
71
Programmazione orientata
agli oggetti
import java.util.*;
class Telefonata
{
String numero;
boolean tipo; // false = verso fisso
int durata;
}
, true = verso mobile
public class esempio14{
public static void main(String[] args) {
Telefonata[] elenco_tel;
int i;
int cont;
float dur_media;
// creazione elenco telefonate
elenco_tel = new Telefonata[10];
for (i=0; i<10 ; i++) {elenco_tel [i] = new Telefonata();}
Fondamenti di Informatica
Massimo Tistarelli
72
Programmazione orientata
agli oggetti
// apertura tastiera
Scanner kb = new Scanner(System.in);
// lettura dati da tastiera
for (i=0; i<10 ; i++) {
System.out.println("Inserire numero chiamato ");
elenco_tel[i].numero = kb.next();
System.out.println("Inserire 1 per chiamata verso
mobile, 0 per chiamata verso
fisso");
if (kb.nextInt()==1) {elenco_tel[i].tipo = true; }
else {elenco_tel[i].tipo = false; }
System.out.println("Inserire durata della chiamata in
secondi
");
elenco_tel[i].durata = kb.nextInt();
}
Fondamenti di Informatica
Massimo Tistarelli
73
Programmazione orientata
agli oggetti
// calcolo durata media telefonate verso fisso
dur_media = 0;
cont = 0;
for (i=0; i<10 ; i++) {
if (elenco_tel[i].tipo == false) {
dur_media = dur_media + elenco_tel[i].durata;
cont = cont+1;
}
}
// stampa risultati
if (cont !=0) {
dur_media = dur_media/cont;
System.out.println("Durata media verso tel fisso: "+ dur_media);
}
else {
System.out.println("Nessuna chiamata verso telefono fisso");
}
}
}
Fondamenti di Informatica
Massimo Tistarelli
74
Programmazione orientata
agli oggetti
• La nozione di classe estende il concetto di record
– i campi diventano PRIVATI
– si aggiungono funzioni PUBBLICHE che lavorano sui dati
funzione
funzione
funzione
dati globali
PROGRAMMAZIONE
PROCEDURALE
metodo
metodo
metodo
dati locali
metodo
PROGRAMMAZIONE ORIENTATA
AGLI OGGETTI
Fondamenti di Informatica
Massimo Tistarelli
metodo
metodo
dati locali
75
Programmazione orientata
agli oggetti
• Classi definite dall’utente: come si creano in modo appropriato
class Employee
{
public Employee(String n, double s)
COSTRUTTORE
{ name = n;
salary = s;
}
public void print()
{ System.out.println(name + " " + salary );
}
public void raiseSalary(double byPercent)
{ salary *= 1 + byPercent / 100;
}
private String name;
private float salary;
DATI PROTETTI
}
Fondamenti di Informatica
Massimo Tistarelli
76
Programmazione orientata
agli oggetti
• Classi definite dall’utente: come si usano in modo appropriato
class Employee
{ public Employee…..
...
}
public class EmployeeTest
{ public static void main(String[] args)
{
Employee E1, E2;
E1 = new Employee("Harry Hacker", 35000);
E2 = new Employee("Carl Cracker", 35000);
E1.print();
E2.print();
E1.raiseSalary(5);
queste sono
E2.raiseSalary(5);
E1.print();
chiamate dei
E2.print();
metodi di classe
}
}
Fondamenti di Informatica
Massimo Tistarelli
77
Programmazione orientata
agli oggetti
• Meccanismi di ereditarieta`
class Manager extends Employee
{ public Manager(String n, float s)
{ super(n, s);
secretaryName = "";
}
public void raiseSalary(double byPercent)
{ // add 1/2% bonus for every year of service
double bonus = 0.5 ;
super.raiseSalary(byPercent + bonus);
}
//continua
Fondamenti di Informatica
Massimo Tistarelli
78
Programmazione orientata
agli oggetti
• Meccanismi di ereditarieta`
// continua da pagina precedente
public void setSecretaryName(String n)
{ secretaryName = n;
}
public String getSecretaryName()
{ return secretaryName;
}
private String secretaryName;
} // fine classe Manager
Fondamenti di Informatica
Massimo Tistarelli
79
Programmazione orientata
agli oggetti
• Meccanismi di ereditarieta` - Uso
public class EmployeeTest
{ public static void main(String[] args)
{ Employee[] staff = new Employee[2];
staff[0]
staff[1]
int i;
for (i =
for (i =
for (i =
= new Employee("Harry Hacker", 35000);
= new Manager("Carl Cracker", 35000);
0; i < 2; i++) staff[i].print();
0; i < 2; i++) staff[i].raiseSalary(5);
0; i < 2; i++) staff[i].print();
}
}
// qui di seguito il codice della classe Employee
// qui il codice della classe Manager
Fondamenti di Informatica
Massimo Tistarelli
80
Programmazione orientata
agli oggetti
• Esempio
Lo schedario dei dipendenti di un’azienda contiene per ogni
dipendente i seguenti dati:
– Nome
– età (in anni)
– stipendio annuale
Implementare un programma che consenta di:
– creare uno schedario per 100 dipendenti
– caricare su tale schedario tutti i dati relativi ai dipendenti
– calcolare la spesa annualmente sostenuta dall’azienda per
la retribuzione dei dipendenti
– calcolare la percentuale di tale spesa relativa alle persone
con più di 50 anni di età
Fondamenti di Informatica
Massimo Tistarelli
81
Programmazione orientata
agli oggetti
• Suggerimenti per la soluzione
class Employee {
public Employee(String n, float s, int a) {
name = n;
salary = s;
age = a;
}
int getAge() {
return age;
}
float getSalary(){
return salary;
}
private String name;
private float salary;
private int age;
}
Fondamenti di Informatica
Massimo Tistarelli
82
Programmazione orientata
agli oggetti
public class EmployeeTest
{ public static void main(String[] args)
{ Employee[] staff = new Employee[100];
float somma, sommaover50;
int i;
// leggi dati da tastiera e crea array di staff
(da fare)
// calcola somma stipendi
for (i = 0; i < 100; i++) {
somma = somma+ staff[i].getSalary();
if (staff[i].getAge() >50) {
sommaover50 = sommaover50 + staff[i].getSalary();
}
}
// calcola e stampa risultati
(da fare)
}
}
Fondamenti di Informatica
Massimo Tistarelli
83
Programmazione grafica
• Alternative Window Toolkit (AWT) e SWING
– sono librerie di classi che consentono la realizzazione di
interfacce grafiche per l’utente (GUI)
– AWT è molto spartana, SWING leggermente più raffinata
– sono entrambe INDIPENDENTI dalla piattaforma hardware
• Oggetti e funzioni per la grafica
– Il frame è una finestra di primo livello (non contenuta da altre
finestre)
– Scrivere testo o grafica dentro un frame richiede la definizione
del metodo paint
– Il metodo paint ha un solo parametro di tipo Graphics
– Graphics è un oggetto caratterizzato da numerosi metodi
specializzati nelle funzioni di tipo testo/grafica
Fondamenti di Informatica
Massimo Tistarelli
84
Programmazione grafica
• Alcuni metodi interessanti di Graphics
drawString(“Hello”,75,100); // stampa una stringa
setColor(Color.pink); //colore predefinito
setColor(new Color(10,10,10)); //colore RGB
SetBackground(Color.red); // definisce lo sfondo
drawLine(x1,y1,x2,y2);
drawArc(x,y,w,h,start,end);
drawRect(x,y,w,h)
draw3dRect(x,y,w,h,raised);
drawOval(x,y,w,h);
drawPolygon(int[] xPoints, int[] yPoints, int npoints)
Fondamenti di Informatica
Massimo Tistarelli
85
Programmazione grafica
import javax.swing.*;
import java.awt.*;
public class DrawRect extends JFrame {
public DrawRect() {
super("Esempio JFRAME");
setBounds(100,100,300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawRect(10, 40, 80, 30);
g.drawRoundRect(100, 40, 80, 30, 15, 15);
g.drawLine(100, 100, 180,130);
g.drawOval(10, 100, 80, 30);
}
public static void main(String args[]) {
DrawRect f = new DrawRect();
f.setVisible(true);
}
}
Fondamenti di Informatica
Massimo Tistarelli
86
Programmazione grafica
• Creazione di interfacce per l’utente
– Si usano alcuni componenti principali
(components) equivalenti ai controls di Windows
o ai widgets di X-Windows
– I componenti possono essere racchiusi dentro
containers
– I passi fondamentali per definire un’interfaccia
sono i seguenti:
• Definire un layout
• Posizionare i componenti entro il layout
• Gestire gli eventi legati all’azione dell’utente
Fondamenti di Informatica
Massimo Tistarelli
87
Programmazione grafica
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ButtonTest extends JFrame
implements ActionListener {
Button myButton;
Color c; // il colore dello sfondo
public ButtonTest() {
super("ESEMPIO Pulsanti");
setBounds(100,100,300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new FlowLayout());
myButton = new Button("Cambia Colore");
add(myButton);
myButton.addActionListener(this);
}
Fondamenti di Informatica
Massimo Tistarelli
88
Programmazione grafica
public void actionPerformed(ActionEvent evt) {
if((evt.getSource()== myButton) &&
(c!= Color.blue)) c=Color.blue;
else c=Color.red;
getContentPane().setBackground(c);
}
public static void main(String[] args) {
ButtonTest f = new ButtonTest();
f.setVisible(true);
}
}
Fondamenti di Informatica
Massimo Tistarelli
89
Programmazione grafica
• Gerarchie di oggetti grafici
Fondamenti di Informatica
Massimo Tistarelli
90
Programmazione grafica
• Alcuni oggetti di interesse
– Panel: contenitore invisibile atto a contenere
ulteriori componenti
– Canvas: area rettangolare grafica
– Label: componente testo non modificabile
– Button: componente bottone a pressione
monostabile
– TextField: componente input/output di testo
(una linea)
– TextArea: componente area di testo (più linee)
– Checkbox: componente tasto di spunta bistabile
– Scrollbar: componente barra di scorrimento
Fondamenti di Informatica
Massimo Tistarelli
91
Programmazione grafica
public class media_frame extends javax.swing.JFrame {
/** Creates new form media_frame */
public media_frame() {
initComponents();
}
private void initComponents() {
panel1 = new java.awt.Panel();
label1 = new java.awt.Label();
textField1 = new java.awt.TextField();
panel2 = new java.awt.Panel();
label4 = new java.awt.Label();
textField4 = new java.awt.TextField();
label2 = new java.awt.Label();
textField2 = new java.awt.TextField();
panel3 = new java.awt.Panel();
label3 = new java.awt.Label();
textField3 = new java.awt.TextField();
addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent evt) {
System.exit(0);
}
});
Fondamenti di Informatica
Massimo Tistarelli
92
Programmazione grafica
panel1.setBackground(new java.awt.Color(153, 244, 51));
label1.setFont(new java.awt.Font("Arial", 0, 14));
label1.setText("Numero corrente");
panel1.add(label1);
textField1.setText("0");
textField1.setColumns(10);
textField1.setFont(new java.awt.Font("Arial", 0, 18));
textField1.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
textField1ActionPerformed(evt);
}
});
panel1.add(textField1);
getContentPane().add(panel1, java.awt.BorderLayout.NORTH);
Fondamenti di Informatica
Massimo Tistarelli
93
Programmazione grafica
panel2.setBackground(new java.awt.Color(255, 153, 51));
label4.setText("Totale numeri inseriti");
panel2.add(label4);
textField4.setText("0");
panel2.add(textField4);
label2.setText("
Somma");
panel2.add(label2);
textField2.setText("0");
textField2.setColumns(10);
panel2.add(textField2);
getContentPane().add(panel2, java.awt.BorderLayout.CENTER);
label3.setText("Media");
panel3.add(label3);
textField3.setText("0");
textField3.setColumns(10);
panel3.add(textField3);
getContentPane().add(panel3, java.awt.BorderLayout.SOUTH);
pack();
} //fine initComponents
Fondamenti di Informatica
Massimo Tistarelli
94
Programmazione grafica
private void textField1ActionPerformed(java.awt.event.ActionEvent evt) {
current_number = Float.parseFloat(textField1.getText());
sum = sum + current_number;
tot = tot+1;
mean = sum / tot;
textField2.setText(""+sum);
textField3.setText(""+mean);
textField4.setText(""+tot);
}
public static void main(String args[]) {
new media_frame().show();
}
private java.awt.Label label1,label2,label3,label4;
private java.awt.TextField textField1,textField2,textField3,textField4;
private java.awt.Panel panel1,panel2,panel3;
float current_number;
float sum =0, mean=0;
int tot;
}
Fondamenti di Informatica
Massimo Tistarelli
95
Programmazione grafica
• Un semplice esempio di GUI
import java.awt.*;
import java.awt.event.*;
public class ColorSelect extends Frame
implements AdjustmentListener
{ public ColorSelect()
{ addWindowListener(new WindowAdapter() { public void
windowClosing(WindowEvent e) { System.exit(0); } } );
Panel p = new Panel();
p.setLayout(new GridLayout(3, 2));
p.add(redLabel = new Label("Red 0"));
p.add(red = new Scrollbar(Scrollbar.HORIZONTAL, 0, 0,
0, 255));
red.setBlockIncrement(16);
red.addAdjustmentListener(this);
p.add(greenLabel = new Label("Green 0"));
p.add(green = new Scrollbar(Scrollbar.HORIZONTAL, 0,
0, 0, 255));
green.setBlockIncrement(16);
green.addAdjustmentListener(this);
p.add(blueLabel = new Label("Blue 0"));
p.add(blue = new Scrollbar(Scrollbar.HORIZONTAL, 0, 0,
0, 255));
blue.setBlockIncrement(16);
blue.addAdjustmentListener(this);
Fondamenti di Informatica
Massimo Tistarelli
96
Programmazione grafica
• Un semplice esempio di GUI
add(p, "South");
c = new Canvas();
c.setBackground(new Color(0, 0, 0));
add(c, "Center");
}
public void adjustmentValueChanged(AdjustmentEvent evt)
{ redLabel.setText("Red " + red.getValue());
greenLabel.setText("Green " + green.getValue());
blueLabel.setText("Blue " + blue.getValue());
c.setBackground(new Color(red.getValue(),
green.getValue(), blue.getValue()));
c.repaint();
}
public static void main(String[] args)
{ Frame f = new ColorSelect();
f.setSize(300,300);
f.show();
}
private Label redLabel, greenLabel,blueLabel;
private Scrollbar red, green, blue;
private Canvas c;
}
Fondamenti di Informatica
Massimo Tistarelli
97
Applicazioni multimediali
• Il concetto di applet
– si tratta di un programma JAVA che può essere eseguito
da un qualunque browser abilitato
– applet e frame derivano entrambi dall’oggetto container;
possono quindi essere utilizzati gli stessi metodi per
aggiungere componenti
– la conversione di un programma in applet è semplice:
• eliminare il metodo main()
• derivare la classe da Applet, non da Frame
• sostituire al costruttore la chiamata init()
• definire esplicitamente il bordo tramite la chiamata
setLayout(new BorderLayout());
• eliminare una eventuale chiamata al metodo
setTitle()
Fondamenti di Informatica
Massimo Tistarelli
98