Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Appunti informatica di base della prof. Caputo, Appunti di Fondamenti di informatica

appunti del corso di informatica di base anno 2021. Voto 30L

Tipologia: Appunti

2020/2021

Caricato il 17/12/2022

valentina-maltratti
valentina-maltratti 🇮🇹

4.5

(2)

4 documenti

1 / 35

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
2 maggio 2022
Teoria dell’informazione.
LA CODIFICA DELL’INFORMAZIONE:
Cos’è l’informazione:
The word ‘information’ has been given different meanings by various writers in the general field of information
theory. It is likely that at least a number of these will prove sufficiently useful in certain applications to deserve
further study and permanent recognition. It is hardly to be expected that a single concept of information would
satisfactorily account for the numerous possible applications of this general field.
- Claude Shannon (1916-2001)
Hannon diceva che dare una definizione di informazione è complicato perché è pressoché impossibile trovare
una definizione univoca. (vengono esclusi elementi importanti).
L’informazione è ciò che viene trasmesso o rappresentato da una particolare sequenza di cose.
La scrittura come codifica dell’informazione = rispecchia una particolare organizzazione il cui obiettivo è di
trasmettere qualcosa, attraverso l’ordine delle lettere (insieme di simboli + convenzione per l’interpretazione =
informazione).
Si possono ricavare tre categorie di informazione:
- Informazione sintattica: informazione svuotata dal suo significato, rappresentazione senza il
significato. E’ la scelta dei simboli e del loro ordinamento, a prescindere dal significato.
- Informazione semantica: legata al significato dato dall’ordine dei simboli. (usiamo maggiormente)
- Informazione pragmatica: informazione derivata dall’informazione semantica legata al contesto.
L’informazione è rappresentata attraverso un’organizzazione di simboli e una convenzione per leggerli.
Codifica = operazione con cui l’informazione viene scritta su un supporto fisico
Decodifica = operazione con cui l’informazione viene letta da un supporto fisico
LA CODIFICA BINARIA:
Linguaggio informatico = come l’informazione viene rappresentata all’interno dei dispositivi informatici.
Permette di rappresentare l’informazione.
Anche i QR code sono codifica binaria che utilizza due simboli.
Gli attuali calcolatori impiegano per la memorizzazione dei dati una serie di dispositivi detti “bistabili”, in grado
di assumere costantemente una configurazione rispetto ad un’altra.
E’ un codice con solo due simboli, 0 e 1 per convenzione. (potrebbero essere altri due simboli)
Il bit come unità minima per la rappresentazione di un simbolo (0 - 1).
La scelta di tale codifica è stata aiutata dallo stato dello sviluppo tecnologico dell’epoca (nato con l’elettricità,
assenza e presenza di corrente elettrica) e dalla robustezza di un sistema rappresentato da soli 2 stati.
Esigenza di corretta interpretazione dei simboli per il dispositivo, la possibilità di errore è molto ridotta.
L’interpretazione dei numeri in forma binaria:
Notazione posizionale: ogni cifra corrisponde ad un certo ordine di grandezza. A base 10 è il metodo per
riutilizzare i simboli da 0 a 9 basandosi sulla posizione dei numeri/simboli.
Anche la codificazione è basata sulla notazione posizionale.
Si parla di rappresentazione numerica in base 2. Il numero critico di questa rappresentazione è il numero 2.
(21 è in base 10)
Rappresentazione basata sulla notazione posizionale. Si parte
dalla cifra più a destra (meno significativa).
1 in terza posizione = 2 * 2 (quanti giri nelle cifra precedenti).
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23

Anteprima parziale del testo

Scarica Appunti informatica di base della prof. Caputo e più Appunti in PDF di Fondamenti di informatica solo su Docsity!

