310 likes | 452 Views
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) .
E N D
Informatica Generale Marzia Buscemibuscemi@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)
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 • Strutture di controllo: • 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 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ù formale più discorsivo
inizio progr. fine progr. 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 Es. if C then I else L begin yes no C I L 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 No d > 0 ? Si 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 xusando 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)
Leggi N Inizio I = 2 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 (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. Array di 4 valori interi (a una sola dimensione) 1 3 7 8 • Possiamo definire una tabella a due dimensioni, ad esempio per memorizzare le vendite di un prodotto in un trimestre dell’anno II III I IV 1 32 7 8 Prod 1 Array 3x4 di 12 valori interi (a due dimensioni) 9 3 3 8 Prod 2 14 3 723 82 Prod 3
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 II III I IV 1 32 7 8 Prod 1 9 3 3 8 Prod 2 14 3 723 82 Nomi delle tabelle Prod 3
Array 3 • Uso di una singola variabile : • 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) 0 2 posizione 1 3 1 3 7 8 Noi generalmente seguiremo la convenzione del linguaggio C di partire da 0 valore II III I IV X[1] 1 32 7 8 Prod 1 9 3 3 8 Prod 2 T[1][0] 14 3 723 82 Prod 3
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. 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.