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