Elementi di Informatica
Mondovì
Prova del 30 gennaio 2007
Matricola:___________________________________________________________
es. 1
Cognome:___________________________________________________________
es. 2
Nome:______________________________________________________________
es. 3
Corso di Laurea:______________________________________________________
es. 4
es. 5
tot.:
N.B.: in tutti gli esercizi riportare lo svolgimento (solo i passaggi significativi) ed il risultato !
 Tempo a disposizione: 1 ora e 30 minuti.
1.
Per misurare temperature nell'intervallo -30  +50 °C, un sistema a microprocessore è fornito di sensore
a cui è connesso un convertitore analogico/digitale tarato in modo da fornire il valore 0 per la
temperatura più bassa e il valore massimo esprimibile nel numero di bit a disposizione del convertitore
per la temperatura massima.
a) Se si vuole misurare la temperatura con la precisione dei decimi di grado, quale deve essere il
numero di bit del convertitore?
b) Quali sono le operazioni da effettuare sul dato fornito dal convertitore per visualizzare la
temperatura nell'intervallo richiesto? (simularle nel linguaggio C)
Risposta:
a) Occorre visualizzare l’intervallo -30.0
 +50.0 °C, per un totale di 500 – (-300) = 800 punti: occorrono 10 bit
(512 < 800 < 1024).
b) Dalla proporzione (V – 0)/(1024 – 0) = (T – (-300))/(500 – (-300)):
T = -300 + V 800/1024
Nel linguaggio C:
temperatura = ((long)valore * 800L) / 1024L;
1
2.
Rappresentare il numero 15.125 nel formato floating point standard. Successivamente sommarlo, se
lecito, con il numero 7F800000H, mostrando il risultato in decimale.
Mantissa:
1510 = 11112
0.12510 = 0.0012
15.125 = 1111.001 = 1.111001  23
Esponente:
3 + 127 = 130 (= 128 + 2)
15.125  0 10000010 11100100000000000000000
7F800000H = 0111 1111 1000 0000 0000 0000 0000 0000 ovvero:
0 11111111 00000000000000000000000
Esponente = 255, mantissa = 0: si sta rappresentando NAN, quindi non ha senso effettuare la somma (e
comunque il risultato sarebbe ancora NAN)
3.
Ricordando l'algoritmo per il complemento a 2 di un numero (si parte da destra, gli zeri e il primo uno
si riportano tali e quali, gli altri bit si invertono), sulla falsariga del full-adder si può realizzare un
"blocco" per il complemento a 2 di un numero qualunque sia il numero di bit che lo costituiscono. Il
blocco ha due ingressi, il bit B da trattare e un bit di controllo Ci, e due uscite, il bit corrente B' e il bit di
controllo Co per il livello successivo. Determinare le funzioni di forma minima per le uscite B' e Co di
un blocco.
numero
B
Ci
Co
B'
Complemento a 2 di numero
Bi
0
0
1
1
Ci
0
1
0
1
Bo
0
1
1
0
Co
0
1
1
1
Bo  BiCi  Bi C i
Co  BiCi  Bi C i  BiCi  Ci  Bi
2
0
4.
"Scannerizzate" la foto del/della fidanzato/a con uno scanner a 600 DPI, 256 colori. La foto è di 10 X 13
cm. Quanto spazio occuperà l'immagine? Quanto tempo richiederà il suo salvataggio su disco?
Risposta:
1 inch = 2.54 cm.
Dot lungo il primo asse: 600  10 / 2.54  2.360
Dot lungo il secondo asse: 600  13 / 2.54  3.070
Numero totale di punti: 2.360 3.070 = 7.245.200  7 Mpixel
Per codificare un punto di 256 colori occorre 1 byte, quindi si l'occupazione sarà di 7 MB.
Per la scrittura su disco: Tscrittura = Taccesso + dimensione_file / velocità_trasferimento =
50 ms + 7 MB / 10 MB/s = (0.050 + 0.7) s = 0.75 s
5.
Pitagora definì due numeri "amici" o "amicabili" se ognuno di essi è la somma di tutti i divisori
dell'altro (esclusi i numeri stessi). I due numeri amicabili più celebri del Pantheon pitagorico sono 220 e
284. Infatti:
i divisori di 220 sono: 1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110
i divisori di 284 sono: 1, 2, 4, 71, 142
e
1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284
1 + 2 + 4 + 71 + 142 = 220
Realizzare un programma che individui e stampi tutte le coppie di "numeri amicabili" nell'intervallo
degli interi. Attenzione: ogni coppia deve apparire una sola volta!
/* Soluzione esercizio 5 tema esame del 30 gennaio 2007 */
#include <stdio.h>
#include <values.h>
#include <conio.h>
typedef enum {FALSE, TRUE} boolean;
boolean calcolabile_amicabile(int n, int *p_amico);
main()
{
int numero, amico, amico_amico;
clrscr();
for(numero = 2; numero < MAXINT; numero++)
if(calcolabile_amicabile(numero, &amico))
if(calcolabile_amicabile(amico, &amico_amico))
if((numero == amico_amico) && (numero > amico))
printf("Sono amicabili %d e %d\n", numero, amico);
printf("Fine\n");
} /* end main */
3
boolean calcolabile_amicabile(int n, int *p_amico)
{
boolean lecito;
int somma, indice;
lecito = TRUE;
somma = 0;
for(indice = 1; (indice < n) && lecito; indice++)
if( (n % indice) == 0)
{
somma = somma + indice;
if(somma < 0)
lecito = FALSE;
}
*p_amico = somma;
return(lecito);
}
4