Programma che compila ma esegue solo in parte

di il
2 risposte

Programma che compila ma esegue solo in parte

Ciao a tutti, mi sto esercitando in java con degli esercizi abbastanza basilari, tutti con lo stesso tipo di ragionamento ma non riesco a capire perché compilano ma poi quando li eseguo mi danno errore. Mi potreste spiegare dove sbaglio?
Questo è un'esempio: un programma che in teoria dovrebbe dare vero se la matrice "a" ha una colonna uguale a una colonna della matrice "b".
public class Luglio2017 {
public static boolean ex1(int[][] a, int[][] b){
int n = 0;
int m = 0;
int i = 0;
int j = 0;
boolean valido = false;
while(a != null && b != null){
while(m <= a[m].length){
while(n <= a[n].length){
if(a[n][m] == b[j]){
n = n + 1;
i = i + 1;
valido = true;
}else{
n = 0;
m = m + 1;
i = 0;
j = j + 1;
valido = false;
}
}
}
}
return valido;
}
}
Questo è il main:
public class LuglioTestEx1 {
public static void main(String[] args) {
int[][] a0 = null;
int[][] b0 = null;

int[][] a1 = {};
int[][] b1 = {};
System.out.println(Luglio2017.ex1(a0,b0)==false); // atteso true perche':
// nessuno tra a0 e b0 contiene elementi.

System.out.println(Luglio2017.ex1(a0,b1)==false); // atteso true perche':
// nessuno tra a0 e b1 contiene elementi.

System.out.println(Luglio2017.ex1(a1,b0)==false); // atteso true perche':
// nessuno tra a1 e b0 contiene elementi.

System.out.println(Luglio2017.ex1(a1,b1)==false); // atteso true perche':
// nessuno tra a1 e b1 contiene elementi.


int[][] a2 = {{2, 1 , 5}
,{3, 10 , 6}
,{4, 100, 7}};
int[][] b2 = {{4, 7 , 1 }
,{3, 5 , 10 }
,{2, 6 , 100}};
System.out.println(Luglio2017.ex1(a2,b2)==true ); // atteso true perche':
// colonna 1 in a2 == colonna 2 di b2.

int[][] a3 = {{2, 1 , 5}
,{3, 10 , 6}
,{4, 100, 7}};
int[][] b3 = {{4, 1 , 7}
,{3, 10 , 6}
,{2, 0 , 5}};
System.out.println(Luglio2017.ex1(a3,b3)==false); // atteso true perche':
// nessuna colonna di a3 e' identica a qualche colonna di b3.

int[][] a4 = {{2, 1 , 5}
,{3, 10 , 6}
,{4, 100, 7}};
int[][] b4 = {{1 , 4 , 7}
,{10, 3 , 6}
,{0 , 2 , 5}};
System.out.println(Luglio2017.ex1(a4,b4)==false); // atteso true perche':
// nessuna colonna di a4 e' identica a qualche colonna di b4.

int[][] a5 = {{1 , 2, 5 }
,{10 , 3, 6 }
,{100, 4, 7 }};
int[][] b5 = {{1 , 4, 1 }
,{10 , 3, 10 }
,{0 , 2, 100}};
System.out.println(Luglio2017.ex1(a5,b5)==true ); // atteso true perche':
// colonna 0 in a5 == colonna 2 di b5.

int[][] a6 = {{1 , 2 , 5}
,{10 , 3 , 6}
,{100, 4 , 7}};
int[][] b6 = {{1 , 1 , 7}
,{1 , 10 , 6}
,{0 , 100, 5}};
System.out.println(Luglio2017.ex1(a6,b6)==true ); // atteso true perche':
// colonna 0 in a6 == colonna 1 di b6.
}
}
Questo è quello che esce quando provo ad eseguire:
true
true
true
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
at Luglio2017.ex1(Luglio2017.java:20)
at LuglioTestEx1.main(LuglioTestEx1.java:17)


Grazie dell'aiuto e della pazienza nel leggere un post così chilometrico

2 Risposte

  • Re: Programma che compila ma esegue solo in parte

    RED_53 ha scritto:


    Mi potreste spiegare dove sbaglio?
    Questo è un'esempio: un programma che in teoria dovrebbe dare vero se la matrice "a" ha una colonna uguale a una colonna della matrice "b".
    Per fare una cosa del genere, bisogna "provare" tutte le combinazioni tra le varie colonne di a e b. Ovvero la prima colonna di a verificarla con ciascuna delle colonne in b, la seconda colonna di a verificarla con ciascuna delle colonne in b, ecc...
    Serve per questo un doppio ciclo for annidato. E per ciascuna combinazione, un ulteriore ciclo che verifica materialmente i dati tra due colonne.
    Quindi servono 3 cicli annidati. Io tutto questo nel tuo codice NON lo vedo. E nel tuo codice un while(a != null && b != null) non serve proprio per niente.

    Prova a ri-ragionare sull'esercizio.
  • Re: Programma che compila ma esegue solo in parte

    Grazie mille
Devi accedere o registrarti per scrivere nel forum
2 risposte