Errori comuni Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2014/2015 Errori comuni Compilation di errori comuni degli studenti di LPR1. Tips and tricks Avete un processo bloccato? Tips and tricks Avete un processo bloccato? CTRL + C Tips and tricks Avete un processo bloccato? CTRL + C Volete aprire gedit e continuare a usare il terminale? Tips and tricks Avete un processo bloccato? CTRL + C Volete aprire gedit e continuare a usare il terminale? gedit & Errore 1 i n t main ( ) { i n t n1 , n2 , n3 , max ; p r i n t f ( " I n s e r i r e t r e numeri i n t e r i : \ n " ) ; s c a n f ( "%d%d%d " ,&n1 ,& n2 ,& n3 ) ; max=n1 ; i f ( n2>max ) max=n2 ; i f ( n3>max ) max=n3 ; p r i n t f ( " I l numero maggiore e ’ %d " ,max ) ; } Quali due problemi ha? Errore 1 i n t main ( ) { i n t n1 , n2 , n3 , max ; p r i n t f ( " I n s e r i r e t r e numeri i n t e r i : \ n " ) ; s c a n f ( "%d%d%d " ,&n1 ,& n2 ,& n3 ) ; max=n1 ; i f ( n2>max ) max=n2 ; i f ( n3>max ) max=n3 ; p r i n t f ( " I l numero maggiore e ’ %d " ,max ) ; } Quali due problemi ha? 1) Anubi valuta tutto l’output del programma, comprese le stampe di “Inserire tre numeri...” e “Il numero maggiore...”, quindi la valutazione automatica fallisce. Errore 1 i n t main ( ) { i n t n1 , n2 , n3 , max ; p r i n t f ( " I n s e r i r e t r e numeri i n t e r i : \ n " ) ; s c a n f ( "%d%d%d " ,&n1 ,& n2 ,& n3 ) ; max=n1 ; i f ( n2>max ) max=n2 ; i f ( n3>max ) max=n3 ; p r i n t f ( " I l numero maggiore e ’ %d " ,max ) ; } Quali due problemi ha? 1) Anubi valuta tutto l’output del programma, comprese le stampe di “Inserire tre numeri...” e “Il numero maggiore...”, quindi la valutazione automatica fallisce. 2) Inoltre, manca il valore restituito dal programma. Morale: non stampare niente che non sia richiesto dall’esercizio e ricordarsi return 0 in fondo al main. Errore 2 f l o a t sum_pow ( i n t exponent , f l o a t base ) { int i ; f l o a t somma=1 , s =1; f o r ( i =0; i <exponent ; i ++) s∗=base ; somma=somma+s ; r e t u r n somma ; } Che problema ha? Errore 2 f l o a t sum_pow ( i n t exponent , f l o a t base ) { int i ; f l o a t somma=1 , s =1; f o r ( i =0; i <exponent ; i ++) s∗=base ; somma=somma+s ; r e t u r n somma ; } Che problema ha? Il blocco di istruzioni eseguito dal for è composto solo dalla prima linea, la variabile somma viene modificata solo alla fine del ciclo. Errore 2 f l o a t sum_pow ( i n t exponent , f l o a t base ) { int i ; f l o a t somma=1 , s =1; f o r ( i =0; i <exponent ; i ++) s∗=base ; somma=somma+s ; r e t u r n somma ; } Che problema ha? Il blocco di istruzioni eseguito dal for è composto solo dalla prima linea, la variabile somma viene modificata solo alla fine del ciclo. Morale: attenzione a dove finiscono e iniziano i blocchi, e soprattutto attenti all’indentazione. Poesia visuale # i n c l u d e < s t d i o . h> i n t main ( ) { int n; s c a n f ( "%d " ,&n ) ; i f ( n>=0) { i n t f 0 =0 , f 1 =1 , f 2 =0 , t r o v a t o =0; p r i n t f ( " 0\n" ) ; while ( ! trovato ) { f2=f1+f0 ; f0=f1 ; f1=f2 ; p r i n t f ( "%d \ n " , f 0 ) ; i f ( f2 >=n ) t r o v a t o =1; i f ( f 2 ==n ) p r i n t f ( "%d \ n " , f 2 ) ; } } return 0; } Errore 3 i n t main ( ) { i n t m i e t i t r e b b i a [ 1 0 ] , motozappa = −1, i ; f o r ( i = 0 ; i < 1 0 ; i ++) s c a n f ( "%d " , & m i e t i t r e b b i a [ i ] ) ; i = 1; w h i l e ( i < 9 && motozappa == −1) i f ( m i e t i t r e b b i a [ i + 1 ] − m i e t i t r e b b i a [ i − 1 ] == mietitrebbia [ i ]) motozappa = i ; else i ++; p r i n t f ( "%d \ n " , motozappa ) ; return 0; } Che problema ha? Errore 3 i n t main ( ) { i n t m i e t i t r e b b i a [ 1 0 ] , motozappa = −1, i ; f o r ( i = 0 ; i < 1 0 ; i ++) s c a n f ( "%d " , & m i e t i t r e b b i a [ i ] ) ; i = 1; w h i l e ( i < 9 && motozappa == −1) i f ( m i e t i t r e b b i a [ i + 1 ] − m i e t i t r e b b i a [ i − 1 ] == mietitrebbia [ i ]) motozappa = i ; else i ++; p r i n t f ( "%d \ n " , motozappa ) ; return 0; } Che problema ha? Il programma funziona, ma il codice è poco leggibile. Errore 3 i n t main ( ) { i n t m i e t i t r e b b i a [ 1 0 ] , motozappa = −1, i ; f o r ( i = 0 ; i < 1 0 ; i ++) s c a n f ( "%d " , & m i e t i t r e b b i a [ i ] ) ; i = 1; w h i l e ( i < 9 && motozappa == −1) i f ( m i e t i t r e b b i a [ i + 1 ] − m i e t i t r e b b i a [ i − 1 ] == mietitrebbia [ i ]) motozappa = i ; else i ++; p r i n t f ( "%d \ n " , motozappa ) ; return 0; } Che problema ha? Il programma funziona, ma il codice è poco leggibile. Morale: trovate modi più idonei per esprimere la vostra creatività. Errore 4 i n t main ( ) { i n t a [10] , v , i , j = 0; f o r ( i =0; i <10; i ++) s c a n f ( "%d " , &a [ i ] ) ; w h i l e ( j <10 && a [ j ] ! = a [ j +1]−a [ j −1]) j = j + 1; i f ( a [ j ]== a [ j +1]−a [ j −1]) p r i n t f ( "%d \ n " , j ) ; else p r i n t f ( "−1 \ n " ) ; return 0; } Che problema ha? Errore 4 i n t main ( ) { i n t a [10] , v , i , j = 0; f o r ( i =0; i <10; i ++) s c a n f ( "%d " , &a [ i ] ) ; w h i l e ( j <10 && a [ j ] ! = a [ j +1]−a [ j −1]) j = j + 1; i f ( a [ j ]== a [ j +1]−a [ j −1]) p r i n t f ( "%d \ n " , j ) ; else p r i n t f ( "−1 \ n " ) ; return 0; } Che problema ha? Per j = 0 e j = 9, accede risp. a a[−1] e a[10], che non esistono. In questi casi il programma si comporta in maniera non determinata. Errore 4 i n t main ( ) { i n t a [10] , v , i , j = 0; f o r ( i =0; i <10; i ++) s c a n f ( "%d " , &a [ i ] ) ; w h i l e ( j <10 && a [ j ] ! = a [ j +1]−a [ j −1]) j = j + 1; i f ( a [ j ]== a [ j +1]−a [ j −1]) p r i n t f ( "%d \ n " , j ) ; else p r i n t f ( "−1 \ n " ) ; return 0; } Che problema ha? Per j = 0 e j = 9, accede risp. a a[−1] e a[10], che non esistono. In questi casi il programma si comporta in maniera non determinata. Morale: Fate attenzione agli indici che usate per accedere agli array. Errore 5 void m u l t i p l i ( ) ; i n t N, M; i n t main ( ) { i f ( s c a n f ( "%d%d " , &N, &M) ) ; multipli () ; return 0; } void m u l t i p l i ( ) { int i ; f o r ( i = 1 ; i <= N; i ++) i f ( i%M == 0 ) p r i n t f ( "%d \ n " , i ) ; } Che problema ha? Errore 5 void m u l t i p l i ( ) ; i n t N, M; i n t main ( ) { i f ( s c a n f ( "%d%d " , &N, &M) ) ; multipli () ; return 0; } void m u l t i p l i ( ) { int i ; f o r ( i = 1 ; i <= N; i ++) i f ( i%M == 0 ) p r i n t f ( "%d \ n " , i ) ; } Che problema ha? Usa variabili globali, la funzione multipli non può essere usata su altri valori in altri parti del programma. Errore 5 void m u l t i p l i ( ) ; i n t N, M; i n t main ( ) { i f ( s c a n f ( "%d%d " , &N, &M) ) ; multipli () ; return 0; } void m u l t i p l i ( ) { int i ; f o r ( i = 1 ; i <= N; i ++) i f ( i%M == 0 ) p r i n t f ( "%d \ n " , i ) ; } Che problema ha? Usa variabili globali, la funzione multipli non può essere usata su altri valori in altri parti del programma. Morale: E’ quasi sempre sbagliato usare variabili globali (per voi, sempre!) Errore 6 # i n c l u d e < s t d i o . h> i n t main ( ) { i n t b , a=0 , f 0 =0 , f 1 =1; s c a n f ( "%d \ n " ,&b ) ; f o r ( ; f0 <=b ; ) { p r i n t f ( "%d \ n " , f 0 ) ; a= f 1 + f 0 ; f0=f1 ; f 1 =a ; } return 0; } Che problema ha? Errore 6 # i n c l u d e < s t d i o . h> i n t main ( ) { i n t b , a=0 , f 0 =0 , f 1 =1; s c a n f ( "%d \ n " ,&b ) ; f o r ( ; f0 <=b ; ) { p r i n t f ( "%d \ n " , f 0 ) ; a= f 1 + f 0 ; f0=f1 ; f 1 =a ; } return 0; } Che problema ha? Usa for, ma non sappiamo in anticipo il numero di iterazioni, quindi è poco leggibile. Errore 6 # i n c l u d e < s t d i o . h> i n t main ( ) { i n t b , a=0 , f 0 =0 , f 1 =1; s c a n f ( "%d \ n " ,&b ) ; f o r ( ; f0 <=b ; ) { p r i n t f ( "%d \ n " , f 0 ) ; a= f 1 + f 0 ; f0=f1 ; f 1 =a ; } return 0; } Che problema ha? Usa for, ma non sappiamo in anticipo il numero di iterazioni, quindi è poco leggibile. Morale: Non usare for quando dovete usare while, e viceversa.
© Copyright 2024 ExpyDoc