Ingegneria Gestionale

Prova scritta di Informatica

Java Terzo Scritto 2004

 

Nome:             ________________________________________

 

Matricola            ________________________________________

 

 

Quesito 1)

Scrivere un metodo che, dati due array di interi di uguale lunghezza, restituisca un array con componenti iesima pari a 0 se le componenti dei due vettori sono diverse, pari alla somma delle componenti se sono uguali.

Scrivere un programma main di test per il metodo.

 

Soluzione:

 

 

public class esame {

     

       // metodo elabora_array

       // pre condizioni:

       // gli array non sono null

       // gli array hanno uguale lunghezza

       public static int [] elabora_array(int [] a, int [] b) {

 

             // creo l’array senza ulteriori controlli

             // perchè a e b non sono null

             // e sono di uguale lunghezza

             int [] c = new int [a.length];

 

             int i;

             for (i=0;i<a.length;i++)

             {

                   if (a[i]!=b[i])

                         c[i]=0;

                   else

                         c[i]=a[i]+b[i];

                 

            }

 

             return(c);

 

 } // end of elabora_array

 

 

      public static void main(String[] args) {

           

                  //          creo due array di uguale lunghezza

                   int [] vett1 = new int [10];

                   int [] vett2 = new int [10];

 

                   // assegno alcune componenti

                   // le altre sono tutte zero perchè inizializzate

                   // con null

 

                   vett1[2]=4;

                   vett1[3]=5;

                   vett1[5]=6;

 

                   vett2[2]=4;

                   vett2[3]=7;

                   vett2[5]=7;

 

                   // creo un riferimento al vettore risultato

                   int[] vett3;

 

                   vett3 = elabora_array(vett1, vett2);

 

                   System.out.println(" l’elaborazione dei vettori vett1 e vett2");

                   System.out.println(" di componenti");

 

                   int i=0;

                   for (i=0;i<vett1.length;i++)

                   {

                         System.out.print("vett1[" + i + "]=" + vett1[i]);

                         System.out.println("\tvett2[" + i + "]=" + vett2[i]);

                   }

 

                   // uno spazio per separare

                   System.out.println();

                   System.out.println(" ha prodotto come risultato vett3");

                   System.out.println(" di componenti");

                   for (i=0;i<vett3.length;i++)

                   {

                         System.out.println("vett3[" + i + "]=" + vett3[i]);

                  }

 

            } // end_of_main

} // end_of_class esame

 

Osservazioni:

Poteva anche essere definito un metodo di supporto per la stampa delle componenti di un vettore dato il nome ed il vettore stesso..

 

// metodo che stampa le componenti con il nome di un vettore

// precondizioni: nome ed a non sono null

public static void stampa_componenti(String nome, int [] a) {

            int i=0;

            for (i=0;i<a.length;i++)

                  System.out.println(nome + “[“ + i + “]=” + a[i]);

 

} // end of stampa componenti

 

 

con tale metodo di supporto la soluzione dell’esercizio diventa:

 

public class esame_alt {

 

       //   metodo elabora_array

       // pre condizioni:

       // gli array non sono null

       // gli array hanno uguale lunghezza

       public static int [] elabora_array(int [] a, int [] b) {

 

             // creo l’array senza ulteriori controlli

             // perchè a e b non sono null

             // e sono di uguale lunghezza

             int [] c = new int [a.length];

 

             int i;

             for (i=0;i<a.length;i++)

             {

                   if (a[i]!=b[i])

                         c[i]=0;

                   else

                         c[i]=a[i]+b[i];

                 

            }

 

             return(c);

 

      } // end of elabora_array

     

      //    metodo che stampa le componenti con il nome di un vettore

      //    precondizioni: nome ed a non sono null

      public static void stampa_componenti(String nome, int [] a) {

             int i=0;

             for (i=0;i<a.length;i++)

                   System.out.println(nome + "[" + i + "]=" + a[i]);

 

      } // end of stampa componenti

 

     

     

      public static void main(String[] args) {

           

                   //   creo due array di uguale lunghezza

                   int [] vett1 = new int [10];

                   int [] vett2 = new int [10];

 

                   // assegno alcune componenti

                   // le altre sono tutte zero perchè inizializzate

                   // con null

 

                   vett1[2]=4;

                   vett1[3]=5;

                   vett1[5]=6;

 

                   vett2[2]=4;

                   vett2[3]=7;

                   vett2[5]=7;

 

                   // creo un riferimento al vettore risultato

                   int[] vett3;

 

                   vett3 = elabora_array(vett1, vett2);

 

                   System.out.println(" l’elaborazione dei vettori vett1 e vett2");

                   System.out.println(" di componenti");

 

                   // stampa componenti di vett1

                   String nome="vett1";

                   stampa_componenti(nome, vett1);

                   

                   //   uno spazio per separare

                   System.out.println();

                   

                   // stampa componenti di vett2

                 nome="vett2";

                   stampa_componenti(nome, vett2);

                 

                   // uno spazio per separare

                   System.out.println();

                   System.out.println(" ha prodotto come risultato vett3");

                   System.out.println(" di componenti");

                   //   stampa componenti di vett2

                   nome="vett3";

                   stampa_componenti(nome, vett3);

                   

      }// end of main

}

 

 

