Informatica Generale

25
1 Informatica Generale Susanna Pelagatti email: [email protected] Ricevimento: Mercoledì ore 14.30-17.30 presso Dipartimento di Informatica, Via Buonarroti, 2 stanza 346 DE Tel. 050.2212.772 o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~susanna/IG02/

description

Informatica Generale. Susanna Pelagatti email: [email protected] Ricevimento: Mercoledì ore 14.30-17.30 presso Dipartimento di Informatica, Via Buonarroti, 2 stanza 346 DE Tel. 050.2212.772 o per posta elettronica Pagina web del corso: http://www.di.unipi.it/~susanna/IG02 /. - PowerPoint PPT Presentation

Transcript of Informatica Generale

Page 1: Informatica Generale

1

Informatica GeneraleSusanna Pelagatti email: [email protected]

Ricevimento: Mercoledì ore 14.30-17.30presso Dipartimento di Informatica, Via Buonarroti, 2stanza 346 DE Tel. 050.2212.772o per posta elettronica

Pagina web del corso: http://www.di.unipi.it/~susanna/IG02/

Page 2: Informatica Generale

2

La scorsa lezione … • Abbiamo introdotto le strutture dati array• Abbiamo iniziato a vedere un esempio di utilizzo di array : l’algoritmo per ordinare N numeri

• Oggi : – completiamo l’esempio – parliamo di record– riprendiamo il discorso della codifica dei programmi in C

Page 3: Informatica Generale

3

Usiamo gli array ...

• Costruiamo una versione dell’algoritmo che ordina N numeri che usa un array int X[N]per memorizzare i numeri della sequenza

da ordinare• Vediamo prima 2 sottoalgoritmi

– leggi_Na che legge i numeri da ordinare e li inserisce nell’array X

– max_Na che trova il valore del massimo numero in X e la sua posizione

Page 4: Informatica Generale

4

Esempio di leggi_Na

8

Inizialmente X è vuoto

Passo 1, leggo il primo numero

I=0 Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8

Termina

Sequenza di numeri da leggere : 8, 1, 9, 7 quindi N=4

Passo 2, leggo il secondo numero8 1I=1 Leggo 1 e lo scrivo nella posizione 1, cioè X[1]=1

8 1 9 7

Passo 3, leggo il terzo numero

I=2 Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9 8 1 9

Passo 4, leggo il quarto numero

I=3 Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7

X =

0 1 2 3posizione

I=4, quindi I< N non è più verificata

Page 5: Informatica Generale

5

I < N ?

Inizio

Fine

Si No

Leggi il nuovo numero in X[I]

Sottoalgoritmo per lalettura di N numeri (leggi_Na)

Leggi il valore di N

I = 0

I = I + 1

Strutture dati: Int X[N] // la sequenza

Input : vuoto (void)

Output : Int X[N] // la sequenza lettaInt N // la sua lunghezza

Page 6: Informatica Generale

6

Esempio di max_Na 8 1 9 7

8 1 9 7

Passo 1, esamino X[0], I=0

m = 8 Imax = 0

Termina

Trova il valore m del massimo in X ela sua posizione Imax ,la lunghezza di X è N=4

Passo 2, esamino X[1], I=1 8 1 9 7

8 1 9 7

Passo 3, esamino X[2], I=2 8 1 9 7

Passo 4, esamino X[3], I=3

X =

0 1 2 3posizione

I=4, quindi I< N non è più verificata

(Valore e posizione del massimo trovato fra gli elementi già esaminati)

m = 8 Imax = 0

m = 9 Imax = 2

m = 9 Imax = 2

Page 7: Informatica Generale

7

I < N ?

Inizio

Fine

Si No

Sottoalgoritmo per latrovare il massimodi N numeri in un array(max_Na)

Imax = 0, I = 0

I = I + 1

Strutture dati: Int X[N] // la sequenza

m = X[0]

Input: Int X[N],Int N

Output: Int m // il valore del massimoInt Imax // l’indice del massimom > X[i]

?

Si

No

m = X[i], Imax = I

Page 8: Informatica Generale

8

Ordinare N numeri interi

8 7 3 1

1 3 7 8

1 7 3 8

N=4 Max_Na = 8 in posizione 1

Scambio la posizione 1 e 4

N=3 Max_Na = 7 in posizione 2

Scambio la posizione 1 e 3

N=2 Max_Na = 3 in posizione 2

Nessuno scambio1 3 7 8

Termina1 3 7 8

N=1

Page 9: Informatica Generale

9

Ordinare N numeri interi (2)• Algoritmo ordina_Na

