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) dddd
Argomenti trattati la scorsa lezione Cos’è un programma Com’è organizzata la memoria nel calcolatore (memoria centrale e memoria di massa) Linguaggi di programmazione Linguaggio macchina Linguaggio assembler Linguaggi ad alto livello Variabili, costanti e tipi di dato
Cosa tratteremo in questa lezione Le strutture di controllo sequenza di istruzioni selezione (if .. then .. else ..) iterazione (while .. do, repeat .. while, for .. to .. do) Come si rappresentano gli algoritmi: pseudocodice diagramma di flusso Le strutture dati array
Istruzioni elementari Operazioni aritmetiche di base: somma (a+b), sottrazione (a-b), confronto (a=b oppure a==b) Operazioni di I/O: leggere da tastiera (read a), scrivere sullo schermo (write a) Operazioni di assegnamento (a := b+c oppure a=b+c)
Strutture di controllo 1 sono comuni a tutti i tipi di linguaggi di programmazione definiscono l’ordine in cui eseguire le istruzioni di un programma si dividono in tre tipi fondamentali: sequenza di istruzioni selezione (if) ripetizione (for, while, repeat)
Strutture di controllo 2 Sequenza: se S1, S2, ... , Sk sono istruzioni, allora una sequenza è: S1; S2; ... Sk; Le istruzioni sono eseguite in successione ordinata. Esempi: culinario: “mettere farina, poi aggiungere uova, ...”. linguaggio C: { x = y + 2; z = x*4; }
Strutture di controllo 3 Selezione: se E è vera allora S1 altrimenti S2 Indica la scelta tra due possibilità. Se in un caso si vogliono eseguire istruzioni in più si elimina il ramo “altrimenti” Esempi: “se avete burro scioglietelo e poi versatelo, altrimenti versate direttamente l’olio. if (a>0) a=a-1; else b=a;
Strutture di controllo 4 Ciclo condizionato (for): Esegui (S1, S2, ... , Sk) N volte Il ciclo (loop) viene eseguito n volte. Esempi: “Prendere un uovo e separare il tuorlo dall’albume. Ripetere l’operazione con altre 10 uova.” linguaggio C: for (i=1; i <=100; i++) { ... } ad ogni ciclo incrementa di 1 il valore di “i” assegna a “i” il valore 1 ripete il ciclo finché vale questa condizione
Strutture di controllo 5 Ciclo condizionato (while): Finché E, esegui (S1, S2, ... , Sk) Il ciclo (loop) viene eseguito per tutto il tempo in cui vale E. Esempi: “Finché non si è sciolto il burro, tenere il tegame sul fuoco” linguaggio C: i= 1; while (i <=100) { ... i++; }
Algoritmi e programmi Algoritmo Programma Eseguibile Codifica in un linguaggio di programmazione (C, Java, etc) Programma Input : programma Compilatore Eseguibile Output : rappresentazione comprensibile alla macchina
Algoritmi 1 Algoritmo: sequenza di azioni non ambigue che da un dato input produce un output dato un problema, descrive teoricamente la sequenza di istruzioni che devono essere eseguite per risolvere il problema viene “scritto” in un certo linguaggio di programmazione (implementazione) Il flusso di istruzioni di un algoritmo e’ regolate dalle stutture di controllo. può essere rappresentato mediante pseucodice o diagrammi di flusso le informazioni sono organizzate in modo logico, tramite le strutture di dati
Algoritmi 2 Ci sono due modi di rappresentare gli algoritmi. Lo pseudocodice: “assomiglia” (pseudo) alla sintassi (codice) usata nei linguaggi di programmazione il flusso di istruzioni è rappresentato con precisione le istruzioni sono definite “informalmente” I diagrammi di flusso: sono grafici che permettono di esprimere un algoritmo in modo preciso ed intuitivo si costruiscono a partire da blocchi “base” che rappresentano le operazioni elementari ed i costrutti di controllo i blocchi base sono collegati tramite “freccie”
Algoritmi: pseudocodice 1 Lo pseudocodice sfrutta le parole chiave e l’indentazione. Esempio informale: tipi di dato in input: latte, uova, ... tipi di dato in output: torta inizio preparazione metti farina in una casseruola; aggiungi lo zucchero; se zucchero non basta vai a comprarlo; ... finché il composto non si è amalgamato, rimescola; fine preparazione
Algorimi: pseudocodice 2 Parole chiave (possono essere in italiano, in inglese, etc.) e indentazione: Inizio e fine programma: begin, end; I/O: read (per leggere l’input), write, return, print (per scrivere l’output), Sequenza: successione di istruzioni con la stessa indentazione Selezione: if .. then .. else .. Iterazione: while .. do, repeat .. until, for .. to .. do
Algoritmi: pseudocodice 3 Esempio 1: 1. leggi i numeri x e y 2. assegna a d il valore x – y 3. se d è maggiore di zero allora scrivi x altrimenti scrivi y Esempio 2: var d: int begin read x, y; d := x – y; if d>0 then return x; else return y; end più discorsivo più formale
Algoritmi: diagrammi di flusso Sono grafici che permettono di esprimere un algoritmo in modo preciso ed intuitivo Si costruiscono a partire da blocchi base che rappresentano le operazioni elementari ed i costrutti di controllo I blocchi base sono collegati tramite ‘freccie’ blocco di istruzioni sequenziali operazioni di I/O condizione inizio progr. Es. if C then I else L fine progr. begin no yes C L I sottoprogramma end
Esempi Scrivere gli algoritmi in pseudocodice e diagramma di flusso per risolvere i seguenti problemi: Dati x e y, scrivere un algoritmo che calcoli il massimo tra x e y (usando solo sottrazione e assegnamenti) Calcolare il massimo tra 3 numeri Calcolare il massimo tra N numeri Scrivere un algoritmo che calcola il prodotto di due interi x e y (usando solo somma e assegnamenti)
Il maggiore fra 2 numeri interi x, y Algoritmo max 1. Leggi i valori di x e y dall’esterno 2. Calcola la differenza d fra x e y (d=x-y) 3. Se d è maggiore di 0 vai al passo 5 altrimenti prosegui in sequenza 4. Stampa ‘il massimo è …’ seguito dal valore di y e vai a 6 5. Stampa ‘il massimo è …’ seguito dal valore di x 6. Termina l’esecuzione
Diagramma di flusso di max Inizio Passo 1 Leggi x e y Passo 2 d = x - y Passo 3 Si d > 0 ? No Scrivi ‘max è y’ Scrivi ‘max è x’ Passo 5 Passo 4 Fine Passo 6
Il maggiore fra 3 numeri interi Possiamo sfruttare l’algoritmo max come ‘sottoalgoritmo’ Algoritmo max_3 1. Leggi i valori di x, y, z dall’esterno 2. Valuta se x> y usando l’algoritmo max 3. In caso affermativo vai al passo 5 4. Trova il massimo fra y e z (con max) e termina 5. Trova il massimo fra x e z (con max) e termina
Il massimo fra N numeri interi Possiamo ancora sfruttare l’algoritmo max come ‘sottoalgoritmo’! Idea … trovare prima il maggiore fra i primi due numeri, poi confrontare il risultato con il terzo, poi con il quarto etc … In pratica, possiamo usare la struttura di controllo iterativa while…do per effettuare le operazioni di max su tutti i numeri in ingresso
Determinare il massimo fra N numeri interi Algoritmo max_N 1. Leggi il valore di N dall’esterno 2. Leggi i primi due numeri 3. Trova il maggiore m fra i primi due numeri (con max) 4. Finchè (hai esaminato meno di N numeri) a. Leggi un nuovo numero x b. Trova il maggiore fra m e x usando l’algoritmo max c. Assegna il valore del maggiore a m 5. Stampa ‘il massimo è…’ ed il valore di m e termina
Diagramma di flusso per il problema del massimo di N numeri Inizio Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Ancora numeri da esaminare ? Si No Scrivi ‘max è m’ Leggi il nuovo numero in a Fine Supponiamo N fissato m = max(a,m)
(versione più formale) Leggi N Inizio I = 2 Leggi i primi due numeri x1 e x2 e memorizzali nelle variabili a e b m = max(a,b) Si I < N ? No I = I + 1 Scrivi ‘max è m’ DF per il problema del massimo di N numeri (versione più formale) Leggi il nuovo numero in a Fine m = max(a,m) Supponiamo N almeno 2
Prodotto di due interi positivi x e y Algoritmo prod 1. Leggi i valori di x e y dall’esterno 2. Assegna a p il valore di 0. (p=0) 3. Se y è uguale a 0 vai al passo 5 4. Assegna a p il valore p+x (p=p+x) 5. Decrementa y di 1 (y=y-1) e vai al passo 3 6. Stampa ‘il prodotto di x per y è … ’ seguito dal valore di p 7. Termina l’esecuzione
Strutture dati Tutti i linguaggi ad alto livello per la programmazione permettono di definire due tipi di aggregati di variabili (o strutture dati) array : tabelline di valori tutti dello stesso tipo record : gruppi di variabili di tipo diverso Le strutture dati seguono criteri logici e non fisici. I compilatori traducono le istruzioni che manipolano strutture dati in istruzioni che operano su locazioni di memoria.
Array Possiamo definire una sequenza lunga N es. 1 3 7 8 Array di 4 valori interi (a una sola dimensione) Possiamo definire una tabella a due dimensioni, ad esempio per memorizzare le vendite di un prodotto in un trimestre dell’anno I II III IV 1 32 7 8 Prod 1 9 3 3 8 Array 3x4 di 12 valori interi (a due dimensioni) Prod 2 Prod 3 14 3 723 82
Array 2 Come si specifica la struttura di un array? E come si usano le singole variabili nella struttura? La struttura si specifica con il tipo e l’ampiezza di ogni dimensione es : int X[4] int T[3][4] 1 3 7 8 I II III IV 1 32 7 8 Prod 1 9 3 3 8 Prod 2 Nomi delle tabelle Prod 3 14 3 723 82
Array 3 Uso di una singola variabile : X[1] T[1][0] Si specificano le coordinate della variabile desiderata Ogni elemento di ogni dimensione è identificato da un valore da 1 a N (o da 0 a N-1, dipende dal linguaggio) 1 2 3 posizione 1 3 7 8 Noi generalmente seguiremo la convenzione del linguaggio C di partire da 0 valore I II III IV X[1] 1 32 7 8 Prod 1 9 3 3 8 Prod 2 T[1][0] Prod 3 14 3 723 82
Esempi Dato un array A di interi di lunghezza N e un valore (chiave) k, scrivere un algoritmo Calc_Posiz_k (A,N) che dà in output l’indice i tale che A[i]=k. Es.: Suggerimento: provare prima usando for poi usando while.Confrontare le soluzioni. 3 9 6 5 Calc_Posiz_9(A,4) dà in output i=1 A 0 1 2 3
Esercizio proposto Dato un array A di lunghezza N, scrivere un algoritmo palindromo_N che restituisce in output True se A è palindromo, False altrimenti. N.B. Una sequenza di numeri (o caratteri) è palindroma se, letta al rovescio, rimane identica. Es.: A=011110, A=anna.