Sei sulla pagina 1di 10

Appunti dal corso Fondamenti di Informatica (9 CFU) del prof.

Porfirio Tramontana
Luca Marseglia, DIETI, 2018

Gli appunti sono tutti battuti a macchina e sono divisi per argomenti, in base alle
lezioni tenute dal professore.

Nelle ultime pagine sono presenti gli algoritmi più importanti, tra i quali c'è anche
la spiegazione passo passo per l'algoritmo di inserimento della lista a puntatori,
argomento secondo me più ostico di tutto il corso.
Prova orale 21 dicembre 2018

Nota: ​le seguenti domande sono state sottoposte a quattro persone. Viene generalmente fatta
qualche domanda sulla parte di teoria (compresa la parte precedente alla prova intercorso) e poi
chiesto un algoritmo scritto a penna.

Domande di teoria

1. Che cosa avviene in memoria quando vengono allocati dinamicamente tre elementi?
1. Che vantaggio ha questo sistema rispetto ad altri?
2. Rispetto agli array conviene di più se la lista è lunga o breve?
3. Per quali due motivi conviene di più farlo con un’array?
4. Quanto spazio avrei occupato in memoria facendolo con un’array?
5. Nel caso di una lista?
6. Per quanto riguarda il tempo, la lista è più o meno vantaggiosa e perché?

Spiegazione della domanda 1


Array -​ ​Al calcolatore serve solo l'indirizzo iniziale quindi a partire da quello scorre gli elementi uno
dopo l'altro. Per questo gli elementi che lo compongono devono stare affiancati in memoria
Liste - ​Possono anche giostrati conoscendo solo l'indirizzo iniziale, ma il vantaggio che offrono
rispetto agli array è che la loro dimensione può essere variabile. Questo avviene grazie al fatto che
gli elementi che le compongono non vengono affiancati in memoria, ma sono sparsi. Ciò implica
che ogni elemento ha un indirizzo a sé per essere trovato

Dunque per lo spazio sono più vantaggiosi gli array in quanto il calcolatore memorizza solo
l'indirizzo iniziale
Per il tempo sono più vantaggiose le liste in quanto, proprio per il fatto che ogni elemento ha il suo
indirizzo personale, il calcolatore non ha bisogno di scorrere tutti gli elementi della lista per arrivare
a quello desiderato, a differenza degli array.

2. Quali sono i vantaggi di aver inserito i bus nel modello di Von Neumann?
3. Interrupt service routine.
4. Discutere del problema della calcolabilita partendo dalla definizione di algoritmo.
5. Che cos'è la Macchina di Turing?
1. Quali sono le macchine che non sanno risolvere gli algoritmi che sa risolvere
Turing?
6. Che ha di vantaggioso la rappresentazione in complementi alla base?
7. Esporre tutta la teoria della trattabilità
1. Qual è la migliore tipologia di algoritmo di ricerca?
Algoritmi

1. Data una lista a puntatori, eliminare tutti gli elementi dispari


2. Scrivere una funzione che inserisce un elemento in una lista a puntatori ordinata crescente
3. Scrivere una funzione per inserire un elemento in un’array ordinata crescente
4. Dato un array di char in ordine anti-alfabetico, creare una funzione di ricerca binaria
5. Dato un array ordinato crescente di elementi, cancellare tutti gli elementi più piccoli di un
elemento dato in input
6. Data una lista a puntatori, scrivere una funzione che ne inverta l’ordine degli elementi
7. Dato un elemento in input, scrivere l’algoritmo per inserirlo in una qualsiasi posizione
all’interno di una lista a puntatori

Spiegazione dell’algoritmo 7

Innanzitutto bisogna cercare la posizione in cui si vuole inserire l'elemento. Una volta trovata, si
inserisce l’elemento in quella posizione, sfruttando l’indirizzo al quale si è arrivati.

L’algoritmo base è il seguente:

while(...) {
lista* e = new lista;
e->numero = 6;
e->prossimo = ​p​;
​p​ = e;
}

Una possibile soluzione a quello richiesto potrebbe essere invece questa:

while(...) {
q = q->prossimo;
}

lista* e = new lista;


e->numero = 6;
e->prossimo = ​q->prossimo;
q->prossimo​ = e;
Nel primo mese del corso viene svolta la parte toerica, al termine della quale viene svolta la prova
intercorso, mentre gli ultimi due mesi coprono tutta la parte di programmazione, con qualche
esercitazione extra-corso nei laboratori di Agnano.

Programma parte teorica

