Il 0% ha trovato utile questo documento (0 voti)
15 visualizzazioni3 pagine

Soluzione 20211123

Il documento presenta la prima prova in itinere del corso di Fondamenti di Informatica, con esercizi riguardanti la codifica binaria, la traduzione in codice assembler MIPS, la verifica della legalità di istruzioni C e la scrittura di una funzione per verificare la presenza di valori in un array. Ogni esercizio è dettagliato con la relativa soluzione e discussione, evidenziando concetti chiave come l'aritmetica dei puntatori e la semantica delle espressioni. La prova è strutturata per valutare le competenze pratiche e teoriche degli studenti nel campo dell'informatica.

Caricato da

jojiw93323
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd
Il 0% ha trovato utile questo documento (0 voti)
15 visualizzazioni3 pagine

Soluzione 20211123

Il documento presenta la prima prova in itinere del corso di Fondamenti di Informatica, con esercizi riguardanti la codifica binaria, la traduzione in codice assembler MIPS, la verifica della legalità di istruzioni C e la scrittura di una funzione per verificare la presenza di valori in un array. Ogni esercizio è dettagliato con la relativa soluzione e discussione, evidenziando concetti chiave come l'aritmetica dei puntatori e la semantica delle espressioni. La prova è strutturata per valutare le competenze pratiche e teoriche degli studenti nel campo dell'informatica.

Caricato da

jojiw93323
Copyright
© © All Rights Reserved
Per noi i diritti sui contenuti sono una cosa seria. Se sospetti che questo contenuto sia tuo, rivendicalo qui.
Formati disponibili
Scarica in formato PDF, TXT o leggi online su Scribd

Università degli Studi di Firenze, Scuola di Ingegneria – Corso di Laurea in Ingegneria Informatica – Prof.

Stefano Berretti

Fondamenti di Informatica
PRIMA PROVA IN ITINERE – 23 novembre 2021

Esercizio 1. (5 punti) (codifica operandi 1pt ciascuno, somma 2 pt, discussione 1pt)
Date la dichiarazione int x, y; e le istruzioni x=-125; e y=-6; scrivere la codifica binaria di x e y e la loro
somma. Ipotizzare che la rappresentazione del tipo int sia su 8 bit. Discutere il risultato ottenuto.

Esercizio 2. (5 punti) (operazioni da e verso la memoria 3pt, logica 2pt)


Tradurre in codice assembler MIPS la seguente istruzione C: *(X+i) -= Y[++j]; nell’ambito delle seguenti
dichiarazioni ed istruzioni:
int X[20], Y[20], *ptr, i, j;
ptr = X;
Ipotizzare che le variabili siano allocate in memoria a partire dall'indirizzo 200.

Esercizio 3. (10 punti) (verifica legalità 5pt, produzioni 2 pt, semantica 3pt)
Data la seguente istruzione:
position = &(ptr->buffer[*position].next);
nell’ambito delle seguenti dichiarazioni e definizioni
struct list { struct record * buffer;
… };
struct record { int value;
int next; };
struct list * ptr;
int * position;
verificarne la legalità riportando anche le produzioni della grammatica C utilizzate nella riduzione. Discutere la
semantica dell’istruzione.

Esercizio 4. (10 punti) (prototipo e parametri formali 3 pt, allocazione 2pt, logica 5 pt)
Scrivere la funzione C che riceve in ingresso un array di valori interi V, la sua dimensione N, ed un intero
0<=N1<=N, ed opera nel modo seguente:
• Considera uno ad uno i valori di V con indice da N1 ad N-1 e verifica se sono presenti nei primi N1-1
elementi di V;
• Alloca un array di valori Booleani A e lo assegna in modo tale che A[i] è TRUE se V[N1+i] è presente tra
gli elementi in V con indice tra 0 e N1-1, FALSE altrimenti;
• Restituisce tra i parametri formali della funzione l’array A.

(Esempio: V = {4, 2, 2, 5, 2, 6, 1}, N = 7, N1 = 4 --> A = {TRUE, FALSE, FALSE})


Università degli Studi di Firenze, Scuola di Ingegneria – Corso di Laurea in Ingegneria Informatica – Prof. Stefano Berretti

