Informatica Generale
Marzia Buscemi
buscemi@di.unipi.it
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