Pages: [1]   Go Down
Print
Author Topic: Aiuto per un esercizio  (Read 2978 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
Serginho21
Guest
« on: 11-06-2009, 08:50:23 »

Ragazzi mi direste come mai non mi risulta? di compilare compila ma il risultato non è giusto
Code:
/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che
indichi se esistono due colonne di A le cui rispettive medie dei valori coincidano. Non si possono
usar array ausiliari.*/

public class Es023
{
public static boolean metodo ( long [][] A )
{
boolean trovato=false;
int i=0, k=0, y=0;
long cont=0;
long cont2=0;
long media=0;
long media2=0;
for(i=0; i<A.length; i++)
{
for(k=0; k<A[i].length; k++)
{
for(y=k+1; y<A[i].length; y++)
{
cont+=A[i][k];
cont2+=A[i][y];
}
}
media=cont/k;
media2=cont2/y;
System.out.println(media);
System.out.println(media2);
if(media==media2)
trovato=true;
}
return trovato;
}
public static void main( String [] args )
        {
           long [][]A = {{1,0,3,0,2},
       {0,3,3,0,1},
               {5,1,8,3,6},
                                       {7,5,2,5,3}};
                   System.out.println(metodo(A));
        }
}  
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #1 on: 11-06-2009, 12:28:34 »

Correggimi se sbaglio, ma nel tuo codice prima imposti la riga con l'indice i e poi k e.....l'altra non la ricordo sono le colonne.Credo che sia sbagliato concettualmente, perchè:
Se l'esercizio vuole che controlli le COLONNE per la media, mettendo i cicli for di k e l'altro che non ricordo più interni, anzichè scendere nell'array giu, vai a DESTRA!!! e quindi sbagli.

Seconda cosa, dato che non è frastagliata la matrice, puoi benissimo mettere ad es: for(int k=0 k<A[0].length....)
tanto la lunghezza della riga sarà sempre uguale, hai sbagliato i cicli principalmente, invertendo le colonne che devono stare nei cicli più esterni con la riga che invece deve essere quello più interno.
Per la media, non capisco perchè fai cont/k.......basta fare cont/A.length no?? la somma fratto il numero degli elementi che è datto dalla lunghezza della matrice.
Dimenticavo, hai anche sbagliato secondo me ne ciclo più interno a mettere insieme cont e cont2 perchè in quel ciclo farà solo un tipo di somma che è relativa al ciclo più interno, ma l'altra sarebbe dovuta essere messa nel for più esterno, ma l'esercizio ripeto sarebbe stato sbagliato comunque perchè erano sempre le colonne a incrementarsi e non le righe.



Se qualcosa non è chiara dimmelo pure....
« Last Edit: 11-06-2009, 12:30:07 by guitarplaying » Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Serginho21
Guest
« Reply #2 on: 11-06-2009, 17:00:19 »

ok grazie per le correzioni ora vado a correggere e ti faccio sapere! 
Edit: Ho fatto queste correzioni perchè ho capito questo di quello che mi ha spiegato ma non funziona lo stesso
Code:

public class Es023
{
public static boolean metodo ( long [][] A )
{
boolean trovato=false;
int i=0, k=0, y=0;
long cont=0;
long cont2=0;
long media=0;
long media2=0;
for(k=0; k<A[0].length; k++)
{
for(y=k+1; y<A[0].length; y++)
{
for(i=0; i<A.length; i++)
                {
cont+=A[i][k];
cont+=A[i][y];
        }
}
media=cont/A.length;
media2=cont2/A.length;
System.out.println(media);
System.out.println(media2);
if(media==media2)
trovato=true;
}
return trovato;
}
public static void main( String [] args )
        {
           long [][]A = {{1,0,3,0,2},
       {0,3,3,0,1},
               {5,1,8,3,6},
                                       {7,5,2,5,3}};
                   System.out.println(metodo(A));
        }
}  
« Last Edit: 11-06-2009, 17:10:00 by Serginho21 » Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #3 on: 11-06-2009, 17:43:54 »

Code:
for(k=0; k<A[0].length; k++)
{
for(y=k+1; y<A[0].length; y++)
....

Io qui vedo un ArrayIndexOutOfBoundsException nell'esecuzione del programma.
Questo xchè quando k arriva a A[0].length-1, y varrà A[0].length andandosene fuori dall' array.
Quindi il fix è qui:
Code:
for(k=0; k<A[0].length-1; k++) // Fix
{
for(y=k+1; y<A[0].length; y++)
....

Poi un'altra kosa: devi settare a 0 le 2 variabili cont ogniqualvolta finisce un ciclo for, altrimenti sommi + colonne nella stessa variabile.
Logged

Diventa ciò che sei nato per essere
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #4 on: 11-06-2009, 18:04:27 »

Code:
for(k=0; k<A[0].length; k++)
{
for(y=k+1; y<A[0].length; y++)
....

Io qui vedo un ArrayIndexOutOfBoundsException nell'esecuzione del programma.
Questo xchè quando k arriva a A[0].length-1, y varrà A[0].length andandosene fuori dall' array.
In realtà l'eccezione java.lang.ArrayIndexOutOfBoundsException non sarà mai lanciata a causa di tale codice.
Anche se y nella ultima iterazione del ciclo for più interno valesse proprio A[0].length, la condizione di uscita dello stesso for
y<A[0].length
impedirebbe comunque che tale valore di y sia usato per la computazione della media.

In ogni caso, è opportuna la correzione postata da Crasher, visto che comunque tale iterazione non sarà fatta.
Code:
for(k=0; k<A[0].length-1; k++) // Fix
{
for(y=k+1; y<A[0].length; y++)
....

Poi un'altra kosa: devi settare a 0 le 2 variabili cont ogniqualvolta finisce un ciclo for, altrimenti sommi + colonne nella stessa variabile.
Confermo anche questa seconda correzione e aggiungo che nel ciclo for più interno hai erroneamente incrementato cont per entrambe le colonne, mentre il secondo incremento va fatto su cont2 (errore di svista, suppongo).

Hint (suggerimento): poiché la media è una somma diviso un numero di elementi, e il numero di elementi è costante e pari ad A.length è sufficiente confrontare i valori di cont e cont2 alla fine dei due cicli for per sincerarsi della presenza di due colonne con la stessa media.
Questo suggerimento, però, va precisato, non sarebbe applicabile nel caso di array frastagliati.
Il testo parla esplicitamente del costrutto matematico "matrice" quindi l'hint è applicabile.

Suggerimento personale: questo tipo di errore (dimenticanza di un carattere nel nome di un simbolo, in questo caso di una variabile) è uno degli errori più comuni nella programmazione. Prima di chiedere aiuto, rileggi "attentamente" il tuo testo. Non voglio dire di non chiedere più aiuto nel forum, ma di farlo (se ti senti di seguire il mio suggerimento personale) dopo aver letto "attentamente" il codice che da errore.

Saluti .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #5 on: 11-06-2009, 18:11:39 »

Bhè che dire, mi hanno battuto ,non ho avuto il dito più veloce  pray

Però ti ho corretto il codice con dei commenti in modo che tu possa capirlo... 

Code:
/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che
indichi se esistono due colonne di A le cui rispettive medie dei valori coincidano. Non si possono
usar array ausiliari.*/

public class Es023
{
public static boolean metodo ( long [][] A )
{
boolean trovato=false;
int i=0, k=0, y=0;
long cont=0;
long cont2=0;
long media=0;
long media2=0;

for(k=0; k<A[0].length-2; k++) //k<A[0].length-2 che tu non avevi messo è importante perchè la colonna di partenza si ferma alla penultima visto che l'altra y è uguale a k+1
{

for(y=k+1; y<A[0].length; y++) //Andava benissimo
{
for(i=0; i<A.length; i++)
{
cont+=A[i][k];
                                     
cont2+=A[i][y];             //Qui ti sei dimenticato di mettere cont2, avevi scritto cont al posto di cont, ma vabbè piccola distrazione...
}

media=cont/A.length;
media2=cont2/A.length;
System.out.println("Media"+"     "+media+'\t');            //sommo le due medie chiamandole media e media2
System.out.println("Media2"+"    "+media2+'\t');
if(media==media2)
trovato=true;

cont=0;   //ATTENTO, AVEVI DIMENTICATO DI AZZERARE CONT E CONT2, COSI' PER FORZA ERA SBAGLIATO

cont2=0; //INFATTI SENZA QUESTE DUE LA SOMMA CONTINUA A INCREMENTARSI MENTRE SI DEVE AZZERARE QUANDO CAMBI LE COLONNE PERCHè CAMBIANO I NUMERI
}
}

return trovato;
}


public static void main( String [] args )
        {
           long [][]A = {{1,0,1,0,2},
       {0,0,3,0,1},
               {5,1,8,3,6},
                                       {7,5,2,5,3}};
                   System.out.println(metodo(A));
        }
}
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #6 on: 11-06-2009, 18:12:13 »

In realtà l'eccezione java.lang.ArrayIndexOutOfBoundsException non sarà mai lanciata a causa di tale codice.
Anche se y nella ultima iterazione del ciclo for più interno valesse proprio A[0].length, la condizione di uscita dello stesso for
y<A[0].length
impedirebbe comunque che tale valore di y sia usato per la computazione della media.

Piccola svista, giusto! Stavo appunto editando il post precedente sul suggerimento delle 2 variabili superflue media e media2
Logged

Diventa ciò che sei nato per essere
ɹǝǝuıƃuǝsɹǝʌǝɹ
Administrator
God of the Forum
*****
Offline Offline

Gender: Male
Posts: 4.474


Più grande è la lotta, e più è glorioso il trionfo


WWW
« Reply #7 on: 12-06-2009, 00:34:13 »

Espliciterò i commenti (semplicemente indicati nel codice riportato) in fondo al messaggio.
Code:
/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che
indichi se esistono due colonne di A le cui rispettive medie dei valori coincidano. Non si possono
usar array ausiliari.*/

public class Es023
{
public static boolean metodo ( long [][] A )
{
boolean trovato=false;
int i=0, k=0, y=0;
long cont=0;
long cont2=0;
long media=0;
long media2=0;

for(k=0; k<A[0].length-2; k++) //commento di guitarplaying: k<A[0].length-2 che tu non avevi messo è importante perchè la colonna di partenza si ferma alla penultima visto che l'altra y è uguale a k+1
//commento di reversengineer 1
{

for(y=k+1; y<A[0].length; y++) //Andava benissimo
{
for(i=0; i<A.length; i++)
{
cont+=A[i][k];
                                     
cont2+=A[i][y];             //Qui ti sei dimenticato di mettere cont2, avevi scritto cont al posto di cont, ma vabbè piccola distrazione...
}

media=cont/A.length;
media2=cont2/A.length;
System.out.println("Media"+"     "+media+'\t');            //sommo le due medie chiamandole media e media2
System.out.println("Media2"+"    "+media2+'\t');
if(media==media2)
trovato=true;

//commento di reversengineer 2 relativo a questi due azzeramenti
cont=0;   //ATTENTO, AVEVI DIMENTICATO DI AZZERARE CONT E CONT2, COSI' PER FORZA ERA SBAGLIATO

cont2=0; //INFATTI SENZA QUESTE DUE LA SOMMA CONTINUA A INCREMENTARSI MENTRE SI DEVE AZZERARE QUANDO CAMBI LE COLONNE PERCHè CAMBIANO I NUMERI
}
}

return trovato;
}


public static void main( String [] args )
        {
           long [][]A = {{1,0,1,0,2},
       {0,0,3,0,1},
               {5,1,8,3,6},
                                       {7,5,2,5,3}};
                   System.out.println(metodo(A));
        }
}

Commento 1: grave errore quello di fermarsi solo alla terz'ultima colonna per fare i confronti. Come suggeriva già Crasher ci si ferma a k<A[0].length-1 e non a k<A[0].length-2.
Inoltre, voglio ricordati che quando si sceglie di postare una replica (reply) in un forum bisogna aver letto tutti gli interventi precedenti, perché bisogna sapere esattamente di cosa si è parlato per evitare inutili ripetizioni o interventi inappropriati. In particolare in questa discussione si è già corretto quest'errore iniziale (v. post di Crasher e anche successiva mia conferma della correttezza di tale soluzione, quindi ben 2 interventi).

Commento 2: ti avevo già ripreso in passato (vedere questo link) sul fatto che azzerare variabili dopo l'uso rende più difficile la comprensione del testo e in generale non si può stabilire se è corretto ai fini dell'esercizio. Le variabili contatore vanno azzerate sempre prima del loro uso, mai dopo .

Buonanotte .
Logged

La grande marcia della distruzione mentale proseguirà. Tutto verrà negato. Tutto diventerà un credo. È un atteggiamento ragionevole negare l'esistenza delle pietre sulla strada; sarà un dogma religioso affermarla. È una tesi razionale pensare di vivere tutti in un sogno; sarà un esempio di saggezza mistica affermare che siamo tutti svegli. Accenderemo fuochi per testimoniare che due più due fa quattro. Sguaineremo spade per dimostrare che le foglie sono verdi in estate. Non ci resterà quindi che difendere non solo le incredibili virtù e saggezze della vita umana, ma qualcosa di ancora più incredibile: questo immenso, impossibile universo che ci guarda dritto negli occhi. Combatteremo per i prodigi visibili come se fossero invisibili. Guarderemo l'erba e i cieli impossibili con uno strano coraggio. Saremo tra coloro che hanno visto eppure hanno creduto.

In tutto, amare e servire.

  
                            ن                           
I can deal with ads,
I can deal with buffer,
but when ads buffer
I suffer...

...nutrimi, o Signore, "con il pane delle lacrime; dammi, nelle lacrime, copiosa bevanda...

   YouTube 9GAG    anobii  S  Steam T.B.o.I. Wiki [univ] Lezioni private  ʼ  Albo d'Ateneo Unicode 3.0.1
Usa "Search" prima di aprire un post - Scrivi sempre nella sezione giusta - Non spammare - Rispetta gli altri utenti - E ricorda di seguire il Regolamento
Serginho21
Guest
« Reply #8 on: 12-06-2009, 08:27:33 »

grazie a tutti e tre, ora vado a correggere. 
Logged
Daréios89
Forumista Eroico
*****
Offline Offline

Gender: Male
Posts: 2.679


La musica è la forma d'arte suprema.


« Reply #9 on: 12-06-2009, 10:17:00 »

Espliciterò i commenti (semplicemente indicati nel codice riportato) in fondo al messaggio.
Code:
/*Scrivere un metodo che prenda in input una matrice A di long, e restituisca un boolean che
indichi se esistono due colonne di A le cui rispettive medie dei valori coincidano. Non si possono
usar array ausiliari.*/

public class Es023
{
public static boolean metodo ( long [][] A )
{
boolean trovato=false;
int i=0, k=0, y=0;
long cont=0;
long cont2=0;
long media=0;
long media2=0;

for(k=0; k<A[0].length-2; k++) //commento di guitarplaying: k<A[0].length-2 che tu non avevi messo è importante perchè la colonna di partenza si ferma alla penultima visto che l'altra y è uguale a k+1
//commento di reversengineer 1
{

for(y=k+1; y<A[0].length; y++) //Andava benissimo
{
for(i=0; i<A.length; i++)
{
cont+=A[i][k];
                                     
cont2+=A[i][y];             //Qui ti sei dimenticato di mettere cont2, avevi scritto cont al posto di cont, ma vabbè piccola distrazione...
}

media=cont/A.length;
media2=cont2/A.length;
System.out.println("Media"+"     "+media+'\t');            //sommo le due medie chiamandole media e media2
System.out.println("Media2"+"    "+media2+'\t');
if(media==media2)
trovato=true;

//commento di reversengineer 2 relativo a questi due azzeramenti
cont=0;   //ATTENTO, AVEVI DIMENTICATO DI AZZERARE CONT E CONT2, COSI' PER FORZA ERA SBAGLIATO

cont2=0; //INFATTI SENZA QUESTE DUE LA SOMMA CONTINUA A INCREMENTARSI MENTRE SI DEVE AZZERARE QUANDO CAMBI LE COLONNE PERCHè CAMBIANO I NUMERI
}
}

return trovato;
}


public static void main( String [] args )
        {
           long [][]A = {{1,0,1,0,2},
       {0,0,3,0,1},
               {5,1,8,3,6},
                                       {7,5,2,5,3}};
                   System.out.println(metodo(A));
        }
}

Commento 1: grave errore quello di fermarsi solo alla terz'ultima colonna per fare i confronti. Come suggeriva già Crasher ci si ferma a k<A[0].length-1 e non a k<A[0].length-2.
Inoltre, voglio ricordati che quando si sceglie di postare una replica (reply) in un forum bisogna aver letto tutti gli interventi precedenti, perché bisogna sapere esattamente di cosa si è parlato per evitare inutili ripetizioni o interventi inappropriati. In particolare in questa discussione si è già corretto quest'errore iniziale (v. post di Crasher e anche successiva mia conferma della correttezza di tale soluzione, quindi ben 2 interventi).

Commento 2: ti avevo già ripreso in passato (vedere questo link) sul fatto che azzerare variabili dopo l'uso rende più difficile la comprensione del testo e in generale non si può stabilire se è corretto ai fini dell'esercizio. Le variabili contatore vanno azzerate sempre prima del loro uso, mai dopo .

Buonanotte .



Già hai proprio ragione, ero stanco e non ho visto bene, mi sono confuso con gli indici  testate
Per quanto  riguarda il secondo errore cercherò di tenerlo a mente, ma tu ritieni che sia corretto? a parte che da ora in poi azzererò le variabili all'inizio dei cicli per chiarezza come dici tu, ma sarebbe giusto lo stesso come esercizio?
Logged

"Utilizzare sempre de l'Hôpital.....è come andare a caccia di farfalle con un bazooka".
Serginho21
Guest
« Reply #10 on: 12-06-2009, 11:45:20 »

Code:
for(k=0; k<A[0].length; k++)
{
for(y=k+1; y<A[0].length; y++)
....

Io qui vedo un ArrayIndexOutOfBoundsException nell'esecuzione del programma.
Questo xchè quando k arriva a A[0].length-1, y varrà A[0].length andandosene fuori dall' array.
In realtà l'eccezione java.lang.ArrayIndexOutOfBoundsException non sarà mai lanciata a causa di tale codice.
Anche se y nella ultima iterazione del ciclo for più interno valesse proprio A[0].length, la condizione di uscita dello stesso for
y<A[0].length
impedirebbe comunque che tale valore di y sia usato per la computazione della media.

In ogni caso, è opportuna la correzione postata da Crasher, visto che comunque tale iterazione non sarà fatta.
Code:
for(k=0; k<A[0].length-1; k++) // Fix
{
for(y=k+1; y<A[0].length; y++)
....

Poi un'altra kosa: devi settare a 0 le 2 variabili cont ogniqualvolta finisce un ciclo for, altrimenti sommi + colonne nella stessa variabile.
Confermo anche questa seconda correzione e aggiungo che nel ciclo for più interno hai erroneamente incrementato cont per entrambe le colonne, mentre il secondo incremento va fatto su cont2 (errore di svista, suppongo).

Hint (suggerimento): poiché la media è una somma diviso un numero di elementi, e il numero di elementi è costante e pari ad A.length è sufficiente confrontare i valori di cont e cont2 alla fine dei due cicli for per sincerarsi della presenza di due colonne con la stessa media.
Questo suggerimento, però, va precisato, non sarebbe applicabile nel caso di array frastagliati.
Il testo parla esplicitamente del costrutto matematico "matrice" quindi l'hint è applicabile.

Suggerimento personale: questo tipo di errore (dimenticanza di un carattere nel nome di un simbolo, in questo caso di una variabile) è uno degli errori più comuni nella programmazione. Prima di chiedere aiuto, rileggi "attentamente" il tuo testo. Non voglio dire di non chiedere più aiuto nel forum, ma di farlo (se ti senti di seguire il mio suggerimento personale) dopo aver letto "attentamente" il codice che da errore.

Saluti .
Una cosa non ho capito, ma se già le variabili cont e cont2 sono inizializzate a zero in quale ciclo for devo settare a zero?
Logged
Crasher
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 417



« Reply #11 on: 12-06-2009, 11:49:38 »

Una cosa non ho capito, ma se già le variabili cont e cont2 sono inizializzate a zero in quale ciclo for devo settare a zero?

quando finisci di sommare tt gli elementi di una colonna e devi passare alla colonna successiva
Logged

Diventa ciò che sei nato per essere
Pages: [1]   Go Up
Print
Jump to: