Esercizi Programmazione I

Похожие документы
Basi della programmazione in Java. Anteprima. Uso delle variabili. Il concetto di variabile Uso delle variabili. Input da tastiera I tipi Esercizi

Elementi lessicali. Lezione 4. La parole chiave. Elementi lessicali. Elementi lessicali e espressioni logiche. Linguaggi di Programmazione I

Problema. Vettori e matrici. Vettori. Vettori

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

C: panoramica. Violetta Lonati

Espressioni. Espressioni. Valutazione di un espressione. Espressioni semplici

HOMEWORKS. in modo che il programma stampi N ripetizioni della stringa HelloWorld (su righe diverse), con N inserito dall utente.

Teorema di Pitagora. Triangoli con angoli di 45, 30 e 60. Eserciziario con soluzioni. - 1

Il linguaggio C. Notate che...

Tipi di dati scalari (casting e puntatori) Alessandra Giordani Lunedì 10 maggio 2010

- Dispensa III - PROGRAMMAZIONE C (Parte I)

Linguaggio C. strutture di controllo: strutture iterative. Università degli Studi di Brescia. Docente: Massimiliano Giacomin

Scelte ed alternative. Esercizi risolti

Introduzione alla programmazione in C(++)

Errori frequenti Cicli iterativi Array. Cicli e array. Laboratorio di Programmazione I. Corso di Laurea in Informatica A.A.

Introduzione al linguaggio C Puntatori

Espressione di chiamata di funzione

Esercitazione 3. Espressioni booleane I comandi if-else e while

Esercizi di programmazione in C

Informatica B. Sezione D. Scuola di Ingegneria Industriale Laurea in Ingegneria Energetica Laurea in Ingegneria Meccanica

Esercitazione 6. Array

ESERCIZI DI PROGRAMMAZIONE DA SVOLGERE INDIVIDUALMENTE - parte 1 -

Struttura dei programmi C

Compitino di Laboratorio di Informatica CdL in Matematica 13/11/2007 Teoria Compito A

Le basi del linguaggio Java

Stringhe e allocazione dinamica della memoria

Programmazione in Java (I modulo)

Variabili. Unità 2. Domenico Daniele Bloisi. Corso di Programmazione e Metodi Numerici Ingegneria Aerospaziale BAER

Lezione 6 Introduzione al C++ Mauro Piccolo

Un esempio per iniziare. Il controllo del programma in C. Altri cenni su printf() Esercizi (printf) printf( 8!=%d, fatt);

Esercitazione 4. Comandi iterativi for, while, do-while

Laboratorio di Programmazione Lezione 2. Cristian Del Fabbro

Istruzioni iterative. Istruzioni iterative

a.a Codice corso: 21012, HOMEWORKS

I costrutti forniti dal linguaggio si dividono in corrispondenti classi di istruzioni

IL PRIMO PROGRAMMA IN C

Algoritmi e basi del C Struttura di un programma

Creare una funzione float square(float x). La funzione deve restituire il quadrato del parametro x.

Esercitazione 5. Procedure e Funzioni Il comando condizionale: switch

ESERCIZI JAVA. Esercizi sulle Interfacce. Esercizio 1:

soluzione in 7 step Es n 208

Fondamenti di Informatica 6. Algoritmi e pseudocodifica

Definizione di metodi in Java

Linguaggio C Informatica Grafica

Lezione 9: Puntatori a funzioni. Tipi enumerativi e orientati ai bit

3. Indicare cosa sta a significare la figura geometrica del rombo in un diagramma a blocchi

Non ci sono vincoli sul tipo degli elementi di un vettore Possiamo dunque avere anche vettori di

Questo teorema era già noto ai babilonesi, ma fu il matematico greco Pitagora, intorno al 500 a.c., a darne una descrizione precisa.

I puntatori. Un puntatore è una variabile che contiene l indirizzo di un altra variabile. puntatore

Per gli esercizi sulla algebra booleana, si consiglia di verificare tramite tabelle di verità le equivalenze logiche proposte sulle dispense.

Fondamenti di Informatica T-1

Realizzare un programma che legga da input tre numeri interi e stampi a video la loro somma e la media.

