Pages: [1] 2   Go Down
Print
Author Topic: Esercizio di prova in itinere  (Read 5097 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« on: 17-11-2008, 22:10:12 »

Se avete scaricato il file "3" delle prove in itinere del prof. Cincotti, avrete sicuramente visto questo esercizio:

Un robot, caratterizzato da un livello di energia (float), si muove all’interno di una griglia quadrata composta da
100x100 posizioni. Il movimento del robot avviene mediante una sequenza di mosse unitarie, ognuna caratterizzata:
• dalla direzione del movimento (Nord, Sud, Est , Ovest), e
• dall’ampiezza dello spostamento (una, due o tre caselle).
Ad ogni mossa il livello energetico viene decrementato del 2%, 2.3% o 2.4% proporzionalmente all’ampiezza dello
spostamento. Si simuli un percorso casuale del robot che inizia nella locazione centrale della griglia con un livello
energetico pari a 100. La simulazione termina se il robot esce dal perimetro della griglia oppure se il livello energetico è
inferiore ad 1.4, e fornisce in output la posizione di arresto del robot.
P.S.: Non si possono utilizzare gli array!


Io sono riuscito a scriverlo tutto, ma senza gli array non so come tenere conto della "posizione" (praticamente la mia simulazione finisce solo quando il robot termina l'energia). Avevo pensato a dei contatori: nord sud est ovest, per indicare "di quanto" si sposta, e non deve superare la griglia; il problema è che così vengono una marea di if annidati.....qualcuno mi sa illuminare?? 

Giuseppo
Logged

I have nothing to declare except my genius.
MisteroLupo
Apprendista Forumista
**
Offline Offline

Posts: 273

Tra il dire e il fare c'è distanza di hamming 2.


« Reply #1 on: 18-11-2008, 17:12:51 »

Io userei due variabili per tracciare la posizione, come se fosse su di un piano cartesiano:
Code:
// posizione iniziale
byte posX = 50;
byte posY = 50;
Ad esempio per spostare due caselle a nord:
Code:
posY -= 2;

Spero di essere stato d'aiuto e di non aver detto una boiata univ
Logged
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #2 on: 18-11-2008, 17:33:41 »

Se avete scaricato il file "3" delle prove in itinere del prof. Cincotti, avrete sicuramente visto questo esercizio:

Un robot, caratterizzato da un livello di energia (float), si muove all’interno di una griglia quadrata composta da
100x100 posizioni. Il movimento del robot avviene mediante una sequenza di mosse unitarie, ognuna caratterizzata:
• dalla direzione del movimento (Nord, Sud, Est , Ovest), e
• dall’ampiezza dello spostamento (una, due o tre caselle).
Ad ogni mossa il livello energetico viene decrementato del 2%, 2.3% o 2.4% proporzionalmente all’ampiezza dello
spostamento. Si simuli un percorso casuale del robot che inizia nella locazione centrale della griglia con un livello
energetico pari a 100. La simulazione termina se il robot esce dal perimetro della griglia oppure se il livello energetico è
inferiore ad 1.4, e fornisce in output la posizione di arresto del robot.
P.S.: Non si possono utilizzare gli array!


Io sono riuscito a scriverlo tutto, ma senza gli array non so come tenere conto della "posizione" (praticamente la mia simulazione finisce solo quando il robot termina l'energia). Avevo pensato a dei contatori: nord sud est ovest, per indicare "di quanto" si sposta, e non deve superare la griglia; il problema è che così vengono una marea di if annidati.....qualcuno mi sa illuminare?? 

Giuseppo

Ti scrivo una sorta di pseudo-codice

..........

  x=valore random tra 0 e 100
  y=valore random tra 0 e 100
 energia= valore random tra 0 e 100
while(energia>=1,4 && x<=100 && x>=0 && y<=100 && y>=0)
{
   spostamento=valore random intero tra 1 e 3
   bussola=stringa casuale tra Nord,sud,est,ovest
   if(bussola=nord)
      y+=spostamento
    else
       if(bussola=sud)
          y-=spostamento
    else
         if(bussola=est)
            x+=spostamento
    else
            x-=spostamento
   
   if( spostamento == 1)
       energia-= energia*2/100
    else
      if(spostamento==2)
                energia-= energia*2.3/100
      else
                energia-=energia*2.4/100
}
Stampa ( x,y,bussola,energia)
.................

E' mooooooooolto indicativo e mooooooooooolto ottimizzabile ma credo che possa essere un'idea di partenza ! Buon lavoro cool
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« Reply #3 on: 19-11-2008, 08:25:32 »

Io l'ho scritto così ma dà alcuni errori....

public class robot {
   public static void main (String[]args) {
      float livello=100;
      int dir,mov;
      double x=0,y=0;
      while (livello>=1,4&&y>=-50&&y<=50&&x>=-50&&x<=50) {
         dir=(int)(Math.random()*4+1);
         mov(int)(Math.random()*4+1);
         if (dir==1) {
            if (mov==1){
               livello=livello-livello*2/100;
               y++;
            }
            if (mov==2) {
               livello=livello-(livello*2,3)/100;
               y=y+2;
            }
            if (mov==3) {
               livello=livello-(livello*2,4)/100;
               y=y+3;
            }
         }
         if (dir==2) {
            if (mov==1){
               livello=livello-livello*2/100;
               y--;
            }
            if (mov==2) {
               livello=livello-(livello*2,3)/100;
               y=y-2;
            }
            if (mov==3) {
               livello=livello-(livello*2,4)/100;
               y=y-3;
            }
         }
         if (dir==3) {
            if (mov==1){
               livello=livello-livello*2/100;
               x++;
            }
            if (mov==2) {
               livello=livello-(livello*2,3)/100;
               x=x+2;
            }
            if (mov==3) {
               livello=livello-(livello*2,4)/100;
               x=x+3;
            }
         }
         if (dir==4) {
            if (mov==1){
               livello=livello-livello*2/100;
               x--;
            }
            if (mov==2) {
               livello=livello-(livello*2,3)/100;
               x=x-2;
            }
            if (mov==3) {
               livello=livello-(livello*2,4)/100;
               x=x-3;
            }
         }
      }
      System.out.println("La posizione finale del robot è data dalle coordinate x= "+x+" e y= "+y);
   }
}
   
Logged

I have nothing to declare except my genius.
ɹǝǝ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 #4 on: 19-11-2008, 09:48:35 »

Suggerisco l'uso del tag code per inserire blocchi di codice.
Saluti .
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
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #5 on: 19-11-2008, 11:39:34 »

Allora....................
1- i numeri con la virgola si indicano con il punto, quindi no  1,4 ma 1.4
2- perchè x e y double ? le coordinate sono interi tra 0 e 100
3- perchè fai partire x e y da 0,0 ? Dagli già all'inizio un valore casuale !!
4- perchè le variabili direzione e movimento ?
5- dove sono Nord, Sud, Est e Ovest ?
6-la variabile livello ( che credo sia l'energia ) dichiarala double

E infine evita tutti questi if annidati, cerca di trovare una soluzione più "semplice" al problema.
Se sei un programmatore alle prime armi non iniziare subito dal codice, inizia invece a scrivere lo pseudo codice
o in maniera "discorsiva" ciò che vuoi creare. Fai un punto della situazione prima nella tua mente, poi sulla carta
e poi crea il codice ( il codice se lo commenti è meglio  [Emoticon] Asd )
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« Reply #6 on: 19-11-2008, 12:13:12 »

1) giusto ho sbagliato
2) i miei x e y vanno da -50 a 50
3) il testo dice di farlo partire al centro
4) sono casuali direzione(nord,sud,est e ovest) e movimento( una casella,due o tre)
5) li ho contati nord e sud solo con la y, e est ed ovest solo con la x
6) il testo dice che livello è float