2 maggio 2022 Teoria dell’informazione. LA CODIFICA DELL’INFORMAZIONE: Cos’è l’informazione: The word ‘information’ has been given different meanings by various writers in the general field of information theory. It is likely that at least a number of these will prove sufficiently useful in certain applications to deserve further study and permanent recognition. It is hardly to be expected that a single concept of information would satisfactorily account for the numerous possible applications of this general field.

  • Claude Shannon (1916-2001) Hannon diceva che dare una definizione di informazione è complicato perché è pressoché impossibile trovare una definizione univoca. (vengono esclusi elementi importanti). L’informazione è ciò che viene trasmesso o rappresentato da una particolare sequenza di cose. La scrittura come codifica dell’informazione = rispecchia una particolare organizzazione il cui obiettivo è di trasmettere qualcosa, attraverso l’ordine delle lettere (insieme di simboli + convenzione per l’interpretazione = informazione). Si possono ricavare tre categorie di informazione :
    • Informazione sintattica : informazione svuotata dal suo significato, rappresentazione senza il significato. E’ la scelta dei simboli e del loro ordinamento, a prescindere dal significato.
    • Informazione semantica : legata al significato dato dall’ordine dei simboli. (usiamo maggiormente)
    • Informazione pragmatica : informazione derivata dall’informazione semantica legata al contesto. L’informazione è rappresentata attraverso un’organizzazione di simboli e una convenzione per leggerli. Codifica = operazione con cui l’informazione viene scritta su un supporto fisico Decodifica = operazione con cui l’informazione viene letta da un supporto fisico LA CODIFICA BINARIA: Linguaggio informatico = come l’informazione viene rappresentata all’interno dei dispositivi informatici. Permette di rappresentare l’informazione. Anche i QR code sono codifica binaria che utilizza due simboli. Gli attuali calcolatori impiegano per la memorizzazione dei dati una serie di dispositivi detti “bistabili”, in grado di assumere costantemente una configurazione rispetto ad un’altra. E’ un codice con solo due simboli, 0 e 1 per convenzione. (potrebbero essere altri due simboli) Il bit come unità minima per la rappresentazione di un simbolo (0 - 1). La scelta di tale codifica è stata aiutata dallo stato dello sviluppo tecnologico dell’epoca (nato con l’elettricità, assenza e presenza di corrente elettrica) e dalla robustezza di un sistema rappresentato da soli 2 stati. Esigenza di corretta interpretazione dei simboli per il dispositivo, la possibilità di errore è molto ridotta. L ’interpretazione dei numeri in forma binaria : Notazione posizionale : ogni cifra corrisponde ad un certo ordine di grandezza. A base 10 è il metodo per riutilizzare i simboli da 0 a 9 basandosi sulla posizione dei numeri/simboli. Anche la codificazione è basata sulla notazione posizionale. Si parla di rappresentazione numerica in base 2. Il numero critico di questa rappresentazione è il numero 2. (21 è in base 10) Rappresentazione basata sulla notazione posizionale. Si parte dalla cifra più a destra (meno significativa). 1 in terza posizione = 2 * 2 (quanti giri nelle cifra precedenti).

Esponente base è lo 0 (=1). Calcolando il valore di ogni singola cifra, si somma. Conversione in base 10 : valore del numero in base alla sua posizione: 110 = 14 + 12 + 01 = 6 1011 = 18 + 04 + 12 + 11 = 11 LA CODIFICA ESADECIMALE: Politica molto comune per le immagini (colori). Il valore di un numero non riguarda solo il valore della cifra, ma anche la sua posizione. DA DECIMALE A BINARIO: E’ necessario pensare al concetto di divisione. Quante volte abbiamo contato fino a 2 (numero della base) per quante volte. Il resto non può mai essere superiore al numero per cui divido. Si divide per la base 2, segnando il resto = quello che rimane perchè non ha raggiunto la base. Poi li segno al contrario per individuare il numero binario. 5 = 1 2 = 0 1 = 1 0 510 = 101 2 [11+02+14] 34 = 0 17 = 1 8 = 0 4 = 0 2 = 0 1 = 1 0 3410 = 100010 2 [01+12+04+08+016+132] LA SOMMA DI NUMERI BINARI: Si possono fare tutte le operazioni, come nella base 10. Utilizziamo le operazioni in colonna, allineando da destra (cifra meno significativa). 1 + 1 in base due = 0 riporto 1

  • 11 bit per l’esponente
  • 52 bit per la mantissa LIMITI DEL CALCOLO NUMERICO su dispositivi informatici: Si ha a che fare con gli errori generati dai limiti imposti attraverso le convenzioni. ● Errori di overflow : genera errori all’interno del sistema informatico. Derivato dal limite imposto per rappresentare il numero. Il risultato di un’operazione supera il limite, fuoriesce e modifica i numeri delle operazioni precedenti. (99 + 1 = 100 > 00, l’informazione più significativa persa) ● Errori di cancellazione numerica : cancellazione del range di precisione, sempre legato al limite di cifre (0,01 - 0,0). Può comportare differenze enormi, vengono perse le cifre meno significative. ● Errori di troncamento e moltiplicazione : errore di approssimazione, meno grave degli errori precedenti (4,25 - 4,2). Riguarda i numeri maggiori di 1. La parte più significativa non si perde. L’errore corrisponde al dimenticarsi che si sta facendo un’approssimazione. Si deve cercare di spostare i troncamenti dove l’approssimazione è minore. Nella migliore delle ipotesi scompare. Più grave è se si sovrascrive ad altre cifre. https://sciencecue.it/missili-disastri-approssimazione-decimali-aritmetica-finita/2694/ Codificare in codice binario i simboli della scrittura comune o parole chiave (ad esempio il carattere speciale che indica la fine della riga) richiede l’uso di convenzioni. L’obiettivo è quello di trasmettere tutte le informazioni con componenti rappresentati da 2 STATI. Una convenzione molto conosciuta è la codifica ASCII (American Standard Code for Information Interchange), molto diffusa in passato. Ad un certo codice binario (8 cifre) corrisponde un simbolo. Altre codifiche dei caratteri testuali più recenti : UTF - Unicode Transformation Format (più convenzioni a seconda delle necessità. es caratteri)
  • UTF-
  • UTF-
  • UTF- Attualmente alla versione 13.1. [emoji introdotte dalla 6.0 😊 > con un proprio codice binario] Secondo la codifica che abbiamo visto, è possibile individuare un’unità di misura dell’informazione codificata. L’ unità elementare della codifica binaria è il bit. Un oggetto fisico si può considerare avente capacità di 1 bit quando questo può assumere, in maniera stabile, due stati distinguibili che possono essere associati rispettivamente a 0 e 1. Alcune convenzioni : 8 bit > 1 byte 1 kilobyte (KB) > 1024 bytes (2^10 bytes) 1 megabyte (MB) > 1048576 bytes (2^20 bytes) 1 gigabyte (GB) > 1073741824 bytes (2^30 bytes)

