Sei sulla pagina 1di 24

6/10/2020

Immagini in scala di grigi

8 bit per ogni pixel d’immagine

Mescolanza dei colori primari RGB

Red Green Blue

24bit per ogni pixel, 8 per ogni colore, quindi 3byte per ogni pixel

Risoluzione: capacità di rappresentare un numero di Pixel

08/10/20

Codifiche dei suoni

Campionamento dell’onda sonora

Ogni secondo 44100 campioni

Ogni campione 16 bit, 32 stereo

1 secondo 32.44100, 176 kb/s

Descrizione del suono

Descrivere il suono con codici binari per intensità, durata, note, oggetto che ha generato quel suono
(Standard MIDI, Music Instrument Digital Interface)

Salvati in Lossless: informazioni in modo compresso senza perdere informazioni.

Lossy: compressione irreversibile con perdita di informazioni

Video

Immagini + suono

Codifica di entrambi

PROCESSORE

CISC Complex, integrare istruzioni e componenti di grafica, suono e memoria dentro al processore, alto
consumo e complessità architetturale

RISC Poche istruzioni, integrare processi via software, minor consumo

Legge di Moore: Ogni 18 mesi i processori raddoppiavano i transistor

Core

ALU effettua i calcoli

CU coordina le attività

REGISTER sono di per sé una memoria, con l’insieme di tutti i registri

Ogni core ha una cache


Stored Program

Istruzioni macchina: comando codificato in bit [Codice HEX], eseguibile dal processore

Tipi

Data Transfer group: muovere dati e registri da/verso la memoria

Operazioni I/O (transfer)

Operazioni di calcolo e logiche

Software

Modificabile, in contrasto con la parte tangibile e non modificabile dell’Hardware. Da dinamicità

Software di sistema per controllare la parte hardware del sistema.

Software applicativo per produttività personale/erogare servizi.

15/10/2020

Sistema operativo