per il resto non ho trovato soluzione migliore agli if annidati
Logged

I have nothing to declare except my genius.
Aigor
Forumista Esperto
****
Offline Offline

Gender: Male
Posts: 1.184


"Il destino non è una catena, ma un volo."[A.B.]


« Reply #7 on: 19-11-2008, 13:10:18 »

Ecco come potresti evitare tutti quegli if annidati.
E' una mia soluzione, non vuoldire che non ci sia di meglio ...

Code:
  class robot{
 
    public static void main(String []args){
        int x=50;// mi porto al centro della griglia
        int y=50;// considerando (0,0) il punto iniziale e (100,100) il punto finale
        float energia=100;
        while(energia>=1.4 && x<=100 && x>=0 && y<=100 && y>=0)
        {
            int spostamento=(int)(Math.random()*2)+1;
            int bussola=(int)(Math.random()*3); // 0 Nord , 1 Sud , 2 Est, 3 Ovest
            if(bussola==0)  // Bussola indica nord
                y-=spostamento; // mi sposto in alto
               else
                if(bussola==1) // Bussola indica sud
                    y+=spostamento; // mi sposto in basso
                else
                 if(bussola==2) // Bussola indica Est
                        x+=spostamento; //mi sposto a destra
                      else          //Bussola indica ovest
                         
                        x-=spostamento;  // mi sposto a sinistra
   
            if( spostamento == 1)
                energia-= energia*2/100;
                else
                    if(spostamento==2)
                        energia-= energia*2.3/100;
                        else
                            energia-=energia*2.4/100;
        System.out.println ("Movimento :" +x+"\t"+y+"\t"+"Energia residua :"+energia);
        }
        System.out.println ("Ultimo movimento :" +x+"\t"+y+"\t"+"Energia residua :"+energia);
    }
}

Buona giornata!
Logged

"Era d'altronde uno di quegli uomini che amano assistere alla propria vita, ritenendo impropria qualsiasi ambizione a viverla.
Si sarà notato che essi osservano il loro destino nel modo in cui, i più, sono soliti osservare una giornata di pioggia." - Seta,Baricco
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #8 on: 19-11-2008, 15:28:23 »

oppure si può usare uno switch che secondo me è più ordinato...
Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
ɹǝǝ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 #9 on: 19-11-2008, 17:41:19 »

