Informatica Generale Marzia Buscemi [email protected] Ricevimento: Giovedì ore 16.00-18.00, Dipartimento di Informatica, stanza 306-PS o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~buscemi/IG07.htm (sommario delle lezioni in fondo alla pagina) 1 Nella scorsa lezione abbiamo visto esempi di algoritmi per risolvere problemi (numerici e non numerici) come dividere un problema in sottoproblemi e quindi trovare un algoritmi componendo sotto-algoritmi ... usando generalmente gli array 2 Oggi.. Completeremo l’argomento della scorsa lezione trattando un’altra struttura dati: i record Vedremo due diversi paradigmi di programmazione (imperativa, orientata agli oggetti) Parleremo di ipertesti e vedremo un linguaggio ipertestuale (l’HTML) 3 Record 1 Gli array sono sequenze di valori dello stesso tipo: interi, reali … caratteri (‘a’,’b’, …) sequenze di caratteri (dette stringhe, ”gatto ”, ”oggi piove !” …) I record sono aggregati di variabili di tipo diverso e permettono di definire nuovi tipi 4 Record 2 A cosa possono servire…... A rappresentare le schede della biblioteca: stringa Nome Autore stringa Cognome Autore Titolo Scaffale Posizione stringa intero intero … altre informazioni ….. Campi del record 5 Record 3 Il tipo record scheda espresso in linguaggio C struct scheda { char nome[100]; //stringa di al più //100 caratteri char cognome[100]; char titolo[300]; int scaffale; int posizione; } ; 6 Record 4 //Come dichiaro che voglio //una variabile di tipo ‘scheda’ struct scheda nuovo_libro; // come assegno valori ai diversi campi nuovo_libro.nome =”Jorge"; nuovo_libro.cognome =”Amado"; nuovo_libro.titolo =”Dona Flor e i suoi due mariti"; nuovo_libro.scaffale =8; nuovo_libro.posizione =356; 7 Record 5 Si possono definire array di record questo può servire, ad esempio a definire l’insieme delle schede di una biblioteca: struct scheda archivio[100000] possiamo quindi formalizzare un semplice algoritmo per la ricerca in uno schedario Importante: archivio[2] è il record con indice 2 dell’array archivio[100000], mentre archivio[2].titolo è il campo titolo del libro che corrisponde al record archivio[2]. 8 Esempio: ricerca in un archivio La biblioteca Libri disposti sugli scaffali La posizione di ogni libro è fissata dalle due coordinate (S,P) dove S è il numero dello scaffale dove si trova il libro P è la posizione all’interno dello scaffale La biblioteca ha uno schedario con una scheda per ogni libro. Ogni scheda contiene, nell’ordine: cognome e nome dell’autore titolo del libro numero scaffale (S) e posizione nello scaffale (P) 9 Esempio: ricerca in un archivio 2 La biblioteca (cont.) Le schede sono ordinate in ordine alfabetico del campo autore Problema: Vogliamo specificare un algoritmo che spieghi all’utente della biblioteca come trovare un libro cercato supponendo di sapere : Autore e Titolo 10 Esempio: ricerca in un archivio 3 Un primo algoritmo per il prestito: 1. Decidi il libro da richiedere 2. Cerca la scheda nello schedario 3. Trascrivi la posizione (S,P) 4. Accedi alla posizione (S,P) 5. Preleva il libro e compila la scheda di prestito Le operazioni elementari in questo caso sono piuttosto complesse… 11 Esempio: ricerca in un archivio 4 … e se non so come si effettua la ricerca nello schedario ? Tutte le operazioni specificate devono essere ‘elementari’ per chi esegue l’algoritmo. Se non lo sono è possibile spiegarle a parte per mezzo di un sotto-algoritmo 12 Esempio: ricerca in un archivio 5 Un sotto-algoritmo per cercare nello schedario : 1. Apri il classificatore 2. Prendi la prima scheda 3. Confronta il campo autore e titolo con quelli cercati 4. Se sono uguali, allora la ricerca è terminata, altrimenti prendi la scheda successiva e vai al passo 3 5. Se le schede sono esaurite, allora il libro cercato non esiste. 13 Input : struct scheda archivio Ricerca scheda (ricerca) Inizio Leggi Nome, Cognome e Titolo del libro cercato Strutture dati: struct scheda archivio // l’array di schede I=0 Si No I < 100000 ? Fine archivio[I].nome = Nome archivio[I].cognome = Cognome archivio[I].titolo = Titolo ? Si No I=I+1 Fine Non l’ho trovata! Output : la scheda cercata e un valore (si/no) che dice se c’è L’ho trovata! 14 Esercizi proposti Dare il diagramma per il sottoalgoritmo stampa_Na Trovare un algoritmo (e fornire il diagramma di flusso) per i seguenti problemi : trovare la somma dei primi K numeri (K letto in input) trovare la media di una sequenza di numeri positivi (la sequenza viene letta dall’esterno e si interrompe al primo numero negativo letto) trovare il max dei numeri posti sulla diagonale di una matrice M*M Date in input N schede di un archivio (vedi esempio), stampare il titolo e la collocazione di tutte le schede che hanno il campo autore “Umberto Eco”. 15 Paradigmi di programmazione Programmazione imperativa (es. Linguaggio C) Programmazione dichiarativa (funzionale, logica; es. ML, Lisp, Prolog) Programmazione orientata agli oggetti (Java) 16 La programmazione imperativa Obiettivo: efficienza nella progettazione e scrittura dell’algoritmo Caratteristiche: attinenza al modello architetturale di Von Neumann è conforme ai principi della programmazione strutturata (usa strutture di controllo) ma permette di manipolare i dati facendo riferimento alla struttura fisica del calcolatore (le istruzioni sono assegnamenti da dare alle locazioni di memoria) 17 La programmazione imperativa. Esempio: funzione max in C 1 Inizio Leggi x e y d=x-y Si No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Fine 18 La programmazione imperativa. Esempio: funzione max in C 2 main() /* calcola max */ { int x, y, d; //def. Delle variabili scanf ("%d %d”, &x, &y) ; //lettura x,y d = x - y ; if (d > 0) //scrittura risultati printf (”il max è %d”, &x) ; else printf (”il max è %d”, &y) ; return ; //terminazione } questo programma stampa il risultato 19 ma non restituisce nessun valore in output La programmazione imperativa. Esempio: funzione max_N in C 1 main() /* calcola max_N */ { int m, i, a, b; i = 2 ; scanf ("%d %d”, &a, &b); m = max(a,b); while (i < N) { scanf ("%d ”, &a) ; m = max(a,m); } printf (”il max è %d”, &m) ; return ; } 20 La programmazione imperativa. Esempio: funzione max_N in C 2 int max(int x, int y) /* sottoprogramma che calcola max */ { int d; d = x - y ; if (d > 0) return x; else return y; notare che questo programma } è una variante del programma visto nella penultima slide che: •prende in input x e y, piuttosto che leggerli da tastiera •restitusce in output il risultato, piuttosto che stamparlo 21 Leggi N Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I=2 No I<N? I=I+1 Leggi il nuovo numero in a Scrivi ‘max è m’ Fine DF per il problema del massimo di N numeri m = max(a,m) Supponiamo N almeno 2 22 La programmazione imperativa. Esempio: funzione ordina_Na in C main() /* calcola max_N */ { int m, i, t, X[N], N, lung; leggi_Na (N, X) ; m = X[0]; lung = N ; while (N > 1) { max_Na(X,N,&m,&i) ; t = X[N]; X[N] = X[i] ; X[i] = t ; N = N - 1 ; } stampa_Na (X,lung) ; return ;} 23 La programmazione orientata agli oggetti Enfasi: semplicità di programmazione e riuso di sottoprogrammi esistenti (modularità) Concetti base: classe: entità astratta caratterizzata da un insieme di proprietà che definiscono sia le strutture dati della classe (attributi) sia le sue funzionalità (metodi) oggetti: istanze delle classi descritte da valori associati alle diverse proprietà definite per la classe Un programma in POO è costituito da oggetti che interagiscono tra loro La POO è particolarmente adatta per 24 programmare interfacce grafiche La programmazione orientata agli oggetti. Esempio in Java 1 Java è un linguaggio di programmazione OO. Java fornisce moltissime classi raccolte in packages. Es. consideriamo la classe java.awt.Rectangle che definisce degli oggetti che rappresentano rettangoli. Ogni rettangolo (istanza della classe) ha quattro variabili, che rappresentano la dimensione del rettangolo (height e width) e la posizione nel piano del suo vertice superiore sinistro (x e y). 25 La programmazione orientata agli oggetti. Esempio in Java 2 Es. Consideriamo tre rettangoli, ognuno rappresentato da una scatola avente in alto il nome della classe, e sotto le variabili. Rappresentazione grafica dei tre oggetti 26 La programmazione orientata agli oggetti. Esempio in Java 3 Vogliamo scrivere un programma che: •Crea un rettangolo di coordinate x = 5 e y = 10 e dimensioni height = 20 e width = 30; •Stampa lo stato del rettangolo; •Sposta il rettangolo di 15 unità lungo l'asse x e di 25 lungo l'asse y; •Stampa il nuovo stato del rettangolo. 27 La programmazione orientata agli oggetti. Esempio in Java 4 Consultando la documentazione della classe Rectangle vediamo come costruire un rettangolo con i valori desiderati per le variabili, e che esiste un metodo d'istanza translate. Il programma risultante è il seguente: import java.awt.Rectangle; public class MoveRectangle { public static void main(String[] args) { Rectangle rect; rect = new Rectangle(5, 10, 20, 30); System.out.println(rect); rect.translate(15, 25); System.out.println(rect); } 28 La programmazione orientata agli oggetti. Esempio in Java 5 Vediamo questo semplice esempio in dettaglio: 1. Dichiariamo di voler usare la classe Rectangle del package java.awt: import java.awt.Rectangle; ... 2. Dichiariamo una variabile rect di tipo Rectangle e le assegnamo un nuovo oggetto con i valori desiderati per le variabili d'istanza: nome del ... programma public class MoveRectangle { public static void main(String[] args) { tipo dell’input crea un Rectangle rect; rect = new Rectangle(5, 10, 20, 30); nuovo ... oggetto 3. Stampiamo lo stato del rettangolo: ... System.out.println(rect); ... 29 La programmazione orientata agli oggetti. Esempio in Java 6 Invochiamo il metodo d'istanza translate sull'oggetto rect per spostarlo della quantità voluta: ... rect.translate(15, 25); ... Infine stampiamo lo stato finale: ... System.out.println(rect); Output: java.awt.Rectangle[x=20,y=35,width=20,height=30] Importante: per invocare un metodo d'istanza su di un oggetto si scrive <oggetto>.<metodo>(<parametri>) 30 Linguaggi Ipertestuali Ipertesto: documento la cui consultazione è non lineare, cioè le sue parti (paragrafi, capitoli, etc.) sono organizzate non semplicemente in successione, ma secondo una struttura più complessa Ogni parte del documento può contenere dei punti di aggancio (link) che rimandano ad altre parti Es. ciascuna pagina Web, l’intero World Wide Web (le pagine possono risiedere su siti diversi) I documenti ipertestuali contengono sia informazione (dati) sia meta-informazione 31 (organizzazione dei dati) Linguaggi Ipertestuali: HTML 1 HTML (Hyper Text Mark-up Language) è un linguaggio usato per descrivere ipertesti. Non è un linguaggio di programmazione, ma un linguaggio di markup, cioè descrive il contenuto (testuale e non) delle pagine Web per mezzo di opportuni “segnaposto”. Elementi: sono gli atomi principali di della sintassi di documenti HTML (strutture del linguaggio) Ogni elemento è racchiuso da segnalini (tag), uno di apertura e uno di chiusura. Es. <html> <head> <title> </head> Nome del documento </title> <body> Testo visibile </body> </body> </html> 32 Linguaggi Ipertestuali: HTML (2) All’interno di <body> </body> è possibile inserire mediante tag: intestazioni di varie dimensioni(<h1>, <h2>, etc.) elementi di testo (paragrafi, linee orizzontali) stili (grassetto, corsivo, etc.) link ad altre pagine e a immagini liste puntate e numerate tabelle ... Manuali e esempi on line su HTML: http://www.w3schools.com/html/default.asp 33 Scrivere documenti in HTML I documenti in HTML possono essere editati come semplici documenti (con estensione .htm o .html) o tramite dei programmi Nvu è un editor html molto semplice da usare, che permette di creare pagine web senza conoscere il linguaggio html, basta saper formattare le pagine NVU è open source e gratutito e si può scaricare da: http://www.nvu.com 34