Insieme dei software responsabile dell’utilizzo delle risorse hardware(Processore, memoria principale e
periferica, dispositivi input/output.

Gestisce i software (programmi in esecuzione, programmi applicativi)

Gestisce la sicurezza.

Storia

1940\50

Programmi eseguiti a lotti (Job queue)

1970

Primo sistema operativo, permetteva un accesso interattivo al computer

1970\80

Time sharing, tempo di elaborazione condiviso tra i programmi in esecuzione.


Anche il primo windows e mac eseguiva un programma alla volta

1990-oggi

Possibilità del multitasking, eseguire più programmi insieme

COMPONENTI

I programmi non hanno accesso all’Hardware, il kernel ha accesso, che offre servizi allo strato successivo,
ovvero il gestore della memoria.
Struttura a cipolla, per semplificare il sistema.
Se cambio un pezzo Hardware cambia anche il Kernel.
Kernel monolitico:
Microkernel
Kernel ibrido

INTERFACCIA UTENTE

Permette all’utente di gestire la macchina all’utente tramite

- Command text
Shell, Terminal
- Windows system
GUI, mouse, voce

FILE MANAGER

Gestisce le memorie di massa e secondarie

MEMORY MANAGER

Gestisce la memoria centrale (RAM), verifica che la RAM abbia spazio disponibile, e alloca i programmi.
Quando la RAM finisce trasforma un pezzo della memoria di massa in RAM virtuale.

DEVICE DRIVERS

Programmi che permettono di accedere alle funzioni della periferica installata senza conoscerne le
specifiche.

SCHEDULER

Gestisce la tabella dei processi, la tabella con tutti i programmi in esecuzione

DISPATCHER

GESTIONE DELLA SICUREZZA

Il S.O. controlla tutte le attività, e scrive il log di tutte le informazioni (avvii, errori, accessi…)

Embedded system

Sistemi operativi che troviamo su robot, droni…

FIRMWARE

Software che risiede nelle memorie rom (Non volatile).


Contiene le caratteristiche del prodotto, lo marca.
Scritti utilizzando il linguaggio C. Non sono direttamente modificabili, memorizzati dentro la ROM
BIOS, permette il caricamento del sistema operativo, fa il controllo su tutti i componenti hardware, se è
tutto ok procede al caricamento del sistema.

Algoritmi

Procedura generale: metodo che risolve una classe di problemi, non uno singolo.
Deve essere efficiente e arrivare alla soluzione nel minor tempo possibile con il minor utilizzo di risorse
possibili
Algoritmi deterministici e non deterministici. Il primo da una risposta certa, l’altro è probabilistico.
20/10/2020

Processo, algoritmo ed esecuzione.


è necessaria chiarezza negli algoritmi, niente ambiguità.

DIAGRAMMI A BLOCCHI

VARIABILE

Contenitore dove vengono buttati i dati, ha un nome rappresentativo del contenuto


Deve essere dichiarata, fondamentali per l’allocazione della memoria e dargli un nome umano.

Assegnazione

Definisce il valore di una variabile, e si rappresenta con il simbolo=

ES: altezza=183

Nella parte destra sono specificati valori ed espressioni.


ESERCIZI

RAPPRESENTARE UN ALGORITMO

Insieme di istruzioni utilizzando un linguaggio di programmazione.

ESEMPIO
Dato un numero intero determinare se pari o dispari

Print “inserire numero intero”


numInserito= LEGGI NUMERO INSERITO

if num inserito/2=0 (se il numero inserito ha come resto della divisione 0)

print “pari”

else

print “dispari”

Condizioni

Un’alternativa: SE

Due alternative: SE… ALTRIMENTI

If… else

Condizioni nidificate multiple

Queste condizioni sono simili alla sintassi C e C++

22/10/2020

STRUTTURE ITERATIVE

While pretestloop

Esegue una o piu istruzioni (blocco) fin tantoi che la condizione espressa dal while è soddisfatta/vera. Se la
condizione è falsa si interrompe il ciclo.
La condizione è verificata subito.
Esempio pratico: calcolare l’incasso totale del cinema.
Posti in sala 250, costo del biglietto 10
n=250 incasso=0
while (n>0)
Stampa biglietto (n)
Incasso=incasso+10
n=n-1
Stampa (incasso)
Fino alla soglia n=0

Do/while

Valuta una condizione dopo avereseguito il blocco, while sta in fondo al blocco
N=1
do
stampa (n)
n=n+1
while n<10
For
Ciclo while scritto in maniera più coincisa

Calcolare un algoritmo che calcola la media di voti di un esame (inseriti dall’utente a tastiera)
Ricerca di un valore all’interno di un elenco

Dato un elenco, individuare il valore che soddisfa la ricerca.


Ricerca sequenziale: andare avanti valore per valore fino a che non si trova quello giusto.

Ricerca in un insieme di elementi ordinati


Ricerca binaria: divide-et-impera
Trova l’elemento centrale-verifica se l’elemento centrale è maggiore, minore o uguale all’elemento cercato.
In base a quello si sposta nella parte inferiore o superiore dell’elenco-ripete il ciclo di divisione fino a non
trovare l’elemento ricercato.

STRUTTURE RICORSIVE

EFFICIENZA DEGLI ALGORITMI

Efficienza di un algoritmo, ovvero misurare le risorse minime necessarie per la soluzione del problema.
Si misura stimando i tempi di esecuzione di un algoritmo in tre casi: caso peggiore, medio e migliore.

Esempio: ricerca sequenziale su una lista di 30000 nomi.


L’operazione ci costa 10 ms per elemento.

Migliore: prime 100 posizioni, pochi millisecondi


Medio: metà delle posizioni, 150 secondi
Peggiore: In fondo o non compreso, 300 secondi

Nel caso medio l’algoritmo richiede n/2 operazioni; nel caso peggiore n operazioni.

Ricerca binaria:

30000/2=15000

15000/2=7500

1.8/2=0.9

Con 15 operazioni troviamo l’elemento cercato


Se ogni operazione costa 10 millisecondi, 150 ms totali
Il caso peggiore richiede log2(n)

Θ per contrassegnare il caso peggiore e per segnare quanti processi richiede l’algoritmo
LINGUAGGI DI PROGRAMMAZIONE

Assembler: convertitore da linguaggio mnemonico a linguaggio macchina.

Linguaggio assembly

Rapidità nella scrittura


Migliore leggibilità
Efficienza

Svantaggi
I programmi sono dipendenti dalla CPU (op-code, diverso per ogni marchio di processore)
Bisogna scendere in ogni minimo dettaglio.

III Generazione di programmazione

Compilatore: traduce in linguaggio macchina un linguaggio sorgente, che produce un file eseguibile.

Interprete: traduce linea per linea il codice sorgente. Le istruzioni vengo interpretate ogni volta che si carica
il codice sorgente.
Si appoggiano su memoria, input e output, non sul processore
IV generazione (80’s)

Linguaggi non procedurali, basati su insieme predefiniti di comandi che permettono di portare ai risultati
desiderati.
Risoluzione non passo per passo, arrivano alla soluzione del problema specificando la soluzione che
cerchiamo. Programmi per scopi specifici

V generazione intelligenza artificiale

Paradigmi di programmazione

Approcci utilizzati per la soluzione

Imperativo: sequenza di comandi ed istruzioni che manipolano i dati per arrivare al risultato.

Esempio: Studenti promossi all’esame di calcolo numerico?


Inizializzo una variabile che contiene la lista degli studenti, la carico nel programma.
Leggo elemento per elemento, scrivo un ciclo for o while con il controllo che la lista coincida con il numero
effettivo degli estudenti.
Controllo che il voto sia maggiore di 18 per ogni studente
alla fine stampo il numero di studenti promossi

Dichiarativo: Descrizione del problema da risolvere e applico metodi risolutivi già predisposti
Funzionale: logica delle funzioni per risolvere
Ad oggetti: problema in termine di oggetti che hanno proprietà e funzioni proprie.

27/10/2020

Esempio: Studenti promossi all’esame di calcolo numerico?

Imperativo
Inizializzo una variabile che contiene la lista degli studenti, la carico nel programma.
Leggo elemento per elemento, scrivo un ciclo for o while con il controllo che la lista coincida con il numero
effettivo degli studenti.
Controllo che il voto sia maggiore di 18 per ogni studente
alla fine stampo il numero di studenti promossi
Dichiarativo

Le primitive sono già definite, non le posso estendere, quindi questo approccio è utile solo per problemi
specifici.
La programmazione logica permette di costruire altre primitive per risolovere altri tipi di problemi

Funzi
onale

Il programma è una funzione che accetta degli input e produce dei risultati (output)

Ad oggetti:

Definisco oggetto Esame che da crediti e voto


Definisco oggetto studenti che contiene nome cognome e matricola, tra le sue azioni può sostenere esami
L’insieme degli studenti lo chiamo come studenti dell’esame e lo indico come vettore.

Cos’è un programma?

Insieme di istruzioni organizzate:


Istruzioni di dichiarazione

Istruzioni di esecuzione: espressione

Di controllo: if

Iterative: while

Commenti: commentano le istruzioni e rendono più leggibile il codice

Istruzioni di esecuzione

Unità che permettono di migliorare la leggibilità del codice

03/11/2020

Istruzioni C++

ISTRUZIONI SEMPLICI: base per le istruzioni complesse e terminano tutte con ;


definizioni/dichiarazioni
espressionni: Input, output, assegnamento, matematiche, logiche
Espressione condizionale: if/else in forma compatta, scritto in forma exp1 ? exp 2: exp3
Se exp1 è vera equivale a exp 2, altrimenti equivale a exp 3

ISTRUZIONI STRUTTURATE

Composte da più istruzioni semplici. Azioni complesse

di tipo composto: delimitate da parentesi graffe


condizionali: gestiscono delle condizioni
iterative

10/11/2020

Funzioni

I programmi possono essere gestiti con funzioni, ovvero un blocco di istruzioni al quale viene assegnato un
nome, ha dei parametri in ingresso, e il blocco mi ritorna un risultato.
Posso scorporarlo dal codice sorgente, cosi suddivido il programma in funzioni e sottofunzioni, e migliora la
leggibilità.

FUNZIONI DI LIBRERIA

Codici sorgenti organizzati secondo una logica rispondenti ad un determinato bisogno, manca il main
perché non è un programma, ma una libreria.
Lo compiliamo, e ci crea un file oggetto che traduce le funzioni in linguaggio macchina.

12/11/2020

24/11/2020
Riferimento

“Riferimento a”

Int x= 1

Int &y=x y è sinonimo di x

Y=6 viene modificato anche x

Ciò consente di dare nomi multipli a variabile, modificando una si modifica anche l’altra (aliasing)

Inizializzazione obbligatoria

Float &y=10.2 è errore

Double d=3.1

Int &z=d errore, perche sto assegnando un tipo double ad una variabile intera

Double x=3.5
int&y = x
y-= 3

Errore, perche sono due variabili diverse

Intx = 4
cout<< &(2*x) errore perche non ha nessun indirizzo di memoria

Intx=1
int &y
y=x
x++ Errore, non posso equiparare un percorso ad una variabile.

26/11/2020

I PUNTATORI

Modo per manipolare le strutture complesse

Variabile che contiene indirizzo di un altro oggetto

Def: tipo *identificatore;

Es int *px; Puntatore a intero

È necessario specificare il tipo di dato perché mi punta ad uno spazio di memoria ben preciso.
Il puntatore è una variabile come tutte le altre.

Operatore Dereference “*”


Permette di accedere alla variabile che sto puntando.
scrivendo * e nome del puntatore modifico la variabile a cui sto puntando
Esempio
int x=1
int *px // px variabile puntatore
scrivendo *px accedo direttamente alla cella puntata a px.

Qualsiasi sia il tipo di *px, riserva comunque 8 celle di memoria, a differenza di int che ne consuma 4.
Se avessi avuto un char, che occupa 1 cella, il puntatore ne occupa sempre 8.
Cosi si crea un link tra x e px.

Se scrivo *px=125 è come scrivere x=125


N.B. Se ometto l’asterisco butto via il link, in quanto vado a modificare il valore della cella px, perdo quindi
l’indirizzo di memoria.

Array, Puntatori e funzioni.


Array tramite puntatore di una funzione.

01/12/20

STRINGHE

Sequenza di caratteri alfanumerici, vista come unn array di caratteri, il cui ultimo elemento è il carattere
nullo (/0) di terminazione. Lo spazio conta come carattere.

Char parola []= “Ciao” Char parola[]= {‘C’, ‘i’, ‘a’, ‘o’, \0}

Dimensione array = numero caratteri + 1

Quando dichiaro un array di caratteri posso farlo allo stesso modo di un array di interi

Char parola [5] = {‘C’, ‘i’, ‘a’, ‘o’, \0};

oppure

char parola [5]; (che va inizializzato)

Per inizializzarlo devo inizilizzare i singoli elementi della parola.

Parola [0] =c; parola[1]=i … parola[5]= /0; (VA SEMPRE MESSO /0 IN QUESTO CASO)

Funzioni utili

Cin.eof: ritorna true (boolen) se lo stream cin ha raggiunto La sua fine (Va usato sempre dopo almeno
un’operazione di lettura)

Cin.fail: ci dice se si è manifestato un errore in fase di lettura


Cin.clear: ripristina lo stato normale per lo stream di ingresso

Cin.getline (s,n): legge da cin una riga in s fino a capo linea, per un massimo di n-1 caratteri (lo \n non viene
letto)

Cin.get c: legge da cin un solo carattere (spaziature comprese), restituisce c

Argomenti da linea di comando

Quando immettiamo dati nel programma utilizziamo cin.


con gli argomenti possiamo passare dati di input attraverso la linea di comando.
è possibile tramite parametri predefiniti di main:

int main (int argc,char *argv [])


Argc= numero parole di linea di comando (./a.exe incluso)
argv= array di puntatori a carattere (stringhe) contenente parole di linea dicomando)
NB Gli argomenti sono trattati come stringhe anche se sono numeri.
per convertirle posso utilizzare atoi (converte in intero) o atof (converte in float, reale) (libreria <cstdlib>)

