Codifica dell'Informazione, Aritmetica e...

24
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

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

F.A.Q.

Frequently Asked Questions

2

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

ESERCIZI

Vediamo esercizi sui cicli

19

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

Complemento a 2

• Codificare il numero -131.

• Quanti bit servono?

21

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

Virgola Mobile Single precision

• Convertire 0.75 in virgola mobile SP

24