1 terabyte (TB) > 1099511627776 bytes (2^50 bytes) 1 petabyte (PB) > .... (2^50 bytes) E’ necessario che le convenzioni scelte siano adatte alle informazioni trasmesse. LA DIGITALIZZAZIONE: Altri tipi di informazione sono archiviabili nei sistemi digitali. I contenuti multimediali sono un altro comune tipo di informazione che necessita della sua codifica:

  • Suoni (e.g. brani musicali)
  • Immagini
  • Video Il processo di codifica e di conversione di una grandezza fisica (o della sua misurazione) in un informazione discreta (sequenza di bit) è chiamato digitalizzazione. Esempio: Una foto scattata con il telefono è una digitalizzazione dell'informazione luminosa passante per la lente della camera. Supponiamo di scattare una foto con un telefono che fa solo foto in scala di grigi: Il sensore dietro il sistema di lenti riceve la luce a varie intensità, in base alla luminosità dei colori degli oggetti visibili. Le ‘‘sfumature’’ che può assumere la luce in questo senso sono infinite all’interno dell’intervallo bianco-nero. Il sistema del nostro telefono, in quanto digitale, può avere solo un numero finito di colori (o di grigi nel nostro esempio). Il sistema del nostro telefono assegnerà quindi in base a un certo numero di soglie e al loro valore uno dei colori, in numero finito, a ogni parte della nostra foto (numero limitato di bit). I due estrmi (biano-nero) rappresentano i limiti dell’intervallo, il quale sarà suddiviso in sottointervalli > trasformati in valori finiti. Il processo di trasformazione di una quantità da una scala continua di valori a una discreta (intervallo finito) si dice discretizzazione (suddividere in numero finito). Il processo di discretizzazione che avviene per soglie/intervalli si dice quantizzazione. La quantizzazione è quindi un metodo di digitalizzazione (non per forza questo, attribuire ad un sottointervallo lo stesso valore = comprimendo più valori). L’informazione digitale è sempre a intervallo finito, risulterà quindi limitata rispetto a quella della realtà e meno precisa. Per codificare una grandezza fisica i cui valori si assumono variabili in un intervallo continuo, è necessaria un’operazione di discretizzazione di tali valori, attraverso un procedimento di approssimazione con uno dei valori compresi nell’insieme di quelli previsti. La quantizzazione è un processo in cui l’insieme dei valori che la grandezza può assumere viene suddiviso in un numero finito di sottoinsiemi, ognuno dei quali rappresentato mediante codifica digitale. La lunghezza della successione di bit necessaria per la codifica viene chiamata numero di bit di quantizzazione.
  • Implementazione di tecniche di compressione più o meno sofisticate. (completamente reversibili) I metodi di compressione si dividono in due grandi categorie:
  • Compressione Lossless = l’informazione viene interamente conservata. Ha il difetto di avere dei limiti: non è permesso adottare un procedimento che possa causare qualche perdita di informazione. Questa compressione deve conservare qualsiasi informazione (completamente reversibili);
  • Compressione Lossy = l’informazione principale viene conservata ma viene scartata una sua parte, idealmente la meno rilevante. Questa compressione è più efficiente per quanto si riesce a risparmiare in termini di spazio. C’è un compromesso tra l’informazione persa e una maggiore efficienza (compressione audio, variazioni meno percepibili). Tecniche basate su dizionario (schema per convertire da codice a parole, e viceversa), un esempio applicando un approccio lossless. Prendiamo come esempio i titoli dei film della nota saga di Fast & Furious: Viene analizzato il testo e si contano le parole che lo compongono. Ci sono parole ripetute frequentemente e vale la pena codificare in maniera diversa rispetto a conservare 8 bit per ogni carattere. Sostituendo i codici con le parole, si crea un problema. Bisogna considerare nella codifica dei simboli (o sequenze di questi) il problema di univocità e non sovrapposizione dei prefissi. Per univocità si intende il non avere più simboli codificati con lo stesso codice. Per non sovrapposizione dei prefissi si intende il non avere mai la codifica di un simbolo come prefisso della codifica di un altro. Una soluzione nota a questo problema è la codifica di Huffman = crea un’associazione di codici a sequenze di caratteri, per cui ogni codice assegnato a ogni sequenza non è mai il prefisso di un altro codice del dizionario. Non c’è ambiguità nell’interpretazione del codice, ma richiederà un maggior numero di cifre. Per prefisso si intende tutto il numero privato dell’ultima cifra. La lista di film compressa sarà tradotta in un codice più breve e avrà una parte di dizionario dove verranno codificate le informazioni per l’operazione di decompressione. Questo metodo, si può intuire, permette di ricostruire l’informazione originale senza perdita di informazioni. In questo senso si tratta quindi di un approccio Lossless. [dovrò scrivere almeno una volta la parola con il codice rispettivo = nel dizionario. Efficiente se più occorrenze/ripetizioni] Cose da ricordare quando si applica una compressione dei dati:
  • La quantità di dati dell’informazione compressa è uguale all’informazione effettiva compressa più l’informazione necessaria per invertire il processo di compressione e riottenere l’informazione originale. Nel nostro esempio sarà il dizionario + lista dei film compressa (informazione compressa).
  • Bisogna anche tenere a mente che dove si guadagna in spazio (ridotta quantità di dati) si perde in tempo (tempo necessario per la decompressione). Non è quindi sempre desiderabile comprimere dati. Esempio: alcuni videogiochi per console di vecchia generazione non avevano informazioni compresse per non pesare sulla velocità di calcolo.

