
































Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Appunti dell'insegnamento di "Elementi di informatica e programmazione" del professore Alessandro Saetti. Includono tutti gli argomenti necessari a superare l'esame (NB. Non sono inclusi appunti riguardanti la parte di programmazione in C) sistemati, corretti, comprensibili ed esaustivi. Riepilogo degli argomenti: o Problemi e le loro soluzioni o Algoritmi e proprietà o Schemi a blocchi o La codifica dell'informazione o L'architettura del calcolatore - La macchina di Von Neumann - La struttura del processore (CPU) - Ciclo Macchina e il linguaggio macchina (vari tipi di istruzioni con esempi) - Periodo di Clock - Assembly - La memoria (gerarchia e spiegazioni dettagliate) - Interfacce di ingresso e di uscita - Tipologie di indirizzamento e sincronizzazione - Le periferiche fondamentali
Tipologia: Appunti
1 / 40
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!

































Cosa si intende per programmazione? La creazione di procedure per risolvere problemi. Si interagisce con una macchina che risolverà questi problemi. Per questo, bisogna trovare il procedimento, delle fasi, quali:
L'uomo aveva l'ambizione di creare una macchina che risolvesse per lui i problemi, che possono essere visti come una classe di domande omogenee a cui rispondere con una procedura uniforme. Troviamo vari elementi all’interno di un Problema: ● L’ Istanza è la domanda; ● La Soluzione dell’istanza ;
● Le variabili d'ingresso : descrivono il caso in esame (il problema da risolvere) → dati (valori assunti); ● Le variabili d'uscita : rappresentano la soluzione del problema → risultati (valori assunti). ● Elaborazione : avviene quando si manipolano i dati in ingresso per ottenere le variabili d'uscita P 1 : Quanto vale la radice quadrata intera Y di un numero intero positivo X? P 2 : Quanto vale la radice N-esima intera Y di un numero intero positivo X? P 3 : Quanto vale la radice quadrata intera Y di un numero positivo X? Abbiamo delle differenze sostanziali: Il problema P 2 include più variabili di P 1 (N, X, Y) mentre il problema P 3 ha le stesse variabili di P 3 ma ha un dominio più esteso (dom(P 1 ) → tutti i numeri ℤ, dom(P 3 ) → tutti i numeri ℝ).
La soluzione P 3 non è un numero, ma un procedimento. II problema può essere risolto in cinque fasi, che sono:
Problema : Quanto vale il quadrato Z di un intero positivo Y? Algoritmo :
II calcolatore è un esecutore universale di algoritmi e possiede alcune qualità superiori al calcolatore umano: ● Velocità : essenziale per ottenere risultati in tempi brevi (es. regolatore del reattore nucleare); ● Affidabilità : seppur l'uomo bravo, può anche sbagliare, quindi i risultati ottenuti non sono corretti; ● Costo : i costi dell'operatore umano tendono a salire, quello dei calcolatori a scendere. Affinché i programmi siano precisi, bisogna usare precisi elementi linguistici dell’esecutore: ● Il linguaggio che è in grado di interpretare. Ha una caratterizzazione sintattica , cioè definisce le regole di scrittura, ciò che la macchina comprende, quindi il linguaggio che l’esecutore è in grado di interpretare deve essere definito in modo completo e non ambiguo ; ● L'insieme delle azioni che è in grado di compiere. Ha una caratterizzazione pragmatica , cioè l’insieme delle azioni che l’esecutore è in grado di compiere deve essere definito e finito , e tali azioni devono essere elementari per l’esecutore; ● L'insieme delle regole che a ogni frase del linguaggio associano le relative azioni da compiere. Ha una caratterizzazione semantica , cioè definisce le regole di significato, quindi l’insieme delle
regole di associazione tra costrutti del linguaggio e azioni deve essere definito in modo completo e non ambiguo. Si può inoltre andare incontro a degli errori che possono essere di vario tipo: ● errori funzionali : se gli errori avvengono nella prima fase di identificazione, si sbaglia ad identificare il problema e questi sono difficili da risolvere; ● errori logici :
Quando si esegue un programma di parla di : ● Computazione : esecuzione di un algoritmo in corrispondenza di certi dati iniziali; ● Passo di computazione : ogni singolo passo elementare che l’esecutore compie durante una computazione; ● Processo : sequenza di passi elementari che l’esecutore compie in corrispondenza di certi dati iniziali durante l'esecuzione di un algoritmo; ● Flusso di esecuzione : ordine di esecuzione delle istruzioni. Algoritmo = concetto statico Processo = concetto dinamico → matura nel corso dell’esecuzione. Un processo può essere costituito da
Caratteristiche delle variabili: ● Hanno un nome per identificare univocamente la variabile ● Sono tipizzate , cioè è specificato un tipo di dato che possono contenere ● Hanno una locazione di memoria per conservare il dato che la variabile memorizza ● Gli può essere assegnato un solo valore ● Possono comparire in istruzioni di assegnamento ed espressioni Classificate in base a:
Le istruzioni possono essere di: assegnamento , elaborazione, controllo, ingresso o uscita, controllo del flusso di esecuzione Istruzioni di Assegnamento Sono usate per assegnare un valore, usualmente quello di un’espressione, ad una variabile o ad un elemento di vettore. Possono anche essere utilizzate per modificare i contenuti di locazione di memoria assoluta. La variabile può apparire nelle istruzioni o nell’espressione. Sono indicate con “ x← ” dove x è la variabile ( left value ) e alla destra della freccia vi è una costante/variabile/espressione ( right value ). ID ← costante variabile espressione x ← 0 y y + 1
Esistono tre tipi di espressioni: ● espressioni aritmetiche , formate da:
Un algoritmo può essere rappresentato in forma grafica attraverso gli schemi a blocchi (detti anche diagrammi di flusso o flow chart). I blocchi di input (x ←) e output (← x) hanno forme trapezoidali, per l’input si dà un valore alla variabile x, per l’output si visualizza il valore della variabile x. L’ elaborazione ha forma rettangolare, all’interno va l'istruzione di assegnamento. Le istruzioni di controllo ( selezione a 2 vie ) hanno forma di rombo con due archi uscenti, al suo interno vi è il predicato, detta anche espressione condizionale, che è composta dagli operatori relazionali/logico-relazionali. Le freccette hanno segnato Si/No oppure Vero/Falso. Il sottoprogramma è un rettangolo sbarrato, è un’operazione non elementare, indica un altro algoritmo. La funzione restituisce un valore, la procedura no! Esempi di algoritmi a schema a blocchi Problema 1. Visualizzare il massimo ( max ) tra due interi ( x e y ) acquisiti da tastiera. (La funzione max deve essere spiegata al calcolatore, strutturata e dotata di struttura a blocchi.) Algoritmo :
P 2. Visualizzare il massimo ( max ) di 10 interi acquisiti ( x ) da tastiera. Algoritmo :
Esistono dei vincoli da rispettare per progettare dei buoni programmi. Uno schema a blocchi si dice strutturato se ha schema di inizio, schema di fine e un blocco strutturato composto (BSC), che può essere una struttura di controllo (quindi selezione, controllo, ripetizione), un blocco funzionale semplice o un blocco nullo. Strutture di controllo ● Sequenza : sono dei comandi uno di seguito all’altro → operazione a cascata;
Blocco funzionale semplice (la circostanza determina la condizione) Il linguaggio degli schemi a blocchi è talmente espressivo da poter esprimere qualsiasi algoritmo. ● Potenza computazionale : ammette almeno un algoritmo per ogni problema solubile; ● Potenza espressiva : ammette tutti gli algoritmi possibili per ogni problema solubile. Tra due schemi a blocchi abbiamo differenti equivalenze: ● Equivalenza debole : due schemi a blocchi sono debolmente equivalenti se per ogni ingresso (input) danno gli stessi risultati e quindi risolvono lo stesso problema; ● Equivalenza forte : due schemi a blocchi sono fortemente equivalenti se per ogni ingresso (input) danno le stesse sequenze di computazione (sequenza di istruzioni che vengono eseguite). Forte ⇒ (implica) Debole Debole ⇏ (non implica) Forte
● Teorema di Boem-Jacopin i: per ogni SB non strutturato esiste uno SBS debolmente equivalente (ottenibile attraverso trasformazione funzionale ) ● SBS permette di risolvere ogni problema solubile Dal punto di vista funzionale SBS è potente quanto SB! ● SBS non permette di rappresentare ogni possibile algoritmo Dal punto di vista algoritmico SBS è meno potente di SB!
Esistono costrutti aggiuntivi per risolvere algoritmi in maniera più sintetica e compatta: ● Ciclo a condizione finale : iterazione per falso, se il controllo per l’arresto dell’iterazione è posto dopo il gruppo di istruzione da ripetere. ● Struttura condizionale multipla : ● Ciclo controllato da contatore : traccia le operazioni con la variabile contatore.
In informatica ciascuno di questi simboli è una cifra in base due, quindi un bit. Una sequenza di 8 bit è chiamata byte e si considerano i suoi multipli: Le unità di misura nella tabella di sinistra sono più utilizzate quando si parla di capacità di memorizzazione oppure di networking (quando acquisti una nuova memoria il venditore è interessato a utilizzare queste grandezze in quanto sono leggermente inferiori). Quando si parla invece per esempio di indirizzamento di memoria si fa più riferimento alla tabella di destra. Avendo n entità informative da codificare, di quanti simboli {0, 1} abbiamo bisogno? Esempio 1. Supponendo di voler codificare i giorni della settimana ● k = 1 → Lun, mar, mer {0} / gio, ven, sab, dom {1} ● k = 2 → Lun, mar {00} / mer {01} / ven, gio {10} / sab, dom {11} ● k = 3 → Lun {000} / mar {001} / mer {010} / gio {011} / ven {100} / sab {101} / dom {110}, ci rimane ancora una configurazione disponibile {111}, a cui possiamo non assegnare significato quindi → k = ⎡ log 2 n ⎤ e in questo caso k = ⎡log 2 7 ⎤ = 3 (N.B. ⎡⎤ significa con approssimazione per eccesso; ⎣⎦ significa con approssimazione per difetto) Esempio 2 : Se volessimo codificare una poesia, ciascuna parola si dovrà codificare con un simbolo ogni lettera, cifra o punteggiatura che possa apparire: 26 lettere minuscole + 26 lettere maiuscole + 10 cifre + 30 punteggiatura ≈ 90 → ⎡log 2 90 ⎤ = 7 bit
● ASCII (American Standard Code for Information Interchange) : Prevede successioni di 7 bit ed include anche la codifica di caratteri speciali (CANC, ESC, INVIO, ecc.) Esempio ASCII: CIAO → codifica in 7 bit per ogni lettera → 4 lettere x 7 bit = 28 bit
● Latin-1 : Estensione di ASCII basato su successioni di 8 bit con i quali è possibile rappresentare lettere accentate ● UNICODE : Basato su successioni di 16 bit che contiene simboli di altri alfabeti, altri simboli (matematici, valute, ecc.) e simboli utili per la scrittura in lingue orientali Nel calcolatore possono inoltre starci anche dei programmi, che possono essere memorizzati come:
Il significato della cifra dipende dalla posizione in cui si trova all’interno della successione di cifre Esempio: 4243 = 4 x 10^3 + 2 x 10^2 + 4 x 10^1 + 3 x 10^0 Il significato della cifra dipende dalla posizione assunta all'interno della successione delle cifre ( Notazione posizionale ). È possibile passare dalla base 2 alla base dieci, e viceversa, dando valore alle cifre con potenza di due (2n), invece di potenza di 10 (10n). (^1101) due = 1 x 10^3 due + 1 x 10^2 due + 1 x 10^1 due + 1 x 10^0 due = = 1 x 2^3 dieci + 1 x 2^2 dieci + 0 x 2^1 dieci + 1 x 2^0 dieci = 8dieci + 4dieci + 0dieci + 1dieci = (^13) dieci (^13) dieci = 1 x 10dieci^1 + 3 x 10dieci^0 = = 1due x 1010due^1 + 11due x 1010due^0 = 1010due + 11due = 1101due Questi calcoli risultano semplici ma possono diventare complessi, quindi si può usare un’altra metodologia.
Con n bit posso rappresentare 2n^ differenti entità informative. Per la rappresentazione degli interi esistono
0110 = 0 x 2^3 + 1 x 2^2 + 1 x 2 + 0 x 2^0 = = 0 + 4 + 2 + 0 = + 1010 = -1 x 2^3 + 0 x 2^2 + 1 x 2 + 0 x 2^0 = = -8 + 0 + 2 + 0 = - Con questo metodo si possono codificare numeri da -2n-1^ a +2n-1^ - 1. Es. con n = 4 bit: 1000 = -8 1111 = -1 0000 = 0 0111 = 7 Quindi, con 4 bit, posso codificare i numeri che vanno da -8 a + Metodi alternativi per ricavare il complemento a due di un numero intero negativo: Supponiamo di voler codificare un numero intero x in complemento a due con n bit ● Primo metodo
Esempio. 26 - 13 = 26 + (-13) → con 6 bit Si parla di overflow nel caso in cui si superi l’intervallo di numeri supportati dai bit, quando il risultato è troppo grande per essere rappresentato dal numero finito di bit, ma anche nel caso in cui il segno del risultato è diverso rispetto a quello aspettato. Esempio. Sommando due positivi abbiamo ottenuto un negativo: Se gli ultimi due riporti sono differenti c’è stato l’ overflow/traboccamento. Esempio. -100 - 60 = -100 + (-60) → con 8 bit