Programmazione I Appello di Febbraio (prima prova) 18 febbraio 2014 Cognome: Nome: Matricola: De Marco - Zizza De Prisco - Senatore Riservato alla commissione d’esame 1 2 3 4 5 6 7 8 TOT (/40) Ritirato 1 Esercizi Attenzione: le risposte vanno scritte dalla pagina 6 in poi. Leggere con molta attenzione il testo degli esercizi prima di svolgerli. Esercizio 1 Indicare il valore di ((~ 0) << 3) & (15 << 2). Mostrare tutti i passaggi. Esercizio 2 Cosa viene stampato eseguendo il codice seguente? #include <stdio.h> char *f (char *p); int main(void) { char p[] = "mia"; printf ("%s\n", f(p)); return 0; } char *f (char *p) { *(p+2) = ’o’; *p++; return p; } Spiegare nel dettaglio la funzione f . Esercizio 3 Quale sar` a l’output del seguente programma? #include <stdio.h> struct point { int x; int y; int z; }; void f (struct point *p); int main(void) { 2 struct point p = {1,2,3}; f(&p); printf ("x = %d y = %d z= %d\n", p.x, p.y, p.z); return 0; } void f (struct point *p) { int t = p->x; (*p).x = p->z; p->z = t; p->y = p->z - (*p).y; } Esercizio 4 Riscrivere la seguente funzione usando l’aritmetica sui puntatori invece dell’indicizzazione dell’array (eliminare le variabili i e j e tutti gli usi dell’operatore []). Sapreste indicare cosa fa la funzione e cosa viene stampato se viene eseguito il main seguente? #include <stdio.h> int f(char s[], char t[]) { int c = 0; int i = 0, j = 0; while (s[i++] == t[j++]) i f (s[i] && t[j]) ; e l s e break; i--; j--; while (s[i++] != t[j++]) i f (s[i] && t[j]) c++; e l s e break; return c; } int main(void) { char a[]="maritare"; char b[]="maritire"; char c[]="maposire"; char d[]="tire"; printf("Valore printf("Valore printf("Valore printf("Valore return 0; della della della della chiamata: chiamata: chiamata: chiamata: %d\n", %d\n", %d\n", %d\n", } 3 f(a,b)); f(a,c)); f(c,c)); f(b,d)); Esercizio 5 Indicare un opportuno valore per la malloc in riga 8. Sapreste indicare cosa fa la funzione f e cosa viene stampato se viene eseguito il main seguente? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> #include <stdlib.h> int *f(int *array, int n) { int *new; int i; new = malloc(...); i f (!new) fprintf(stderr, "mi dispiace\n"); else for (i=0; i<n; i++) new[i]=array[i] * 2; return new; } int main(void) { int array1[] = {1,2,3,4,5,6,7,8,9,0}; int *array2 = f(array1, 10); int i = 0; for (; i<10; i++) printf("%d ", array2[i]); printf("\n"); return 0; } Esercizio 6 Sapreste indicare cosa fa la funzione g e cosa viene stampato se viene eseguito il main seguente? #include <stdio.h> int g(unsigned int n) { int c = 0; f o r (; n&1 ; n >>= 1) c = (n & 0x01)? c+1: c; return c; } int main(void) { printf("Valore: %d\n", g(11)); printf("Valore: %d\n", g(10)); 4 printf("Valore: %d\n", g(23)); return 0; } Esercizio 7 Dopo aver indicato l’output del seguente programma, dire quali delle seguenti printf stampa un valore che non ha senso. #include <stdio.h> enum mobile {armadio, comodino=3, tavolo, sedia=8, letto}; int main(void) { enum mobile m; int i = tavolo+4; printf("i=%d\n", i); m=0; printf("m=%d\n", m); printf("m=%d\n", --m); m += 4; printf("m=%d\n", m); return 0; } Esercizio 8 Quale delle seguenti istruzioni non `e equivalente alle altre tre (assumendo che nel corpo dei cicli la parte non specificata sia identica). (a) (b) (c) (d) while (i++<10) {...} for (; i<10; i++) {...} for (; i<10; ) {... i++;} for (; i<10; ) {i++; ...} 5 Risposte Usare lo spazio seguente per rispondere agli esercizi. Per ciascuna risposta, indicare il numero dell’esercizio al quale essa si riferisce. Svolgere gli esercizi giustificando ogni risposta. Alle risposte corrette ma non giustificate sar`a assegnato un punteggio di poco superiore allo zero. 6 Risposte 7 Risposte 8 Risposte 9 Risposte 10
© Copyright 2024 Paperzz