SISTEMI DI RIFERIMENTO SU UNA RETTA E SU UN PIANO

Ministero della Difesa Direzione Generale per il Personale Militare I Reparto

Istruzioni iterative (o cicliche)

Triangolo rettangolo

COMANDI ITERATIVI. Ivan Lanese

PROGRAMMAZIONE: Le strutture di controllo

Fondamenti di Informatica T-1 Modulo 2

Esempio (if): equazione di secondo grado

Indice. Prefazione. 3 Oggetti e Java 53

Cicli annidati ed Array multidimensionali

Транскрипт:

Esercizi Programmazione I 9 Novembre 201 Esercizio 1 Valutare e dare il tipo delle seguenti espressioni condizionali. 1 char a= a, b= b ; // a ha v a l o r e decimale 97 2 i n t i= 1, j= 2 ; 3 double x= 7. 0 7 ; i == j? a 1 : b + 1 ; j % 3 == 0? i + : x ; 7 j % 3? i + : x ; Tipo espressione condizionale Soluzione dell esercizio 1 (i == j)? (a - 1) : (b + 1) Valore 99, Tipo int ((j % 3) == 0)? (i + ): x Valore 7.07, Tipo double (j % 3)? (i + ): x Valore.0, Tipo double Ricordarsi che il tipo di un espressione expr1? expr2: expr3 condizionale è uno solo, e dipende dai tipi delle espressioni expr2 e expr3 : utilizzare le regole di conversione di tipo tra expr2 e expr3 per trovare il tipo di tutta l espressione. Esempio, nel terzo caso sopra, i + ha tipo int, ma viene ritornato un valore.0 di tipo double, dato che expr3 ha tipo double. Il tipo di expr2 viene quindi convertito a quello di expr3. Esercizio 2 Operatore virgola Studiare la seguente porzione di codice; rispondere alle domande nei commenti. Infine controllare la correttezza delle proprie risposte eseguendo tale codice. 1 i n t a= 0 ; 2 double b= 3. ; 3 // D i c h i a r a r e c con i l t i p o appropriato, i n modo che non c i s i a n o c o n v e r s i o n i d i t i p o c= ( a =, b = b + 0. 3 ) ; 7 // Cosa stampa? p r i n t f ( %d\n%f \n%f \n, a, b, c ) ; 9 10 // D i c h i a r a r e d con i l t i p o appropriato, i n modo che non c i s i a n o c o n v e r s i o n i d i t i p o 11 d= ( a++, a + 2) ; 12 13 // Cosa stampa? 1 p r i n t f ( %d\n%d\n, a, d ) ; 1 1 i n t i, j, k= 3 ; 17 double x= 3. 3 ; 1 19 // D i c h i a r a r e f con i l t i p o appropriato, i n modo che non c i s i a n o c o n v e r s i o n i d i t i p o 20 f= ( i = 1, j = 2, ++k + 1) ; 21 22 // D i c h i a r a r e g con i l t i p o appropriato, i n modo che non c i s i a n o c o n v e r s i o n i d i t i p o 23 g= ( j= k!= 1, ++x 2. 0 + 1) ; 2 2 // Cosa stampa? 2 p r i n t f ( %d\n%d\n%d\n%f \n%d\n%f \n, i, j, k, x, f, g ) ; 1

