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