Gli if annidati non sono di per se una anomalia nella stesura di un programma.

Il loro uso al posto del costrutto switch può essere giustificato dalla possibilità di dover fare scelte in base a predicati bensì mutualmente esclusivi tra loro ma non necessariamente di tipo "uguaglianza".

Ad esempio, si consideri:
Code:
if (anni < 0 || anni > 100)
{    ...    }
else
    if (anni >= 0 && anni < 18)
    {    ...    }
    else
        if (anni >= 18 && anni < 30)
        {    ...    }
        else
            if (anni >= 30 && anni < 50)
            {    ...    }
            else
                if (anni >= 50 && anni < 80)
                {    ...    }
                else
                {    ...    }
Questo codice è un esempio del caso precedentemente menzionato.
Tuttavia esso può essere scritto in una forma di più facile leggibilità ed esattamente identica (a meno di tabulazioni) alla precedente, cioè equipotente, portando tutti gli if successivi accanto ad else ed allineando i vari else if (e l'eventuale ultimo else singolo) sulla stessa colonna del primo if, così:
Code:
if (anni < 0 || anni > 100)
{    ...    }
else if (anni >= 0 && anni < 18)
{    ...    }
else if (anni >= 18 && anni < 30)
{    ...    }
else if (anni >= 30 && anni < 50)
{    ...    }
else if (anni >= 50 && anni < 80)
{    ...    }
else
{    ...    }

Saluti ciao.
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
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« Reply #10 on: 19-11-2008, 20:31:16 »

ecco ho corretto un bel po' di errori...ma ne da ancora uno

public class robot {
   public static void main (String[]args) {
      float livello=100;
      int dir,mov;
      byte x=0;
      byte y=0;.
      while (livello>=1.4&&y>=-50&&y<=50&&x>=-50&&x<=50) {
         dir=(int)(Math.random()*4+1);
         mov=(int)(Math.random()*3+1);
         if (dir==1) {
            if (mov==1){
               livello=livello-livello*2/100;
               y++;
            }
            if (mov==2) {
               livello=livello-(livello*2.3)/100;
               y=y+2;
            }
            if (mov==3) {
               livello=livello-(livello*2.4)/100;
               y=y+3;
            }
         }
         if (dir==2) {
            if (mov==1){
               livello=livello-livello*2F/100;
               y--;
            }
            if (mov==2) {
               livello=livello-(livello*2.3)/100;
               y=y-2;
            }
            if (mov==3) {
               livello=livello-(livello*2.4)/100;
               y=y-3;
            }
         }
         if (dir==3) {
            if (mov==1){
               livello=livello-livello*2F/100;
               x++;
            }
            if (mov==2) {
               livello=livello-(livello*2.3)/100;
               x=x+2;
            }
            if (mov==3) {
               livello=livello-(livello*2.4)/100;
               x=x+3;
            }
         }
         if (dir==4) {
            if (mov==1){
               livello=livello-livello*2F/100;
               x--;
            }
            if (mov==2) {
               livello=livello-(livello*2.3)/100;
               x=x-2;
            }
            if (mov==3) {
               livello=livello-(livello*.4)/100;
               x=x-3;
            }
         }
      }
      System.out.println("La posizione finale del robot è data dalle coordinate x= "+x+" e y= "+y);
   }
}
      

l'errore è

>javac robot.java
robot.java:6: illegal start of expression
      byte y=0;.
               ^
1 error
>Exit code: 1
Logged

I have nothing to declare except my genius.
ShiShi
Apprendista Forumista
**
Offline Offline

Gender: Female
Posts: 256



« Reply #11 on: 19-11-2008, 20:49:40 »

Quote
l'errore è

>javac robot.java
robot.java:6: illegal start of expression
      byte y=0;.
               ^
1 error
>Exit code: 1

C'è un punto che non dovrebbe starci dopo il punto e virgola °_°
Comunque trovo questa soluzione vagamente confusionaria. Molto meglio il codice di Aigor.
Logged
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« Reply #12 on: 20-11-2008, 16:12:50 »

mamma mia che scemo non l'avevo viso  testate comunque adesso da tanti errori di "possible loss of precision" 
Logged

I have nothing to declare except my genius.
Fr3d3R!K
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.463



« Reply #13 on: 20-11-2008, 17:53:36 »

cosa che in C viene segnalata solamente come warning  [Emoticon] Asd [Emoticon] Asd [Emoticon] Asd comunque significa che hai memorizzato su una variabile di tipo int (ad esempio) un valore a virgola mobile, per cui su int i numeri dopo la virgola si perderebbero (in quanto int non accetta decimali al contrario di float e double). Questo dice l'errore.
Logged

Search Button, CODE Tag, Google & Italian language are your friends! Use Them!
Giuseppo
Apprendista Forumista
**
Offline Offline

Posts: 198



« Reply #14 on: 21-11-2008, 13:37:06 »

Infine con un po' di cast qui e la funziona....comunque gli if annidati mi piacciono  [Emoticon] Asd 
Logged

I have nothing to declare except my genius.
Pages: [1] 2   Go Up
Print
Jump to: