text

Transcript

text
Esercizi Programmazione I
30 Novembre 2016
Esercizio 1
Utilizzo della memoria dinamica
Scrivere un programma in C che esegue le seguenti istruzioni in ordine. Leggere un valore n intero da tastiera e
utilizzare calloc() per creare un array (il puntatore all’array si chiama p) di n variabili di tipo int. Utilizzare un ciclo per
inizializzare tutto l’array con valori presi da tastiera, utilizzando l’aritmetica dei puntatori (p + i). Utilizzare un ciclo per
stampare l’array, questa volta utilizzando l’operatore [ ] (cioè stampare i valori dell’array con p[i]). Liberare la memoria
occupata dall’array utilizzando la funzione free(). Con malloc allocare un array di 2 ∗ n variabili intere (salvare l’indirizzo
ritornato da malloc() sempre in p). Stampare il valore di p (il valore del puntatore). Stampare il valore di tutti gli elementi
dell’array p per vedere come è stato automaticamente inizializzato. In seguito, assegnare ad ogni elemento dell’array p
l’indice della sua posizione nell’array (p[i] = i). Stampare nuovamente il contenuto di tutto l’array. Ridimensionare
l’array da 2 ∗ n ad n elementi (utilizzando realloc). Stampare nuovamente il valore di p (il valore del puntatore), per
vedere se realloc() ha spostato l’array. Stampare il contenuto del nuovo array. Ridimensionarlo nuovamente portandolo a
2 ∗ n elementi. Stampare nuovamente il valore di p (il valore del puntatore), per vedere se realloc() ha spostato l’array.
Stampare solo gli elementi di p da n a (2 ∗ n) − 1 (la seconda metà).
Esercizio 2
Artimetica dei puntatori
Dato il seguente programma, (senza implementarlo) dire se genera errori (o warning) al momento della compilazione.
1
2
#i n c l u d e <s t d i o . h>
#i n c l u d e < s t d l i b . h>
3
4
5
i n t main ( v o i d ) {
6
i n t n= 0 ;
7
8
p r i n t f ( ”Dammi numero e l e m e n t i d e l l ’ a r r a y : ” ) ;
s c a n f ( ”%d” , &n ) ;
9
10
11
i n t ∗ p= c a l l o c ( n , s i z e o f ( i n t ) ) ; // Quanti b y t e d i memoria a l l o c o q u i ?
12
13
14
f o r ( i n t i= 0 ; i < n ; i ++) {
p r i n t f ( ”Dammi e l e m e n t o %d\n” , i +1) ;
s c a n f ( ”%d” , p+i ) ;
}
15
16
17
18
19
s h o r t ∗ q= ( s h o r t ∗ ) p ;
20
21
f o r ( i n t i= 0 ; i < 2∗n ; i ++) {
p r i n t f ( ” Elemento %d : %d\n” , i +1 , ∗ ( q+i ) ) ;
}
22
23
24
25
free (p) ;
26
27
}
Ricordandosi che 216 = 65536 e che supponiamo di avere una memoria in little endian (letta da sinistra verso destra)
e con valori rappresentati in complemento a due, spiegare come mai accade
Dammi numero elementi dell’array: 3
Dammi elemento 1
4
1
Dammi elemento 2
65536
Dammi elemento 3
65535
Elemento 1: 4
Elemento 2: 0
Elemento 3: 0
Elemento 4: 1
Elemento 5: -1
Elemento 6: 0
Esercizio 3
Trova gli errori
Segnare quali comandi generano un errore o un warning a tempo di compilazione, e dire perché.
1
#i n c l u d e <s t d i o . h>
2
3
i n t main ( v o i d ) {
4
i n t a= 6 , b= 7 ;
c o n s t i n t ∗ p= &a ;
i n t ∗ c o n s t q= &a ;
i n t ∗ r= &b ;
5
6
7
8
9
∗q= a +1;
10
11
p r i n t f ( ” a= %d\n” , a ) ;
12
13
a= a++;
14
15
p r i n t f ( ” a= %d\n” , a ) ;
16
17
∗p= a +1;
18
19
p r i n t f ( ” a= %d\n” , a ) ;
20
21
q= r ;
22
23
a= ∗ r ;
24
25
p r i n t f ( ” a= %d\n” , a ) ;
26
27
28
}
29
Esercizio 4
Cosa stampa?
Dato il seguente programma (senza implementarlo), scrivere cosa stampa.
1
#i n c l u d e <s t d i o . h>
2
3
i n t main ( v o i d ) {
4
i n t a= 6 ,
b= 7 , c= 1 3 ;
5
6
7
do { i f ( a<b ) i f ( b%2 !=0) i f ( 4 ) b++; i f ( c == 2∗ a ) c++; e l s e c −−; i f ( a+b>=c ? 1 : 0 ) a−−;} w h i l e ( a >0) ;
8
9
p r i n t f ( ” a= %d” , a ) ;
p r i n t f ( ”b= %d” , b ) ;
p r i n t f ( ” c= %d” , c ) ;
10
11
12
13
14
}
15
Esercizio 5
Trova gli errori
Trova gli errori in queste dichiarazioni di variabili.
2
1
i n t main ( v o i d ) {
2
f l o a t p∗ = n u l l ;
i n t a= 3 ;
d o u b l e a= 3 . 2 ;
i n t b= 0 ;
l o n g i n t B= 0 ;
3
4
5
6
7
8
9
}
10
Esercizio 6
Disegno figure geometriche
1. Si realizzi un programma in linguaggio C che legga un numero intero N e visualizzi un quadrato di asterischi di lato
N (vedi esempio con N = 5).
2. Si realizzi una variante del programma per visualizzare solo i lati del quadrato (vedi esempio con N = 5).
3. Si realizzi una variante del programma per visualizzare un triangolo isoscele rettangolo di lato N (vedi esempio con
N = 5).
4. Si realizzi una variante del programma per visualizzare un quadrato di lato N come nell’esempio del caso 4 (con N
= 5).
3