traccia

Programmazione I
Appello di Luglio (prima prova)
18 luglio 2014
Cognome:
Nome:
Matricola:
Indicare la classe di appartenenza:
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
(1<<5) ^ (7<<3).
Giustificare la risposta.
Esercizio 2 Cosa viene stampato eseguendo il codice seguente?
#include <stdio.h>
char *f (char *p);
int main(void) {
char p[] = "stringa lunga 26 caratteri";
printf ("%s\n", f(p));
return 0;
}
char *f (char *p) {
*p += ’A’-’a’;
*(p+15) += 1;
*(p+26) = ’.’;
*(p+27) = 0;
return p;
}
Giustificare la risposta spiegando cosa fa la funzione f e come essa determina l’output.
Esercizio 3 Siano c e j dichiarate come segue
enum {FALSE, TRUE, UNKNOWN} c;
int j;
Considerare le seguenti istruzioni:
a) c = TRUE;
b) c--;
c) j = 13*c - 8;
d) c = j;
d) c = c+10;
2
Quali di queste istruzioni assegna alla variabile alla sinistra dell’operatore di assegnazione un
valore che `e al di fuori dell’insieme di valori previsti dal tipo della variabile stessa?
Esercizio 4 Dire cosa fa la seguente funzione. Si dica espressamente se il carattere di newline
viene inserito nella stringa.
char *f(char s[], int n){
int ch, i=0;
do {
ch=getchar();
i f (i < n)
s[i++] = ch;
} while (ch != ’\n’);
s[i]=’\0’;
return s;
}
Esercizio 5 Indicare un opportuno valore per la malloc in riga 6. Sapreste indicare cosa
fa la funzione f e cosa viene stampato se, dopo la compilazione, viene eseguito ./a.out 5?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
long *f(int *array, int n)
{
long *new = malloc(...);
int i;
i f (new){
for (i=0; i<n; i++) {
new[i] = array[i]*array[i];
new[n+i] = new[i]*array[i];
}
}
else
fprintf(stderr, "oops\n");
return new;
}
int main(int argc, char **argv){
i f (argc != 2)
return 0;
int x = atoi(argv[1]);
int array1[x];
3
24
25
26
27
28
29
30
31
32
33
34 }
int y = x;
while (x)
array1[--x] = x;
long *array2 = f(array1, y);
int i = 0;
for (; i<2*y; i++)
printf("%li ", 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, d = 0, e;
unsigned int m = n;
while (m) {
d++;
m >>= 1;
}
e = 1 << (d-1);
fo r (; (n&e) ; n <<= 1) c++;
return c;
}
int main(void) {
printf("Valore:
printf("Valore:
printf("Valore:
printf("Valore:
return 0;
}
%d\n",
%d\n",
%d\n",
%d\n",
g(1));
g(2));
g(225));
g(49));
Esercizio 7 La funzione f del seguente programma non fornisce il risultato atteso. Sapreste
indicare l’errore?
#include <stdio.h>
4
struct studente {
char *nome;
char *cognome;
int matricola;
int max_voto;
int n;
};
struct esame {
int matricola;
int voto;
};
void f(struct studente t, struct esame s) ;
int main(void) {
struct studente st = {"Boninsegna","Roberto", 123456, 28, 1};
struct esame es = {00020, 28};
f(st, es);
es.voto = 30;
f(st, es);
es.voto = 27;
f(st, es);
printf("%s\n", (&st)->cognome);
printf("%s\n", st.nome);
printf("Voto piu‘ alto: %d\n", (&st)->max_voto);
return 0;
}
void f(struct studente s, struct esame e) {
s.n++;
s.max_voto = (s.max_voto < e.voto)? e.voto: s.max_voto;
}
Esercizio 8 Cosa fa il seguente programma? Indicare cosa viene stampato se, dopo la compilazione, vengono eseguiti i seguenti comandi:
A. ./a.out buongiorno buonasera
B. ./a.out buon buonasera
5
C. ./a.out ciao arrivederci
D. ./a.out buongiorno buon
#include <stdio.h>
int main(int argc, char *argv[]) {
i f (argc != 3) {
printf("Errore\n");
return 0;
}
int i = 0;
while (argv[1][i] == argv[2][i++]){
i f (argv[1][i] == ’\0’){
printf("%d\n", i);
return 0;
}
i f (argv[2][i] == ’\0’){
printf("%d\n", -i);
return 0;
}
}
printf("0\n");
return 0;
}
6
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.
7
Risposte
8
Risposte
9
Risposte
10
Risposte
11