Pages: [1]   Go Down
Print
Author Topic: Un esercizio come quello di Atrixone.  (Read 760 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« on: 06-04-2009, 18:38:55 »

Praticamente non capisco perchè in questo codice alla parte finale devo mettere la condizione if dopo l'elese prima della return, altrimenti si scatena l'eccezione OutofBounds:



l'errore me lo da all'espressione verso la fine del codice:
  F1[r1]=F[r];


Code:
/*Scrivere un metodo che prende come parametri un array di float e un float h.
Si assuma che l'array dato sia ordinato in senso crescente. Il metodo deve restituire un array
di float ottenuto dall'array originale inserendo l'elemento h nella posizione corretta.*/

public class Atrixone
  {
 
  public static void main(String [] args)
  {
  float m=3.3F;
  float [] F={1.2F,2.4F,6.5F,9.6F};
  float [] F1=metodo(F,m);
  for(int r=0; r<F1.length; r++)
  System.out.print(F1[r]+" ");
  }
 
 
 
 
 
  public static float [] metodo(float []F,float m)
  {
  float [] F1=new float[F.length];
 
  float tmp=0;
 
  int r1=0;
  for(int r=0; r<F.length; r++)
  {
  if(F[r]<m && m<F[r+1])
  {
  if(r1<F1.length)
  tmp=F[r+1]; //memorizzo il valore successivo di m nella variabile temporanea
  F1[r1]=F[r];  //il valore che è più piccolo di m lo posso memorizzare subito
  F1[r+1]=m;    //assegno subito dopo l'elemento m
  F[r1+2]=tmp; // e dopo metto il più grande
  r1=r1+2;          //aumento l'indice per evitare errori con l'altro
  }
  else {
    if(r1<F1.length)
   F1[r1]=F[r];
             r1++;
  }
  }
    return F1;

       }
           
}
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #1 on: 06-04-2009, 19:08:05 »

Rispondo scrivendo il tuo codice senza i tuoi commenti ma con i miei commenti che mostrano gli errori:
Code:
    public static float [] metodo(float []F,float m)
    {
        float [] F1=new float[F.length];          //1) errore - deve essere: F1.length == F.length + 1 > F.length
       
        float tmp=0;
       
        int r1=0;
        for(int r=0; r<F.length; r++)
        {
            if(F[r]<m && m<F[r+1])                //2) possibile ArrayIndexOutOfBoundsException (r+1 non è sempre un indice valido)
            {                                     //per fare vedere che è vero, provare a scegliere per m un valore più grande di tutti quelli dell'array
                if(r1<F1.length)                  //ad esempio se F = {1.2f, 2.4f, 6.5f, 9.6f} m potrebbe essere 10f
                    tmp=F[r+1];
                F1[r1]=F[r];
                F1[r+1]=m;
                F[r1+2]=tmp;
                r1=r1+2;
            }
            else {
                if(r1<F1.length)                //3) questa condizione impedisce l'ArrayIndexOutOfBoundsException causata a cascata dall'errore 1)
                    F1[r1]=F[r];                     
                r1++;
            }
        }
        return F1;
    }

Io l'avrei fatto così comunque:
Code:
    public static float [] mioMetodo (float [] a, float h)
    {
        float [] r = new float [a.length + 1];
        int i;
       
        //copia tutti gli (eventuali) elementi più piccoli di h
        for (i = 0; i < a.length && a [i] < h; i++)
            r [i] = a [i];
       
        //copia h nella posizione opportuna
        r [i] = h;
       
        //copia tutti gli (eventuali) elementi più grandi di h
        for (; i < a.length; i++)
            r [i + 1] = a [i];
       
        //restituisco l'array nuovo
        return r;
    }

 

Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #2 on: 06-04-2009, 19:09:52 »

ma il mio è giusto? pc
Logged

Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #3 on: 06-04-2009, 19:17:14 »

Si Atrix mi è sembrato di si.
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
atrix0ne
Forumista
***
Offline Offline

Posts: 607


homo faber fortunae suae


« Reply #4 on: 06-04-2009, 19:26:54 »

DOMANI LA SUPEREMO TUTTI DAIII
Logged

Pages: [1]   Go Up
Print
Jump to: