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
Rggb1
La lunghezza del vettore che mostri è 8... ti torna?

bius88
scusa ma se si parte da $0$ la lunghezza non è $7$?

Rggb1
Parte da v[0] e arriva a v[7] quindi sono 8 elementi, quindi la lunghezza è 8.

Per il resto, mi sembra semplice. Cosa non ti torna?

bius88
hai ragione mi sono confuso...correggo:
Il metodo esercizio1A riceve come parametro un vettore di interi v; v.length è 8 quindi 8%2 è uguale a 0

j=i+4
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

non riesco a capire l'esecuzione del programma e cosa stampa....

Rggb1
"bius88":
v % v[j] è diverso da 0 oppure v[j] % v è diverso da 0, ritorna c
...
non riesco a capire l'esecuzione del programma e cosa stampa....

Più esattamente, fa un ciclo all'interno del quale, se la condizione
(v[i] % v[j] != 0) || (v[j] % v[i] != 0)
è vera, incrementa il valore di c.
Alla fine ritorna il valore di c.

Inoltre, per il vettore dato, essendo la lunghezza 8, all'interno del ciclo la variabile j vale i+4, quindi confronterà gli elementi di indice 0 e 4, 1 e 5, 2 e 6, 3 e 7.

bius88
Prima non ho corretto tutto....lo faccio ora e tento di concludere grazie al tuo suggerimento:
Il metodo esercizio1A riceve come parametro un vettore di interi v; v.length è 8 quindi 8%2 è uguale a 0

j=i+4
se v % v[j] è diverso da 0 oppure v[j] % v è diverso da 0, incrementa il valore di c.
per ora $c=-1$

v[0] % v[4] è diverso da 0 $rArr$ $c=0$
v[1] % v[5] è uguale da 0 ma v[4] % v[1] è diverso da 0 $rArr$ $c=1$
v[2] % v[6] è diverso da 0 $rArr$ $c=2$
v[3] % v[7] è diverso da 0 $rArr$ $c=3$

alla fine ritorna e stampa $c=3$
Spero sia così.....

Grazie

giozh
scusa la banalità, ma compilarlo e farlo girare?

bius88
Ma se non gira come faccio a capire dove sbaglio? Meglio avere chiarimenti e confrontarsi!!

giozh
"bius88":
Ma se non gira come faccio a capire dove sbaglio? Meglio avere chiarimenti e confrontarsi!!

se mi dai questa risposta evidentemente (ma forse mi sbaglio) non hai mai compilato un sorgente java. il compilatore java "standard" da terminale, ti dice dove sbagli (se hai scritto sintatticamente male il codice), o addirittura se usi eclipse ti dice anche le possibili correzioni al tuo codice. se non ho capito male, tu non sapevi cosa stampava il tuo sorgente no? beh lo scrivevi, lo compilavi, gli passavi quel vettore e guardavi cosa veniva stampato (ovviamente potevi prima fare su carta le tue ipotesi). simple.

bius88
"giozh":
[quote="bius88"]Ma se non gira come faccio a capire dove sbaglio? Meglio avere chiarimenti e confrontarsi!!

se mi dai questa risposta evidentemente (ma forse mi sbaglio) non hai mai compilato un sorgente java. il compilatore java "standard" da terminale, ti dice dove sbagli (se hai scritto sintatticamente male il codice), o addirittura se usi eclipse ti dice anche le possibili correzioni al tuo codice. se non ho capito male, tu non sapevi cosa stampava il tuo sorgente no? beh lo scrivevi, lo compilavi, gli passavi quel vettore e guardavi cosa veniva stampato (ovviamente potevi prima fare su carta le tue ipotesi). simple.[/quote]

Veramente l'esercizio è discorsivo; devo descrivere la funzione svolta dal metodo e cosa esegue il programma...per questo io metto tutte le ipotesi, così qualcuno mi correggerà e capirò dove sbaglio e come devo agire

Grazie comunque per le informazioni!!

giozh
guarda, anche se li devi fare su carta, ti consiglio sempre e comunque di scrivere il programma (mettendo istruzioni di stampa fra una istruzione e l'altra) in modo tale da accorgerti tu stesso degli errori che fai. fidati che impari molto di piu!

bius88
ok...allora ci proverò....ma intanto riguardo all'esercizio ho sbagliato qualcosa?

giozh
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;
}


il tuo vettore è di 8 elementi. quindi il primo if non viene eseguito (visto che 8/2 da resto 0). il for cicla per 4 volte (i/v[i+v.length/2) oppure v[i+v.length/2]/v[1] danno resto 0. se così è incrementa la variabile c.
quando devi tenere traccia dei passi di un programma (se lo fai su carta), le prime volta è preferibile che scrivi tutte le variabili che utilizzi e il loro sviluppo nel tempo.
PASSO 0
c=0 (visto che la lunghezza del vettore è divisibile per 2)
variabili del for:
i=0; i<4 (v.length/2)? si
j=0+4
v[0]/v[0+4] da resto 0? no. v[0+4]/v[0] da resto 0? si
c=0+1;
i=i+1
questo è il primo passo. gli altri falli tu.

bius88
"giozh":
il for cicla per 4 volte (i/v[i+v.length/2) oppure v[i+v.length/2]/v[1] danno resto 0. se così è incrementa la variabile c.

Scusa ma non è il contrario? Se NON danno resto $0$ incrementa c...
Comunque credo che sia giusto e che c sia $3$

giozh
ehm si sorry, m'era sfigguto il diverso :D

bius88
Ora posto un altro esercizio che è molto simile ma mi sta dando un po di problemi:
 public static int esercizio1D ( boolean v[] )  {
                   int c=0;
                   if ((v.length>2) && (v.length % 2 ==0))
                           int i = v.length/2 -1;
                           while (i>=0)   {
                                    if (v[i] && v[v.length-1-i])
                                             c++;
                                    i--;
                           }
                  return c;
 }


Descrivere la funzione svolta dal metodo e si mostri l'esecuzione nel caso in cui v=[true, false, true, false, false, true, false, true] specificando il valore dell'intero c restituito.

Il metodo esercizio1D riceve come parametro un vettore v di booleani.
Se è vero che v.length >2 verifico che v.length%2 sia uguale a zero: $8>2$ e $8%2==0$ dunque i=$8/2 -1$ =$3$

Ora non riesco a capire il programma: cosa fa il ciclo while?
Grazie!!

hamming_burst
Ciao,

allora la verifica nell'if vuol dire che la lunghezza deve essere maggiore di 2 ed avere un numero pari di elementi.

$i$ viene inizializzato alla metà inferiore del vettore booleano.

l'invariante di ciclo è quando $i$ decrementa a -1

all'interno del ciclo se il contentuo nella i-esima posizione è true e se nella seconda metà del vettore a posizione alternate è true anch'essa, incrementa la variabile $c$

e ritorna $c$, cioè conta i true presenti nel vettore quando le condizioni nel ciclo while sono verificate.

Semplice...spero sia chiaro :)

bius88
a dire la verità l'if non l'ho capito...
abbiamo v e v[v.length-1-i] : per i>=0 confrontiamo in pratica :
v[0] e v[7]
v[1] e v[6]
v[2] e v[5]
v[3] e v[4]

se sono uguali incrementa c quindi alla fine ritorna $c=4$

E' così?
Grazie 1000!!!

hamming_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

giacomo.bezzi
incrementa c non se sono uguali, ma se sono entrambi TRUE.

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