Errori comuni - Dipartimento di Informatica

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.