1000 verrà salvato come un


array di caratteri

Return -1 per qualcosa che


non va, esce dal
programma

Return 0, chiude il
programma e tutto è
apposto
I/O su file di testo

Un programma può ricevere operazione direttamente da file di testo attraverso <fstream>

La funzione riceve in ingresso un array

Passa i valori dell’array interno incrementato di uno


dichiariamo x con 1 2 3.
Il risultato è imprevedibile perché sto ritornando qualcosa dentro la funzione, che muore appena scriviamo
return.

03/12/2020

ALLOCAZIONE DEALLOCAZIONE DINAMICA DELLA MEMORIA

Come allocare dinamicamente la memoria di un programma?

Di solito negli esercizi venivano utilizzate variabili che allocavano memoria nella ram.
Allocazione statica: devo sempre conoscere i dati su cui vado a lavorare, solo che non sempre conosco
come ad esempio dei vettori la memoria che mi serve.

Soluzione: avere variabili dinamiche, ovvero una gestione dinamica della memoria durante l’esecuzione.
Queste variabili vengono allocate nell’heap, un’area esterna allo stack, alla quale accedo solo tramite i
puntatori.
New: allocazione della memoria delete: deallocazione della memoria

Area di memoria allocata ad un’esecuzione di un programma:

Area programmi e costanti: per le istruzioni in linguaggio macchina (es. settings.json) e le costanti del
programma

