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