45
INFORMATICA GENERALE E BASI DI DATI PER ARCHIVI AUDIOVISIVI (PRIMO MODULO) Claudio Piciarelli A.A. 2013/2014

INFORMATICA GENERALE E BASI DI DATI PER ARCHIVI ... · INFORMATICA GENERALE E BASI DI DATI ... In un recipiente capiente montare le uova con lo ... Esistono numerosi linguaggi di

  • Upload
    hatram

  • View
    214

  • Download
    0

Embed Size (px)

Citation preview

INFORMATICA GENERALE E BASI DI DATI PER ARCHIVI AUDIOVISIVI (PRIMO MODULO)

Claudio Piciarelli

A.A. 2013/2014

L’elaborazione dell’informazione

Lezione 4

« Sono il signor Wolf, risolvo problemi »

Elaborazione dell’informazione

� Abbiamo visto fino ad ora come rappresentarel’informazione

� Ora vogliamo studiare come elaborarla per risolvere problemi

L’informatica consiste in larga parte in questo: trovare soluzioni a problemi, assicurandosi che tali soluzioni possano essere attuate da una macchina

L’informatica consiste in larga parte in questo: trovare soluzioni a problemi, assicurandosi che tali soluzioni possano essere attuate da una macchina

Modello black box

� Di fronte a molti problemi, ci limitiamo a considerare la procedura risolutiva come una scatola chiusa, che prende dei dati in input e restituisce degli output

� Noi vogliamo scoperchiare la scatola e scoprire cosa c’è dentro!

Dati in input

Dati in output

(soluzione)

ELABORAZIONEELABORAZIONE

Esempi

Due numeri x, y

x + yCalcolo della sommaCalcolo della somma

ingredienti tortaRicettaRicetta

Esempio: come fare una torta di mele

� Input: gli ingredienti

� Output: la torta

� Elaborazione: la ricetta!

Input Output

Descrivere la fase di elaborazione

Ingredienti:250 grammi di farina150 grammi di zucchero150 grammi di burro3 uovamezza bustina di lievito per dolci1 bicchierino di latte4 melezucchero a velo quanto basta

In un recipiente capiente montare le uova con lo zucchero con il battitore elettrico, quindi unire la farina, il burro fuso, il bicchierino di latte e per ultimo il lievito ed amalgamare bene. Disporre il composto in una teglia per dolci precedentemente imburrata, sbucciare le mele, tagliarle a fettine sottili e disporle con molta cura a raggera sopra al composto. Infornare a 180 gradi per circa 35 minuti; lasciar raffreddare la torta e cospargerla di zucchero a velo prima di servirla.

Ingredienti:250 grammi di farina150 grammi di zucchero150 grammi di burro3 uovamezza bustina di lievito per dolci1 bicchierino di latte4 melezucchero a velo quanto basta

In un recipiente capiente montare le uova con lo zucchero con il battitore elettrico, quindi unire la farina, il burro fuso, il bicchierino di latte e per ultimo il lievito ed amalgamare bene. Disporre il composto in una teglia per dolci precedentemente imburrata, sbucciare le mele, tagliarle a fettine sottili e disporle con molta cura a raggera sopra al composto. Infornare a 180 gradi per circa 35 minuti; lasciar raffreddare la torta e cospargerla di zucchero a velo prima di servirla.

Istruttore ed esecutore

� Abbiamo quindi un istruttore, che sa come risolvere il problema, che esprime la sua conoscenza sotto forma di sequenza di operazioni elementari che un esecutore è in grado di eseguire

cuoco ioricetta

Sa fare una tortaSa fare una tortaSo fare alcune operazioni elementari (accendere il forno, sbattere le uova…)

So fare alcune operazioni elementari (accendere il forno, sbattere le uova…)

Problemi

� Ambiguità della lingua italiana. Cosa vuol dire «montare le uova»?

� Misure imprecise: quanto grande è il bicchierino di latte? Cosa significa «zucchero a velo quanto basta»?

� Informazioni incomplete: che forma deve avere la teglia?

� Casi non contemplati: cosa devo fare se le uova sono marce?

� La ricetta può essere facilmente seguita da un essere umano, nonostante presenti numerosi problemi…

Descrivere la fase di elaborazione

� Descrivere la fase di elaborazione (la procedura risolutiva del nostro problema) consiste quindi nell’elencare una serie di operazioni elementari da effettuare in sequenza (la ricetta)

� Tuttavia siamo abituati a soluzioni incomplete e imprecise, e dobbiamo fare ricorso alle nostre conoscenze per colmare queste lacune

