1 / 25

Informatica Generale

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 /.

etoile
Download Presentation

Informatica Generale

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 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/

  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

  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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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

  9. 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

  10. 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

  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

  12. 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

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

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

  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

  16. 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!

  17. DF e programmi DF Codifica in un linguaggio di programmazione (C, Java etc) Programma Input : programma Compilatore Eseguibile Output : rappresentazione comprensibile alla macchina

  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

  19. DF di max Inizio Leggi x e y d = x - y No d > 0 ? Si Scrivi ‘max è y’ Scrivi ‘max è x’ Fine

  20. 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 }

  21. 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

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

  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; elsereturn y; }

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

  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

More Related