Programma in java....cosa viene stampato?
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!
public static int esercizio1A (int v[]) {
int c=0;
if(v.length % 2!=0)
c=-1;
else
for (int i=0; i
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
scusate, non avevo visto che aveva già risposto ham_burst
Si avete ragione....purtroppo sono alle prime armi e mi confondo facilmente.
Grazie a tutti e due!!!
Grazie a tutti e due!!!
"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....
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.
ah ho capito.....bastava dire che devono essere entrambi true!!
Per quanto riguarda il codice è giusto quello che ho scritto?
Per quanto riguarda il codice è giusto quello che ho scritto?
giusto, ma l'ordine con cui viene fatto il confronto è al contrario (non cambia nulla, pura pignoleria).
Grazie! Ma come faccio ad accorgermi che l'ordine del confronto è al contrario?
Perché i all'inizio assume il valore 3 (quindi il primo confronto è v[3] v[4]) e scala fino a 0.
Ah ok....grazie tante!!
Ora sto facendo un altro esercizio che è un po più lungo e complicato ma che comunque sto tendando di risolvere:
$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!!
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!!
"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
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!
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!
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] $
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] $
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ì?
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ì?
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.
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.
Ok grazie tante!!
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!
Nel programma r è un vettore booleano quindi viene restituito r:{false, false, false} ?
Grazie!
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:
quindi dove non hai scritto niente c resta TRUE.
tutto chiaro?
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?
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?
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?
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
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