Un caso molto comune di approccio Lossy è il metodo di compressione immagini JPEG. Si può scegliere quale grado di preservazione ottenere = metodo scalabile. L'efficienza rispetto allo spazio è altissima. Premessa sulla rappresentazione delle immagini in formato digitale: Un’ immagine non compressa (in genere in formato bitmap ) presenta l’informazione ‘completa’ del colore per ogni pixel/punto assegnando un certo numero di bit per ogni canale di colore ( RGBa , composizione red green blue alpha). Il numero di colori rappresentabili dipende quindi dal numero di bit assegnati per ogni canale. (+ bit, + simile) I passi per la compressione in formato JPEG e i suoi effetti che subiscono l’immagine):

  • Suddivisione dell’immagine in blocchi 8x8px (misura ricavata da un’euristica: non c’è una dimostrazione che il metodo funzioni, ma si ottengono buoni risultati). Per ogni blocco:
  • Cambio in dominio delle frequenze con Discrete Cosine Transform (DCT): strumento matematico, che applicato all’immagine, trasforma l’informazione come valore del colore in base alla sua posizione nella bitmap, a valori dei colori in base alla frequenza all’interno dell’immagine. Si ottiene un'altra immagine con macchie di colore, non ha senso visualizzarle. Il risultato di quest’operazione è un riarrangiamento dell’informazione, tale per cui è possibile individuare in quali bande di frequenza viene rappresentata l’informazione alla quale l’occhio umano è più suscettibile, rispetto ad altre bande di frequenza in cui viene raggruppata tutta l’informazione rispetto alla quale l’occhio umano non percepisce bene la differenza. Riordina e riorganizza l’informazione in base alla frequenza del colore. Permette di mirare alle zone con contenuto molto rilevante (occhio molto suscettibile) e non.
  • Quantizzazione pesata < Componente Lossy : l’immagine è rappresentata in base alla frequenza che raggruppa informazioni rilevanti e non. Dove l’informazione è più rilevante si mettono più intervalli, diversamente si schiaccia il sottointervallo in un unico valore quando sono meno rilevanti. L'obiettivo è togliere le variazioni piccole di colore, in quanto non siamo in grado di distinguerle. Viene scartata una parte di informazione poco rilevante. Solo in questo passo si perdono delle informazioni, ed è accettabile perché è fatta mirando alla info meno rilevante. Non taglia a fette regolari, ma schiaccia su un unico valore le informazioni meno importanti.
  • Rimozione delle ridondanze : ci sono parti quantizzate con intervalli molto larghi (poche variazioni), quindi il valore si ripete molto spesso all’interno dell’immagine e le sfumature diminuiscono. ● Codifica RLE (Run-Length Encoding) < Compressione Lossless : se un colore è ripetuto spesso dico: codice del colore e numero delle volte che verrà ripetuto, finché non cambia. Opera sostituendo a successioni di simboli uguali una rappresentazione formata dalla coppia “numero di ripetizioni, simbolo ripetuto”, che può dimostrarsi molto efficace per rappresentare informazioni poco variabili.

