Forum Informatica Unict

LAUREA TRIENNALE (D.M. 270/04) => Programmazione 1, 9 CFU => Topic started by: Giuseppo on 17-11-2008, 22:10:12



Title: Esercizio di prova in itinere
Post by: Giuseppo 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??  .penso

Giuseppo


Title: Re:Esercizio di prova in itinere
Post by: MisteroLupo 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 |-O


Title: Re:Esercizio di prova in itinere
Post by: Aigor 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??  .penso

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 8-|


Title: Re:Esercizio di prova in itinere
Post by: Giuseppo 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);
   }
}
   


Title: Re:Esercizio di prova in itinere
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ on 19-11-2008, 09:48:35
Suggerisco l'uso del tag code per inserire blocchi di codice.
Saluti .ciaociao.


Title: Re:Esercizio di prova in itinere
Post by: Aigor 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: )


Title: Re:Esercizio di prova in itinere
Post by: Giuseppo 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


Title: Re:Esercizio di prova in itinere
Post by: Aigor 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!


Title: Re:Esercizio di prova in itinere
Post by: Fr3d3R!K on 19-11-2008, 15:28:23
oppure si può usare uno switch che secondo me è più ordinato...


Title: Re:Esercizio di prova in itinere
Post by: ɹǝǝuıƃuǝsɹǝʌǝɹ 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.


Title: Re:Esercizio di prova in itinere
Post by: Giuseppo 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


Title: Re:Esercizio di prova in itinere
Post by: ShiShi 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. .applausi


Title: Re:Esercizio di prova in itinere
Post by: Giuseppo on 20-11-2008, 16:12:50
mamma mia che scemo non l'avevo viso  :-)| comunque adesso da tanti errori di "possible loss of precision"  .bah


