Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Alec on 30-06-2009, 16:43:52



Title: SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Alec on 30-06-2009, 16:43:52
salve a tutti non capisco l'erroreeeeeee helpppp
è il compito di lab di prog1 del 23/06...mi da questo errore:

>javac lab.java
lab.java:60: missing return statement
   }
   ^
1 error
>Exit code: 1

 e non capisco il motivo  :-)|
Code:
abstract class numero
{
protected byte [] cifre;
public numero (byte [] x)
{
cifre=new byte [x.length];
for (int i=0; i<x.length; i++)
{
cifre[i]=x[i];
}
}
private int valore()
{
int valore=0;
int temp=cifre.length-1;
for (int i=0; i<cifre.length; i++)
{
if (i<0)
valore=cifre[temp];
else
{
int temp2 = i*10;
valore+=Math.pow(cifre[temp],temp2);
}
temp--;
}
return valore;
}
public int somma(numero n)
{
int temp1=((numero)n).valore();
int temp2=valore();
return (temp1+temp2);
}
abstract byte cifra();
}

class A extends numero
{
public A (byte [] x)
{
super(x);
}
public byte cifra()
{
return cifre[0];
}
private int c(int cc)
{
if (cc<3)
return (5);
else
if(cc<=3 && cc<7)
return(c(cc-1));
else

if (cc>=7)
return (c(cc-2)+cc);

}
public int codice()
{
int temp = cifra();
return (c(temp));
}
}

class B extends numero
{
public B (byte [] x)
{
super(x);
}
public byte cifra()
{
return cifre[cifre.length-1];
}
}



Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Fr3d3R!K on 30-06-2009, 16:54:48
scusa ma a che ti serve l'istruzione
Code:
if (cc>=7)
? hai già analizzato tutte i possibili casi. Caso minore di 3, caso "tra 3 e 7". Rimane solamente un caso (se non è minore di 3 e compreso tra 3 e 7 sicuramente sarà maggiore di 7) quindi basta l'else.
Saluti.


Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Alec on 30-06-2009, 17:04:30
grazie mille :-OK

però è una stranezza perche non mi funzionava....fondamentalmente una volta che dava vero non doveva semplicemente andare avanti???


Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Fr3d3R!K on 30-06-2009, 17:13:44
E se per assurdo la condizione fosse stata falsa? ricordati che i computer sono stupidi, non danno per scontato nulla... .wink
Il problema stava (come puoi vedere dal messaggio del compilatore) tutto nei return. Ogni struttura di selezione deve avere un return, così da garantire l'uscita dal metodo in ogni caso (e qui arriverà reverse a dare la definizione più tecnica della mia .whistling |-O). Nel tuo caso manca il return per il caso in cui anche il terzo if fallisca. Siccome il fallimento dei primi due porta (come ti ho detto nel precedente messaggio) ad una sola conclusione, va messo l'else che starà a significare che la terza è anche l'ultima alternativa possibile. Spero sia tutto chiaro .wink
Saluti.


Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Alec on 30-06-2009, 17:17:40
cristallino direi...  :yoh

grazie ancora


Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 30-06-2009, 17:21:45
però è una stranezza perche non mi funzionava
Analizziamo bene il codice, parentesizzando i blocchi per una migliore leggibilità:
Code:
private int c(int cc)
{
if (cc<3)  //sezione A: c'è un RETURN in ogni sotto percorso
return (5);  //primo (ed unico) sottopercorso della sezione A
else //sezione B: c'è un return solo nelle sottosezioni BA e BBA, ma non in tutto B
{
if(cc<=3 && cc<7)  //sezione BA: c'è un return in ogni sotto percorso
return(c(cc-1));    //primo (ed unico) sottopercorso della sezione B1
else                        //sezione BB: c'è un return solo nella sottosezione BBA, ma non in tutto BB
{
if (cc>=7)       //sezione BBA: c'è un return in ogni sotto percorso
return (c(cc-2)+cc);
//poiché non c'è "else" qui, allora se [cc >= 7] è FALSO allora, si continua
//in questo pezzo di codice, che è vuoto e NON ha alcuna istruzione return;
}
}
}
Cioè, non tutti i percorsi che il flusso d'esecuzione potrebbe ipoteticamente seguire c'è una istruzione return.
Che poi effettivamente il blocco in cui dovrebbe stare il return non sarà mai raggiunto, questo è un dettaglio che il compilatore da solo non può prevedere (almeno non quello standard fornitoci da Sun a quanto pare).


Title: Re:SAPETE DARMI UNA MANO CON QUESTO PROG???
Post by: Vitocr on 30-06-2009, 17:52:40
devi togliere l'ultimo if.....cioè "l'if (cc>=7)" in quanto è scontato che se "cc" nn è minore 3 e "cc" nn è compreso tra 3 e 7..........sarà sicuramente maggiore di 7........quindi nel codice dovresti mettere qualcosa del tipo:


if (cc < 3)
       return 5

else if (cc<=3 && cc<7)
      return (c(cc-1))

else 
       return (c(cc-2)+cc)

 .wink