PRINCIPI DI PROGRAMMAZIONE PRINCIPI DI PROGRAMMAZIONE INFORMATICA Prof. Folgieri, aa Prof. Folgieri, aa 2009 2009‐2010 2010 Università dell’Insubria ‐ Varese ALGORITMI RAPPRESENTAZIONE ALGORITMI LINGUAGGIO NATURALE Non confondere con i significati finanziari: Strategia top down. Strategia di investimento volta ad individuare i settori e le industrie dai quali ci si attende una buona performance e i titoli più appetibili al loro interno Approccio bottom-up l'investitore infatti concentra la propria attenzione su una società specifica anziché sul settore in cui la società opera o sull'economia nel suo complesso. METAFORA DELL’ALTALENA METAFORA DELL’ALTALENA (più recente) DIAGRAMMA A BLOCCHI standard DIAGRAMMA A BLOCCHI non standard • elaborazione alternativa • documento • documenti multipli • input manuale input manuale • operazione manuale • dati memorizzati • disco magnetico (supporto / ) dati/base di dati) UML CASI D’USO d descrivono il comportamento esterno di un sistema i il di i DIAGRAMMI DI CLASSE tipi di entità, relative caratteristiche, relazioni tra tipi i i di ià l i i i h l i i i i DIAGRAMMI DI SEQUENZA scenari, generici e istanze i i i i DIAGRAMMI DI COLLABORAZIONE cooperazione componenti per soluzione i i l i DIAGRAMMI DI STATO passaggi stato entità o classe i ià l PSEUDOCODICE e UTILIZZO DI PSEUDOCODICE UTILIZZO DI LINGUAGGIO DI PROGRAMMAZIONE LINGUAGGIO DI PROGRAMMAZIONE saranno chiari quando entreremo nel vivo… COMPILATORI ED INTERPRETI STRUTTURA LINGUAGGI • • • • • Inizialmente sequenziale Poi destrutturata (salti) Poi destrutturata (salti) Poi routine Poi strutturata Fino a OO Fino a OO NIDIFICAZIONE • In generale linguaggio strutturato a blocchi – Inizio‐fine programma e blocco p g • Nidificazione: STRUTTURE COMUNI ITERAZIONE E RICORSIONE Strutture viste: iterazione Ricorsione: procedura o funzione che chiama se stessa Esempio Fibonacci: Fib(n) = Fib(n - 1) + Fib(n - 2); Fib(0) = Fib(1) = 1 Esempio codice C /* questo programma calcola l’n-simo numero di Fibonacci */ /* con fib(0) = fib(1) = 1 1; fib( fib(n)) = fib( fib(n-1) 1) + fib(n-2) fib( 2) per n1 1 */ #include int fib (int x) { if ((x == 1) || (x == 0)) { return 1; } else { return fib(x-1) ( ) + fib(x-2); ( ) } } main() { int n; do { printf("Enter printf( Enter n: (0<n<20) (0 n 20) "); ); scanf( scanf("%d", %d , &n); } while ((n <= 0) || (n = 20)); printf("\n\nThe value of fib(%d) is:\t%d\n", n, fib(n)); } ALGORITMI DI BASE ALGORITMI DI BASE • da conoscere • Tra questi: ricerca di un elemento in un insieme. Diversa a seconda di come organizzato: d di i t – insieme organizzato ad elenco sequenziale, cioe` come un array, array – elementi dell'array disordinati – elementi dell'array ordinati alfabeticamente per Nome elementi dell'array ordinati alfabeticamente per Nome – elementi dell'array ordinati alfabeticamente per Numero – insieme organizzato come lista lineare i i i t li t li – insieme organizzato come albero binario (a dizionario) ARRAY • Elenco con più campi • Se non ordinato o no informazioni: ricerca sequenziale RICERCA BINARIA IN ARRAY ORDINATO per nome (ovvero: A[i].nome < = A[j].nome per 0 < = i < j < n) se si può calcolare a priori l'indirizzo di dove si trova l'i‐esimo elemento dell'array (0 < = i < n). La ricerca binaria è basata sul seguente algoritmo espresso in pseudo codice: pseudo‐codice: Per trovare una chiave in A[Sx ...Dx], Calcolare il punto di mezzo dell'elenco: Calcolare il punto di mezzo dell elenco: Mid = (Sx+Dx)/2 Mid = (Sx+Dx)/2 Guardare cosa si è trovato a metà elenco (A[Mid].Nome) Se il campo nome è quello cercato la ricerca è conclusa Se il campo nome è quello cercato, la ricerca è conclusa Altrimenti, se A[Mid] > Chiave, e se la chiave è nell'elenco e se la chiave è nell elenco, dovrà dovrà essere nella metà sinistra dell'elenco dell elenco, ovvero in A[Sx ... Mid‐1] ovvero in A[Sx Mid 1] Altrimenti, la chiave cercata non può essere che nella metà destra che nella metà destra, ovvero A[Mid+1 ... Dx] RICERCA IN ARRAY ORDINATO PER NUMERO (di telefono) Caso semplice: ricerca sequenziale. In alternativa ricerca binaria: In alternativa ricerca binaria: trovo il punto medio dell’array Se il nome è in questa posizione mi fermo altrimenti cerco Se il nome è in questa posizione mi fermo, altrimenti cerco nella metà di sinistra. In caso contrario nella metà di destra. Proviamo a scriverlo in pseudo‐codice… ORDINAMENTO DI UN VETTORE (ARRAY) Algoritmi noti: • SelectionSort l • BubbleSort • HeapSort • ShellSort • MergeSort • Per le velocità e le complessità degli algoritmi far riferimento al libro (le chiedo)