1 i n t a= 0 ; 2 double b= 3. ; 3 double c = 0. 0 ; c= ( a =, b = b + 0. 3 ) ; 7 p r i n t f ( %d\n%f \n%f \n, a, b, c ) ; 9 i n t d= 0. 0 ; 10 d= ( a++, a + 2) ; 11 12 p r i n t f ( %d\n%d\n, a, d ) ; 13 1 i n t i, j, k= 3 ; 1 double x= 3. 3 ; 1 17 i n t f= ( i = 1, j = 2, ++k + 1) ; 1 double g= ( j= k!= 1, ++x 2. 0 + 1) ; 19 Soluzione dell esercizio 2 20 p r i n t f ( %d\n%d\n%d\n%f \n%d\n%f \n\n, i, j, k, x, f, g ) ; Output del programma precedente 3.00000 3.00000 7 1 1.300000 9.00000 Esercizio 3 Precedenza operatori Studiare la seguente porzione di codice e scrivere quello che si pensa stampi. Cosa succede se si toglie la prima o la seconda coppia di parentesi, o entrambe? Controllare solo alla fine la correttezza delle proprie risposte eseguendo il codice. 1 i n t x= 0, y= 0, z= 0 ; 2 x = ( y = 2) + ( z = 3) ; 3 p r i n t f ( %d %d %d\n, x, y, z ) ; Soluzione dell esercizio 3 2 3 (senza togliere parentesi) 3 (togliendo la prima coppia di parentesi) error: expression is not assignable (togliendo la seconda coppia) error: expression is not assignable (togliendo entrambe le coppie) Togliendo la prima coppia, viene valutata per prima l espressione (y = 2), a cui poi si somma z. (y = 2) + z NON rappresenta però un lvalue, quindi non può stare a sinistra di un operatore di assegnamento. Togliendo la seconda coppia di parentesi invece, viene valutata per prima 2 + z (che non è un lvalue), a cui si cerca poi di assegnare 3. Esercizio Effetti collaterali (side effects) Studiare la seguente porzione di codice e scrivere quello che stampa a video. Solo in seguito, scrivere un tale programma, compilare, eseguire e controllare se quello che si era pensato è corretto. 1 i n t a, b =0, c =0; 2 a =++b + ++c ; 3 p r i n t f ( %d %d %d\n, a, b, c ) ; a= b+++c++; 2

p r i n t f ( %d %d %d\n, a, b, c ) ; a= ++b + c++; 7 p r i n t f ( %d %d %d\n, a, b, c ) ; a= b + c ; 9 p r i n t f ( %d %d %d\n, a, b, c ) ; 10 i n t q = q ; 11 p r i n t f ( %d\n, q ) ; 12 i n t r = 2+ q++; 13 p r i n t f ( %d %d\n, r, q ) ; 1 Sul mio ambiente viene stampato questo: 2 1 1 2 2 2 3 3 2 2 199390 199390 199390 Soluzione dell esercizio Alcuni compilatori C possono inizializzare una variabile a 0, ma, in generale, una variabile (non dichiarata come static o extern) può essere assegnata a qualsiasi valore. INIZIALIZZARE SEMPRE SUBITO TUTTE LE VARIABILI. Questo per rendere il codice portabile su compilatori che non effettuano automaticamente l inizializzazione a 0. Esercizio Rispondere alle domande nei commenti: While ed espressioni di controllo 1 // 1) Che f u n z i o n e implementa questo programma? 2 // 2) Cosa succede s e da t a s t i e r a p a s s a t e un numero minore d i 0? 3 #i n c l u d e <s t d i o. h> i n t main ( ) { i n t n= 0, r e s= 1 ; 7 s c a n f ( %d, &n ) ; 9 w h i l e ( n ) 10 r e s = ( n + 1) ; 11 12 p r i n t f ( %d\n, r e s ) ; 13 1 r e t u r n 0 ; 1 } 1 Soluzione dell esercizio Il primo programma calcola il fattoriale di n (passato da tastiera). Se n è negativo, il ciclo termina non correttamente, dato che qualsiasi valore diverso da 0 in C equivale a true. Più precisamente (sulla mia piattaforma), n viene decrementato fino al minimo valore rappresentabile con un tipo int (se int quattro byte, 2, 17, 3,, rappresentato con 32 bit con valore 1), il successivo decremento porta n al massimo valore rappresentabile con un int (se int quattro byte, 2, 17, 3, 7); situazione di overflow. Infine n viene decrementato di volta in volta fino a terminare quando n = 0. Esercizio Loops Utilizzare un ciclo while, un do...while, e un for per stampare tutti i numeri tra 0 e n con il valore n letto da tastiera (scanf()). Per esempio, se n = 10, la stampa deve essere 1237910. Calcolare il massimo comune divisore (MCD) tra due valori di tipo int presi in input da tastiera. Per farlo, scandire tutti i valori tra 1 ed il minimo dei due valori, controllando per ogni valore scandito se è divisore di entrambi. Il massimo di essi corrisponde al MCD. Leggere 10 valori di tipo int da tastiera assegnadoli a ciscun elemento di un array di 10 posizioni. In seguito, risolvere ciascuno dei seguenti punti con un ciclo for: trovare i) la media dei valori memorizzati nell array, ii) il massimo ed il minimo elemento dell array, iii) ordinare l array in ordine crescente utilizzando due for annidati, iv) stampare tutti gl elementi dell array. Inizializzare max a 0 e min a INT MAX (importare limits.h). 3

