Академический Документы
Профессиональный Документы
Культура Документы
Istruzioni
1. La prova dura 2 ore.
2. ALLA FINE DELLA PROVA VA CONSEGNATO SOLO QUESTO PLICO (SCRIVETE
CON CARATTERI DI DIMENSIONE ADEGUATA). Scrivere solo sui fogli distribuiti. Non
separare questi fogli. Si può utilizzare la matita.
3. È vietato portare all’esame libri, eserciziari, appunti o calcolatrici. Chiunque venga trovato in
possesso di documentazione relativa al corso – anche se non strettamente attinente alle domande
proposte – vedrà annullata la propria prova.
4. Non è possibile uscire dall’aula durante la prova o lasciare l’aula conservando il tema della
prova in corso.
NEGLI ESERCIZI DI PROGRAMMAZIONE SI SUPPONGA CHE:
- I VALORI LETTI DA TERMINALE E/O DA FILE SIANO SEMPRE COMPATIBILI COL
TIPO DELLE VARIABILI CORRISPONDENTI E CHE TALI VALORI NON GENERINO
OVERFLOW,
- LE FUNZIONI DI LETTURA/SCRITTURA A TERMINALE E/O FILE E DI CHIUSURA
DEI FILE NON GENERINO ERRORE.
TUTTE LE ALTRE CONDIZIONI DI ERRORE CHE SI POSSONO VERIFICARE VANNO
CONTROLLATE.
pp. 2 / 4
Esercizio B. Esercizio in linguaggio C
Data una lista dinamica nella quale ogni elemento punta al successivo e al precedente e definita dalle
seguenti dichiarazioni (si noti che "primo" punta al primo elemento della lista e permette tramite la scansione
del campo "prossimo" di ogni elemento di raggiungere l'ultimo elemento puntato da "ultimo"):
pp. 3 / 4
Esercizio C.
1. Si indichi, utilizzando 10 bit, il valore in base 2, in base 16 del numero 333 e in complemento a
due dei numeri -333, -100
333 base 2: base 16:
-333
-100
2. Convertire il valore esadecimale EFF8 (16 bit) in binario e trovare il numero decimale
corrispondente supponendo che sia un numero naturale
EFF8 base 2: base 10:
3. Quali vantaggi offre al programmatore la traduzione dei programmi divisa in due fasi separate
(compilazione + collegamento) quando sta realizzando un programma suddiviso in più file?
Rispondere brevemente.
4. Si supponga di avere un’operazione O che può essere realizzata come circuito hardware da
inserire nell’Unità aritmetico logica (ALU) del calcolatore oppure come funzione C (realizzata
implementando O in termini di operazioni più elementari disponibili nella ALU) resa disponibile
tramite una libreria memorizzata sul calcolatore. Confrontando le due soluzioni indicare,
motivando brevemente la risposta, quale possa essere
a. la soluzione più efficiente (tempo di esecuzione)
5. Date le seguenti variabili globali: int c=3, d=5, e=2; e la seguente funzione
int f(int a, int *b) {*b=a; b=&a; b=3; return (a+c);}
indicare quali valori assumerebbero le variabili globali c, d, e dopo l’esecuzione delle seguenti
istruzioni (ogni istruzione deve essere eseguita considerando i valori iniziali delle variabili
globali):
e = f(6,&c); c= d= e=
pp. 4 / 4
c = f(4,&d); c= d= e=
pp. 5 / 4
SOLUZIONE ESERCIZIO A
a)
#include <stdio.h>
#include <string.h>
b)
void InitVettore(struct rec V[], int *u)
{*u=-1;}
c)
int Leggi (char *nome, struct rec V[], int *u)
{ FILE *f; struct rec temp;
if ((f = fopen(nome, "rb"))==NULL) { printf("errore apertura file"); return 0;}
else
{*u=-1;
while (fread(&temp, sizeof(struct rec),1,f)==1)
{ *u=*u+1; V[*u]=temp;
}
fclose (f);
}
if ((f = fopen(nome, "wb"))==NULL) { printf("errore riapertura file per cancellazione"); return 0;}
else {fclose(f); return 1;}
}
d)
void main()
{int i;
InitVettore(VET,&ultimo);
if (Leggi(nomefile,VET,&ultimo)==1)
{ for (i=0; i<=ultimo;i++)
if (strcmp(VET[i].nome,"Rover472")==0)
printf("\nnome=%s,S/N=%d,quantità=%d",VET[i].nome,VET[i].serialNum,VET[i].quantita);
}
else printf(“Leggi non corretta”);
}
SOLUZIONE ESERCIZIO B
Si devono considerare i vari stati nei quali si può trovare la lista e le varie posizioni di inserimento.
pp. 6 / 4
A)
#include <stdio.h>
#include <stdlib.h>
B)
int INSERT(t_pointer *p, int val, int pos)
{ ElemLista *temp, *prec; int precpos;
if (pos<1) return 0;
if (pos==1)
{ temp=(ElemLista*) malloc(sizeof(ElemLista));
if (temp==NULL)return 0;
else
{temp ->valore=val; temp ->prossimo=p->primo; p->primo=temp; temp ->precedente=NULL;
// verifica esistenza di altro elemento nella lista
if (temp ->prossimo==NULL) p->ultimo=temp; else temp ->prossimo ->precedente=temp;
return 1;
}
}
else
//pos>1 verifica esistenza posizione
{ prec = p->primo; precpos=1;
while((prec!=NULL) && (precpos <(pos-1))) {precpos++; prec=prec->prossimo;}
if (prec==NULL)
//lista contiene meno elementi di quelli richiesti da pos
return 0;
else
{temp= malloc(sizeof(ElemLista));
if (temp==NULL)return 0;
else //inserimento
{temp ->valore=val; temp ->prossimo = prec->prossimo;
prec->prossimo=temp;
temp ->precedente=prec;
if (temp ->prossimo==NULL) p->ultimo=temp; else temp ->prossimo ->precedente=temp;
}
}
return 1;
}
}
C)
void main()
{ int v,p;
printf("inserire valore e posizione"); scanf("%d",&v);scanf("%d",&p);
printf("\n%d",INSERT(&pointer, v,p));
}
SOLUZIONE ESERCIZIO C
Si indichi, utilizzando 10 bit, il valore in base 2, in base 16 del numero 333 e in complemento a due
dei numeri -333, -100
333 base 2: 01 0100 1101 base 16: 14D
-333 10 1011 0011
-100 11 1001 1100
Convertire il valore esadecimale EFF8(16 bit) in binario e decimale
EFF8 base 2: 1110 1111 1111 1000 base 10: 215 +214 +213 +211 ...+23
pp. 7 / 4
Quali vantaggi offre al programmatore la traduzione dei programmi divisa in due fasi separate
(compilazione + collegamento) quando sta realizzando un programma suddiviso in più file?
Rispondere brevemente.
- Permette di verificare la correttezza del codice scritto in ogni file attivando il compilatore
solo sul file realizzato indipendentemente dagli altri file;
- Permette di assegnare ogni file da realizzare a programmatori diversi che possono compilare
la propria parte indipendentemente dagli altri.
- Permette di riutilizzare file scritti da altri (librerie) senza averne il codice sorgente.
Si noti che ovviamente la correttezza complessiva richiede di realizzare l’eseguibile complessivo e
di verificarne la correttezza in esecuzione.
Si supponga di avere un’operazione O che può essere realizzata come circuito hardware da inserire
nell’Unità aritmetico logica (ALU) del calcolatore oppure come funzione C (realizzata
implementando O in termini di operazioni più elementari disponibili nella ALU) resa disponibile
tramite una libreria memorizzata sul calcolatore. Confrontando le due soluzioni indicare, motivando
brevemente la risposta, quale possa essere
la soluzione più efficiente (tempo di esecuzione)
la soluzione hardware permette di ottimizzare l’operazione O, mentre la soluzione software realizza
l’operazione O attraverso un algoritmo che coinvolge operazioni più semplici e pertanto in generale
non è sempre possibile ottenere lo stesso livello di ottimizzazione.
e indicare quali operazioni fisico/logiche si debbano eseguire in entrambi i casi quando si decida di
modificare la realizzazione proposta (ad esempio, modificando il circuito hardware o l’algoritmo
software) e indicare se il calcolatore richieda di essere spento per effettuare la sostituzione..
- Caso hardware: si deve realizzare una nuova scheda che va sostituita nel calcolatore e ciò
comporta il fermo macchina per il tempo necessario.
- Caso software: va realizzato il nuovo programma e poi sostituito al precedente e ciò non
comporta in generale il fermo macchina a meno che sia un programma che faccia parte del sistema
operativo.
Date le seguenti variabili globali: int c=3, d=5, e=2; e la seguente funzione
int f(int a, int *b) {*b=a; b=&a; b=3; return (a+c);}
indicare quali valori assumerebbero le variabili globali c, d, e dopo l’esecuzione delle seguenti
istruzioni (ogni istruzione deve essere eseguita considerando i valori iniziali delle variabili globali):
e = f(6,&c); c= 6 d= 5 e= 12
c = f(4,&d); c= 7 d= 4 e= 2
pp. 8 / 4