� Con un computer dovremo essere più rigorosi!

Elaborazione dell’informazione

� OBIETTIVO:

Esprimere la soluzione di un problema in termini di operazioni elementari, in maniera corretta, completa e non ambigua, affinché sia possibile automatizzarla(farla eseguire da un computer!)

Algoritmi e programmi

� ALGORITMO: Sistema di regole e procedure di calcolo ben definite che portano alla soluzione di un

problema con un numero finito di operazioni

� PROGRAMMA: descrizione di un algoritmo in un

linguaggio comprensibile dall’elaboratore

Istruttore ed esecutore / 2

� Torniamo allo schema istruttore/esecutore: per risolvere un problema all’elaboratore dobbiamo quindi esprimere la soluzione come sequenza di operazioni elementari eseguibili dall’elaboratore

io computerprogramma

Ma questa volta nel programma non possono esserci ambiguità

Dal problema al programma / 1

� Fase 1: analisi del problema

� Si studia il problema, lo si formula in maniera chiara e rigorosa, senza ambiguità. Si identificano gli input possibili e gli output attesi.

Dal problema al programma / 2

� Fase 2: definizione dell’algoritmo

� Si trova una procedura che risolva il problema e la si descrive sotto forma di algoritmo, ovvero come sequenza finita di operazioni elementari.

� Non esiste un modo automatico per definire gli algoritmi. Non a caso Donald Knuth ha intitolato il suo lavoro più importante «The Art of Computer Programming». Inventare algoritmi è un’arte che richiede talento, ingegno, intuizione e tanta fantasia!

Dal problema al programma / 3

� Fase 3: scrittura del programma

� I passi identificati a livello astratto dall’algoritmo vengono concretizzati come sequenza di istruzioni interpretabili da un elaboratore.

Dal problema al programma

ANALISI ALGORITMO PROGRAMMA

Il linguaggio del computer

� Ma qual è questo linguaggio compreso dal computer?

� Il processore (CPU) di un computer è il suo «cervello». E’ in grado di eseguire poche operazioni semplici (ad es. sommare due numeri)

� Ogni operazione è codificata da una sequenza di bit

� Il linguaggio macchina specifica i codici (opcodes) di ciascuna istruzione

Un programma eseguibile quindi non è altro che una lunga sequenza di bit che identifica le operazioni da eseguire e i dati su cui vanno applicateUn programma eseguibile quindi non è altro che una lunga sequenza di bit che identifica le operazioni da eseguire e i dati su cui vanno applicate

Linguaggio assembly

� Nessuno scrive programmi direttamente in linguaggio macchina. Si possono tuttavia assegnare dei nomi mnemonici ai diversi codici (linguaggio assembly) per facilitare la scrittura dei programmi. Un programma, detto assemblatore, si occupa di tradurre i comandi assembly negli equivalenti codici macchina

Linguaggio assembly

.data

first: .asciiz "Inserisci il numero: "

answ1: .asciiz "Fattoriale: "

.text

.globl main

main:

#calcola N! con N dato da tastiera

li $v0, 4 #4=print_string

la $a0, first #caricamento della stringa first come parametro

syscall #display della stringa first

li $v0, 5 #5=read_int

syscall #lettura del valore N

move $s0, $v0 #salvataggio del valore N in $s0

li $v0, 4 #4=print_string

la $a0, answ1 #caricamento della stringa answ1 come parametro

syscall #display della stringa answ1

li $s1, 1 #inizializzazione del risultato (0! = 1)

loop:

#ciclo di calcolo del fattoriale

beqz $s0,results # se s0 vale 0, allora il ciclo e' finito

mul $s1, $s1, $s0 #aggiornamento del fattoriale

addi $s0, $s0, -1 #decremento della variabile da moltiplicare

b loop #salto al loop

results:

li $v0, 1 #1=print_int

move $a0, $s1 #caricamento di N! come parametro

syscall #display di N!

li $v0, 10 #10=exit

syscall #uscita con successo

.data

first: .asciiz "Inserisci il numero: "

answ1: .asciiz "Fattoriale: "

.text

.globl main

main:

#calcola N! con N dato da tastiera

li $v0, 4 #4=print_string

la $a0, first #caricamento della stringa first come parametro

syscall #display della stringa first

li $v0, 5 #5=read_int

syscall #lettura del valore N

move $s0, $v0 #salvataggio del valore N in $s0

li $v0, 4 #4=print_string

la $a0, answ1 #caricamento della stringa answ1 come parametro

