/**
    Classe della Prova di Esame di Programmazione I e Laboratorio
    del 8 luglio 2003
*/

public class ProvaArrayLuglio {

    /**
    deve prendere come parametri due array a e b di elementi di tipo 
    booleano e restituire il risultato del seguente calcolo:
    \/ i=0..n-1 (a[i] /\ b[i]). Si verifiche che la lunghezza
    dei due array sia uguale.
    @param a primo array di elementi di tipo boolean 
    @param b primo array di elementi di tipo intero 
    @return \/ i=0..n-1 (a[i] /\ b[i]).
    */
    public static boolean andOrI(boolean[] a, boolean[] b) {
        if ((a == null) || (b == null) || (a.length != b.length))
            throw new IllegalArgumentException("Array di lunghezza diversa o non inizializzati");
        boolean ris = false;
        for (int i=0; i < a.length; i++)
            ris = ris || (a[i] && b[i]);
        return ris;
    }


    /**
    deve prendere come parametri due array a e b di elementi di tipo 
    booleano e restituire il risultato del seguente calcolo:
    \/ i=0..n-1 (a[i] /\ b[i]). Si verifiche che la lunghezza
    dei due array sia uguale.
    Versione piu` efficiente, sfrutta il fatto che e` sufficiente 
    che una sola coppia a[i] /\ b[i] sia true perche` tutta 
    l'espressione or sia true.
    @param a primo array di elementi di tipo boolean 
    @param b primo array di elementi di tipo intero 
    @return \/ i=0..n-1 (a[i] /\ b[i]).
    */
    public static boolean andOrII(boolean[] a, boolean[] b) {
        if ((a == null) || (b == null) || (a.length != b.length))
            throw new IllegalArgumentException("Array di lunghezza diversa o non inizializzati");
        boolean ris = false;
        int i = 0;
        while (!ris && (i < a.length)) {
            ris = (a[i] && b[i]);
            i++;
        }
        return ris;
    }


    /**
        Risultato atteso dal main:

        Risultato calcolo: true
        Risultato calcolo: true
        Risultato calcolo: false
        Risultato calcolo: false

    */
    public static void main(String[] args) {
        boolean[] a = {true, true, true, true};
        boolean[] b = {false, false, true, false};
        System.out.println("Risultato calcolo: " + andOrI(a, b));
        System.out.println("Risultato calcolo: " + andOrII(a, b));
        a = new boolean[]{true, true, true, true};
        b = new boolean[]{false, false, false, false};
        System.out.println("Risultato calcolo: " + andOrI(a, b));
        System.out.println("Risultato calcolo: " + andOrII(a, b));
    }

}