Di seguito, la soluzione solo per il secondo e terzo punto. 1 #i n c l u d e <s t d i o. h> 2 3 i n t main ( void ) { i n t i, num1, num2, min, gcd =1; Soluzione dell esercizio p r i n t f ( Ricevo i due numeri per i q u a l i c a l c o l a r e i l GCD: ) ; 7 s c a n f ( %d %d, &num1, &num2) ; 9 min = (num1 < num2)? num1 : num2 ; 10 11 f o r ( i =1; i <= min ; i ++) { 12 13 // Se i e f a t t o r e d i entrambi i numeri 1 i f (num1 % i == 0 && num2 % i== 0) 1 gcd = i ; 1 } 17 1 p r i n t f ( GCD d i %d e %d = %d\n, num1, num2, gcd ) ; 19 r e t u r n 0 ; 20 } 21 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e <l i m i t s. h> 3 #d e f i n e ARRAY ELEM 10 i n t main ( void ) { 7 i n t arrayelem [ARRAY ELEM ] ; 9 f o r ( i n t i= 0 ; i < ARRAY ELEM; i ++) { 10 s c a n f ( %d, &arrayelem [ i ] ) ; 11 } 12 13 i n t sum= 0 ; 1 f o r ( i n t i= 0 ; i < ARRAY ELEM; i ++) { 1 sum+= arrayelem [ i ] ; 1 } 17 1 p r i n t f ( %f \n, ( double ) sum / ARRAY ELEM) ; 19 20 i n t max= 0 ; 21 i n t min= INT MAX; 22 f o r ( i n t i= 0 ; i < ARRAY ELEM; i ++) { 23 i f ( arrayelem [ i ] > max) 2 max= arrayelem [ i ] ; 2 i f ( arrayelem [ i ] < min ) 2 min= arrayelem [ i ] ; 27 } 2 29 p r i n t f ( Max = %d\nmin = %d\n, max, min ) ; 30 31 f o r ( i n t i= 0 ; i < ARRAY ELEM; i ++) 32 f o r ( i n t j= i +1; j < ARRAY ELEM; j++) 33 i f ( arrayelem [ i ] > arrayelem [ j ] ) { 3 i n t tmp= arrayelem [ i ] ; 3 arrayelem [ i ] = arrayelem [ j ] ; 3 arrayelem [ j ] = tmp ; 37 } 3 39 f o r ( i n t i= 0 ; i < ARRAY ELEM; i ++) 0 p r i n t f ( Elemento [%d]= %d\n, i +1, arrayelem [ i ] ) ; 1 2 } 3 Esercizio 7 Triangoli

