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/ 1 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 2 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 3 Esempio di leggi_Na Sequenza di numeri da leggere : 8, 1, 9, 7 quindi Inizialmente X è vuoto Passo 1, leggo il primo numero N=4 X= posizione I=0 Leggo 8 e lo scrivo nella posizione 0, cioè X[0]=8 0 1 2 3 8 Passo 2, leggo il secondo numero I=1 Leggo 1 e lo scrivo nella posizione 1, cioè X[1]=1 8 1 8 1 9 8 1 9 Passo 3, leggo il terzo numero I=2 Leggo 9 e lo scrivo nella posizione 2, cioè X[2]=9 Passo 4, leggo il quarto numero I=3 Leggo 7 e lo scrivo nella posizione 3, cioè X[3]=7 Termina I=4, quindi I< N non è più verificata 7 4 Input : vuoto (void) Inizio Leggi il valore di N Strutture dati: Int X[N] // la sequenza I=0 Si Sottoalgoritmo per la lettura di N numeri (leggi_Na) No I<N? Fine Leggi il nuovo numero in X[I] Output : Int X[N] // la sequenza letta Int N // la sua lunghezza I=I+1 5 Esempio di max_Na Trova il valore m del massimo in X e la sua posizione Imax , la lunghezza di X è N=4 Passo 1, esamino X[0], I=0 m=8 X= 8 1 posizione Imax = 0 (Valore e posizione del massimo trovato fra gli elementi già esaminati) 9 7 0 1 2 3 8 1 9 7 8 1 9 7 8 1 9 7 8 1 9 7 Passo 2, esamino X[1], I=1 m=8 Imax = 0 Passo 3, esamino X[2], I=2 m=9 Imax = 2 Passo 4, esamino X[3], I=3 m=9 Termina Imax = 2 I=4, quindi I< N non è più verificata 6 Input: Int X[N], Int N Sottoalgoritmo per la trovare il massimo di N numeri in un array (max_Na) Inizio m = X[0] Imax = 0, I = 0 Si Strutture dati: Int X[N] // la sequenza No I<N? Fine Si No m > X[i] ? I=I+1 Output: Int m // il valore del massimo Int Imax // l’indice del massimo m = X[i], Imax = I 7 Ordinare N numeri interi 8 7 3 1 N=4 Max_Na = 8 in posizione 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 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 9 Input : vuoto (void) (X,N)=leggi_Na() Inizio Si N>1? (m,I) = max_Na(X,N) T = X[N] X[N] = X[I] X[I] = T N = N-1 Lung=N No Stampa(X,Lung) Strutture dati: Int X[N] // la sequenza Fine Output : vuoto (void) Scambio dei due valori DF per il problema del ordinare di N numeri (ordina_Na) 10 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 11 Record (2) • A cosa possono servire…... – A rappresentare le schede della biblioteca stringa Nome Autore stringa Cognome Autore Titolo intero Scaffale Posizione Costo stringa intero reale … altre informazioni ….. Campi del record 12 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 ; } ; 13 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"; 14 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 15 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 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! 16 DF e programmi DF Codifica in un linguaggio di programmazione (C, Java etc) Programma Input : programma Compilatore Eseguibile Output : rappresentazione comprensibile alla macchina 17 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 18 DF di max Inizio Leggi x e y d=x-y Si No d>0? Scrivi ‘max è y’ Scrivi ‘max è x’ Fine 19 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 } 20 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 (seconda versione) m = max(a,m) Supponiamo N almeno 2 21 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 ; } 22 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; } 23 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 ;} 24 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 25