Calcolo della moltiplicazione Dagli Algoritmi ai Programmi Calcolo della moltiplicazione fra due numeri naturali x e y utilizzando solo operazioni di somma e sottrazione Scomposizione in sottoproblemi: Fondamenti di Informatica A 1. 2. 3. 4. 5. 6. 7. 8. 9. Ingegneria Gestionale Università degli Studi di Brescia Docente: Prof. Alfonso Gerevini Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y z←0 Se y > 0 allora vai al passo 5 altrimenti vai al passo 8 z←z+x y←y–1 Vai al passo 4 Stampa/visualizza la frase “Prodotto = ” seguita dal valore in z Fine Docente: A. Gerevini x← y← 1 z←0 2 3 4 5 6 7 8 9 10 11 12 13 14 y>0 no sì z←z+x y←y–1 ‘Prodotto =’, ← z fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 2 Esecuzione passo passo dell’algoritmo inizio Diagramma di flusso dell’algoritmo della moltiplicazione Fondamenti di Informatica A – Università di Brescia 3 Lettura di un numero e memorizzazione nella variabile x (supponiamo x=8) Lettura di un numero e memorizzazione nella variabile y (supponiamo y=3) Assegna 0 alla variabile z (che conterrà il risultato) Controllo se y > 0 Î è vero z=0+8=8 y=3–1=2 Controllo se y > 0 Î è vero z = 8 + 8 = 16 y=2–1=1 Controllo se y > 0 Î è vero z = 16 + 8 = 24 y=1–1=0 Controllo se y > 0 Î non è vero Stampa/visualizza “Prodotto = 24” Fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 4 inizio Calcolo di xy x← y← Calcolo di xy (con x e y numeri naturali) utilizzando il sottoprogramma ‘moltiplica(a,b)’ Diagramma di flusso dell’algoritmo per il calcolo di xy Scomposizione in sottoproblemi: 1. 2. 3. 4. 5. 6. 7. 8. 9. Leggi un valore dall’esterno e inseriscilo nella variabile x Leggi un valore dall’esterno e inseriscilo nella variabile y z←1 Se y > 0 allora vai al passo 5 altrimenti vai al passo 8 z ← moltiplica(z, x) y←y–1 Vai al passo 4 Stampa/visualizza la frase “xy = ” seguita dal valore in z Fine Fondamenti di Informatica A – Università di Brescia 2 3 4 5 6 7 8 9 5 Fondamenti di Informatica A – Università di Brescia y←y–1 Docente: A. Gerevini chiamata di un sottoprogramma Fondamenti di Informatica A – Università di Brescia 6 Esecuzione passo passo dell’ algoritmo (cont.) Lettura di un numero e memorizzazione nella variabile x (supponiamo x=2) Lettura di un numero e memorizzazione nella variabile y (supponiamo y=4) Assegna 1 alla variabile z (che conterrà il risultato) Controllo se y > 0 Î è vero z = moltiplica(1, 2) = 2 y=4–1=3 Controllo se y > 0 Î è vero z = moltiplica(2, 2) = 4 y=3–1=2 Controllo se y > 0 Î è vero Docente: A. Gerevini sì z ← moltiplica(z,x) fine Esecuzione passo passo dell’algoritmo 1 y>0 no ‘xy =’, ← z * il sottoprogramma ‘moltiplica(a,b)’ riceve in ingresso due numeri naturali e ne restituisce il prodotto (può essere ad esempio definito attraverso l’algoritmo precedente) Docente: A. Gerevini z←1 10 11 12 13 14 15 16 17 7 Docente: A. Gerevini z = moltiplica(4, 2) = 8 y=2–1=1 Controllo se y > 0 Î è vero z = moltiplica(8, 2) = 16 y=1–1=0 Controllo se y > 0 Î non è vero Stampa/visualizza “xy = 16” Fine Fondamenti di Informatica A – Università di Brescia 8 Calcolo del fattoriale Esercizio Calcolo del fattoriale del numero N • Scrivere l’algoritmo e il diagramma di flusso per il seguente problema: dato in ingresso un numero intero N restituire in uscita il fattoriale di questo numero, cioè il valore ottenuto da N x (N-1) x (N2) x … x 1 • Scrivere l’algoritmo controllando che il valore N in ingresso sia corretto (cioè maggiore di zero) N! = N x (N-1) x (N-2) x … x 1 Esempio: 5! = 5 x 4 x 3 x 2 x 1 = 120 Scomposizione in sottoproblemi: 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Docente: A. Gerevini 9 Fondamenti di Informatica A – Università di Brescia Leggi un valore dall’esterno e inseriscilo nella variabile N Se N <= 0 allora vai al passo 8 fattoriale ← 1 Se N > 1 allora vai al passo 5 altrimenti vai al passo 9 fattoriale ← fattoriale x N N←N–1 Vai al passo 4 Stampa/visualizza la frase “Errore nell’inserimento del valore di N” e vai al passo 10 Stampa/visualizza la frase “Fattoriale = ” seguita dal valore in fattoriale Fine Docente: A. Gerevini inizio no 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 N<=0 Diagramma di flusso dell’algoritmo del fattoriale ‘Errore nell’inserimento…’ fattoriale ← 1 no N>1 sì fattoriale ← fattoriale * N N←N–1 ‘Fattoriale =’, ← fattoriale fine Docente: A. Gerevini 10 Esecuzione passo passo dell’algoritmo N← sì Fondamenti di Informatica A – Università di Brescia Fondamenti di Informatica A – Università di Brescia 11 Lettura di un numero e memorizzazione nella variabile N (supponiamo N=4) Controllo se N <= 0 Î non è vero Assegna 1 alla variabile fattoriale (che conterrà il risultato) Controllo se N > 1 Î è vero fattoriale = 1 * 4 = 4 N=4–1=3 Controllo se N > 1 Î è vero fattoriale = 4 * 3 = 12 N=3–1=2 Controllo se N > 1 Î è vero fattoriale = 12 * 2 = 24 N=2–1=1 Controllo se N > 1 Î non è vero Stampa/visualizza “Fattoriale = 24” Fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 12 Perché gli algoritmi non bastano… Esercizio • Scrivere l’algoritmo e il diagramma di flusso per il seguente problema: l’esecutore deve leggere in ingresso una sequenza di numeri naturali (i.e. interi positivi strettamente maggiori di zero) e calcolarne (per poi stamparli) il massimo, il minimo e la media • La sequenza si interrompe non appena viene introdotto un numero negativo o uguale a zero • Per esempio, data la sequenza 5, 1, 2, 3, 4, -5, il risultato dovrebbe essere: “Il massimo è 5, il minimo è 1, la media è 3” Docente: A. Gerevini • Un algoritmo descritto con i linguaggi visti è spesso interpretabile in modo ambiguo • Non è utilizzabile da un esecutore automatico • Ad esempio, in quegli algoritmi non si parlava di: – come sono codificati i dati – come avviene l’interazione con operatori umani – problemi legati alle caratteristiche fisiche: ad es. limiti nella dimensione dei numeri rappresentabili 13 Fondamenti di Informatica A – Università di Brescia Docente: A. Gerevini Dall’analisi del problema all’esecuzione Fondamenti di Informatica A – Università di Brescia 14 Programma problema analisi • Un programma è la descrizione formale di un algoritmo attraverso un linguaggio di programmazione soluzione (informale) specifica programazione • Esempio: il sistema operativo Windows NT è composto da 4,3 milioni di righe di istruzioni che, trascritte su fogli A4, riempirebbero più di 75 mila pagine programma (alto livello) traduzione Hw Docente: A. Gerevini • Scrivere programmi è un compito complesso algoritmo (sol. formale) Fondamenti di Informatica A – Università di Brescia programma (ling. macchina) esecuzione 15 • Il calcolatore esegue i programmi passo per passo: se i passi non sono completi o non sono nell’ordine corretto, oppure se ci sono dei conflitti tra i passi, il calcolatore non sarà in grado di portare a termine il suo compito Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 16 Il lavoro dei programmatori Linguaggi di programmazione • I programmatori – – – – – Scrivono i programmi Verificano l’esecuzione dei programmi (debugging) Correggono eventuali errori Preparano le istruzioni/documentazione per gli utenti finali (manuali) Modificano programmi esistenti per aumentarne l’efficienza o per adattarli a nuove esigenze • Ora anche utenti “poco esperti di programmazione” vengono messi in grado di scrivere programmi (linguaggi “macro” e di interrogazione sono presenti in molti ambienti applicativi) • I linguaggi di programmazione (di alto livello) sono nati per consentire uno sviluppo “rapido” e “facile” di applicazioni informatiche • Permettono di descrivere l’algoritmo e le componenti più operative (es. visualizzazione dei risultati) in un formalismo che fa uso di un insieme ridotto di termini linguistici (della lingua inglese) • Con tali termini linguistici vengono formate le istruzioni che operano sui dati • Le istruzioni hanno un significato preciso e univoco Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 17 Cos’è in pratica un programma? • Un programma è dunque una sequenza di istruzioni di un linguaggio di programmazione di alto livello (ad es.: Fortran, Cobol, Basic, C, Pascal, Ada, C++, Java, Prolog, Lisp) • Un programma viene poi tradotto in linguaggio macchina per essere eseguito dal calcolatore • Ogni linguaggio di programmazione ha Sintassi + semantica • Confronteremo frammenti di programmi in C e in Basic (si vedranno analogie sintattiche e semantiche fra i due linguaggi) Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 19 Docente: A. Gerevini 18 Fondamenti di Informatica A – Università di Brescia Esempio: moltiplicazione tra numeri interi positivi Inizio Dichiarazione: a,b,w,z sono numeri a← b← w←a z←0 Sì w>0 z ← z+b w ← w-1 No ←z fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 20 Dallo pseudo-codice al programma in C Dati a, b interi positivi w, z interi Risoluzione leggi a e b z←0 w←a finchè w > 0 ripeti z←z+b w ← w –1 fine ciclo scrivi z fine Docente: A. Gerevini identificazione programma main() /* prodotto in C */ { unsigned int a, b dichiarazione int w, z; variabili scanf(“%d %d”, &a,&b); z = 0; w = a; while (w > 0) controllo { z = z + b; w = w – 1; } printf(“%d”, z); } corpo del programma Fondamenti di Informatica A – Università di Brescia 21 • Ogni variabile ha un tipo • Il tipo identifica le proprietà della variabile e le operazioni che su di essa possono essere compiute • Ogni variabile viene dichiarata prima del suo utilizzo • Dichiarazione del tipo delle variabili • Assegnamento dei valori alle variabili Fondamenti di Informatica A – Università di Brescia identificazione programma Dati a, b interi positivi w, z interi Risoluzione leggi a e b z←0 w←a finchè w > 0 ripeti z←z+b w ← w –1 fine ciclo scrivi z fine Docente: A. Gerevini ‘ prodotto in Basic dim a as integer, b as integer dim w as integer, z as integer input a, b z=0 w=a while w > 0 z=z+b w=w-1 wend print z dichiarazione variabili controllo corpo del programma 22 Fondamenti di Informatica A – Università di Brescia Dichiarazioni di variabili e assegnamento di valori Variabili e tipi Docente: A. Gerevini Dallo pseudo-codice al programma in Basic La dichiarazione della variabile ‘z’ di tipo ‘intero’ crea un contenitore per memorizzare un valore intero positivo La dichiarazione associa il nome ‘z’ a tale contenitore L’assegnamento usa il contenitore per memorizzarvi il valore 23 Docente: A. Gerevini z z Fondamenti di Informatica A – Università di Brescia 0 24 Istruzioni di ingresso/uscita e istruzioni aritmetico-logiche Le istruzioni • Le istruzioni di I/O consentono: • Il corpo del programma è composto da una sequenza di istruzioni • Nei linguaggi di programmazione si distinguono solitamente 3 tipi di istruzioni: – – – – – Istruzioni di ingresso/uscita – Istruzioni aritmetico-logiche – Istruzioni di controllo Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia l’acquisizione (ingresso) di dati dall’esterno la presentazione dei risultati in uscita in linguaggio C: scanf e printf in Basic: input e output • Le istruzioni aritmetico-logiche consentono – la manipolazione dei dati – la generazione di nuovi risultati – in quasi tutti i linguaggi sono assegnamenti 25 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 26 Esempi di utilizzo delle operazioni logiche Operazioni logiche main() { int h, i, j, k; bool b1, b2, b3; … b1 = h > j; /* b1 ← true se h è maggiore di j */ b2 = (h > j) || (j ==k); /* b2 ← true se h è maggiore di j o se j e k hanno lo stesso valore */ b3 = b1 && b2; /* b3 ← true se sia b1 che b2 sono true */ … Notare differenza fra = (per assegnamento) e == per } • Le operazioni di tipo logico fanno riferimento a variabili o costanti di tipo booleano • Somma e prodotto logici sono indicati rispettivamente con i termini OR e AND • In C: – OR corrisponde a ‘| |’ – AND corrisponde a ‘&&’ confronto (valutazione di uguaglianza fra due valori) Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 27 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 28 Istruzioni di controllo Proprietà Booleane • • • • • • • • • NOT (a OR b) =(NOT a) AND (NOT b) De Morgan NOT (a AND b) = (NOT a) OR (NOT b) De Morgan a AND (b OR c) = (a AND b) OR (a AND c) Distributiva a OR (b AND c) = (a OR b) AND (a OR c) Distributiva NOT (NOT a) = a Doppia negazione a AND b = b AND a Commutativa a OR b = b OR a Commutativa a AND (b AND c) = (a AND b) AND c Associativa a OR (b OR c) = (a OR b) OR c Associativa Docente: A. Gerevini 29 Fondamenti di Informatica A – Università di Brescia • Le istruzioni di controllo consentono di modificare il flusso di esecuzione delle istruzioni all’interno di un programma • L’esecuzione sequenziale viene alterata attraverso le istruzioni di controllo che introducono dei salti • Salto incondizionato: salto ad un certo punto del programma (identificatore) senza alcun controllo • Salto condizionato: il salto è condizionato al verificarsi di una condizione valutata durante l’esecuzione del programma Docente: A. Gerevini Selezione semplice … main() /* C */ {… Fondamenti di Informatica A – Università di Brescia Esempio di selezione semplice ‘ Basic … /* selezione semplice */ Sì if (cond) {… cond if cond then … /*blocco istruzioni */ /* eseguito solo se */ /* cond è true */ No blocco istruzioni V B←C*D C←C+1 … } … … 30 … end if A=5 F main() /* C */ { int A, B, C, D; … if (A = = 5) { B = C * D; C = C + 1; } … } ‘Basic dim A as integer, B as integer dim C as integer, D as integer … if A = 5 then B=C*D C=C+1 end if } Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 31 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 32 Esempio di selezione a 2 vie Selezione a due vie main() /* C */ {… ... Sì blocco 1 if (cond) { … /* blocco 1 */ } else { … /* blocco 2 */ } blocco 2 … } ... Docente: A. Gerevini V if cond then … else … end if … Fondamenti di Informatica A – Università di Brescia 33 Si test 1 blocco 1 Si No test 2 No blocco 2 Si blocco n test n No blocco n+1 B←B-A A←A-1 … Docente: A. Gerevini … if A > B then A=A-B B=B-1 else B=B-A A=A-1 end if … Fondamenti di Informatica A – Università di Brescia ... main() /* C */ {… /* selezione a più vie */ if (test1) { … /* blocco 1 */ } else if (test2) { … /* blocco 2 */ } … else if (testn) { … /* blocco n */ } else { … /* blocco n + 1*/ } ... } Fondamenti di Informatica A – Università di Brescia ‘Basic dim A as integer dim B as integer 34 Selezione a più vie (in Basic) Si test 1 blocco 1 Si No test 2 No blocco 2 Si blocco n ... ... Docente: A. Gerevini F A>B A←A-B B←B-1 Selezione a più vie (in C) ... main() /* C */ { int A, B; … if (A > B) { A = A - B; B = B - 1; } else { B = B - A; A = A - 1; } … } … /* selezione a 2 vie */ No cond ‘ Basic … 35 Docente: A. Gerevini test n No blocco n+1 ‘ Basic … ‘ selezione a più vie if test1 then … ‘ blocco 1 elseif test2 then … ‘ blocco 2 … elseif testn then … ‘ blocco n else … ‘ blocco n + 1 end if ... Fondamenti di Informatica A – Università di Brescia 36 Esempio di ciclo a condizione iniziale Ciclo a condizione iniziale F cond V Blocco istruzioni Docente: A. Gerevini main() /* C */ {… /* ciclo a condizione iniziale */ ‘ Basic … while (cond) { /* blocco istruzioni eseguito quando cond è vero */ } … /* eseguito quando cond è falso */ } while cond ‘ blocco istruzioni ‘ eseguito quando cond ‘ è vero Inizio J←0 I←0 I <= 10 I←I+1 J←J+I 37 blocco istruzioni Sì cond No ... ‘Basic main() /* C */ … {… /* ciclo a condizione */ /* finale */ do do ‘ blocco istruzioni { ‘ eseguito almeno /* blocco istruzioni ‘ una volta e finchè eseguito almeno ‘ cond rimane vera una volta e finchè cond rimane vera */ } while (cond) loop while cond … /* eseguito quando cond … ‘eseguito quando cond ‘ è falsa è falsa */ } ‘ Basic dim I as integer, J as integer J=0 I=0 while I <= 10 I=I+1 J=J+I wend Esercizio: cosa fa il programma? Quali sono i valori finali di I e J? Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 38 Esempio di ciclo a condizione finale Inizio Ciclo a condizione finale ... fine V wend … ‘ eseguito quando ‘ cond è falso Fondamenti di Informatica A – Università di Brescia F main() /* C */ { int I, J; J = 0; I = 0; while (I <= 10) { I = I + 1; J = J + I; } } j←1 i ← 10 j←j*i i←i-1 i>0 V F ←j main() /* C */ { int i, j; j = 1; i = 10; do { j = j * i; i = i – 1; } while (i > 0) printf(“%d”, j); } ‘Basic dim I as integer, J as integer j=1 i = 10 do j=j*i i=i-1 loop while i > 0 print j Esercizio: cosa calcola questo programma? fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 39 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 40 Ciclo For Esempio di uso del ciclo For • Si utilizza quando è noto a priori il numero di iterazioni da compiere • Ad esempio: i, n, s interi Risoluzione Algoritmo che, preso in ingresso un numero n, calcola la somma dei quadrati dei numeri compresi fra 1 e n s←0 s←0 i←1 È un ciclo a condizione iniziale for i=1 to i = n • In tutti i linguaggi è previsto un costrutto del tipo “for i=1 to n do sequenza istruzioni”… la sintassi precisa ovviamente cambia da linguaggio a linguaggio Fondamenti di Informatica A – Università di Brescia n← E se n è minore di 1? leggi n • Nell’algoritmo avrò un ciclo di n iterazioni (con n noto a priori, cioè prima di entrare nel ciclo) Docente: A. Gerevini Inizio Dati s = s + i*i V fine for s←s+i*i i←i+1 scrivi s 41 i <= n Docente: A. Gerevini F ←s fine Fondamenti di Informatica A – Università di Brescia 42 Algoritmo di Euclide per il MCD (in C) Ciclo For in C e in Basic Dati i, n, s interi Risoluzione leggi n s←0 for i=1 to i = n s = s + i*i fine for main() /* C */ { int i, n, s; scanf(“%d”, &n); s = 0; for ( i=1; i<=n; i++ ) { s = s + i*i; } printf(“%d”, s); } inizio x← y← ‘Basic no dim i as integer, n as integer dim s as integer input n s=0 for i=1 to n s = s + i*i next i print s x≠y sì sì x←x–y x>y no y←y –x main() /* MCD in C */ { int x, y; scanf(“%d”, &x); scanf(“%d”, &y); while (x != y) { if (x > y) x = x – y; else y = y - x } printf(“%d”, y) } ‘MCD =’, ← y scrivi s fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 43 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 44 Algoritmo di Euclide per il MCD (in Basic) I dati: tipi inizio x← y← no x≠y sì sì x←x–y x>y no y←y –x ‘MCD in Basic dim x as integer, y as integer input x input y while x <> y if x > y then x = x – y else y = y – x end if wend print y ‘MCD =’, ← y • Ogni variabile è caratterizzata da un tipo (oltre che dal nome e dal valore) • Il tipo specifica le operazioni di cui le variabili possono essere oggetto • Tipi predefiniti: numeri (interi, reali, …), caratteri, booleani Î normalmente previsti in tutti i linguaggi di programmazione • Esempi: – tipo int (intero) in C permette di dichiarare variabili di tipo intero – Su variabili di tipo intero saranno applicabili operatori aritmetici (+, *, -, /, …) – Il tipo booleano permette di dichiarare variabili che possono assumere solo i valori ‘vero’ e ‘falso’ (true e false) – Su variabili di tipo booleano possono essere applicate operazioni logiche, ad esempio AND (&& in C) e OR (| | in C) fine Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 45 Altri tipi Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 46 L’ "overloading" degli operatori • Uno stesso operatore (ad esempio ‘+’) può assumere significati diversi a seconda del tipo delle variabili a cui viene applicato • Previsti solo in alcuni linguaggi • Tipo ‘stringa’ per la memorizzazione di successioni di caratteri alfanumerici: esempio ‘ciao a tutti’ • Si dice che l’operatore viene ‘sovraccaricato’ di significato (operator overloading) • L’operatore ‘+’ applicato • Tipo ‘data’ per la memorizzazione di date: esempio ‘15/10/1002’ – a variabili numeriche Î ne somma i valori – a variabili di tipo stringa Î ne giustappone i valori: se x contiene ‘ciao ’ e y contiene ‘a tutti’ allora x + y conterrà la stringa ‘ciao a tutti’ – Applicato a una variabile di tipo data e a una numerica Î aggiorna la data Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 47 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 48 Esempio: somma dei guadagni di 1 anno Variabili strutturate: i vettori • Le variabili dichiarate di un tipo predefinito diventano contenitori di singoli valori • int x Î significa che la variabile x è un contenitore di un valore intero • E se volessimo memorizzare i guadagni di 12 mesi in 12 variabili? Possiamo… a) Dati n=12 intero g[ ] vettore di interi w, z interi positivi Risoluzione w←1 z←0 finchè (w <= n ) ripeti z ← z + g[w] w←w+1 fine ciclo scrivi z … dichiarare dodici variabili di tipo intero: g1, g2, …, g12 b) … oppure dichiarare un VETTORE (ARRAY) g di 12 posizioni • Ogni vettore ha un nome e un tipo e può contenere un numero stabilito n di elementi, ogni elemento è identificato da un indice che varia fra 1 e n Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 49 w = 0; z = 0; while (w < 12) { z = z + g[w]; w = w + 1; } printf (“%d, z); w=1 z=0 while w <= 12 z = z + g(w) w=w+1 wend print z Docente: A. Gerevini 50 Fondamenti di Informatica A – Università di Brescia Matrice bidimensionale • Le matrici sono array multidimensionali, cioè i cui elementi sono identificati di più indici contemporaneamente • Ogni indice identifica una dimensione della matrice • Esempio: nella gestione del magazzino di un’azienda si vuole tenere traccia, per ognuno dei suoi 50 prodotti, della disponibilità mensile Dati relativi al mese j-esimo Dati relativi al prodotto i-esimo ⇒ Usiamo una matrice d[i,j] dove i è l’indice che identifica l’iesimo prodotto (1..50) e j è l’indice che identifica il mese a cui si riferisce la disponibilità (1..12) Fondamenti di Informatica A – Università di Brescia ‘ Basic dim g(12) as integer dim w as integer dim z as integer } Variabili strutturate: matrici Docente: A. Gerevini main() /* C */ { int g[12]; int w, z; (n=50) 51 Docente: A. Gerevini d[1,1] d[1,2] d[2,1] d[2,2] … d[1,j] d[2,j] … d[1,12] d[2,12] d[i,1] d[i,2] … d[i,j] … d[i,12] d[n,1] d[n,2] … d[n,j] … d[n,12] Fondamenti di Informatica A – Università di Brescia 52 Esempio: inizializzazione della matrice d Inizio i←1 j←1 i <= 50 V j <= 12 V d[i,j] ← 0 j←j+1 Docente: A. Gerevini F fine F i←i+1 j←1 main() /* C */ { int i, j; int d[50][12]; i = 0; j = 0; while (i < 50) { while (j < 12) { d[i,j] = 0; j = j + 1; } i = i + 1; j = 0; } } For anziché While (in C) Ordine di inizializzazione d[0,0] = 0 d[0,1] = 0 d[0,2] = 0 … d[0,11] = 0 d[1,0] = 0 d[1,1] = 0 … d[1,11] = 0 … d[48,11] = 0 d[49,0] = 0 d[49,1] = 0 … d[49,11] = 0 Fondamenti di Informatica A – Università di Brescia 53 Variabili strutturate: record main() /* C */ { int i, j; int d[50][12]; i = 0; j = 0; while (i < 50) { while (j < 12) { d[i,j] = 0; j = j + 1; } i = i + 1; j = 0; } } Docente: A. Gerevini main() /* C */ { int i, j; int d[50][12]; for (i=0; i < 50; i++) for (j=0; j < 12; j++) d[i,j] = 0; } Esempio: il record “studente” • Nei vettori e nelle matrici gli elementi devono essere tutti dello stesso tipo studente • Si supponga che per ogni elemento si vogliano però memorizzare diversi dati • Ad esempio: per ogni studente si vuole memorizzare numero di matricola, nome, cognome, numero degli esami sostenuti • Tipi definiti dall’utente: a partire dai tipi di dati disponibili nel linguaggio l’utente può definire altri tipi • Una variabile avente una certa struttura definita comprende più componenti di diverso tipo • Le strutture sono dette record e i componenti campi Fondamenti di Informatica A – Università di Brescia matricola = 25891 nome = Mario cognome = Rossi num_esami = 0 definizione del tipo ‘studente’ struct studente /* in C */ { matricola; int char nome[30]; char cognome[30]; num_esami; int } • Il programmatore può definire delle strutture Docente: A. Gerevini 54 Fondamenti di Informatica A – Università di Brescia 55 Docente: A. Gerevini definizione del tipo ‘studente’ type studente ‘in Basic matricola as integer nome as string * 30 cognome as string * 30 num_esami as integer end type Fondamenti di Informatica A – Università di Brescia 56 Vettori di record e accesso diretto Dichiarazione e uso di record C Dichiarazione struct studente stud; Basic dim stud as studente Assegnamento stud.matricola = 25891; stud.matricola = 25891 Modifica stud.num_esami = stud.num_esami + 1; Docente: A. Gerevini stud.num_esami = stud.num_esami + 1 Fondamenti di Informatica A – Università di Brescia 57 I sottoprogrammi Fondamenti di Informatica A – Università di Brescia Docente: A. Gerevini type studente ‘in Basic matricola as integer nome as string * 30 cognome as string * 30 num_esami as integer end type dim s(100) as studente … s(3).num_esami = 0 … Assegna il valore 0 al numero di esami dello studente di indice 3 Fondamenti di Informatica A – Università di Brescia 58 Strutturazione in sottoprogrammi • Soluzione di problemi complessi • Lavoro di più persone in modo coordinato • La struttura dei programmi deve essere il più possibile comprensibile e modulare • Ricordate il concetto di strutturazione in sottoproblemi e di problemi elementari • I sottoprogrammi corrispondono alla soluzione di sottoproblemi • Facilitati comprensione, controllo correttezza, manutenzione Docente: A. Gerevini struct studente /* in C */ { matricola; int char nome[30]; char cognome[30]; num_esami; int }; Main() { struct studente s[100]; … s[3].num_esami = 0; … } • Ogni sottoproblema sufficientemente limitato può essere assunto come problema terminale • Per ogni problema terminale esiste un’istruzione del linguaggio che lo risolve • Per ogni sottoproblema si scrive un sottoprogramma • A questo punto è come se il linguaggio si arricchisse di nuove istruzioni… ogni nuova istruzione è la chiamata di un sottoprogramma e quindi corrisponde all’esecuzione di un sottoprogramma (una certa sequenza di istruzioni del linguaggio di programmazione) 59 Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 60 Programmi in C e Basic Esempio di uso di sottoprogrammi Dati n intero z razionale fine booleano Risoluzione fine ← false finchè (non fine) ripeti leggi w se (w > 0) z ← media(w) scrivi z altrimenti fine ← true fine condizione fine ciclo fine • Supponiamo di disporre di una matrice p contenente i valori dei fatturati relativi ai 100 prodotti di un’azienda per ogni mese dell’anno (p ha cioè 100 righe e 12 colonne) • p[i,j] contiene il fatturato del prodotto i nel mese j • Si vuole visualizzare il fatturato mensile medio di ogni prodotto specificato dall’utente attraverso l’inserimento dell’indice relativo al prodotto • Scriviamo il programma supponendo di disporre di un sottoprogramma che calcola la media Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia 61 Docente: A. Gerevini • Nello pseudo-codice e nel codice Basic, se l’utente inserisce un indice di prodotto <=0 allora l’esecuzione termina, altrimenti viene calcolata la media dei valori della riga individuata dall’indice inserito • Nel caso del C la locazione p[0,0] contiene il fatturato del primo prodotto nel mese di gennaio Îla numerazione degli indici di vettori e matrici inizia dallo zero ÎSe l’utente inserisce un indice (del prodotto) >-1 (cioè 0 o un numero positivo) allora viene fatto il calcolo della media e viene visualizzato il fatturato medio relativo al prodotto altrimenti l’esecuzione termina • In Basic, se il valore di una variabile o di una espressione è diverso da zero, allora il suo valore booleano corrispondente è “vero” (uso diffuso del valore “-1” per indicare il valore “vero”) Fondamenti di Informatica A – Università di Brescia fine = 0; while (!fine) { scanf(“%d”,&w); if (w > -1) { z = media(w); printf(“%d”,z); } else { fine = 1; } } } ? ‘ Basic dim w as integer dim z as single dim fine as integer fine = 0 while not fine input w if w > 0 then z = media(w) print z else fine = -1 end if ? wend Fondamenti di Informatica A – Università di Brescia 62 La funzione ‘media’ Note sui programmi precedenti Docente: A. Gerevini main() /* C */ { int w; float z; bool fine; 63 Funzione media(w) Dati float media(int w) i,j interi z razionale p[] matrice di interi Risoluzione { int i, j; float z; int p[100][12]; i←1e j ←0 finchè (i < 13) ripeti j ← j + (p[w, i]) i ←i + 1 fine ciclo z = j / 12 restituisci z fine funzione Docente: A. Gerevini i = 0; j = 0; while (i < 12) { j = j + p[w][i]; i = i + 1; } z = j / 12; return (z); } function media (w as integer) dim i as integer dim j as integer dim z as single dim p(100, 12) as integer i = 1: j = 0 while i <= 12 j = j + p(w, i) i=i+1 wend z = j /12 media = z end function Fondamenti di Informatica A – Università di Brescia 64 Domanda Un altro esempio di uso di sottoprogrammi • Che controllo manca nei programmi? …cosa succede se l’utente, come indice di prodotto, inserisse 120? • Nella funzione ‘media’ si va ad accedere alle locazioni p[120,i] con i che varia fra 1 e 12 (o fra 0 e 11 nel caso del C) • In ogni caso tutte queste locazioni sono al di fuori della nostra matrice! • Uno stesso sottoproblema si può presentare più volte in momenti diversi • Con i sottoprogrammi si riduce il numero delle istruzioni del programma • Invece di ripetere la stessa sequenza di istruzioni più volte si scrive un sottoprogramma e lo si richiama tutte le volte che serve • Esempio: calcolo di z = x2 + y2 • Le stesse funzioni scanf e printf del C che abbiamo visto sono sottoprogrammi disponibili in (una libreria del) C Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia Calcolo di x2 + y2 Inizio leggi xey w ←x z ←0 V w> 0 +x z ←z+ w ←w -1 F V x2 ←z w ←y z ←0 w> 0 +y z ←z+ w ←w -1 y2 ←z q ←x2+y2 I prodotti x*x e y*y sono ottenuti con somme successive Docente: A. Gerevini F scrivi “x2+ y2=q” fine 65 main() /* q = x2 + y2 */ { int x,y,x2,y2,q,w,z; scanf(“%d %d”,&x,&y); w = x; z = 0; while (w > 0) { z = z + x; w = w – 1; } x2 = z; w = y; z = 0; while (w > 0) { z = z + y; w = w - 1; } y2 = z; q = x2+y2; printf(“%d”,q); } Fondamenti di Informatica A – Università di Brescia 67 Docente: A. Gerevini 66 Fondamenti di Informatica A – Università di Brescia Funzione quad(a) Calcolo di x2 + y2 Funzione quad (a) Inizio leggi xey w←a z←0 V z ←z + a w ←w -1 Esercizio Scrivere la funzione quad in C e in Basic w> 0 F x2 ←quad(x) y2 ←quad(y) q ← x2 + y2 scrivi “x2+ y2=q” ritorna z Docente: A. Gerevini Fondamenti di Informatica A – Università di Brescia fine 68