Una serie di ingredienti ( input ). Una serie di operazioni da effettuare con gli ingredienti (step/ passi dell’algoritmo , operazioni). Una pietanza come risultato della procedura ( output ). Tenendo a mente il parallelismo algoritmo/ricetta... Ogni passo intermedio produce un risultato parziale, modifica lo stato del sistema. Ad ogni passo, l’operazione da fare, ha come assunzione alla base che tutti i passi precedenti siano stati effettuati. L’operazione funziona sul prodotto dell’operazione precedente, quindi i passi devono essere eseguiti in ordine. Il calcolatore non ha la coscienza/conoscenza dello stato dell’intero processo, quindi è necessario assicurarsi che il risultato parziale sia scritto in una zona di memoria, in modo che nel passo successivo comprende di cosa si tratta e può procedere. Un esempio di algoritmo (pseudocodice): Determinare il maggiore tra due numeri x e y:

  1. Leggere il numero nella variabile x (variabili: zone di memoria che contengono informazioni)
  2. Leggere il numero nella variabile y
  3. Calcolare x-y e assegnarlo a una variabile z
  4. Valutare se il risultato z è maggiore di 0 4a. Se ‘si’, passare al passo 5 4b. Se ‘no’, passare al passo 6
  5. Rispondere comunicando che x è maggiore di y e andare al passo 7
  6. Rispondere comunicando che y è maggiore di x
  7. Terminare la procedura operazione di input/ingresso: 1 - 2 scritto il risultato parziale del passo intermedio: 3 procedura con due possibili direzioni/scelte: 4 (a, b unico passo) - 5/ operazione di output: 5/6 + 7 per concludere la procedura ERRORE: non è gestita una condizione per cui x-y sono uguali. Dovrebbe esserci un passo 4c. (= undefined behavior, comportamento non definito) La rappresentazione degli algoritmi tramite diagrammi di flusso è un modo più intuitivo e informativo di visualizzare un algoritmo. Mostra il flusso di esecuzione dell’algoritmo. Si tratta di un diagramma a blocchi dove ogni blocco, in base alla forma, identifica una particolare tipo di passo.

