Scarica Espressioni Booleane e Strutture Dati: Guida Dettagliata e più Appunti in PDF di Fondamenti di informatica solo su Docsity!
_ - INTRODUZIONE:
Definizione di informatica:
Informatica: INFORmazione autoMATICA
- “Informatics : information processing” – Karl Steinbuch (1957)”
- “Scienza che studia l’elaborazione delle informazioni e le sue applicazioni; più precisamente l’informatica si occupa della rappresentazione, dell’organizzazione e del trattamento automatico della informazione” – Enciclopedia Treccani
- “Scienza che si occupa del trattamento dell’informazione mediante procedure automatizzate, avendo in particolare per oggetto lo studio dei fondamenti teorici dell’informazione, della sua computazione a livello logico e delle tecniche pratiche per la sua implementazione e applicazione in sistemi elettronici automatizzati” Wikipedia INPUT—>elaborazione dati —> OUTPUT Elaborazione automatica: insieme di processi eseguiti da un’unità elettronica/digitale automatica (elaboratore o calcolatore elettronico) su dei dati in ingresso (input) per ottenere dei risultati in uscita (output). L’insieme dei processi, routine e operazioni da eseguire deve essere comunicato all’elaboratore attraverso un linguaggio comprensibile ed eseguibile dall’elaboratore stesso (linguaggio macchina) Algoritmo: procedura per risolvere un generico problema (se risolvibile) formata da un sequenza finita di passi o istruzioni, in un tempo finito che, applicate ai dati iniziali del problema (dati in ingresso: input), li trasformano nei risultati del problema stesso (dati in uscita: output). Programma: implementazione di un algoritmo in un linguaggio comprensibile ed eseguibile dall’elaboratore, utilizzando una specifica sintassi(come è scritto “grammaticalmente”) e semantica(riguarda il significato e la logica del programma: errori nel programma che potrebbe causare la sbagliata esecuzione) del programma che caratterizzano ogni linguaggio di programmazione. Il linguaggio di programmazione utilizzato in questo contesto è il C.
Formalizzazione di un problema attraverso algoritmi
Passi necessari per creare un programma (algoritmo eseguibile dal calcolatore) per risolvere un genericoproblema:
- Analisi e modellazione del problema
- Implementazione dell’algoritmo attraverso un linguaggio formale, definendo:
- Oggetti su cui effettuare le operazioni (dati); dati in ingresso (input) e dati/risultati in uscita (output)
- Operazioni (operatori, funzioni, procedure…)
- Codifica dell’algoritmo nel linguaggio di programmazione Solitamente i linguaggi di programmazione sono cosiddetti «simbolici» e di «alto livello» • Uso di simboli per rappresentare variabili e operatori
- Elevato livello di astrazione Per essere eseguiti dal calcolatore, le istruzioni di alcuni programmi scritti in linguaggi di alto livello (come ad esempio in C) devono essere tradotte in linguaggio a «basso livello» da un programma dedicato, chiamato compilatore. Infine, per poter essere eseguite, le istruzioni in linguaggio di basso livello deve essere ulteriormente tradotte in «linguaggio macchina» da un programma chiamato assemblatore. Rappresentazione generale di un algoritmo:
Calcolo del fattoriale di un numero intero 𝑛: Un algoritmo deve essere generalizzato nel + ampio numero i casi possibili
Elementi di Logica e Algebra Booleana
- Il funzionamento di un calcolatore digitale si basa su reti logiche: insieme di dispositivi porte logiche) opportunamente connessi che implementano operazioni logiche elementari.
- L’algebra Booleana prende il nome dal matematico inglese George Boole (1815- 1864), autore del testo The mathematical analysis of logic, e fornisce un modello formale matematico per la manipolazione di espressioni ed operazioni logiche
- L’algebra Booleana è utile in molteplici contesti: dalla progettazione dei circuiti alla costruzione di condizioni logiche nei linguaggi di programmazione.
- Le espressioni Booleane o logiche operano su variabili logiche (binarie) e producono come risultato valori logici (che possono assumere solo due valori: «Vero» e «Falso», 1 e 0, «Acceso» e «Spento» ecc…)
- L’Algebra Booleana formalizza una logica proposizionale, ovvero un linguaggio formalecon struttura sintattica basata su proposizioni elementari e su operatori logici, chiamati «connettivi vero-funzionali» (AND, OR, NOT...) NOT (negazione logica): data una proposizione o variabile logica p ed un valore logico ad essa associato, l’operatore logico NOT applicato alla proposizione p restituisce il valore logico opposto OR (Disgiunzione Logica o Somma Logica): Date due (o più) proposizioni o variabili logiche (ad esempio, 𝑝1 e 𝑝2) e i valori di verità associati ad esse, l’operazione di disgiunzione o somma logica 𝑝1 OR 𝑝 2 restituisce VERO se e solo se almeno una tra le variabili (in questo caso, almeno una tra 𝑝 1 e 𝑝2) assume valore logico VERO. AND (Congiunzione Logica o Prodotto Logico): Date due (o più) proposizioni o variabili logiche (ad esempio, 𝑝1 e 𝑝2) e i valori di verità associati ad esse, l’operazione di congiunzione logica o prodotto logico 𝑝1 AND 𝑝2 restituisce VERO se e solo se tutte le variabili (in questo caso, entrambe 𝑝1 e 𝑝2) assumono valore logico VERO.
1.1.2 Operatori ed espressioni
ESPRESSIONE= combinazione di costanti e variabili tramite operatori Il calcolo di essa restituisce un valore e produce un effetto sui dati (side effect) OPERATORI= classificati per tipo di operazione:
- aritmetici : somma(+), differenza(-), prodotto(*), divisione(/), modulo(%) Il valore ricavato da essi è intuitivo
- relazionali : usati per comparare i valori minore(<), maggiore(>), minore-uguale(<=), maggiore-uguale(>=), uguale(==), diverso(!=) Es: c=a>b —> restituisce c=1 se vera, c=0 se falsa
- logici : congiunzione AND(&&), negazione NOT(!), disgiunzione OR(||)
- altro: incremento(++), decremento(- - ), assegnamento(=)—>assegna ad una variabile una espressione
1.1.3 Istruzioni
ISTRUZIONE= servono a dirigere il flusso dell’esecuzione, determinano la sequenza con cui le espressioni sono eseguite. Espressione, sequenza, compound ESECUZIONE= calcolare l’espressone producendo side-effect, e passare il controllo del flusso del programma all’istruzione successiva
a) istruzione semplice b)sequenza di due istruzioni, che é a sua volta un’istruzione c) sequenza di due istruzioni raccolte da compuond ovvero dentro { }—> questo permette di raccogliere istruzioni in blocchi ed eseguirle in maniera unitaria Condizione, Iterazione ISTRUZIONI CONDIZIONALI= permettono di decidere direzioni diverse nel flusso di esecuzione in base al valore restituito da un’espressione di controllo. if =condiziona esecuzione di un’istruzione(corpo) al risultato restituito da un’espressione(guardia) Es: If(a>b){ //se la guardia=vero eseguita istruzione tra { } b=10; // in ogni caso è eseguita l’istruzione successiva a=b+125; } Si può aggiungere clausola else che permette di avere 2 corpi eseguiti a seconda del valore restituito dalla guardia Es: If(a>b){ a=b+125; } else{ b=10; a=b+125; }
Esempi
- Calcolo fattoriale di un numero n
- Somma valori memorizzati in un array
1.2 Rappresentazione dati
Esistono 2 tipi di dati che occorre rappresentare: i tipi che codificano il testo e quelli che codificano i numeri.
1.2.1 Numeri
NUMERO=ente dotato di significato intrinseco, del quale è possibile dare rappresentazioni diverse,* che dipendono dalla combinazione di più convenzioni:
- Posizionalità della codifica
- Base di rappresentazione
- Numero di cifre che si hanno a disposizione per la rappresentazione.
- Codifica del segno
- Rappresentazione di parti frazionarie e valori razionali *Il suo significato può essere definito in riferimento alla relazione di equinumerositá tra insiemi —> es: 4(cifra)= IV(n°romano)= 0100(cod binaria) Codifica posizionale I numeri naturali sono codificati attraverso una base finita N di cifre elementari (0- 9 che formano la base decimale), che serve a rappresentare tutti i numeri combinando più cifre secondo una convenzione posizionale(Il peso delle cifre dipende dalla posizione)
Es: sfruttando aritmetica base di partenza
- Da 10 a 2 —>usando l’algoritmo dei resti successivi
- Convertiamo da 10 a 2 un n° A rappresentato su un certo numero di bit
- a0=1 solo se A è dispari, quindi a0 rappresenta il resto di A/
- Iteriamo il procedimento, ugualmente per determinare a1 consideriamo il quoziente della divisione intera A/
- si procede in maniera analogo per determinare gli altri coefficienti finché il quoziente della divisione per 2 è 0
Base esadecimale Per ottenere una codifica più compatta rispetto alla binaria di usa spesso la 16. Ci sono 16 cifre: le decimale (0-9) e A,B,C,D,E,F che rappresentano i numeri rispettivamente (10-15) È il modo più consueto per esprimere indirizzi di memoria
- Da 2 a 16 —> si trova impaccando i bit 4 a 4 (anche dalla 10 alla 16 si passa per la base 2)
- Da 16 a 2 —>si converte ogni cifra in base esadecimale nella rappresentazione a 4 bit in base 2
Consideriamo quindi un numero razionale 𝑥 minore di 1: Ovvero a1 rappresenta la parte intera di 2x Al passo successivo, sottraiamo la parte intera 𝑎1 a 2𝑥 per ottenere una nuova parte frazionaria a cui applicare iterativamente il procedimento (moltiplicazione per 2 e sottrazione della parte intera) per ricavare 𝑎2 e così via. Approccio duale rispetto al precedente algoritmo
1.2.2 Interi senza segno
Serve a rappresentare una variabile dichiarata in c come: Unsigned int a; Viene rappresentato su N bit di memoria {ai}N-^1 i=0 in forma posizionale in base 2: Rappresentazione di tutti e soli i numeri naturale i tra [0,…,2N^ - 1] compresi Il numero di bit N può variare a seconda dell’architettura della macchina, ma è comunemente uguale a 32 o 64. N=32 si possono codificare i numeri da0 a 232 - 1
1.2.3 Caratteri
Un carattere serve a rappresentare una variabile dichiarata in c come: char c; È rappresentato in memoria in base 2 su 8 bit, che codificano un numero intero senza segno tra 0 e 255. La corrispondenza tra caratteri e numeri naturali compresi nell’intervallo [0,255] è definita dalla tabella dei codici ASCII che include:
- Caratteri alfanumerici: cifre decimali, lettere maiuscole e minuscole
- Segni di interpunzione e parentesi: () ,. ; :?! + [] {} @ # …
- Simboli aritmetici: + - * / …
- Caratteri di controllo: , ,ecc…
- All’intero 0 è associato un carattere speciale “\0” utilizzato in segno di terminazione nella codifica delle stringhe
L’operazione di somma può dare origine a una condizione di overflow , che si verifica quando il risultato dell’operazione eccede la dinamica dei valori rappresentabili.
- Interi senza segno : si verifica overflow se e solo se è presente un bit di riporto nella somma dei MSB.
- Interi con segno: si verifica overflow se e solo se i due addendi sono concordi ma il segno del risultato è opposto a quello dei due addendi. L’overflow può portare ad un risultato tipico di un’aritmetica modulare: sommando 1 al massimo valore positivo si ottiene il minimo valore negativo. Es. di overflow con somma di numeri interi rappresentati su 6 bit: Con 6 bit si possono rappresentare gli interi senza segno nell’intervallo 0, 63 Con 6 bit si possono rappresentare gli interi con segno compresi tra [−32, 31]
1.2.5 Numeri in virgola mobile
La rappresentazione in virgola mobile viene utilizzata nel linguaggio C per rappresentare i numeri nei tipi float e double. Un generico numero reale può essere rappresentato in forma esponenziale: 𝑆 ∙ 𝑚 ∙ 𝐵𝑐
- 𝑺 = ±1 rappresenta il segno;
- 𝒎 è un valore reale non negativo detto mantissa;
- 𝒄 è un intero con segno detto caratteristica;
- 𝑩 è la base di rappresentazione. Esistono più rappresentazioni in forma esponenziale dello stesso numero:
- 29.15 ∙ 102 = 2.915 ∙ 103 = 291.5 ∙ 101 È necessario dunque stabilire una rappresentazione univoca. Lo standard IEEE 754 stabilisce che la rappresentazione esponenziale di un numero si dice in forma normale quando: 1 ≤ 𝑚 < 𝐵
Secondo lo standard IEEE 754, I float sono rappresentati su 32 bit:
- 1 bit per il segno s
- 23 bit per la mantissa m
- 8 bit per la caratteristica c Il segno è dato da (-1)s:
- s= 0 —> n è positivo
- s=1 —> n è negativo La mantissa in forma normalizzata in base 2: m ∈ [ 1 ,2), e può essere espressa come: La codifica di m0 può quindi essere omessa: i 23 bit disponili per la codifica della mantissa sono usati per rappresentare i bit da m1 a m23: La caratteristica 𝒄 si rappresenta in forma polarizzata (anziché in complemento a 2 come gli interi con segno). Questa rappresentazione è detta anche rappresentazione in eccesso 127: 𝑐 ∈ −(27 − 1), 27 = −127, 128 ; 𝑒 = 𝑐 + 127 ֜ 𝑒 ∈ 0, 255
- Il caso 𝑒 = 0 c = −127 , 𝑚 = 0, 𝑠 = 0 codifica il valore +0;
- Il caso 𝑒 = 0 c = −127 , 𝑚 = 0, 𝑠 = 1 codifica il valore −0;
- Il caso 𝑒 = 0 c = −127 , 𝑚 ≠ 0, 𝑠 ∈ {0,1}, rappresenta un numero denormalizzato
- Il caso 𝑒 = 255 c = 128 , 𝑚 ≠ 0, 𝑠 ∈ {0,1}, rappresenta un valore non accettabile (NaN: Not a Number);
- Il caso 𝑒 = 255 c = 128 , 𝑚 = 0, 𝑠 = 0 codifica +∞;
- Il caso 𝑒 = 255 c = 128 , 𝑚 = 0, 𝑠 = 1 codifica −∞;
- Il caso 𝑒 ∈ 1, 254 c ∈ [−126,127] , ∀ 𝑚 ∈ [1,2), 𝑠 ∈ {0,1}, rappresenta un numero normalizzato; Numeri normalizzati I numeri con caratteristica 𝒄 ∈ −𝟏𝟐𝟔, 𝟏𝟐𝟕 (ovvero 𝑒 ∈ 1, 254 ) prendono il nome di numeri normalizzati.