INFORMATICA2
INFORMATICA2
Programmare significa...
Scrivere programmi1 in un linguaggio artificiale2, rigoroso e comprensibile ad un esecutore3, con i
quali implementiamo4 gli algoritmi5 che riteniamo6 risolvano i problemi di cui abbiamo creato un
modello7
(1) collezioni di istruzioni (2) in questo corso: il C (3) in questo corso: la macchina astratta C (4)
realizziamo, codifichiamo, traduciamo, … (5) sequenze finite di passi elementari (6) nel caso
generale, NON ci sono garanzie! (7) opportuna “semplificazione” (astrazione) dei problemi reali
Programmare è un atto creativo
BUS DI SISTEMA: connettori che trasmettono i bit di informazione tra un’unità e l’altra. I
trasferimenti sono gestiti dalla CPU (modello master/slave)
Bus Dati
o trasferisce dati da master a slave e viceversa
Bus Indirizzi
o trasferisce indirizzi, per esempio l’indirizzo di un dato dal registro indirizzi alla
memoria, per accedere al dato stesso
Bus di Controllo
o da master a slave: codice dell’istruzione da eseguire (es. lettura da disco)
o da slave a master: informazioni sul successo dell’operazione
char
char a;
char b, c = 'Q'; /* Le costanti di tipo carattere si indicano con ‘’ */
const char d = 'q'; /* OK: d non sarà più modificato */
a = "q"; /* KO: "q" è una stringa, anche se di un solo carattere */
a = '\n'; /* OK: i caratteri di escape sono caratteri a tutti gli effetti */ b = "ps"; /* KO: non si possono
assegnare stringhe ai char */ c = 'ps'; /* KO: 'ps' non è una costante valida, non ha senso */ a =
‘7’; /* Che cosa succede? */ a = 7; /* Che cosa succede? */ a = ‘g’; a = a+1; /* La var a contiene ‘h’
(= ‘g’ + 1) */ a = ‘a’+1; /* La var a contiene ‘b’ (= ‘a’ + 1) */
ISTRUZIONI CONDIZIONALI
Valore o vero o falso
espressi con valori
LOGICI: AND, OR, NOT
o AND = &&
o OR = ||
o NOT = !
RELAZIONALI: INDICA le relazioni tra due variabili
o <, >, <=, >=
o uguale (==)
INFORMATICA
o diverso (!=)
ITERAZIONE
verificare che iteri e che ci possa uscire
o VERIFICO LA CONDIZIONE
28-09-23
VANTAGGI del CONCETTO di TIPO di VARIABILE
definisce lo spazio di memoria RAM e la corrispondeza diretta con il valore, purchè contenibile
nello spazio predisposto
posso anche mettere il massimo valore di variabile inseribile (un intervallo)
o comodo per la verifica o per far si che il programma sia sempre corretto
o C è fortemete tipizzato, ma permette di confrontare variabili di tipi diversi e
convertirle
vuole sempre la definizione di variabile
ma nel caso del confronto (assegno un intero ad un float) il cambio avviene
automaticamente *cast implicito*
es: int 1; float f;
per fare i + f, converte in float i
risultato in float, poi convertito in base alla variabile a cui viene assegnato
CONVERSIONE (copio slide 110, 116)
int n, m; float x;
x = n + x; (n è convertito in “float” e poi sommato a x)
n = x; (x è troncato della parte decimale, ne sopravvive la parte intera)
x = n; (n da “int” è convertito in (promosso a) “float”, aggiunte cifre decimali (0))
n = n / m; (il risultato della divisione è un intero troncato)
n = n / x; (n è convertito in “float”, poi si esegue la divisione,
e infine il risultato è troncato a “int”)
x = n / x; (come sopra ma il risultato resta “float”)
x = n / m; (attenzione: la divisione tra int tronca (quoziente))
CAST ESPLICITO:
int n, m;
float x;
x= (float) n/m; → solo per questo passaggio la divisione tra interi, n si comporta da float, la parte
decimale non viene troncata
INFORMATICA
il tipo della variabile rimane sempre uguale (la variazione avviene e permane solo durante il
cast)
Si converte l'operando “meno ricco” nel tipo di quello “più ricco” (o “più largo”, o “più preciso”)
il tipo più preciso domina nella conversione
Il cast (implicito o esplicito che sia) non modifica il tipo della variabile o delle variabili
coinvolte, ma solo il tipo associato al valore dell'espressione
VARIABILE INT
dominio degli interi
una parola (di solito 16-32 bit, ma cambia a secondo del sistema operativo)
o long int (32bit), short int (
o per spazi piccoli si possono usare anche i char con vaslori nell’intervallo -27<= val
>27
o unsigned solo +
o signed + e -
FLOAT E DOUBLE (spazio di memoria doppio rispetto al float)
numeri razionali (con virgola)
o 313.456
o 3,7 E-5 (notazione scientifica)
sono infiniti, le equivalenze potrebbero non risultare perche’ il calcolatore approssima
o mai condizioni con eguaglianze con tipo float
o per sostituire il confronto, sostituire la condizione in una disuguaglianza
Prima del while sempre interazione con l’utente, poi riporto la stessa condizione
VARIABILI ENUMERATIVE: che assume solo pochi valori (quindi li scrivo tutti)
risparmio memoria RAM
es: enum {QUI, QUO, QUA} papero;
papero = QUA → papero = 2;
enum {gennaio, febbraio, marzo, aprile, maggio, giugno, luglio, agosto, settembre, ottobre,
novembre, dicembre} mese;
mese = aprile → mese = 3;
se faccio printf(“%d”, giugno); mi dara’ 5
tra {} sono etichette, NON VARIABILI
Si puo’ cambiare il primo valore dell’enumerazione
enum {sufficiente = 6, buono, distinto, ottimo, eccelso} voto;
enumerazione parte da 6
VARIABILE COSTANTE
const int modelloauto = 159 (quello spazio di memoria avra’ sempre quel valore)
const float pigreco = 3.14159265
cosi’ facendo spreco memoria
meglio usare direttive al preprocessore
o #define PIGRECO 3.141592; prima dell’int main
poi nel programma scrivero’ l’etichetta PIGRECO
INFORMATICA
Si parte da indice 0, gli altri si ottengono per somma diretta al primo indice
Da 0 a n-1
Array: vettori di elementi indicizzati, omogenei, memorizzati in celle di memoria consecutive
INFORMATICA
Per inserire tutti gli elementi dell’array posso usare un ciclo iterativo, poi ogni elemento può essere
trattato come una variabile indipendente
Posso usare normalmente i comandi di printf e scanf
l’array può essere completamente pieno o incompleto(in questo caso serve una variabile che
ponga il limite di utilizzo); le sue dimensioni sono finite
Quando dichiaro un array, in RAM vengono riservati n celle per lo stesso tipo di variabile
int a[100]; – alloca memoria per 100 elementi interi, a partire da un certo indirizzo di memoria • la
dimensione deve essere nota al compilatore • deve essere una espressione costante • Per
accedere all' i-esimo elemento di a – calcola l'indice i (può essere un'espressione) – all’indirizzo
della prima cella di a somma il numero di celle pari allo spazio occupato da i elementi • ottiene così
l'indirizzo dell'elemento cercato
INIZIALIZZAZIONE DI UN ARRAY
Sintassi compatta:
int n[5] = {1, 2, 3, 4, 5};
Inizializzazione parziale: gli elementi più a destra sono posti a 0 int n[5] = {13}; n[0]=13, tutti gli
altri elementi sono posti a 0
Il MODO MIGLIORE per INIZIALIZZARE è usare un ciclo FOR
for (i = 0; i < 20; i++) /* int i; all’inizio */
a[i] = 0;
ESEMPIO
Ricerca del massimo: max = a[0]; for (i = 1; i <= 19; i++) if (a[i] > max) max = a[i];
Per copiare gli elementi da un array all’altro devo operare sui singoli elementi (sempre iterazioni)
• Dichiarazione: int A[20][30]; A è una matrice di 20 × 30 elementi interi (600 variabili distinte)
LE MATRICI
In matematica, una matrice è uno schieramento rettangolare di oggetti; le matrici di maggiore interesse
sono costituite da numeri appartenenti ad un campo. • Le matrici servono principalmente a descrivere
valori che dipendono da due parametri, e per questo motivo sono ampiamente usate in matematica e in
tutte le scienze.
Le righe orizzontali di una matrice sono chiamate righe, mentre quelle verticali sono le colonne. Ad
esempio, la matrice mostrata sopra ha tre righe e quattro colonne. In generale, una matrice è una matrice
con m righe e n colonne, dove m e n sono interi positivi fissati. Una matrice generica è descritta solitamente
indicando con aij l'elemento posizionato alla riga i-esima e alla colonna j-esima.
• I vettori possono essere considerati matrici molto semplici, aventi una sola riga o una sola colonna. Più
precisamente, una matrice con una sola riga, di dimensione, è detta vettore riga, mentre una matrice con
una sola colonna, di dimensione, è detta vettore colonna
MOLTIPLICAZIONE PER MATRICE: solo se il numero di colonne della prima è uguale a quello di righe della
seconda
Matrici quadrate
• Una matrice quadrata ha una diagonale principale, quella formata da tutti gli elementi ai,i con indici
uguali. La somma di questi elementi è chiamata traccia. L'operazione di trasposizione trasforma una matrice
quadrata A nella matrice At ottenuta scambiando ogni ai,j con aj,i , in altre parole ribaltando la matrice
intorno alla sua diagonale principale.
• Una matrice tale che ai,j = aj,i è una matrice simmetrica. In altre parole, A è simmetrica se A = At . Se tutti
gli elementi che non stanno nella diagonale principale sono nulli, la matrice è detta diagonale.
STRINGHE DI CARATTERE
Scanf di stringhe (non serve la &); questo perché il nome dell’array da subito l’indirizzo del primo elemento
struct {
} indirizzo;
Intero numero;
29/2 = 14 e resto 1
14/2 = 7 e resto 0
7/2 = 3 e resto 1
3/2 = 1 e resto 1
1/2 = 0 e resto 1
29 decimale = 11101 binario
Se il numero è negativo, posso estenderlo senza variarlo aggiungendo a SX serie di 1; per numeri
positivi devo aggiungere serie di 0
OVERFLOW: risultato dell’addizione eccede il potere di rappresentazione dei bit disponibili; nelle
addizioni in base binaria se ho riporto perduto, è overflow; in complemento 2 no vale la regola del
riporto perduto
INFORMATICA
In C2:
Somma di numeri discordi, non overflow
Se addendi concordi se il risultato è discorde
o Addendi negativi, risultato positivo
o Addendi positivi, risultato negativo
NUMERI FRAZIONARI (tra due interi ne ho infiniti, non posso rappresentarli tutti in modo preciso;
al massimo in modo approssimato)
MATHLAB/OCTAVE
Strumento per il calcolo numerico, serve per i corsi futuri. Aiuta a fare grafici e studi matematici
Programma interpretato: la trasformazione da linguaggio MathLab a codifica in linguaggio
macchina avviene mentre si esegue
Si possono eseguire le singole istruzioni, mentre si codifica
Non c’è il compilatore che aiuta alla correzione sintattica
I programmi interpretati sono più “lenti” in esecuzione: ad ogni esecuzione c’è la traduzione
in linguaggio macchina
DICHIARAZIONE DI VARIABILI
Non necessaria la dichiarazione, appena introdotte vengono definite
Si possono successivamente cambiare di tipologia
ARRAY: si possono cambiare dinamicamente, no definire la definizione
precompilazione
o L’ARRAY è la base di Mathlab
1x1: scalari
1xn o nx1 sono i vettori
A due dimensioni sono matrici
Con più di due dimensioni: matrici multidimensionali
DIRECTORY CORRENTE
STORIA DEI COMANDI
FINESTRA DEI COMANDI
WORKSPACE: mostra le variabili usate
INFORMATICA
Comando “hold on” serve per mettere i due grafici sullo stesso piano cartesiano
COMMENTI: precedere il commento: >>%commento (tutto ciò che è posto dopo il % è un
commento)
INFORMATICA
ARRAY: definiti
sempre in DOUBLE (si possono memorizzare numeri reali, immaginari, complessi)
STRINGHE: chiuse tra ‘ ’
INFORMATICA
QUALSIASI FUNZIONE è GIA’ PRESENTE IN MATHLAB, non bisogna includere delle librerie
Se nel vettore ci sono valori maggiori dell’indice max del vettore stesso e viene usato come valore
indice da: ERRORE
INFORMATICA
le colonne di b sono
uguali alle righe di a
%d
%f
%e
%g
o Operatore puntato: (solo per matrici quadrate), operazione di moltiplicazione
elemento per elemento
INFORMATICA
INPUT/OUTPUT
Funzione input: a = input (‘inserisci un valore’)
o Si può inserire uno scalare, un vettore (tra [ ]) o una stringa (tra ‘ ’)
Funzione output:
o Non metto il ;
o >>disp (visualizza solo caratteri); se ho valori numerici bisogna associarlo al
comando >>num2str
o >>fprintf (uguale a C)
%d (interi), %e (formato esponenziale), %f (virgola mobile), %g (il più corto tra il formato esponenziale e
quello in virgola mobile)
>>save filename array1 array2 (salva sul file solo le variabili di array1 e
array 2)
o File ascii: bisogna nominarlo e mettere l’estensione
>>save -ascii filename.dat x;
LOAD:
o File matlab (.mat): >>load filename (estensione implicita .mat); si possono
specificare alcune variabili del file (postporle dopo il nome del file)
o File ascii: >>load filename.dat
SCRIPT (m-file)
E’ un file di testo che contiene una sequenza di comandi Matlab; il file deve avere
un’estensione .m; i comandi vengono eseguiti sequenzialmente
Lo script non è un programma!!!
o Non accetta input e non genera output, agisce solo su variabili scritte nello script o
nel workspace
Bisogna usare un editor di testo puro (non usare word)
INFORMATICA
INFORMATICA
Strutture che servono per costruire qualsiasi algoritmo, comandi di selezione o iterazione che
hanno come risultati o vero o falso.
Falso = 0
Vero = 1(o tutto tranne che 0)
Valori logici: true e false
Dimensione di 1 byte
Tipo logico
OPERATORI RELAZIONALI: uguali come in C
==; ~=; >; <; <=; >=
Si applicano su scalari, ma anche su array in generale (ma con dimensioni uguali): il
confronto avviene elemento per elemento, nella stessa posizione
I numeri razionali viene sempre rappresentato in maniera approssimata (non è sicuro usare
comandi di uguaglianza con valori razionali)
APPLICAZIONE su ARRAY
Il risultato logico viene posto in un una matrice di uguali dimensione
Lo stesso vale per le stringhe (confrontati caratteri)
Doppi simboli di AND e OR si applica solo agli scalari: valuta inizialmente solo il primo operando,
se il primo operando basta a determinare il valore logico dell’espressione, non viene valutato il
secondo
Il singolo simbolo, invece, si applica SEMPRE agli array e valuta entrambi gli operandi (si può
applicare anche agli scalari)
SI POSSNO USARE VETTORI LOGICI per SELEZIONARE gli ELEMENTI dell’array di partenza
Si può applicare anche alle matrici
o Confronto tra singoli elementi
o Confronto elemento e costante
Si ottiene un vettore con all’interno gli elementi che verificano l’espressione logica
o N.S.: matlab legge scorrendo per colonne
FUNZIONI LOGICHE
INFORMATICA
COSTRUTTO IF
Uguale in C; non ci sono parentesi graffe. Per chiudere il blocco si usa la parola “end”
COSTRUTTO SWITCH
LE ITERAZIONI IN MATLAB bisogna usarle il meno possibile, sono già implementate delle
funzione di matlab
--- VETTORIZZAZIONE ---
Si usano i sottoarray
Es.1
b = a>5
a(b) = sqrt(a(b));
es.2
INFORMATICA
n = 1:100;
square(n) = n.^2;
FUNZIONI
TEXTREAD: legge file ASCII organizzati in tabelle
Serve per importare dati generati con altre applicazioni
INFORMATICA
FUNZIONI in MATLAB
Particolari sequenze di istruzioni che facilitano la stesura del programma (MODULARIETA’),
rendono più leggibile il programma stesso permettendo un’astrazione maggiore (ASTRAZIONE)
In più tramite queste istruzioni è possibile condividere il “programma” che risolve un determinato
problema a persone terze (RIUSABILITA’) (come script? No, le funzioni lavorano in un ambiente
separato rispetto al programma principale, ma richiamandole si collegano i due ambienti SENZA
CHE LE VARIBILI VADANO IN CONFLITTO TRA LORO)
STRUTTURA di UNA FUNZIONE
NOME SPECIFICO
INFORMATICA
Le variabili (output/input) presenti nel file della funzione sono dette “parametri formali”
Sono usati per definire la funzione
Quando la funzione è invocata in un programma, ai parametri formali bisogna assegnare i valori
presenti nel workspace (definiti “parametri istantanei”)
Assegnando i valori bisogna stare attenti all’ordine con cui vengono assegnati
QUANDO VIENE INVOCATA LA FUNZIONE
Il programma si interrompe e aspetta che si eseguita totalmente la funzione;
Per fare questo è necessario controllare l’ordine delle istruzioni (sempre ciclo PRELEVA ed
ESEGUI)
o Viene associato il RECORD di ATTIVAZIONE che contiene:
I dati relativi all’ambiente del sottoprogramma
L’indirizzo di ritorno nel programma chiamante
Questo perché: a ogni chiamata a funzione richiede allocazione di spazio di
memoria per le sue variabili locali
I record di attivazione sono impilati in uno STACK di RAM (pila) secondo il concetto LIFO: last
input first output
Quando la funzione è terminata, non è più chiamata il RDA viene eliminato
Lo scorrere lungo lo STACK è controllato dal PUNTATORE (Stack Pointer)
o Registro che contiene l’indirizzo della parola di memoria da leggere nella PILA
INFORMATICA
SE NEL FILE di UNA FUNZIONE sono definite altre funzioni, quest’ultime possono essere
utilizzate dalla FUNZIONE primaria, ma non sono visibili all’esterno (non possono essere chiamate
in autonomia)
FUNZIONI RICORSIVE: funzioni che si richiamano (DA SAPERE SOLO dal POV TEORICO)
A ogni chiamata viene creato un nuovo record di attivazione, quello precedente viene congelato
fino a quando l’ultimo RDA non viene eliminato (perché la sua chiamata corrispettiva è terminata):
a questo punto il RDA chiamante riprende da dove si era bloccato
INFORMATICA
SISTEMA OPERATIVO
Funziona come una macchina virtuale, nasconde agli utenti i dettagli dell’architettura hardware
Fornisce funzionalità di alto livello che facilitano l’accesso alle risorse
MONOUTENTE MONOPROGRAMMATO
MONOUTENTE MULTIPROGRAMMATO
MULTIUTENTE
SISTEMA OPERATIVO: struttura strati
Il cuore (kernel) sono tre funzionalità principali
1. Gestione periferiche
a. Sono meccanismi software a cui è affidato il compito di trasferire dati da e verso le
periferiche Consentono ai programmi applicativi di leggere o scrivere i dati con primitive
di alto livello che nascondono la struttura fisica delle periferiche (e.g. nel sistema Unix le
periferiche sono viste come file speciali) Si distingue generalmente fra: Driver fisici, che
vengono utilizzati dal gestore delle interruzioni per il trasferimento dei dati Driver logici, che
fanno parte del sistema operativo e forniscono una gerarchia di memorie
2. Gestione memoria
a. PAGINAZIONE: aree contigue di uguali dimensioni (fissata); ogni pagina è formata
da celle di memoria contigue; dati e programmi possono essere allocati in diverse
pagine non necessariamente contigue
b. SEGMENTAZIONE: il programma viene diviso in frammenti quando compilato
i. Partizione logica
ii. Si possono caricare frammenti in maniera indipendente
iii. Frammenti di lunghezza variabile
3. Gestione processi
a. Il SO si occupa di gestire l’esecuzione concorrente di più programmi utente L’uso della
CPU del calcolatore (o delle CPU nei sistemi multiprocessore) deve essere distribuito in
maniera opportuna fra i programmi da eseguire Ogni programma eseguito ha a
disposizione una macchina virtuale realizzata dal SO che ne consente l’esecuzione come se
la CPU del calcolatore fosse interamente dedicata ad esso
PROCESSO = Rappresenta un’istanza di un programma composta da: codice eseguibile (il programma
stesso) dati del programma informazioni relative al suo funzionamento (stato)
STATO INTERNO: insieme dei valori delle variabili e dei registri utilizzati in un dato istante
STATO ESTERNO: indica la relazione con gli altri processi
IN ATTESA: attesa di un input/output, ogni volta che si ha una comunicazione con una
periferica
IN ESECUZIONE:
PRONTO: può essere eseguito, ma non avviene perché c’è una singola CPU (fisica) che si
divide per i vari processi in intervalli di tempo
Le risorse fisiche sono o DIVISIBILI o MENO
Se DIVISIBILE (es. RAM) viene divisa in blocchi per i diversi processi
Se non lo è: viene condivisa a rotazione tra i vari processi (es. CPU)
Il SO ha un’esecuzione privilegiata : è il supervisor che permette di controllare gli altri processi
(decidere quale processo ha priorità maggiore)
A ogni processo viene dato un QUANTO di tempo; al termine del quanto viene rivalutato dal
SUPERVISOR