Area dati statici: per variabili globali o allocate staticamente (int x static, variabile intera di tipo statico).
Hanno un’area apposta nei registri, sono privilegiati

Area heap: vengono caricate tutte le variabili non prevedibili a tempo della compilazione

Area stack: per contenere le variabili locali

DICHIARAZIONE DI VARIABILE DINAMICA

New tipo (int float char boolean)

New tipo [dimensione]; che verrà data dall’utente tramite il cin

Es:

int *p = new int


char *stringa = new char[3*i]

Alloca area di memoria adatta a contenere oggetti specificati


la creazione di una variabile dinamica puo non andare a buon fine, quindi si utilizza new (nothrow)

DEALLOCAZIONE

Delete indirizzo; (passo il puntatore, perche serve l’indirizzo)


delete [] indirizzo; (per gli array)

Es: int *p = new int;


char *stringa= new char [n]; n dimensione dinamica


delete p;
delete[] stringa;

Se l’indirizzo non corrisponde a chiamata a new mi da un errore


Se non uso delete la memoria viene automaticamente deallocata.
Quando vado a deallocare la memoria rilascio l’area, ma non significa che la cancello, ma vado a marchiare
quell’indirizzo, perche quell’area la controlla il sistema operativo (non programma o programmatore)
Il contenuto non viene cancellato, ma rimane disponibile conoscendone l’indirizzo.