Quesito 2)

 

Dire, sulla base delle regole di visibilità delle variabili e delle regole di invocazione dei metodi, quali dei seguenti statement sono corretti:

 

public class prova {

              

              

               public static void provina() {

 

                              int D ;

                              int A;

A = 0;

                              B = 0;

                              D = 0;

 

}

 

public static int funzione1( int C) {

 

                              int A = C;

                              int B = 0;

                              int D = 10;

                              return (B);

 

}

 

public static int funzione2( int C) {

 

                              int B;

A = C;

                              B = 10+C;

                              return (B);

 

}

 

}

 

public class test {

              

public static void  main( String [] args) {

 

C=C+1;

 

prova1.provina();

 

 

                              int B = prova.funzione1(10);

                              prova.funzione1(B);

                              prova.funzione2(C,10);                

}

 

}

 

Soluzione:

vengono aggiunti dei commenti in corrispondenza dei vari statement, evidenziando quelli non corretti e spiegandone le motivazioni:

public class prova {

              

              

               public static void provina() {

 

                              int D ;

                              int A;

A = 0;

                              B = 0; // non corretto perchè B non è stata dichiarata nel metodo

                              D = 0;

 

}

 

public static int funzione1( int C) {

 

                              int A = C;

                              int B = 0;

                              int D = 10;

                              return (B);

 

}

 

public static int funzione2( int C) {

 

                              int B;

A = C; // non corretto perchè A non è stata dichiarata nel metodo

                              B = 10+C;

                              return (B);

 

}

 

}

 

public class test {

              

public static void  main( String [] args) {

 

C=C+1; // non corretto perchè C non è stata dichiarata nel metodo

 

prova1.provina();// non corretto perchè il metodo provina appartiene alla classe prova, non prova1

 

 

                              int B = prova.funzione1(10);

                              prova.funzione1(B);

                              prova.funzione2(C,10); // non corretto perchè: C non è stata dichiarata

                                                                     // e funzione2 accetta un solo parametro

                             

}

 

}

 

 

 

Quesito 3)

 

Scrivere il diagramma di flusso che viene implementato dal seguente metodo:

 

public static double metodo(double A, int B)

{

               int c;

System.out.println(“inserisci un numero maggiore di 0”);

               do

               {

                              c = Lettore.in.leggiInt();

               }

               while (c <= 0);

 

               double valore_ritorno = 0;

 

               if (c>B)

                              valore_ritorno=A;

               else

                              valore_ritorno=Math.sqrt(c);

              

 

               return (valore_ritorno);                            

}

 

 

 

 

 

 

 

 

 

 

 

 

Soluzione:

 

 

 

 

 

 

 

 

 

 

 

 

 

Quesito 4)

 

Scrivere il risultato dell’esecuzione del seguente programma, supponendo che l’input di metodo sia a piacere (e comportarsi coerentemente). Nota: il metodo di nome metodo è quello dell’esercio precedente:

 

public class test {

public static double metodo(double A, int B)

{

                              int c;

System.out.println(“inserisci un numero maggiore di 0”);

                              do

                              {

                                             c = Lettore.in.leggiInt();

                              }

                              while (c <= 0);

 

                              double valore_ritorno = 0;

 

                              if (c>B)

                                             valore_ritorno=A;

                              else

                                             valore_ritorno=Math.sqrt(c);

              

 

                              return (valore_ritorno);                            

}

 

public static void main(String [] args)

{

              

                              int A = 5;

                              double B = 3;

 

                              double C = metodo(3.3 , 55);

                              System.out.println(A + “ “ + B + “ “ + C);           

 

}

}

 

Soluzione:

 

// inserimento di un valore di C <= B (che vale 55)

// il risultato è math.sqrt(c)

inserisci un numero maggiore di 0

-1

3

5 3.0 1.7320508075688772

// inserimento di un valore di C > B (che vale 55)

// il risultato è A ossia 3.3

inserisci un numero maggiore di 0

0

77

5 3.0 3.3