MARCO POLO Reiseführer Apulien

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