I blocchi dei diagrammi di flusso: in base allo stato del sistema viene scelto una ramo di esecuzione (branch) piuttosto che un altro = branching. [Si scompongono i branching a 3 vie in 2 da 2 rami.] (macchina ad ingranaggi è un unico passo = calcolatore, non algoritmo) Nel blocco d’azione vi è tutto quello che modifica lo stato del sistema nei passi intermedi (es. z). Il sotto-programma può essere preso e inserito in un altro diagramma (es. operazioni ripetute). Vediamo l’algoritmo visto in precedenza come sequenza di passi rappresentato ora in forma di diagramma di flusso: La possibilità di avere una zona di memoria dove inserire i risultati intermedi, rende una serie di problemi calcolabili. Un altro esempio: Prodotto tra due numeri x e y per somme ripetute

  1. Leggere il numero nella variabile x (lo usiamo come contatore)
  2. Leggere il numero nella variabile y
  3. Assegnare il valore 0 a una variabile z (operazione di inizializzazione)
  4. Valutare se x > 0 (finchè è maggiore si ripete il ciclo) 4a. Se si, andare al passo 5 4b. Se no, andare al passo 6
  5. Assegnare alla variabile z il valore di z+y, assegnare alla variabile x il valore di x-1, andare al passo 4 (si torna indietro)
  6. Rispondere che il risultato di x*y è z
  7. Terminare la procedura Vediamo il diagramma di flusso di questo algoritmo + simulazione:
  • NOT (P AND Q) = operatore logico unario (applicato su un solo operando/espressione logica) Gli operatori logici possono essere utilizzati per creare nuove espressioni logiche. (P AND Q) OR (R): Conversione: La struttura delle istruzioni condizionali IF-THEN-ELSE (key word):
  • IF (poi espressione logica valutata, logica proposizionale, non sono ammessi i quantificatori) THEN: branch nel caso l’espressione logica sia valutata come vera ELSE: branch nel caso l’espressione logica sia valutata come falsa Un’esempio di algoritmo (pseudocodice, cambio di sintassi ma non semantico): Determinare il maggiore tra due numeri x e y:
  1. Leggere il numero nella variabile x
  2. Leggere il numero nella variabile y
  3. Calcolare x-y e assegnarlo a una variabile z
  4. IF (z > 0) THEN: Go to 5 ELSE: Go to 6
  5. Rispondere comunicando che x è maggiore di y e andare al passo 9
  6. IF (z == 0) THEN: Go to 7 ELSE: Go to 8
  7. Rispondere comunicando che x è uguale a y e andare al passo 9
  8. Rispondere comunicando che x è minore di y e andare al passo 9
  9. Terminare la procedura Più chiaro:
  10. Leggere il numero nella variabile x
  11. Leggere il numero nella variabile y
  12. Calcolare x-y e assegnarlo a una variabile z
  13. IF (z > 0) THEN: Rispondere comunicando che x è maggiore di y e andare al passo 5 ELSE: IF (z == 0) THEN: Rispondere comunicando che x è uguale a y e andare al passo 5 ELSE: Rispondere comunicando che x è minore di y e andare al passo 5
  14. Terminare la procedura (indentazione: spostamente verso destra per comprendere a cosa fa riferimento, cioè quello più vicino andando a ritroso. Il programma funziona anche senza, ma è buona pratica. Risulta più chiaro.)

Per specificare che l’esecuzione di un blocco di istruzioni deve essere ripetuta N volte o finché una condizione sussiste, i linguaggi di programmazione di alto livello mettono a disposizione costrutti che istruiscono la macchina: ISTRUZIONI ITERATIVE (CICLI) : funzione controllare la ripetizione di un blocco di istruzioni

  • Permettono di iterare su una condizione (espressione logica, logica proposizionale).
  • Permettono di ripetere un branch fino al verificarsi della condizione contenuta nell’istruzione iterativa.
  • Le strutture più comuni di istruzioni iterative sono: ● FOR-DO ● WHILE-DO/REPEAT-UNTIL (alla base sono la stessa cosa) Struttura del CICLO FOR:
  • FOR: dichiarazione della variabile d’iterazione (indice/numero, che varierà ad ogni iterazione); dell’espressione logica sulla variabile d’iterazione e l’incremento della variabile di iterazione (variazione della variabile ad ogni iterazione del ciclo). L’iterazione del contenuto del DO sarà per x(variabile d’iterazione) volte. E’ utile per sapere a priori qual è il numero di iterazioni, e le trasforma in operazioni sequenziali finite.
  • DO: branch da eseguire nel caso l’espressione logica sia vera Struttura del CICLO WHILE-DO: rivaluta e ripeti
  • WHILE (valutazione dell’espressione logica)
  • DO: branch da eseguire nel caso l’espressione logica sia vera Non si stabilisce una variabile di iterazione, ma viene inserita un'espressione logica finchè non verrà valutata come falsa. (no garanzia della variazione) Struttura del CICLO REPEAT-UNTIL: ripeti finché un’espressione non diventa vera. Resto nel ciclo finchè è falsa.
  • REPEAT: branch da eseguire nel caso l’espressione logica sia vera
  • UNTIL (valutazione dell’espressione logica) Esempi: Prodotto tra due numeri x e y per somme ripetute
  1. Leggere il numero nella variabile x
  2. Leggere il numero nella variabile y
  3. Assegnare il valore 0 a una variabile z (etichetta z a cui associare 0)
  4. FOR (x; x > 0; x=x-1) DO : Assegnare alla variabile z il valore di z+y
  5. Rispondere che il risultato di x*y è z
  6. Terminare la procedura Se vi fosse scritto x+1, e arriveremo ad aver utilizzato tutte le cifre assegnate per la memorizzazione del numero x = errore di overflow. E’ molto utile alla macchina perché anticipa i risultati della computazioni future ancora prima che vengano eseguite. Prodotto tra due numeri x e y per somme ripetute
  7. Leggere il numero nella variabile x
  8. Leggere il numero nella variabile y
  9. Assegnare il valore 0 a una variabile z
  10. WHILE (x > 0) DO : Assegnare alla variabile z il valore di z+y, assegnare alla variabile x il valore di x-