1. Leggi il valore di N dall’esterno2. Leggi gli N numeri della sequenza nell’array X3. Trova il maggiore (m, imax) fra i primi N numeri dell’array X (con max_Na)4. Scambia fra loro X[imax] e X [N]5. Considera adesso solo i primi N-1 numeri dell’array (N=N-1)6. Se N = 1 continua, altrimenti vai al passo 37. Stampa X, termina

Page 10: Informatica Generale

10

N > 1 ?

Inizio

Fine

Si No

(X,N)=leggi_Na()

(m,I) = max_Na(X,N)

DF per il problema delordinare di N numeri(ordina_Na)

Strutture dati: Int X[N] // la sequenza

T = X[N]

X[N] = X[I]

Input : vuoto (void)

Stampa(X,Lung)

X[I] = T

N = N-1

Lung=N

Output : vuoto (void)

Scambiodei due valori

Page 11: Informatica Generale

11

Record• Finora abbiamo visto solo variabili di tipo intero• Normalmente è possibile avere variabili di tipo diverso che rappresentano informazioni di natura diversa :

– 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

Page 12: Informatica Generale

12

Record (2)• A cosa possono servire…...

– A rappresentare le schede della biblioteca

Nome Autore

Cognome Autore

Titolo

Scaffale

Posizione

… altre informazioni …..

stringa

stringa

stringa

intero

intero

Campi del record

Costo reale

Page 13: Informatica Generale

13

Record (3)• Il tipo record scheda espresso in C

struct scheda { char nome[100]; //stringa di al più //100 caratteri char cognome[100]; char titolo[300]; int scaffale; int posizione; double costo ;} ;

Page 14: Informatica Generale

14

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";

Page 15: Informatica Generale

15

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 il nostro algoritmo ‘stupido’ per la ricerca nello schedario

Page 16: Informatica Generale

16

I < 100000 ?

Inizio

Fine

Si No

Ricerca ‘stupida’ (ricerca)

I = 0

I = I + 1

Strutture dati: struct scheda archivio // l’array di schede

Input : struct schedaarchivio

Output : la scheda cercata e un valore (si/no) che dice se c’è

Leggi Nome, Cognome e Titolo del libro cercato

archivio[I].nome = Nome archivio[I].cognome = Cognome

archivio[I].titolo = Titolo?

Si Fine

No

L’ho trovata!

Non l’ho trovata!

Page 17: Informatica Generale

17

DF e programmiDF

Codifica in un linguaggio diprogrammazione (C, Java etc)

Programma

Compilatore

Input : programma

Output : rappresentazione comprensibile alla macchina

Eseguibile

Page 18: Informatica Generale

18

DF e programmi (2)• L’eseguibile dipende dalla macchina che dobbiamo

specializzare (es. processore Intel, o processore SUN), dal sistema operativo (es. Windows, Linux …) e dal linguaggio usato (es: C o Java)

• Gli eseguibili di alcuni linguaggi (come Java) contengono operazioni complesse che non possono essere eseguite direttamente!

• In questo caso si utilizza un programma interprete (es Java Virtual Machine) che realizza le operazioni elementari complesse

Page 19: Informatica Generale

19

DF di max

d > 0 ?

Inizio

Fine

Leggi x e y

Si No

d = x - y

Scrivi ‘max è x’ Scrivi ‘max è y’

Page 20: Informatica Generale

20

DF e programmi : max in Cmain() /* calcola max */{int x, y, d; //def. Delle variabili scanf ("%d %d”, &x, &y) ; //lettura x,yd = x - y ;if (d > 0) //scrittura risultati printf (”il max è %d”, &x) ; else printf (”il max è %d”, &y) ;return ; //terminazione}

Page 21: Informatica Generale

21

I < N ?

Inizio

Fine

Leggi i primi due numeri x1 e x2e memorizzali nelle variabili a e b

Si No

Leggi il nuovo numero in a

Scrivi ‘max è m’

m = max(a,b)

m = max(a,m)

DF per il problema delmassimo di N numeri (seconda versione)

Leggi N I = 2

I = I + 1

Supponiamo N almeno 2

Page 22: Informatica Generale

22

DF e programmi : 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 ;}

Page 23: Informatica Generale

23

DF e programmi : 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;}

Page 24: Informatica Generale

24

DF e programmi : 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 ;}

Page 25: Informatica Generale

25

Esercizi proposti• Dare il DF per il sottoalgoritmo stampa_Na• Trovare un algoritmo (e fornire il DF) per i seguenti

problemi :– trovare la somma dei primi K numeri (K letto dall’esterno)– trovare la media di una sequenza di numeri positivi (la

sequenza viene letta dall’esterno e si interrompe al primo numero negativo letto)

– leggere una data (un record che indica giorno, mese ed anno) e stampare il numero di giorni passati dall’inizio dell’anno