Soluzione

Esercizio 1.
Il valore -125 è rappresentato su 8 bit in notazione 2C come segue:
+125 in forma binaria su 8 bit 01111101
Complemento ad 1 10000010+
1
Complemento a 2 10000011 rappresentazione 2C del valore -125

Il valore -6 è rappresentato su 8 bit in notazione 2C come segue:


+6 in forma binaria su 8 bit: 00000110
Complemento ad 1: 11111001 +
1
Complemento a 2 11111010 rappresentazione 2C del valore -6

La somma è eseguita tra le rappresentazioni 2C: 10000011 +


11111010 =
01111101 numero positivo in 2C avendo il MSB a 0 (il riporto
non viene considerato)
Il risultato è perciò 01111101 che in decimale risulta: +125.
Il risultato non è quello atteso dato che è stato superato il minimo valore negativo rappresentabile con 8 bit in 2C (-128).
L’aritmetica produce un risultato passando dal minimo valore negativo al massimo valore positivo.

Esercizio 2. (5 punti)
Istruzione C: *(ptr+i) -= Y[++j];

addi $1, $0, 0 // indice i


addi $2, $0, 0 // indice j
….
lw $3, 200[$1] // carica *(X+i) nel registro $3. Aritmetica dei puntatori
addi $2, $2, 1 // incremento prefisso dell’indice j
lw $4, 280[$2] // carica Y[j] nel registro $4
sub $3, $3, $4 // sottrae il valore contenuto in $4 dal valore contenuto in $3
sw $3, 200[$1] // salva il contenuto del registro $3 in memoria centrale
….

Esercizio 3. (10 punti)


Albero sintattico:
position = &(ptr->buffer[*position].next);
<id> = &(<id> -> <id>[*<id>].<id>);
<var> = &(<var> -> <id>[*<id>].<id>);
<var> = &(<expr> -> <id>[*<id>].<id>);
<var> = &(<var>[*<var>].<id>);
<var> = &(<expr>[*<expr>].<id>);
<var> = &(<expr>[<var>].<id>);
Università degli Studi di Firenze, Scuola di Ingegneria – Corso di Laurea in Ingegneria Informatica – Prof. Stefano Berretti

<var> = &(<expr>[<expr>].<id>);
<var> = &(<var>.<id>);
<var> = &(<var>);
<var> = &<var>;
<var> = <expr>;
<expr>;
<statement>
L'istruzione è legale dato che è possibile passare dai simboli terminali al simbolo iniziale <statement>.
Produzioni della grammatica usate nella derivazione dell’albero sintattico:
<var> ::= <id> | (<var>) | *<expr> | <expr>[<expr>] | <expr>-><id> | <var>.<id>
<expr> ::= <var> | &<var> | <var>=<expr> |
<statement> ::= <expr>;
La semantica di un’istruzione elementare consiste nell’eseguire l’espressione che precede il ; applicandone la semantica e
nel cedere il controllo del flusso di esecuzione all’istruzione seguente. A sua volta la semantica dell’espressione è data dal
valore restituito e dai side effect. Il valore restituito dall’espressione è il valore della variabile position nel tipo di un
puntatore a int. L’espressione produce un side effect sulla variabile position assegnandola con l’indirizzo del campo
next dell’elemento *position dell’array di dati strutturati buffer di tipo record a sua volta campo del dato
strutturato ptr di tipo list.

Esercizio 4.
#define TRUE 1
#define FALSE 0
typedef unsigned short int Boolean;

Boolean array_include_values(int * V, int N, int N1, Boolean ** A) {


int positiom, count;
Boolean found;

*A = (Boolean *) malloc(sizeof(Boolean)*(N-N1));
if ( *A == NULL )
return FALSE;

// verifica inclusione ultimi N-N1 elementi di V nei primi N1 elementi


for( position=0; position<N-N1; position++ ) {
found = FALSE;
count = 0;
while( count < N1 && found == FALSE ) {
if( V[N1+position] == V[count] )
found = TRUE
else
count++;
}
(*A)[position] = found;
}
return TRUE;
}

Potrebbero piacerti anche