luci <- TRUE il THEN è implicito ELSE luci <- FALSE L’idea è che prenda la decisione combinando due condizioni = quando entrambe le condizioni si verificano. L’espressione logica è più complessa, composta da due proposizioni e l’operatore AND (vero se entrambe sono vere). Esempi messi in pratica : Compilatore : apparato che si occupa di interpretare i passi degli algoritmi, traduce ciò che noi scriviamo in un linguaggio comprensibile alla macchina, Si tratta di una traduzione che non cambia il significato semantico di ciò che scriviamo ma cambia solamente la sintassi. Commenti : righe arancioni che la macchina ignora ma che sono utili al programmatore per annotarsi le cose. Linguaggio C++:

  • int ”: tipo di numeri dato alla macchina (in questo caso interi)
  • cin ” = input: inserisce un valore nella variabile x (poi y), per far sapere il primo numero da moltiplicare;
  • cout ” = output: è un messaggio dato all’utente
  • For = indica la condizione;
  • Do = indica la cosa da fare ogni volta che si ripete il For; Si usa il primo numero per contare quante volte sommare Y a se stesso;
  • Z = viene usata per accumulare i risultati;
  • Quando l’algoritmo raggiunge il “r eturn 0 ”, esso raggiunge il termine della procedura. Non si intende un ritorna ma un restituisci il valore. La variabile di iterazione è più comunemente chiamata contatore, perché si usa per contare quante volte verrà ripetuto per se stesso. Work round per simulare il funzionamento, cioè simula il tasto fisico di accensione. Per convenzione si assegna il valore 1 a true e 0 a false. Altro esempio:
  • Bool on = on (T/F): si riferisce a un valore di tipo logico; I LINGUAGGI DI PROGRAMMAZIONE: Ci sono vari modi per categorizzare i linguaggi ma la categorizzazione principale è tra: COMPILATI : Il compilatore ‘traduce’ il codice scritto dal linguaggio di programmazione in linguaggio macchina. L’algoritmo è un programma compilato che può essere poi eseguito dalla macchina. La traduzione viene fatta in blocco, ovvero il compilatore legge l’intero linguaggio e poi ne fa una traduzione. Il programma sorgente viene fornito in ingresso a un programma di traduzione “compilatore” che genera un nuovo programma “eseguibile” equivalente al primo e codificato nel linguaggio eseguibile dalla CPU.
  • Pro: Non occorre ricompilare il codice per eseguire più volte lo stesso algoritmo/programma, basta avere la sua versione compilata. Una volta che viene fatto l’intervento non c’è bisogno di ripeterlo perché il compilatore lo traduce direttamente e la traduzione può essere riutilizzata più volte per eseguire lo stesso algoritmo/ programma.
  • Contro: Il codice ‘tradotto’ è tradotto per una specifica architettura (l’HW della macchina sul quale deve essere eseguito) e necessita di essere ricompilato per altri tipi di HW. A quel punto, l’interprete dovrà riascoltare il messaggio e tradurlo nella “lingua” adatta a quel tipo di hardware, diverso dal precedente. Se troviamo un programma scritto con linguaggio compilato, diventa ovvio il fatto che bisogna avere diverse versioni del programma perché la traduzione avviene diversamente per ogni macchina. Il linguaggio compilato non è universale. Il traduttore mette insieme codici che daranno vita a un messaggio in linguaggio macchina. Nel linguaggio compilato, a questo punto, non si avrà più la versione originale del messaggio stesso. Spesso non è possibile ritradurre il messaggio da linguaggio macchina a linguaggio originale. E’ quindi più difficile copiare la proprietà intellettuale (questo linguaggio la protegge). INTERPRETATI :

