Politecnico di Milano Facoltà di Ingegneria Industriale INFORMATICA B Prima prova in itinere COGNOME E NOME 13 novembre 2006 RIGA COLONNA MATRICOLA Il presente plico pinzato, composto di sei fogli, deve essere debitamente compilato con cognome, nome, numero di matricola, posizione durante lo scritto (comunicata dal docente), e deve essere firmato. I compiti non compilati, non firmati o con fogli mancanti non saranno considerati validi e quindi non saranno corretti. Sarà valutato solo quanto scritto su questi fogli. Sul tavolo non devono essere presenti telefoni cellulari, PDA o computer di qualsiasi tipo. FIRMA
Esercizio 1 (3 punti). Si consideri il seguente programma in linguaggio C: #include <stdio.h> void s1(int a1, int a2) int tmp; if(a1 > a2) tmp = a1; a1 = a2; a2 = tmp; void s2(int *a1, int *a2) int tmp; if(*a1 > *a2) tmp = *a1; *a1 = *a2; *a2 = tmp; void main() int x = 10; int y = 12; s1(x, y); printf( x=%d, y=%d\n, x, y); s2(&y, &x); printf( x=%d, y=%d\n, x, y); s2(&x, &y); printf( x=%d, y=%d\n, x, y); s2(&y, &y); printf( x=%d, y=%d\n, x, y); Si risponda alle seguenti domande: a. Che cosa viene stampato a video dalle quattro printf presenti nel main? b. Qual è il compito assolto da ciascun sottoprogramma? c. Per ogni chiamata di un sottoprogramma, si disegnino gli ambienti di esecuzione del main e del sottoprogramma nel momento in cui il controllo viene ceduto dal main al sottoprogramma (cioè dopo il passaggio dei parametri). a. Le printf stampano a video le seguenti informazioni: x=10, y=12 x=12, y=10 x=10, y=12 x=10, y=12 b. s2 scambia i valori delle variabili puntate dai due parametri nel caso in cui il valore della variabile puntata dal primo parametro sia maggiore del valore della variabile puntata dal secondo parametro. Il sottoprogramma s1 appare simile ad s2, ma in realtà non sortisce nessun effetto sulle variabili del chiamante. c. Ambienti di esecuzione:
Esercizio 2 (3 punti). Definire in linguaggio C un tipo di dato ArchivioDischi che rappresenti un insieme di dischi dei freni per motociclette. Ogni disco è caratterizzato dal diametro, dallo spessore, dal materiale, da una casa costruttrice e da un numero seriale. Dichiarare una variabile ad di tipo ArchivioDischi. Scrivere poi un frammento di programma in linguaggio C che stampa a video le case costruttrici e i numeri seriali dei dischi contenuti in ad con diametro maggiore di 20cm e con spessore minore di 4mm. Il programma deve anche stampare a video il numero dei dischi contenuti in ad che soddisfano le condizioni sopra riportate. Si assuma che in ad siano già stati immessi dei dati. #define MAX_STR 30; /* lunghezza massima delle stringhe */ #define MAX_DISCHI 100; /* numero massimo di dischi che il programma può gestire */ typedef struct float diametro; /* diametro del disco in cm */ float spessore; /* spessore del disco in cm */ char materiale[max_str]; char casacostruttrice[max_str]; unsigned long numeroseriale; Disco; typedef struct Disco arch[max_dischi]; int ndischi; ArchivioDischi; void main() int cont; /* contatore dei dischi che soddisfano le condizioni */ int i; ArchivioDischi ad;.. cont = 0; for(i=0; i<ad.ndischi; i++) if( (ad.arch[i].diametro > 20.0) && (ad.arch[i].spessore < 0.4) ) printf( %s %d\n, ad.arch[i].casacostruttrice, ad.arch[i].numeroseriale); cont++; printf( %d, cont);...
Esercizio 3 (3 punti). Date le seguenti dichiarazioni in linguaggio C: typedef char Parola[30]; typedef Parola ArrayParole[100]; void main() ArrayParole ap; int nparole; /* numero parole contenute in ap */ Scrivere una funzione in linguaggio C che riceve come parametri di ingresso un array di parole e il numero di parole contenute nell array e che restituisce il numero di caratteri della parola più lunga che inizia e termina con lo stesso carattere. Scrivere un frammento del main che contenga una chiamata alla funzione, usando come parametri attuali ap e nparole. int PiuLunga(ArrayParole parole, int n) int i; int lung; /* numero di caratteri della parola più lunga che inizia e termina con lo stesso carattere */ int ncar; /* numero di caratteri della parola attualmente analizzata */ lung = 0; for(i=0; i<n; i++) ncar = strlen(parole[i]); if(parole[i][0] == parole[i][ncar - 1]) if(ncar > lung) lung = ncar; return lung; Possibile chiamata alla funzione printf( %d, PiuLunga(ap,nparole) );
Esercizio 4 (3 punti). Assumendo di avere a disposizione una macchina di Von Neumann con una dimensione della parola di memoria pari a 12 bit e con codici operativi delle istruzioni dati dalla seguente tabella: leggi da tastiera un valore e ponilo in una cella 0100 stampa a video il contenuto di una cella 0101 carica il registro A con il contenuto di una cella 0000 carica il registro B con il contenuto di una cella 0001 somma i contenuti dei registri A e B 0111 moltiplica i contenuti dei registri A e B 1001 immagazzina il contenuto del registro A in una cella 0010 salta se il contenuto del registro A è 0 (jump=0) 1000 salta senza condizioni 1100 halt 1111 Scrivere un programma in linguaggio macchina che produca lo stesso risultato del seguente frammento di programma in linguaggio C: int x, y; scanf( %d, &x); scanf( %d, &y); if(x*y == 0) printf( %d, x+y); else printf( %d, y); INDIRIZZO CELLA CONTENUTO COMMENTO 0 (00000000) 0100 00001101 leggi da tastiera x 1 (00000001) 0100 00001110 leggi da tastiera y 2 (00000010) 0000 00001101 carica x nel registro A 3 (00000011) 0001 00001110 carica y nel registro B 4 (00000100) 1001 00000000 moltiplica il contenuto di A e B (risultato in A) 5 (00000101) 1000 00001000 se A*B è 0, salta all istruzione nella cella 8 6 (00000110) 0101 00001110 stampa a video y (contenuto nella cella 1) 7 (00000111) 1111 00000000 halt 8 (00001000) 0000 00001101 carica x nel registro A 9 (00001001) 0111 00000000 somma il contenuto di A e B (risultato in A) 10 (00001010) 0010 00001101 immagazzina in contenuto di A in x 11 (00001011) 0101 00001101 stampa a video il contenuto di x 12 (00001100) 1111 00000000 halt 13 (00001101) cella di memoria corrispondente a x 14 (00001110) cella di memoria corrispondente a y
Esercizio 5 (2 punti). Dati i numeri interi P1= 61 e P2=59: 1. indicare il numero minimo N1 di bit necessari per rappresentare il solo P1 in complemento a 2; 2. indicare il numero minimo N2 di bit necessari per rappresentare il solo P2 in complemento a 2; 3. indicare il numero N di bit necessari per rappresentare sia P1 che P2 in complemento a 2; 4. trasformare entrambi i numeri in complemento a 2 su N bit ed eseguire quindi la somma algebrica P1 + P2 e la sottrazione P1 P2; 5. dopo aver eseguito la somma, indicare se essa ha generato riporto (ribocco), overflow, entrambi, nessuno dei due. Si indichino tutti i passaggi svolti. Le soluzioni prive di passaggi non verranno prese in considerazione. Dati N bit, è possibile rappresentare i numeri interi P in complemento a 2 compresi nel seguente intervallo: -2 (N-1) <= P <= +2 (N-1) -1. 1) N1=7. Infatti: -2 6 <= -61 <= +2 6-1 cioè -64<= -61 <= +63 2) N2=7. Infatti: -2 6 <= +59 <= +2 6-1 cioè -64<= +59 <= +63 3) N1= N2=N=7. 4) -61<0 allora -61 (compl2) = (128-61 ) = 67 (naturalebase 2) 67 : 2 = 33 1 33 : 2 = 16 1 16 : 2 = 8 0 8 : 2 = 4 0 4 : 2 = 2 0 2 : 2 = 1 0 1 : 2 = 0 1, quindi -61 su 7 bit = 1000011 +59>0 allora +59 (compl2) = 59 (naturalebase 2) 59 : 2 = 29 1 29 : 2 = 14 1 14 : 2 = 7 0 7 : 2 = 3 1 3 : 2 = 1 1 1 : 2 = 0 1, quindi +59 su 7 bit = 0111011 Somma: 1 0 0 0 0 1 1 + 0 1 1 1 0 1 1 = 1 1 1 1 1 1 0 (-2) Differenza: -59<0 allora -59 (compl2) = (128 - -59 ) (naturalebase 2) = 69 (naturalebase 2) 69 : 2 = 34 1 34 : 2 = 17 0 17 : 2 = 8 1 8 : 2 = 4 0 4 : 2 = 2 0 2 : 2 = 1 0 1 : 2 = 0 1, quindi -59 su 7 bit = 1000101
1 0 0 0 0 1 1 + 1 0 0 0 1 0 1 = (1) 0 0 0 1 0 0 0 Si può notare che i due operandi hanno lo stesso segno (negativo) e che il segno del risultato è diverso dal segno dei due operandi. Questo ci dice che si è verificato un overflow. 5) Il risultato ottenuto dalla somma algebrica (-2) è rappresentabile su 7 bit. Di conseguenza, non è possibile avere overflow. Inoltre, il risultato è senza riporto. Il risultato della differenza, invece, NON è rappresentabile su 7 bit. Dunque si ha overflow. Inoltre, il risultato ha generato un riporto.