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