Una introduzione al linguaggio Java
Prof. Giancarlo Fortino
[email protected]
a.a. 2004/2005
Algoritmi
• Definizione 1. Un algoritmo è una
procedura per risolvere un problema in un
numero finito di passi, che coinvolge
frequentemente
la
ripetizione
di
un’operazione; in senso lato: un metodo
passo-passo per realizzare un certo compito.
Algoritmi e Problemi
• Individuare un algoritmo risolutivo e
realizzarne
una
implementazione
utilizzando un qualsiasi linguaggio ha senso
solo per un problema generale poiché il
costo
iniziale
di
realizzazione
dell’algoritmo
è
compensato
dalla
possibilità di impiego ripetuto.
Esempi di problemi
•
•
•
•
Somma di 3 numeri x, y, z
Somma di N numeri
Numero massimo tra N numeri
Data una sequenza di N numeri sommare i
numeri uguali
• Calcolare la media e la varianza di una
sequenza di N voti…
Esempio 1 di Algoritmo:
programmazione di un VCR
Passo 1. Se le informazioni di clock e calendario non sono correttamente
fissate, vai a pag. 9 del manuale e segui le istruzioni prima di procedere
Passo 2: Poni un nastro vuoto nell’alloggiamento del nastro del VR
Passo 3. Ripeti i passi da 4. a 7. per ogni programma TV che desideri
registrare, per un massimo di 10 programmi
Passo 4. Inserisci il numero di canale che vuoi registrare e premi il tasto CHAN
Passo 5. Inserisci il tempo al quale deve iniziare la registrazione e premi il
tasto TIME-START
Passo 6. Inserisci il tempo al quale deve finire la registrazione e premi il tasto
TIME-FINISH
Passo 7. Se non desideri registrare altri programmi, premi il tasto END-PROG
Passo 8. Premi il tasto TIMER. Il VR è ora pronto per registrare.
Esempio 2 di Algoritmo:
calcolo del Massimo Comun Divisore (MCD) tramite
l’algoritmo di Euclide
Variabili di ingresso:
Variabili di uscita:
Variabili interne:
Passo 1.
Passo 2.
Passo 3.
Passo 4.
Passo 4.1.
Passo 4.2.
Passo 4.3.
Passo 4.4.
Passo 5.
Passo 6.
n, m di tipo intero >0
mcd di tipo intero >0
x, y, r di tipo intero >=0
leggi n ed m;
x=m;
y=n;
ripeti
dividi x per y e sia r il resto;
x=y;
y=r;
finche' r==0;
mcd =x;
scrivi mcd;
Perché realizzare Algoritmi ?
• Se è possibile scrivere un algoritmo per un
assegnato
problema
allora
è
possibile
automatizzarne la soluzione.
• L’esecuzione di tale algoritmo può essere affidata ad
un agente di calcolo (una persona o un calcolatore
elettronico).
• Non tutti i problemi sono risolubili algoritmicamente
(K. Godel, 1930).
Nozione formale di Algoritmo
• Definizione 2. Un algoritmo è una collezione ben
ordinata
di
operazioni,
non
ambigue
ed
effettivamente calcolabili, che quando eseguita
produce un risultato e termina in una quantità finita di
tempo.
• Le operazioni possono
condizionali e iterative.
essere
sequenziali,
Strutturazione di un programma
• Un programma è la realizzazione di un algoritmo
mediante un linguaggio di programmazione (es.,
Java, Pascal, C++, ecc.)
• La struttura base di un programma è la seguente:
– Dichiarazione delle variabili che servono per memorizzare
valori di INPUT, INTERMEDI e di OUTPUT
– Operazioni di INPUT
– Operazioni di Elaborazione
– Operazioni di OUTPUT
Algoritmi in Java “by example”
• Di seguito si propone una serie di algoritmi realizzati
in linguaggio Java con lo scopo di:
– evidenziare i tipi di operazione base (sequenziali,
condizionali, e iterative)
– descrivere le istruzioni ed i tipi base del linguaggio Java
– fornire esempi significativi sulla base dei quali costruire altri
esempi
Esempi di Programmi Java:
somma di 3 numeri interi
import fondamenti.inout.*;
public class Esercizio_Somma1 {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int x, y, z, somma;
//SEZIONE DI INPUT
x = Console.readInt(“x=”);
y = Console.readInt(“y=“);
z = Console.readInt(“z=“);
//SEZIONE DI ELABORAZIONE
somma=x+y+z;
//SEZIONE DI OUTPUT
System.out.println(“somma = "+somma);
}
}
Esempi di Programmi Java:
comparazione tra due numeri interi
import fondamenti.inout.*;
public class Esercizio_Compara {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int x, y, risultato;
//SEZIONE DI INPUT
x = Console.readInt(“x=”);
y = Console.readInt(“y=“);
//SEZIONE DI ELABORAZIONE
if (x>y) risultato = 1;
else if (x==y) risultato = 0;
else risultato = -1;
//SEZIONE DI OUTPUT
System.out.println(“risultato = "+risultato);
}
}
Esempi di Programmi Java:
inserimento di un numero intero >=0 e stampa del suo quadrato
import fondamenti.inout.*;
public class Esercizio_Quadrato {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int x, quadrato;
//SEZIONE DI INPUT
do
x = Console.readInt(“x=”);
while (x<0);
//SEZIONE DI ELABORAZIONE
quadrato = x*x;
//SEZIONE DI OUTPUT
System.out.println(“quadrato = "+quadrato);
}
}
Esempi di Programmi Java:
somma di una sequenza di N numeri interi
import fondamenti.inout.*;
public class Esercizio_Somma2 {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, x, conta=0, somma=0;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
//SEZIONE DI ELABORAZIONE + INPUT
while (conta<N){
x = Console.readInt(“x>”);
somma = somma + x;
conta = conta + 1;
}
//SEZIONE DI OUTPUT
System.out.println(“Somma = "+somma);
}
}
Esempi di Programmi Java:
visualizzare il numero massimo di una sequenza di N numeri interi
import fondamenti.inout.*;
public class Esercizio_Max {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, x, conta=1, max;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
//SEZIONE DI ELABORAZIONE + INPUT
max = Console.readInt(“x>”);
while (conta<N){
x = Console.readInt(“x>”);
if (x>max) max=x;
conta = conta + 1;
}
//SEZIONE DI OUTPUT
System.out.println(“Max = "+max);
}
}
Esempi di Programmi Java:
conteggio dei numeri selezionati 1 e 2 in una sequenza di N numeri
import fondamenti.inout.*;
public class Esercizio_ConteggioSelettivo {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, x, conta=0, conta1=0, conta2=0;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
//SEZIONE DI ELABORAZIONE + INPUT
while (conta<N){
x = Console.readInt(“x>”);
if (x==1) conta1=conta1+1;
else if (x==2) conta2=conta2+1;
conta = conta + 1;
}
//SEZIONE DI OUTPUT
System.out.println(“Conta1 = "+conta1+” Conta2=“+conta2);
}
}
Esempi di Programmi Java:
media di una sequenza di N numeri interi
import fondamenti.inout.*;
public class Esercizio_Media {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, x, conta=0, somma=0;
float media;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
//SEZIONE DI ELABORAZIONE + INPUT
while (conta<N){
x = Console.readInt(“x>”);
somma = somma + x;
conta = conta + 1;
}
media = somma/N;
//SEZIONE DI OUTPUT
System.out.println(“Media = "+media);
}
}
Esempi di Programmi Java:
calcolo del MCD tra due numeri interi
import fondamenti.inout.*;
public class Esercizio_MCD {
public static void main (String[] args) {
//SEZIONE DICHIARAZIONE
int x, y, resto, mcd;
//SEZIONE DI INPUT
x = Console.readInt(“x=”);
y = Console.readInt(“y=“);
//SEZIONE ELABORATIVA
do { resto=x%y;
x=y;
y=resto; }
while (resto!=0);
mcd=x;
//SEZIONE DI OUTPUT
System.out.println("mcd = "+mcd);
}
}
Istruzioni e dichiarazioni base di Java
• DICHIARAZIONI
– int x = 0; // dichiara una variabile di tipo intero e la inizializza
a zero
• INPUT
– Console.readInt(“****”); // legge un intero da console
• OUTPUT
– System.out.println(“****”+x); //stampa sul monitor il valore
della variabile x preceduto dal testo (o stringa) racchiuso dai
doppi apici
Istruzioni e dichiarazioni base di Java
• ELABORAZIONI
– Espr = espressione; // assegnamento del risultato di una
espressione alla variabile Espr.
• Es., s = x*y+z;
– if (condizione) istruzione1 else instruzione 2; // dove
condizione è una espressione booleana, istruzione1 e
istruzione2 sono istruzioni semplici o composte.
• Es., if (x>10) conta=conta+2; else conta=conta-1;
– {instruzionesemplice1;
istruzione composta.
instruzionesemplice2;
• Es., { x=x+1; y=y+2; if (x>10) t=t+10; }
…}
//
Istruzioni e dichiarazioni base di Java
• ELABORAZIONI
– do instruzione while (condizione); // esegue istruzione che
può essere semplice o composta finchè la condizione è vera
• Es., do {x=x+1; y=y+x;} while (x<10);
– while (condizione) istruzione; // esegue istruzione che può
essere semplice o composta finchè la condizione è vera
• Es., while (x<10) {x=x+1; y=y+x;}
I tipi “semplici” Java
• Interi
–
–
–
–
byte
word
int
long
{-128..127}
{-32768..32767}
{-2^31..(2^31)-1}
{-2^63..(2^63)-1}
• Reali
– float
– double
singola precisione
doppia precisione
• Booleani
– boolean
{true, false}
• Caratteri
– char
16-bit UNICODE. Es., ‘a’, ‘b’, ‘&’, ‘1’, ecc.
• Testo
– String
caratteri
“Giancarlo”, “java”, “Informatica”, qualsiasi sequenza di
Insiemi Fuzzy
• Consideriamo il concetto di Vecchio:
– in accordo agli insiemi “crisp” una persona può essere
vecchia o non vecchia cioè può appartenere all’insieme delle
persone vecchie oppure no. Quindi bisogna scegliere una
soglia di età (es., 65 anni) e affermare che da tale soglia in poi
si è vecchi altrimenti non si è vecchi.
– In accordo agli insiemi “fuzzy” una persona è vecchia con un
certo grado di vecchiaia. Quindi tale grado può essere
espresso da una funzione. Es., si può scegliere una spezzata
che è zero (o grado zero) fino ad una soglia d’età s1 e che
cresca linearmente fino al grado 1 in corrispondenza di una
soglia di età s2>s1.
• Per il concetto di Giovane possiamo fare le stesse
considerazioni.
Insiemi Fuzzy…
Vecchio e Giovane
1
0,9
0,8
0,7
0,6
0,5
0,4
0,3
0,2
0,1
0
Vecchio - fuzzy
Giovane - fuzzy
0
45
65
120
Esempi di Programmi Java:
calcolo del grado di vecchiaia e gioventù di N persone
import fondamenti.inout.*;
public class Esercizio_Fuzzy {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, eta, conta=0;
float vecchiaia, gioventu, eta;
//SEZIONE DI INPUT
N = Console.readInt(“Numero di Persone=”);
//SEZIONE DI ELABORAZIONE + INPUT + OUTPUT
while (conta<N){
eta = Console.readInt(“Età della “+(conta+1)+” persona>”);
if (eta<=45) vecchiaia = 0;
else if ( (eta>45) && (eta<65) ) vecchiaia=(eta-45)/20;
else vecchiaia=1;
if (eta<=45) gioventu = 1;
else if ( (eta>45) && (eta<65) ) gioventu=(65-eta)/20;
else gioventu=0;
System.out.println(“Grado di vecchiaia = "+vecchiaia);
System.out.println(“Grado di gioventù = "+gioventu);
conta=conta+1;
}
}
}
Memorizzazione di N valori con N non
conosciuto “a priori”
• Se si vogliono memorizzare N valori di tipo intero per poi
utilizzarli successivamente, si dovrebbero dichiarare tante
variabili intere per quanti valori interi si devono memorizzare.
Ma se N è molto grande e/o se non conosciamo a priori N il
metodo di dichiarare N variabili non è utilizzabile!
• Per dichiarare N variabili (con N non precisato) di uno stesso
tipo (es., int) si utilizza un nuovo tipo denominato ARRAY.
• Un array si dichiara nel seguente modo:
– int [] a, dove a è la variabile di tipo array che può contenere N
valori interi;
– a può essere vista come una riga di una tabella con N colonne;
Array monodimesionali
• a è un array di 10 elementi ognuno dei quali è un intero. Per
accedere all’i-esimo elemento si utilizza la notazione con
parentesi quadre [].
• Es., per accedere all’elemento con indice 2 bisogna scrivere
a[2]
a
10 1 11 34 -1 -7
0
1
2
3
4
5
5
5
6 10
6
7
8
• Per creare un array di 10 elementi interi si scrive:
• int [] a = new int[10].
• Gli elementi vengono inizializzati tutti a zero.
• int x = a[4] a cosa è uguale?
-1
• a[10] esiste?
NO
9
Esempi di Programmi Java:
somma di una sequenza memorizzata di N numeri interi
import fondamenti.inout.*;
public class Esercizio_SommaArray1 {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, conta=0, somma=0;
int [] a;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
a = new int[N];
while (conta<N){
a[conta] = Console.readInt(“a[”+conta+”]=“);
conta = conta + 1; // oppure conta++
}
//SEZIONE DI ELABORAZIONE
conta=0;
while (conta<N){
somma = somma + a[conta];
conta = conta + 1;
}
//SEZIONE DI OUTPUT
System.out.println(“Somma = "+somma);
}
}
Esempi di Programmi Java:
somma di una sequenza memorizzata di N numeri interi, versione 2
import fondamenti.inout.*;
public class Esercizio_SommaArray2 {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, somma=0;
int [] a;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
a = new int[N];
for (int x=0; x<N; x++)
a[x] = Console.readInt(“a[”+x+”]=“);
//SEZIONE DI ELABORAZIONE
for (int x=0; x<N; x++)
somma = somma + a[x];
//SEZIONE DI OUTPUT
System.out.println(“Somma = "+somma);
}
}
Esempi di Programmi Java:
visualizzazione di una sequenza memorizzata di N numeri interi
import fondamenti.inout.*;
public class Esercizio_Visualizza {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, conta=0, somma=0;
int [] a;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
a = new int[N];
while (conta<N){
a[conta] = Console.readInt(“a[”+conta+”]=“);
conta = conta + 1; // oppure conta++
}
conta=0;
//SEZIONE DI OUTPUT
while (conta<N){
System.out.println(“a[”+conta+”]=“+a[conta]);
conta = conta + 1; // oppure conta++
}
}
}
Calcolo della media e della varianza di una
sequenza di N voti
•
Dati N voti compresi tra 18 e 30;
•
Calcolare la media degli N voti;
N 1
Media =
•
i =0
Votoi
N
Calcolare la varianza degli N voti;
N 1
Varianza =
i =0
Media) 2
(Votoi
N
Esempi di Programmi Java:
calcolo della media e della varianza di N numeri interi (o voti)
import fondamenti.inout.*;
public class Esercizio_MediaVarianza {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, conta=0, somma=0;
float media, varianza=0;
int [] a;
//SEZIONE DI INPUT
N = Console.readInt(“N=”);
a = new int[N];
while (conta<N){
a[conta] = Console.readInt(“a[”+conta+”]=“);
conta ++;
}
conta=0;
//SEZIONE DI ELABORAZIONE
while (conta<N){
somma=somma+a[conta];
conta ++;
}
media = somma/N;
Esempi di Programmi Java:
calcolo della media e della varianza di N numeri interi (o voti)…
conta=0;
while (conta<N){
varianza = varianza + ((a[conta]-media)*(a[conta]-media));
conta ++;
}
varianza=varianza/N;
//SEZIONE DI OUTPUT
System.out.println(“Media=“+media);
System.out.println(“Varianza=“+varianza);
}
}
Stringhe
• Una Stringa è una sequenza di caratteri
• Il tipo stringa in Java è denominato String
• String s1 = “Fondamenti”;
• String s2 = “ d’Informatica”;
• String s = s1+s2; //concatenazione
• Quanto vale s?
“Fondamenti d’Informatica”
• Comparazione tra stringhe: s1.equals(s2) è true se s1 è uguale
a s2, altrimenti è false.
Esempi di Programmi Java:
comparazione tra stringhe inserite da console
import fondamenti.inout.*;
public class Esercizio_CompStringhe {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
String s1, s2;
//SEZIONE DI INPUT
s1 = Console.readString(“s1=”);
s2 = Console.readString(“s2=”);
//SEZIONE ELABORATIVA + OUTPUT
if (s1.equals(s2)) System.out.println(s1);
else System.out.println(s2);
}
}
Esempi di Programmi Java:
inserimento di N nominativi in un’agenda e ricerca di un nominativo
import fondamenti.inout.*;
public class Esercizio_RicercaNome {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
int N, conta=0;
String x;
String [] nominativi;
boolean trovato;
//SEZIONE DI INPUT
N = Console.readInt(“N>”);
nominativi = new String[N];
while (conta<N) {
nominativi[conta]=Console.readString(“Nome>”);
conta++;
} //SEZIONE ELABORATIVA
//ricerca
x = Console.readString(“Ricerca nome>”);
trovato = false; conta = 0;
while ( (conta<N) && (!trovato) ){
if (x.equals(nominativi[conta])) trovato=true;
else conta++;
} //SEZIONE OUTPUT
if (trovato) System.out.println(“Posizione=“+conta); else System.out.println(“Non trovato“);
}
}
Esecuzione di programmi Java
• Per eseguire un programma Java bisogna utilizzare un tool per
compilare il programma Java in codice intermedio detto
BYTECODE e poi bisogna impiegare un interprete che esegue
tale codice.
• Il Java SDK (Java Software Development Kit) fornito dalla Sun
Microsystems,
disponibile
gratuitamente
all’indirizzo
http://java.sun.com, permette di eseguire un programma Java.
• La versione corrente e stabile del tool è la 1.4.2.
• La compilazione viene fatta tramite il tool JAVAC
• L’esecuzione tramite il tool JAVA
• Es., editato e salvato il file prova.java
– prompt di dos> javac prova.java
– prompt di dos> java prova
Tipi composti (Classi senza metodi)
• Per costruire un nuovo tipo di dato si usa il costrutto CLASS.
• Il nuovo tipo avrà il nome della classe (Es., Studente)
• Es.:
public class Studente{
int Matricola;
String Nome, Cognome, CorsoLaurea;
Date anno_iscrizione;
}
• Studente s; //s è una variabile di tipo Studente
• s = new Studente(); //è stata creata un’istanza di Studente con
una inizializzazione di default mediante l’operatone new
•
s.Matricola=6513;
s.Nome=“Mario”;
s.Cognome=“Rossi”;
s.CorsoLaurea=“DES”; s.anno_iscrizione=new Date(“1/10/2002”); // il
valore di s è stato settato cioè alle singole variabili interne sono stati
assegnati valori
Esempio: Studenti, Esami, EsamiSostenuti
Descrizione
CorsoLaurea Data_Iscrizione
Lode
Cognome
Studente
0..n
Data
0..29
Esame
Voto
EsamiSostenuti
Nome
Matricola
Nome
Codice
• Modello logico relazionale:
– Studente(Matricola,
Nome,
Cognome,
CorsoLaurea,
Data_Iscrizione)
– Esami(Codice, Nome, Descrizione)
– EsamiSostenuti(Matr_Studente, Cod_Esame, Voto, Lode, Data)
Esempio: Studenti, Esami, EsamiSostenuti
• Modello logico ad Oggetti realizzato con Java:
public class Studente{
int Matricola;
String Nome, Cognome, CorsoLaurea;
Date Data_Iscrizione;
EsamiSostenuti [] esami;
}
public class EsamiSostenuti{
public class Esame{
byte Voto;
String Codice;
boolean lode;
String Nome;
Date Data;
String Descrizione;
Esame esame;
}
}
Esempio: Studenti, Esami, EsamiSostenuti…
import fondamenti.inout.*;
public class Esercizio_AddEsame {
public static void main (String[] args) {
//SEZIONE DI DICHIARAZIONE
Studente s1, s2;
Esami e1, e2;
EsamiSostenuti es1, es2, es3, es4;
//SEZIONE DI INPUT
s1 = new Studente(5555, “Mario”, “Rossi”, “DES”, new Date(“01/10/2001”));
s2 = new Studente(7777, “Luigi”, “Verdi”, “DES”, new Date(“20/10/2001”));
e1 = new Esame(101, “Introduzione all’Informatica”, “Il corso si propone…”);
e2 = new Esame(102, “Sistemi Informativi”, “Il corso prosegue…”);
es1 = new EsameSostenuti(27, false, new Date(“10/1/2002”), e1);
s1.addEsame(es1);
}
}