Se non libero la memoria vado incontro a spreco di memoria

Regola: sempre deallocare memoria allocata dinamicamente non appena serve più

PRO: gestione più efficiente della memoria, perché alloca solo lo spazio necessario

Da utilizzare quando ho strutture di dati dinamiche (liste, alberi,…) elementi di cui non conosco la
dimensione a priori.
ESEMPIO: Word, utilizza memoria dinamica, perche un file di testo è una lista di dati dello stesso tipo,
stringa

CONTRO: è più difficile da gestire, perché il controllo è lasciato al programmatore

ARRAY STATICI

Li creiamo cosi: const int dim=20

Int a [dim]
Oppure int a= {1,2,3}

PROBLEMA DELLA GESTIONE

10/12/2020

Errore perché andrebbe int const =3


Dato che è un’allocazione dinamica la costante non serve.
(si poteva anche mettere cin>> n e farcela dare dall’utente)

Creato array dinamico di 5 spazi, per essere corretto doveva essere delete[x]

allocazione statica è più veloce rispetto alla dinamica.

STRUTTURE

Sono un dato complesso composto da una collezione di elementi non omogenei (gruppo di variabili
etichettato con un nome)

(Array con dati diversi tra loro)

Permette di creare nuovi tipi di oggetti, ciò permette di staccarsi dai tipi di base.

Sintassi:

struct identificatore

{
tipo campo1

tipoN campoN

Identificatore var_id;

(Dopo le dichiarazioni double va “;”)

ACCESSO AI CAMPI

Se ho una struttura dentro la quale ci sono dei campi, per accederci si utilizza la notazione punto (s.field)

Sia ps un puntatore ad una struttura e field un identificatore di campo

Programmazione su File Multipli

Creare programmi su sorgenti divise in più file


Programma ripartito su 2N+1 file
-un file .cc/.cpp contenente main()
-n coppie di file modulo .h e modulo .cc (.h sono moduli di intestazione, header)
Header contiene tutte le dichiarazioni di funzione, tutte le definizioni di variabili globali, struct, costanti,
ecc.