Title: Re:Esercizio di prova in itinere
Post by: Fr3d3R!K on 20-11-2008, 17:53:36
cosa che in C viene segnalata solamente come warning  .penso :[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.


Title: Re:Esercizio di prova in itinere
Post by: Giuseppo 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:  .whistling


Title: Esercizio Robot
Post by: Gam on 23-11-2008, 19:46:04
Salve a tutti, sono riuscito a trovare una soluzione all'esercizio presente sulla prova in itinere del robot.
Ecco qui il codice da me scritto:

import javax.swing.*;
public class robot
{
   public static void main (String args[])
   {
      float energia=100F;      
      int x=0;
      int y=0;
      
      //COORDINATE DEI MOVIMENTI NELLA GRIGLIA
      while ((x>=-50 && x<=50)&&(y>=-50 && y<=50)&&(energia>1.4F))
      {
       int mov = (int) (1+Math.random()*3);
                                 //GENERA LA DIREZIONE CASUALE DEL ROBOT
       char c = (char) (Math.random()*('a'-'e')+'e');
       if (c=='a')
         c='n';
       else
         if (c=='b')
            c='s';
         else
            if (c=='c')
               c='e';
            else
               if (c=='d')
                  c='o';
                                 

       if (c=='n' && mov==1)
       {
              y+=1;
                   
         energia=energia-((energia*2F)/100F);
       }else
       if (c=='s' && mov==1)
       {
          y=y-1;
          
         energia=energia-((energia*2F)/100F);
       }else
       if (c=='e' && mov==1)
       {
          
          x=x+1;
         energia=energia-((energia*2F)/100F);
       }else
       if (c=='o' && mov==1)
       {
          
          x=x-1;
         energia=energia-((energia*2F)/100F);
       }
       if (c=='n' && mov==2)
       {
              y=y+2;
                   
         energia=energia-((energia*2.3F)/100F);
       }else
       if (c=='s' && mov==2)
       {
          y=y-2;
          
         energia=energia-((energia*2.3F)/100F);
       }else
       if (c=='e' && mov==2)
       {
          
          x=x+2;
         energia=energia-((energia*2.3F)/100F);
       }else
       if (c=='o' && mov==2)
       {
          
          x=x-2;
         energia=energia-((energia*2.3F)/100F);
       }
       if (c=='n' && mov==3)
       {
              y=y+3;
                   
         energia=energia-((energia*2.4F)/100F);
       }else
       if (c=='s' && mov==3)
       {
          y=y-3;
          
         energia=energia-((energia*2.4F)/100F);
       }else
       if (c=='e' && mov==3)
       {
          
          x=x+3;
         energia=energia-((energia*2.4F)/100F);
       }else
       if (c=='o' && mov==3)
       {
          
          x=x-3;
         energia=energia-((energia*2.4F)/100F);
       }
       System.out.println("La mossa generata dal robot è verso "+c);
       System.out.println("L'ampiezza del movimento generato è di "+mov+" caselle");
       System.out.println("il robot è alla posizione "+x+";"+y);
       System.out.println("l'energia residua è "+energia);
       System.out.println();
           }
      
   }
}


Vi prego di dirmi se può andare o no.
Grazie


Title: Re:Esercizio di prova in itinere
Post by: Fr3d3R!K on 23-11-2008, 20:31:09
puoi farlo anche tu basta compilarlo.


Title: Re:Esercizio di prova in itinere
Post by: Gam on 23-11-2008, 21:09:25
si si funziona compilandolo. Volevo solo avere un vostro parere nella stesura del programma


Title: Re:Esercizio di prova in itinere
Post by: Aigor on 23-11-2008, 21:21:19
si si funziona compilandolo. Volevo solo avere un vostro parere nella stesura del programma

Come da prima .... TROPPI if ... e non è una questione di mi piacciono o non mi piacciono gli if annidati ma perchè far lavorare di più il nostro programma e appesantirlo con troppi controlli ?  


Title: Re:Esercizio di prova in itinere
Post by: MisteroLupo on 25-11-2008, 16:38:37
Usiamolo il tag per i codici  :[Emoticon] Rosik Asd:


Title: Re:Esercizio di prova in itinere
Post by: Gam on 26-11-2008, 14:47:47
puoi dirmi come si fa per favore?


Title: Re:Esercizio di prova in itinere
Post by: Aigor on 26-11-2008, 14:57:53
il tastino con il cancelletto # ...


Title: Re:Esercizio di prova in itinere
Post by: Bastard_Inside on 28-11-2008, 16:24:57
Ecco qui l'esercizio provato e funzionante  :-OK :
Code:
/* per la direzione:
                    0=nord
                    1=sud
                    2=est
                    3=ovest
   per lo spostamento:
                      1 casella= -2%
                      2 caselle=-2.3%
                      3 caselle=-2.4%
*/
public class robot
{
    public static void main (String[] args)
    {
        int x_attuale=50;
        int y_attuale=50;
        int spost_x;
        int spost_y;
        int direzione;
        int spostamento;
        float energia=100;
        final int altezza_griglia=100;
        final int larghezza_griglia=100;
       
        while( (altezza_griglia-y_attuale)>=0 && (larghezza_griglia-x_attuale)>=0 && energia>1.4)
        {
            direzione = (int)(Math.random()*4);
            spostamento=1+(int)(Math.random()*3);
           
            switch (direzione)
            {
                case 0:
                    spost_x=0;
                    spost_y=spostamento;
                break;
                case 1:
                    spost_x=0;
                    spost_y=-spostamento;
                break;
                case 2:
                    spost_x=spostamento;
                    spost_y=0;
                break;
                default:
                    spost_x=-spostamento;
                    spost_y=0;
            }
           
            x_attuale += spost_x;
            y_attuale += spost_y;
           
            switch (spostamento)
            {
                case 1:
                    energia-=energia*2/100;
                break;
                case 2:
                    energia-=energia*2.3/100;
                break;
                default:
                    energia-=energia*2.4/100;
            }
        }
         System.out.println("la posizione del robot è "+ x_attuale+" " + y_attuale+ " energia rimasta = "+energia);
    }
}


Title: Re:Esercizio di prova in itinere
Post by: TheSpecialOne on 28-11-2008, 16:32:52
thanks! era un bel casino questo esercizio!


Title: Re:Esercizio di prova in itinere
Post by: Bastard_Inside on 28-11-2008, 16:52:51
thanks! era un bel casino questo esercizio!
e si abbastanza ! cmq pregu ;-P