Programma in java....cosa viene stampato?

bius88
Salve a tutti, non ho ben capito l'esecuzione di questo programma:

public static int esercizio1A (int v[]) {
int c=0;
if(v.length % 2!=0)
c=-1;
else
for (int i=0; i int j = i + v.length/2;
if ((v % v[j] != 0) || (v[j] % v != 0))
c++;
}
return c;
}

cosa viene stampato nel caso in cui $v={1,8,9,11,7,4,27,3}$

Provo a svolgere l'esercizio:
Il metodo esercizio1A riceve come parametro un vettore di interi v; v.length è 7 quindi 7%2 è diverso da 0 quindi c=-1

j=i+3
v % v[j] è diverso da 0 oppure v[j] % v è diverso da 0, ritorna c

v[0] % v[3] è diverso da 0
v[1] % v[4] è uguale da 0 ma v[4] % v[1] è diverso da 0
v[2] % v[5] è diverso da 0
v[3] % v[6] è diverso da 0


Ora non so proprio continuare.....datemi una mano...grazie!

Risposte
giacomo.bezzi
scusate, non avevo visto che aveva già risposto ham_burst

bius88
Si avete ragione....purtroppo sono alle prime armi e mi confondo facilmente.
Grazie a tutti e due!!!

bius88
"ham_burst":
No c = 2.

Se sai come funziona l'AND logico. l'And è true se e soltanto se i valori confrontati sono true entrambi e non uguali. A dire di più, se il primo è false il secondo valore non viene nemmeno guardato.

  
A      B      |    AND
true   true   |    true
false  true   |    false
true   false  |    false
false  false  |    false


scusa ma mi sono accorto ora di non aver capito dove prendi quei valori....
il confrono non va fatto tra queste posizioni:

v[0] e  v[7] 
v[1] e  v[6] 
v[2] e  v[5]
v[3] e  v[4]

quindi dovrebbe essere così:
  
A      B      |    AND
true   true   |    true      $c=1$
false  false   |    false
true   true  |    true       $c=2$
false  false  |    false 


Correggimi se sbaglio....

giacomo.bezzi
quello che ha scritto ham_burst è come si comporta l'AND logico in tutte le possibili combinazioni di TRUE e FALSE (nel caso specifico 4: T-T, F-T, T-F, F-F). Non c'entra con il tuo codice.

bius88
ah ho capito.....bastava dire che devono essere entrambi true!!
Per quanto riguarda il codice è giusto quello che ho scritto?

giacomo.bezzi
giusto, ma l'ordine con cui viene fatto il confronto è al contrario (non cambia nulla, pura pignoleria).

bius88
Grazie! Ma come faccio ad accorgermi che l'ordine del confronto è al contrario?

giacomo.bezzi
Perché i all'inizio assume il valore 3 (quindi il primo confronto è v[3] v[4]) e scala fino a 0.

bius88
Ah ok....grazie tante!!

bius88
Ora sto facendo un altro esercizio che è un po più lungo e complicato ma che comunque sto tendando di risolvere:

public class Esercizio1A  {
     public static boolean [] metodoA (int [] a, int [] b)  {
             boolean [] c = new boolean [a.length];
             for (int i=0; i<a.length; i++)
                      c [i] = true;
             for (int i=0; i<a.length; i++)
                      for (int j=0; j<b.length && c[i]; j++)
                                if (a[i] % b[j] ==0)
                                           c[i] = false;
           return c;
      }
      public static void main (String [] args)  {
           int [] a = {4, 6, 14, 10, 8};
           int [] b = {7, 3, 5};
           boolean []  r = metodoA (a,b);
      }
}


$I)$ Descrivere sinteticamente la funzione svolta dal metodo e mostrare l'esecuzione nel caso della chiamata effettuata dal metodo main.
$II)$ Specificare il contenuto di r al termine della chiamata di metodoA (a,b).


Il metodoA riceve come parametri 2 vettori di interi , a e b.
Il vettore booleano c ha la stessa lunghezza del vettore a e la posizione c è true.
Ora non capisco: j va da a a b.length ma l'and logico indica che devo fare il confronto con chi?
grazie 1000!!

giacomo.bezzi
"bius88":

Ora non capisco: j va da a a b.length

no, j va da 0 a b.length - 1 (in questo caso b.lenght = 3, quindi j va da 0 a 2).
"bius88":

