Lucidi - Dipartimento di Informatica

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