import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Arrays; import java.util.Scanner; import org.junit.jupiter.api.Test; public class Esercizi { /* Esercizio 1 */ public static int[] leggiArray(int n) { Scanner kbd = new Scanner(System.in); System.out.println("Immettere " + n + " numeri"); // creo un array lungo n int[] a = new int[n]; // riempio l'array a con valori letti da tastiera for (int i = 0; i < n; i++) { a[i] = kbd.nextInt(); } kbd.close(); // restituisco a return a; } public static void main(String[] args) { int[] dati = leggiArray(10); System.out.println("Array che avete inserito: " + Arrays.toString(dati)); } /* Esercizio 2 */ // notare che il tipo di ritorno è void, perché questo metodo non restituisce // nulla, ma modifica direttamente l'array a passato come input. public static void sostituzioneSulPosto(int[] a) { for (int i = 0; i < a.length; i++) { if (a[i] < 0) a[i] = 0; } } @Test public void testSostituzioneSulPosto() { var dati = new int[] {1, -2, 3, -1, 0}; sostituzioneSulPosto(dati); assertArrayEquals(new int[] {1, 0, 3, 0, 0}, dati); } /* Esercizio 3 */ public static int[] sostituzione(int[] a) { // Creiamo un array res che restituirò come risultato, della stessa lunghezza di a. // È importante creare il vettore con "new int[a.length]". Se invece scrivo "int[] res = a" // quello che succede è che res diventa un alias di a, e quindi tutte le modifiche fatte su // res si ripercuotono sul vettore a. int[] res = new int[a.length]; // riempiamo res con i valori di a modificati for (int i = 0; i < a.length; i++) { if (a[i] > 0) res[i] = a[i]; // se a[i] <= 0 non faccio nulla, tanto dovrei mettere in res[i] il valore 0, che è // quello che c'è gia di default. } // restituiamo res return res; } @Test public void testSostituzione() { // creo un vettore con dei numeri per fare un test int[] dati = new int[] {1, -2, 3, -1, 0}; // creo una copia del vettore dati (uso il metodo clone per non dover riscrivere tutta la // sequenza di numeri) int[] datiorig = dati.clone(); // controllo che l'output del metodo "sostituzione" sia quello atteso assertArrayEquals(new int[] {1, 0, 3, 0, 0}, sostituzione(dati)); // controllo che il vettore dati non si cambiato, confrontandolo col vecchio valore datiorig assertArrayEquals(datiorig, dati); } /* Esercizio 4 */ public static boolean ordineAlfabetico(String[] a) { // Il metodo funziona controllando che tutte le coppie di elementi contigui siano // nell'ordine corretto. Notare che l'estremo superiore del for non è a.length (come è di // solito) ma a.length - 1, perché l'ul for (int i = 0; i < a.length - 1; i++) { // Controllo se l'elemento a[i] e il successivo a[i+1] sono nell'ordine giusto. // Se così non è, termino immediatamente restituendo false. if (a[i].compareTo(a[i + 1]) >= 0) return false; } // Se sono arrivato fin quì vuol dire che ttutte le coppie sono nell'ordine giusto, quindi // restituisco true. return true; } @Test public void testOrdineAlfabetico() { assertTrue(ordineAlfabetico(new String[] {})); assertTrue(ordineAlfabetico(new String[] {"amico"})); assertTrue(ordineAlfabetico(new String[] {"amico", "bandiera", "zattera"})); assertFalse(ordineAlfabetico(new String[] {"bandiera", "amico", "zattera"})); assertFalse(ordineAlfabetico(new String[] {"bandiera", "bandiera", "zattera"})); } }