1. Introduzione
2. Logica
○ Proposizioni semplici e composte
○ Operatori di relazione >, <, ==, !
○ Congiunzione AND, Inclusiva OR, Esclusiva XOR, Negazione NOT
○ Calcolo proposizionale
3. Algebra di Boole <D={0,1}, +, *, ___, min=0, max=1>
○ Proprietà
■ Commutativa
■ Associativa
■ Distributiva
■ Idempotenza
■ Elemento neutro
■ Complemento
■ Minimo e massimo
■ Assorbimento
○ Principio di Dualità
○ Legge di De Morgan
4. Codifica dell'informazione
○ Tipo, cardinalità, valore, attributo
○ Insieme binario
○ Quantità di informazione Q
○ Numero di bit necessario (funzione ​ceiling)​ N
5. Rappresentazioni
○ Valori logici
○ Caratteri
■ ASCII
■ ASCII esteso
■ Unicode
○ Decimali, Binari, Esadecimali
■ Interconversioni
■ Operazioni sui numeri binari
■ Campo di esistenza e ​Overflow
○ Binari relativi
■ Rappresentazione in complementi alla base
■ Proprietà (complemento della somma)
■ Interconversione ​decimale negativo a binario​ e viceversa
■ Algoritmi per farlo
■ Osservazioni (pro, contro, overflow)
○ Binari reali
■ Metodo a virgola fissa
■ Metodo a virgola mobile (​floating point)
■ Mantissa, esponente, base
■ Regola di normalizzazione
■ Underflow​ e Denormalizzazione
○ Precisione
■ Errore assoluto
■ Erroe relativo
○ Standard IEEE 754
■ Precisione singola e doppia
○ Conversione audio, immagine e video
6. Architettura di Von Neumann
○ Modello primario
○ Modello primario + memoria
■ Processore CPU
■ Algoritmo di Von Neumann
■ Tipi di registri
■ Memoria centrale RAM
■ Tipi di Bus
■ Tipi di Clock
■ Parallelismo
■ Altri tipi di Memoria
■ Esecuzione di un programma
■ Operazione di caricamento
■ Sistema delle interruzioni
■ Time sharing
■ Gerarchie delle memorie
■ Cache
■ Virtuale
7. Programmi
○ Proprietà
○ Realizzazione
■ Editing
■ Traduzione
■ Precompilazione
■ Compilazione
■ Analisi lessicale, sintattica e semantica
■ Sintesi
■ Linking
■ Caricamento
■ Esecuzione

Programma parte pratica


1. Concetti base 8. Funzioni
2. Array 9. Parametri
3. Stringhe 10. Ricorsione
4. Matrici 11. Trattabilità
5. Struct 12. Librerie
6. Puntatori 13. File
7. Allocazione dinamica
Introduzione

Questa parte non necessita di particolare attenzione in quanto vengono introdotti pochi concetti
base.
2. Logica

Per descrivere un algoritmo al calcolatore si fa uso della ​logica delle proposizioni​, che consiste
nella scelta, secondo regole precise, tra due opzioni, VERO o FALSO.
Una ​proposizione​ è un'affermazione per la quale è possibile stabilire se essa sia vera o falsa.
Una proposizione per la quale non è possible farlo viene detta ​indeterministica​.
Le proposizioni per le quali è possibile una scelta tra sole due opzioni è detta ​semplice​, che
possono combinarsi attraverso delle ​congiunzioni​, a formare delle p. ​composte​.
Il ​calcolo proposizionale si basa sulle precedenze come i segni nell'aritmetica, che sono: ​NOT
--> AND --> OR e XOR.
E (AND) - Vera se vere entrambi
O (OR) - Vera se almeno una vera
O... O... (XOR) - Vera se e solo se una vera

P Q AND OR XOR

F F F F F

F V F V V

V F F V V

V V V V F

P NOT P

V F

F V
3. Algebra di Boole

L'​Algebra booleana è un metodo alternativo per il calcolo proposizionale e costituisce la base


sulla quale vengono costruiti i calcolatori.

● E' un insieme costituito di soli due elementi D = {0, 1}


● In esso sono definite le operazioni di ​addizione​ e ​moltiplicazione
● E' anche definito il ​complemento
● Sono definiti il min = 0, e il max = 1

Il campo dell'algebra booleana si indica con <D={0,1], +, *, ___, min=0, max=1}.

0 0 0 0

0 1 1 0

1 0 1 0

1 1 1 1

0 1

1 0

Si osservi il parallelo con la Logica, in particolare:


Addizione = OR
Moltiplicazione = AND
Complemento = NOT

Il ​complemento​ è definito come "la quantità che manca per arrivare al massimo dell'insieme".
Possiamo così definire, equivalentemente, l'insieme dell'Algebra di Boole in termini logici:
<D={V,F}, OR, AND, NOT, min=F, max=V}.

PROPRIETA'
Le dimostrazioni sono immediate in quanto sono tutte uguali all'algebra normale. Cambia solo il
fatto che quando si somma 1, il risultato è in ogni caso 1 perché:

● 0+1=0
● 1 + 1 = 1 (col resto di 1)

Esaminiamo dunque quella dell'idempotenza perché compaiono solo lettere ed è dunque la più
generale:

● A+A=A
○ 1 + 1 = 1 (col resto di 1)
○ 0+0=0
● A*A=A
○ 1*1=1
○ 0*0=0

Commutativa, associativa
Le stesse per l'algebra normale

Complemento

Idempotenza

Elemento neutro

Minimo e massimo

Trucco per ricordarsi le prime quattro: si presentano quando c'è la somma o prodotto di un numero
per sé stesso (o complemento) o per 0/1

Distributiva

Attenzione alla seconda che è diversa da quella per l'algebra normale.


Dimostrazione:
(A + B)(A + C) = AA + AC + AB + BC =
per la proprietà dell'idempotenza si ha AA = A:
= A + AC + AB + BC = A(1 + C + B) + BC =
per la proprietà del massimo si ha 1 + (B + C) = 1:
= A + BC
Assorbimento

DIM della prima:


A + AB = A(1 + B) = A [per il massimo]

DIM della seconda:


A(A + B) = AA + AB =
A + AB [per l'idempotenza] =
A(1 + B) [per il massimo] = A

Principio di dualità

Esprime la simmetria tra somma e moltiplicazione.

● * diventa +
● + diventa *
● 0 diventa 1
● 1 diventa 0

Per esempio, per la proprietà dell'elemento neutro vale x + 0 = x ma anche x * 1 = x

Legge di De Morgan

Esercizio di esempio:

Potrebbero piacerti anche