syscall #display della stringa answ1

li $s1, 1 #inizializzazione del risultato (0! = 1)

loop:

#ciclo di calcolo del fattoriale

beqz $s0,results # se s0 vale 0, allora il ciclo e' finito

mul $s1, $s1, $s0 #aggiornamento del fattoriale

addi $s0, $s0, -1 #decremento della variabile da moltiplicare

b loop #salto al loop

results:

li $v0, 1 #1=print_int

move $a0, $s1 #caricamento di N! come parametro

syscall #display di N!

li $v0, 10 #10=exit

syscall #uscita con successo

Calcolo del fattoriale di un numero nel linguaggio assembly del processore MIPS

Linguaggi di alto livello

� Oggigiorno è raro scrivere programmi in linguaggio assembly

� Più spesso si usa un linguaggio di alto livello, che in seguito viene compilato (tradotto in assembly ed infine in linguaggio macchina) mediante un programma detto compilatore

� In alternativa il linguaggio può essere interpretato (la fase di traduzione in linguaggio macchina viene eseguita «al volo» durante l’esecuzione del programma)

� Esistono numerosi linguaggi di alto livello: C, C++, Pascal, Fortran, C#, Java, Python, Ruby…

Linguaggi di alto livello

#include <stdio.h>

int main(void){

int intero, fattoriale;

intero = -1; fattoriale = 1;

while (intero < 0) {

printf("Inserire un intero non negativo: ");

scanf("%d", &intero);

}

while (intero > 0) {

fattoriale = intero * fattoriale;

--intero;

}

printf("Il fattoriale è %d\n", fattoriale);

return (0);

}

#include <stdio.h>

int main(void){

int intero, fattoriale;

intero = -1; fattoriale = 1;

while (intero < 0) {

printf("Inserire un intero non negativo: ");

scanf("%d", &intero);

}

while (intero > 0) {

fattoriale = intero * fattoriale;

--intero;

}

printf("Il fattoriale è %d\n", fattoriale);

return (0);

}

Calcolo del fattoriale di un numero nel linguaggio C

Dal problema al programma

ANALISI ALGORITMO

PROGRAMMA scritto in un linguaggio di alto

livello

PROGRAMMA scritto in linguaggio assembly

PROGRAMMA ESEGUIBILE (sequenza di

opcodes)

compilatore

assembler

� Schema aggiornato

Come descrivere gli algoritmi

� Abbiamo dunque visto che un algoritmo è una sequenza astratta di istruzioni per risolvere un problema, mentre un programma è la sua «concretizzazione» eseguibile da un computer

� Come possiamo descrivere un algoritmo? Abbiamo bisogno di:

� Variabili

� Un modo per descrivere la sequenza di operazioni

Problemi vs. istanze di problemi

� Distinguiamo tra problemi, generici, espressi in termini di alcuni parametri…

� …dalle singole istanze di quei problemi, in cui i parametri sono fissati

� Problema: sommare due numeri

� Istanze del problema: sommare 3 e 4, 19 e 7, 21 e 1…

Variabili

� Poiché un algoritmo generalmente esprime il metodo risolutivo per un problema, e non per singole istanze di problemi, si fa largo uso di variabili

� Una variabile è un «contenitore per dati» con un nome

� Esempio:

� Leggi in input due numeri x e y

� Calcola r � x + y

� Scrivi r

Variabili

� Nell’esempio di prima, x, y ed r sono variabili

� I valori contenuti nelle variabili possono essere usati in espressioni (ad es. x + y)

� Oppure è possibile assegnare un nuovo valore ad una variabile ( r � 5 )

� Grazie alle variabili un algoritmo può risolvere un problema generico, piuttosto che una sua istanza (i parametri sono memorizzati nelle variabili)

Diagrammi di flusso

inizio fine

� La sequenza di passi di cui si compone l’algoritmo è espressa mediante un diagramma che evidenzia il flusso di esecuzione (diagramma di flusso)

� Componenti dei digrammi di flusso:

Diagrammi di flusso

Operazioni di input/output

Chiedono all’utente di immettere dei dati, o visualizzano dei dati

all’utente

Selezione a due vie

Cambia il flusso di esecuzione dell’algoritmo a seconda che

la risposta ad una certa domanda sia «sì» oppure

«no»

Azione

Esegui un’azione elementare

Esempio – somma di due numeri

Es: trova il massimo tra due numeri

Pseudocodice

� Un altro modo per descrivere gli algoritmi è usare uno pseudocodice

