250 likes | 457 Views
Informatica Generale. Susanna Pelagatti email: susanna@di.unipi.it 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 /.
E N D
Informatica Generale Susanna Pelagatti email: susanna@di.unipi.it 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/
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
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
Esempio di leggi_Na Sequenza di numeri da leggere : 8, 1, 9, 7 quindi N=4 Inizialmente X è vuoto X = Passo 1, leggo il primo numero 0 2 posizione 1 3 I=0 Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8 8 Passo 2, leggo il secondo numero 8 1 I=1 Leggo 1 e lo scrivo nella posizione 1, cioè X[1]=1 Passo 3, leggo il terzo numero 8 1 9 Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9 I=2 Passo 4, leggo il quarto numero 8 1 9 7 I=3 Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7 Termina I=4, quindi I< N non è più verificata
Input : vuoto (void) Sottoalgoritmo per la lettura di N numeri (leggi_Na) Inizio Leggi il valore di N Strutture dati: Int X[N] // la sequenza I = 0 I < N ? Si No Fine Leggi il nuovo numero in X[I] Output : Int X[N] // la sequenza letta Int N // la sua lunghezza I = I + 1
Esempio di max_Na Trova il valore m del massimo in X e la sua posizione Imax , la lunghezza di X è N=4 8 1 9 7 X = Passo 1, esamino X[0], I=0 0 2 posizione 1 3 (Valore e posizione del massimo trovato fra gli elementi già esaminati) m = 8 Imax = 0 8 1 9 7 Passo 2, esamino X[1], I=1 8 1 9 7 m = 8 Imax = 0 Passo 3, esamino X[2], I=2 8 1 9 7 m = 9 Imax = 2 Passo 4, esamino X[3], I=3 8 1 9 7 m = 9 Imax = 2 Termina I=4, quindi I< N non è più verificata
Input: Int X[N], Int N Sottoalgoritmo per la trovare il massimo di N numeri in un array (max_Na) Inizio m = X[0] Strutture dati: Int X[N] // la sequenza Imax = 0, I = 0 I < N ? Si No Output: Int m // il valore del massimo Int Imax // l’indice del massimo Fine Si m > X[i] ? I = I + 1 No m = X[i], Imax = I
Ordinare N numeri interi N=4 Max_Na = 8 in posizione 1 8 7 3 1 Scambio la posizione 1 e 4 1 7 3 8 N=3 Max_Na = 7 in posizione 2 Scambio la posizione 1 e 3 1 3 7 8 N=2 Max_Na = 3 in posizione 2 Nessuno scambio 1 3 7 8 N=1 Termina 1 3 7 8
Ordinare N numeri interi (2) • Algoritmo ordina_Na 1. Leggi il valore di N dall’esterno 2. Leggi gli N numeri della sequenza nell’array X 3. 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 3 7. Stampa X, termina
Input : vuoto (void) (X,N)=leggi_Na() Inizio Lung=N N > 1 ? Si No Stampa(X,Lung) (m,I) = max_Na(X,N) Strutture dati: Int X[N] // la sequenza T = X[N] Fine Output : vuoto (void) X[N] = X[I] DF per il problema del ordinare di N numeri (ordina_Na) X[I] = T Scambio dei due valori N = N-1
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
Record (2) • A cosa possono servire…... • A rappresentare le schede della biblioteca stringa Nome Autore stringa Cognome Autore Titolo stringa Scaffale intero Posizione intero Costo reale … altre informazioni ….. Campi del record
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 ; } ;
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";
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
Input : struct scheda archivio Ricerca ‘stupida’ (ricerca) Inizio Leggi Nome, Cognome e Titolo del libro cercato Strutture dati: struct scheda archivio // l’array di schede I = 0 I < 100000 ? Si No Fine Non l’ho trovata! archivio[I].nome = Nome archivio[I].cognome = Cognome archivio[I].titolo = Titolo ? Output : la scheda cercata e un valore (si/no) che dice se c’è No I = I + 1 Fine Si L’ho trovata!
DF e programmi DF Codifica in un linguaggio di programmazione (C, Java etc) Programma Input : programma Compilatore Eseguibile Output : rappresentazione comprensibile alla macchina
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
DF di max Inizio Leggi x e y d = x - y No d > 0 ? Si Scrivi ‘max è y’ Scrivi ‘max è x’ Fine
DF e programmi : max in C 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 }
Leggi N I = 2 Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) I < N ? Si No I = I + 1 Scrivi ‘max è m’ DF per il problema del massimo di N numeri (seconda versione) Leggi il nuovo numero in a Fine m = max(a,m) Supponiamo N almeno 2
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 ; }
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; elsereturn y; }
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 ;}
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