Si scriva un programma in linguaggio C che legga da tastiera i valori delle lunghezze dei tre lati di un triangolo (detti A, B e C), e determini (scrivendolo a video): se il triangolo è equilatero, se il triangolo è isoscele, se il triangolo è scaleno, se il triangolo è rettangolo. Prima controllare se le misure dei tre lati ricevuti in input (A, B, C) rappresentano correttamente un triangolo: tutti i lati devono essere positivi, ogni lato deve essere minore della somam degli altri due, ogni lato deve essere maggiore della differenza degli altri due. 1 #i n c l u d e <s t d i o. h> 2 #i n c l u d e <s t d l i b. h> 3 #i n c l u d e <math. h> i n t main ( void ) { 7 f l o a t a, b, c ; / l a t i d e l t r i a n g o l o / / LEGGI A, B e C / 9 p r i n t f ( Immetti A: ) ; s c a n f ( %f, &a ) ; 10 p r i n t f ( Immetti B: ) ; 11 s c a n f ( %f, &b ) ; 12 p r i n t f ( Immetti C: ) ; 13 s c a n f ( %f, &c ) ; 1 1 Soluzione dell esercizio 7 1 i f ( a<=0 b<=0 c<=0 ) 17 p r i n t f ( Errore : i l a t i devono e s s e r e p o s i t i v i \n ) ; 1 e l s e 19 i f ( a>=b+c b>=a+c c>=a+b ) 20 p r i n t f ( Errore : ogni l a t o deve e s s e r e minore d e l l a somma d e g l i a l t r i due \n ) ; 21 e l s e 22 i f ( ( b>c && a<= b c ) 23 ( b<=c && a <= c b ) 2 ( a>c && b<= a c ) 2 ( a<=c && b <= c a ) 2 ( a>b && c<= b a ) 27 ( a<=b && c<=a b ) ) 2 p r i n t f ( Errore : ogni l a t o deve e s s e r e maggiore d e l l a d i f f e r e n z a d e g l i a l t r i due \n ) ; 29 e l s e { 30 31 32 p r i n t f ( V e r i f i c o l e p r o p r i e t a d e l t r i a n g o l o d i l a t i : %f, %f, %f \n, a, b, c ) ; 33 3 / VERIFICA SE E EQUILATERO ( 3 LATI UGUALI) / 3 i f ( a==b && b==c ) 3 p r i n t f ( I l t r i a n g o l o e e q u i l a t e r o \n ) ; 37 e l s e 3 / VERIFICA SE E ISOSCELE ( 2 LATI UGUALI) / 39 i f ( a==b b==c a==c ) 0 p r i n t f ( I l t r i a n g o l o e i s o s c e l e \n ) ; 1 e l s e 2 p r i n t f ( I l t r i a n g o l o non e i s o s c e l e \n ) ; 3 / VERIFICA SE E SCALENO ( 3 LATI DIVERSI) / i f ( a!=b && b!= c && a!= c ) p r i n t f ( I l t r i a n g o l o e s c a l e n o \n ) ; e l s e 7 p r i n t f ( I l t r i a n g o l o non e s c a l e n o \n ) ; 9 / VERIFICA SE E RETTANGOLO (TEOREMA DI PITAGORA) /

0 1 / VERIFICA SE IL LATO A E L IPOTENUSA / 2 i f ( a a == b b + c c ) 3 p r i n t f ( I l t r i a n g o l o e r e t t a n g o l o ( i p o t e n u s a A) \n ) ; e l s e p r i n t f ( I l t r i a n g o l o non e r e t t a n g o l o ( i p o t e n u s a A) \n ) ; 7 / VERIFICA SE IL LATO B E L IPOTENUSA / i f ( b b == a a + c c ) 9 p r i n t f ( I l t r i a n g o l o e r e t t a n g o l o ( i p o t e n u s a B) \n ) ; 0 e l s e 1 p r i n t f ( I l t r i a n g o l o non e r e t t a n g o l o ( i p o t e n u s a B) \n ) ; 2 3 / VERIFICA SE IL LATO C E L IPOTENUSA / i f ( c c == b b + a a ) p r i n t f ( I l t r i a n g o l o e r e t t a n g o l o ( i p o t e n u s a C) \n ) ; e l s e 7 p r i n t f ( I l t r i a n g o l o non e r e t t a n g o l o ( i p o t e n u s a C) \n ) ; 9 / VERIFICA SE IL TRIANGOLO E RETTANGOLO / 70 i f ( ( a a == b b + c c ) ( b b == a a + c c ) ( c c == b b + a a ) ) 71 p r i n t f ( I l t r i a n g o l o e r e t t a n g o l o \n ) ; 72 e l s e 73 p r i n t f ( I l t r i a n g o l o non e r e t t a n g o l o \n ) ; 7 } 7 7 e x i t ( 0 ) ; 77 } 7 La funzione exit() serve per provocare la terminazione regolare di un programma, proprio come quando da main si fa return. Sia il parametro di exit sia il valore (eventuale) di return vengono restituiti all ambiente da cui il programma è stato chiamato. La differenza fra return ed exit(), oltre al fatto che exit() è una funzione e return non lo è, è che exit() provoca l uscita dal programma in qualunque funzione si trovi. Return provoca l uscita dal programma solo se si trova in main(); in caso contrario provoca il ritorno alla funzione che ha chiamato quella corrente.