� Simile ad un linguaggio di programmazione reale, ma astrae dai dettagli meno importanti

leggi x e yse x > y allora

scrivi «il max è x»altrimenti

se x = y allorascrivi «sono uguali»

altrimenti

scrivi «il max è y»fine

fine

leggi x e yse x > y allora

scrivi «il max è x»altrimenti

se x = y allorascrivi «sono uguali»

altrimenti

scrivi «il max è y»fine

fine

Pseudocodice per trovare il massimo tra due numeri

Correttezza degli algoritmi

� Un buon algoritmo deve funzionare correttamente su tutti gli input possibili

� Esempio: cosa non va in questo codice per il calcolo del fattoriale?

leggi n (intero non negativo)ris � nfinché n > 1 ripeti

n � n - 1ris � ris x n

fine

leggi n (intero non negativo)ris � nfinché n > 1 ripeti

n � n - 1ris � ris x n

fine

Complessità degli algoritmi

� Esistono modi diversi per risolvere lo stesso problema. Es: calcolare la somma dei primi n numeri interi

Complessità degli algoritmi

� Il primo programma esegue un ciclo per un numero di volte pari a n

� Il secondo sfrutta la formula di Gauss e risolve lo stesso problema con una sola operazione, indipendentemente da n

� Il secondo algoritmo è più efficiente (complessità minore)

� La complessità di un problema è quella dell’algoritmo più efficiente che lo risolve

Algoritmi di ordinamento

� Provate ad ordinare in modo crescente questa sequenza di numeri …

� { 5, 2, 7, 1, 12, 4, 10, 3, 6 }

� Che algoritmo avete usato?

Algoritmi di ordinamento

� Probabilmente avete usato uno dei due algoritmi più comuni per l’uomo:

� Insertion sort: prendo un elemento e lo inserisco nella posizione corretta tra i dati che ho già ordinato. Ripeto passando all’elemento successivo

� Selection sort: cerco l’elemento più piccolo e lo sposto all’inizio. Ripeto l’operazione sui dati restanti

� 5, 2, 7, 1, 12, 4, 10, 3, 6

� 5, 2, 7, 1, 12, 4, 10, 3, 6

� 2, 5, 7, 1, 12, 4, 10, 3, 6

� 2, 5, 7, 1, 12, 4, 10, 3, 6

� 1, 2, 5, 7, 12, 4, 10, 3, 6

� 1, 2, 5, 7, 12, 4, 10, 3, 6

� 1, 2, 4, 5, 7, 12, 10, 3, 6

� 1, 2, 4, 5, 7, 10, 12, 3, 6

� 1, 2, 3, 4, 5, 7, 10, 12, 6

� 1, 2, 3, 4, 5, 6, 7, 10, 12

Insertion Sort

Selection sort

� 5, 2, 7, 1, 12, 4, 0, 3, 6

� 1, 2, 5, 7, 12, 4, 10, 3, 6

� 1, 2, 5, 7, 12, 4, 10, 3, 6

� 1, 2, 3, 5, 7, 12, 4, 10, 6

� 1, 2, 3, 4, 5, 7, 12, 10, 6

� 1, 2, 3, 4, 5, 7, 12, 10, 6

� 1, 2, 3, 4, 5, 6, 7, 12, 10

� 1, 2, 3, 4, 5, 6, 7, 12, 10

� 1, 2, 3, 4, 5, 6, 7, 10, 12

Vedi anche esempi visuali su http://sorting.at/

Insertion sort - flowchart

Selection sort – flowchart

Insertion sort - pseudocodice

� 1 for j � 2 to length[A] do

� 2 key � A[j]

� 3 // Insert A[j] into the sorted sequence A[1..j-1]

� 4 i � j - 1

� 5 while i > 0 and A[i] > key do

� 6 A[i + 1] � A[i]

� 7 i � i - 1

� 8 A[i + 1] � key

Selection sort - pseudocodice

� 1 for i � 1 to length[A] do

� 2 min_idx � i

� 3 for j � i + 1 to length[A] do

� 4 if A[j] < A[min_idx]

� 5 min_idx � j

� 6 // A[min_idx]: smallest elem. in A[ i..end ]

� 7 swap A[i] ���� A[min_idx]

Insertion sort – codice C

Complessità di insertion sort

� Sia n la lunghezza del nostro array

� Al primo ciclo dobbiamo fare al massimo uno spostamento…

� Al secondo al massimo due…

� Allo n-simo ciclo al massimo n

� Numero di operazioni: al max 1 + 2 + 3 + … + n

� Complessità ��