Codifica dell'Informazione, Aritmetica e...
Transcript of Codifica dell'Informazione, Aritmetica e...
Facoltà di Ingegneria Industriale
Laurea in Ingegneria Energetica, Meccanica
e dei Trasporti
Informatica B – Esercitazione 5
Algebra booleana e codifica
Andrea Galbiati [email protected]
Dipartimento di
Elettronica e Informazione
Allocazione memoria
• Allocare = riservare memoria
• In C l’allocazione non può essere dinamica ovvero a runtime, cioè durante l’esecuzione del programma.
• Nella dichiarazione di un array di fatto si chiede di riservare memoria
• Quanta?
– Lo si deve sapere a compile time!!!!
– Si calcola facilmente: dimensione del tipo * numero di celle
3
Allocazione memoria (2)
• Sia con le #DEFINE sia con delle
costanti (ovvero anche mettendo il
numero a mano, per esempio 20) il tutto
funziona.
• Ciò che NON funziona è
int alloc;
scanf(“%d”, &alloc);
int myArray[alloc];
4
Allocazione memoria (3)
• Cosa si fa allora?– Si alloca una quantità di memoria NOTA (con
una costante)
– Se ne usa solo una parte ≤ di quella allocata.
QUESTA PARTE USATA PUO’ ESSERE DECISA A RUN TIME!!!!
• Implicazioni:– Spesso si spreca spazio
– Ma...
– Meglio sprecare spazio che avere OVERFLOW!!!
5
Allocazione memoria (4)
• Overflow? Letteralmente è TRABOCCARE
• Esempio: vado al Pub e mi devo portare il bicchiere da casa. Non so se prenderò una media o una piccola... Che faccio? Porto il bicchiere da piccola rischiando di farmi fare una media (che pagherò come media ma di cui metà uscirà....) o porto il bicchiere della media e al limite lo lascio mezzo vuoto se mi faccio fare una piccola?
• La dimensione del bicchiere la decidete a compile time (quando uscite di casa), come usare lo spazio a runtime (al Pub).
6
Allocazione memoria (5)
• Ricapitolando:
– Quando nel testo del problema vedete USER
DEFINED ... TRASALITE!
– Se sono implicati array, questo significa che
l’utente deciderà QUANTO usare di quello che
c’è a disposizione e che avete scelto VOI
– Le dimensioni sono spesso un
compromesso!!!
• Ha senso char cognome[1000] ???
– CONTROLLATE SEMPRE che l’utente non
voglia usare PIU’ di quanto voi avete allocato!
7
Cicli sugli array
• Mettiamo che avete dichiarato un – Int array[R][C]
• R ed C costanti
• Es: R = C = 20 400 celle.
• L’utente vuole fare un vettore r x c– r ≤ R e c ≤ C
– Es: 3 x 5 (15 celle).
• Quando leggete, scrivete o copiate sull’array usate (R,C) o (r,c)? – (r,c).... Perché?
– (R,C) è sbagliato?
– Quali controindicazioni?
8
Scrittura codice
• Anzitutto: i laboratori didattici sono uno
STRUMENTO (utile) che vi viene
messo a disposizione....
• ...tuttavia per usarlo bene....
• DOVETE AVER STUDIATO
QUALCOSA!!!!!
• Che senso ha presentarsi a scrivere
codice se non sapete nemmeno la
sintassi del ciclo for?
9
Le parentesi
• Le parentesi non sono un OPTIONAL
• Sono E-S-S-E-N-Z-I-A-L-I
– Servono al programma per sapere che
operazioni svolgere
– Servono a VOI per capire il codice quando
lo leggete
– Servono a NOI poveri esercitatori a capire
che diamine state combinando
• Non sono motivazioni da poco.....
10
Le parentesi (2)
if ( condizione )
a;
b;
c;
• Se la condizione è vera, quali istruzioni vengono eseguite?
• E se è falsa?
if ( condizione )
{
a;
b;
c;
}
• E così?11
Nomi delle variabili
• Anche qui, è questione di buonsenso...
• Esistone delle “regole”– Non tassative
– Utili
– Esse hanno come finalità la CHIAREZZA
• Ricordatevi sempre (ma proprio SEMPRE)– Il codice dovete capirlo quando lo leggete!!!
– Che senso ha scrivere variabili di cui non sapete il significato?
– Perché chiamare le righe a quando potete chiamarle rows? Per risparmiare 3 caratteri? Spilorci!
12
Riutilizzo delle variabili
• Ci sono variabili che si possono riutilizzare... In particolare quelle che si usano nei cicli.
• Se fate due for SEPARATI e non vi interessa RICORDARE IL VALORE DI FINE DEL PRIMO CICLO
• Potete usare per il secondo ciclo... La stessa variabile....
for (i = 0; i < 3 ; i++)
{ printf(“Ciao!”); }
for (i = 0; i < 5 ; i++)
{ printf(“Hello!”); }
13
Riutilizzo delle variabili (2)
for (i = 0; i < 3 ; i++)
{
printf(“Ciao!”);
}
for (j = 0; j < 5 ; j++)
{
printf(“Hello!”);
}
printf(“Ho scritto %d volte Ciao e %d volte Hello”, i, j);
• BASTA USARE LA TESTA!!!
14
Variabili, funzioni, valore e indirizzo...
• Ogni variabile ha 3 caratteristiche fondamentali– Un nome, identificativo UNIVOCO
– Un valore (non univoco...)
– Un indirizzo di memoria in cui è memorizzato il valore.
• L’identificativo si riferisce al valore, l’identificativo preceduto da & si riferisce all’indirizzo
• Perché la printf vuole l’identificativo della variabile da stampare e la scanf vuole l’indirizzo?
15
Esempio...
void somma(int a, int b)
{
a = a + b;
}
int main()
{
int a,b;
a = 3;
b = 4;
somma(a,b);
printf(“%d”, a);
}
COSA STAMPA?
16
Esempio... (2)
void somma(int *a, int b)
{
*a = *a + b;
}
int main()
{
int a,b;
a = 3;
b = 4;
somma(&a,b);
printf(“%d”, a);
}
COSA STAMPA?
17
Morale della favola
• Le funzioni esterne per modificare il valore di una variabile hanno bisogno di accedere direttamente al suo indirizzo
• Se le passiamo per valore le funzioni si fanno una loro COPIA delle variabili... E lavorano sulla COPIA, non sull’originale!
• La scanf deve scrivere il valore nella variabile, quindi vuole l’indirizzo
• La printf non devo modificare la variabile, deve solo sapere il suo valore.
18
Logica
Per ognuna delle espressioni logiche riportate nelle righe della tabella, assumendo le seguenti
dichiarazioni:
int a = 8, b = 11;
char c=’d’;
indicare se l’espressione è vera o falsa (scrivere V o F nella seconda colonna). Indicare inoltre, nella terza colonna, se l’espressione è vera per qualsiasi valore delle variabili (scrivere SI o NO) e, nella quarta colonna, se l’espressione è falsa per qualsiasi valore delle variabili (scrivere SI o NO). Si giustifichino le risposte.
Espressione Vera o falsa? Sempre vera? Sempre falsa?
(-a==a) && (a < 11)
(c>’a’ || c<’z’ ) && (a<7 && b>8)
!(b<10 && a>7) || (c!=’h’ && c>’a’ )
20
Codifica numerica (TE)
A. Si dica qual è l’intervallo di valori interi rappresentabile con la codifica in complemento a due a 9 bit.
B. Con riferimento a tale codifica indicare, giustificando brevemente le risposte, quali delle seguenti operazioni possono essere effettuate correttamente:
(i) -254 – 255
(ii) + 254 – 253
(iii) -18 + 236
(iv) + 217 + 182
C. Mostrare in dettaglio come avviene il calcolo delle operazioni (i) e (ii), evidenziando il bit di riporto e il bit di overflow così ottenuti.
22
Numeri decimali
• Convertire in virgola fissa (indicando il numero di bit minimi per parte intera e decimale) e mobile (SP) il seguente numero
• -39,125
• VF Parte intera complemento a 2, parte decimale col duale metodo dei resti
• VM Bit di segno, esponente, mantissa.
23