ma l'and logico indica che devo fare il confronto con chi?

se ho capito bene cosa intendi dire, le 2 condizioni che devono essere verificate nel for (appunto quelle separate dall'AND) richiedono che:
1) j < b.length
2) c[i ] == TRUE

bius88
Si va da 0 a b.length....ho sbagliato a scrivere!

Comunque continuo a non capire l'and logico; cosa devo confrontare??
Poi continuando ho un altro dubbio:
se a % b[j] ==0 $rArr$ c = false quindi:

a[0] % b[0] ==0 $rArr$ c = false
a[1] % b[1] ==0 $rArr$ c = false
a[2] % b[2] !=0 $rArr$ c = true

Ora visto che i vettori sono di lunghezza diversa non posso eseguire il confronto?
Grazie!

giacomo.bezzi
l'AND logico impone che entrambe le condizioni siano verificate. Non fa nessun confronto.

I for sono annidati, quindi l'operazione "%" viene eseguita per ogni elemento di a con ogni elemento di b (a meno che a%b[j]==0), quindi:

$ a[0]%b[0]$
$a[0]%b[1]$
$...$
$a[1]%b[0]$
$...$
$a[4]%b[2] $

bius88
Quindi:

a[0] % b[0] !=0
a[0] % b[1] !=0
a[0] % b[2] !=0

a[1] % b[0] !=0
a[1] % b[1] ==0 $rArr$ c = false
a[1] % b[2] !=0

a[2] % b[0] ==0 $rArr$ c = false
a[2] % b[1] !=0
a[2] % b[2] !=0

a[3] % b[0] !=0
a[3] % b[1] !=0
a[3] % b[2] ==0 $rArr$ c = false

a[4] % b[0] !=0
a[4] % b[1] !=0
a[4] % b[2] !=0

Ora restituisce c.....il secondo punto in pratica vuole sapere il valore di c se non erro e nella traccia lo chiama r. E' così?

giacomo.bezzi
si, in pratica è così.

Tuttavia ti faccio notare che:
a[1]%b[2] non viene eseguito dato che al passo precedente a c[1] è assegnato FALSE. Analogamente per a[2]%b[1] e a[2]%b[2].
r e c sono due variabili distinte anche se in questo caso hanno lo stesso contenuto.

bius88
Ok grazie tante!!

bius88
Mi sono dimenticato di una cosa....abbiamo detto che il contenuto di c coincide con r: qual è questo contenuto?
Nel programma r è un vettore booleano quindi viene restituito r:{false, false, false} ?


Grazie!

giacomo.bezzi
No, intanto r (come c) è un vettore di 5 elementi, quando il vettore c viene generato ogni elemento è TRUE e il numero di elementi è a.length (quindi in questo caso 5).

Poi come hai scritto tu:

"bius88":

a[0] % b[0] !=0
a[0] % b[1] !=0
a[0] % b[2] !=0

a[1] % b[0] !=0
a[1] % b[1] ==0 ⇒ c = false
a[1] % b[2] !=0

a[2] % b[0] ==0 ⇒ c = false
a[2] % b[1] !=0
a[2] % b[2] !=0

a[3] % b[0] !=0
a[3] % b[1] !=0
a[3] % b[2] ==0 ⇒ c = false

a[4] % b[0] !=0
a[4] % b[1] !=0
a[4] % b[2] !=0


quindi dove non hai scritto niente c resta TRUE.

tutto chiaro?

bius88
a dire il vero no!!
Allora io so che all'inizio il vettore c ha la stessa lunghezza del vettore a e che c= true.
Al termine della chiamata del metodo il vettore restituito (che in questo caso viene chiamato r) da cosa è composto?

giacomo.bezzi
modifico leggermente quello che hai scritto così si capisce meglio:

a[0] % b[0] !=0
a[0] % b[1] !=0
a[0] % b[2] !=0 ⇒ c[0] resta TRUE

a[1] % b[0] !=0
a[1] % b[1] ==0 ⇒ c[1] = false

a[2] % b[0] ==0 ⇒ c[2] = false

a[3] % b[0] !=0
a[3] % b[1] !=0
a[3] % b[2] ==0 ⇒ c[3] = false

a[4] % b[0] !=0
a[4] % b[1] !=0
a[4] % b[2] !=0 ⇒ c[4] resta TRUE

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.