LIMITI DELLA CALCOLABILITA’:

Immaginiamo di giocare a un nuovo gioco da tavolo con i nostri amici. I pezzi di questo gioco sono tessere del domino un po’ particolari. Le tessere hanno delle sequenze di lettere invece di numeri sui due lati e, visto che è la prima volta che giochiamo, per semplicità usiamo solo tessere che hanno sequenze A e B. A ogni round si usano 4 tessere pescate a caso (numero di esempio, minimo 2). Possibili tessere del nostro domino: Il gioco ci chiede se possiamo, con le tessere date, costruire una serie (anche usando la stessa tessera più volte) in maniera tale da avere la stessa sequenza sopra e sotto. Possiamo vedere come alcuni set di tessere non abbiano soluzione. Immaginiamo che le tessere di un round siano le seguenti: (sequenza superiore più lunga di quella sotto) Poiché siamo fiduciosi dei poteri straordinari degli algoritmi decidiamo di ragionare in maniera algoritmica per vincere a questo gioco. Idea di algoritmo (pseudocodice):

  1. Assegna a una variabile soluzione il valore ‘FALSE’ (valore di tipo logico)
  2. Assegna a una variabile c il valore 1 (limite della lunghezza delle combinazioni)
  3. WHILE (soluzione == FALSE) DO: prova tutte le combinazioni di tessere lunghe c IF (riga sopra == riga sotto) DO: assegna a soluzione il valore TRUE, rispondi con la sequenza di tessere vincente ELSE: assegna a c il valore di c+1 (aumentiamo la lunghezza delle combinazioni)
  4. Termina la procedura Notiamo però che qualcosa manca nel nostro algoritmo, cioè una condizione che ci possa dire quando la soluzione non esiste per un certo set di tessere. Per l’esempio visto del set senza soluzione possiamo ipotizzare di aggiungere dei passi al nostro algoritmo che vadano a verificare che il numero di lettere nella parte superiore di ogni tessera non sia sempre superiore al numero di lettere nella parte inferiore (e viceversa).

Ci sono però altri set di tessere possibili che non hanno il problema del set senza soluzione visto nell’esempio, ma per i quali non vi è una condizione verificabile a priori. Cioè non vi è una proprietà identificabile ‘banalmente’ dalle proprietà delle singole tessere per la quale è possibile dire che non esiste soluzione. A questo punto potrebbe sembrare logico esigere l’esibizione di un esempio di set di tessere per le quali non c’è né soluzione, né la possibilità di verificarlo. Ma questo è esattamente il problema della decidibilità , cioè per affermare qualcosa sull’esistenza o meno di una soluzione per un set di tessere bisogna avere un modo per verificarlo. Quindi, non si può avere un esempio di tessere per il quale abbiamo sia verificato che non ammette soluzione e che al tempo stessa sia un set la cui assenza di soluzione sia NON verificabile. Esistono però delle dimostrazioni in grado di provare almeno l’esistenza di tali set di tessere. La computabilità: Tesi di Church-Turing: «Un problema è decidibile se esiste un algoritmo per una MdT (Macchina di Turing) che lo risolve». Macchina di Turing: Un modello astratto di calcolatore in grado di eseguire algoritmi ed elaborati dati su un ‘nastro’ di memoria potenzialmente infinito. Modello ipotetico, astratto. Facilità le dimostrazioni della decidibilità o meno di un problema (il problema persiste). Una MdT è comparabile a un qualsiasi moderno calcolatore (computer) con ‘in più’ la possibilità di processare una quantità infinita di dati (memoria infinita). Le stesse dimostrazioni possono essere fattibili anche con il computer. Se abbiamo un problema e riusciamo a scrivere un algoritmo, in qualche linguaggio di programmazione, che è in grado di dare risposta, allora il problema è decidibile. IMPLICAZIONI RILEVANTI: Non tutti i problemi sono decidibili. Dei problemi non decidibili :

  • Alcuni problemi sono semi-decidibili (es. domino)
  • I restanti sono indecidibili In particolare:
  • La logica proposizionale (formule logiche dove si usano le proposizioni) è decidibile. Per questo si usano nei costrutti.
  • La logica al primo ordine (es. per ogni) è semi-decidibile. Ci si limita nel suo uso nel linguaggio di programmazione.