Salta el contingut
 

Exercici: Depuració

Joan Puigcerver Ibáñez

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Objectius

L'objectiu d'aquest exercici és familiaritzar-se amb l'ús del depurador.

L'exercici no té com a objectiu aprendre a programar en Java.

És possible que s'utilitzen operadors i estructures que encara no coneixes. No passa res: pots reprendre aquests exercicis a mesura que aprengues aquestes estructures en el mòdul de Programació.

Observacions

Tot el codi font ha d'estar situat en el paquet ud1.exercises.

Exercici 1: DebugVariables

Revisa el codi següent amb el depurador i explica què fan les diferents operacions. Comprova els valors que pren cada variable.

DebugVariables.java
package ud1.exercises;

import java.util.Locale;
import java.util.Scanner;

public class DebugVariables {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in).useLocale(Locale.US);
        System.out.print("Introdueix el primer número: ");
        int x = in.nextInt();
        System.out.print("Introdueix el segon número: ");
        int y = in.nextInt();

        int s = x + y;
        int r = x - y;
        int m = x * y;
        int d = x / y;
        int mod = x % y;

        System.out.printf("%d + %d = %d\n", x, y, s);
        System.out.printf("%d - %d = %d\n", x, y, r);
        System.out.printf("%d * %d = %d\n", x, y, m);
        System.out.printf("%d / %d = %d\n", x, y, d);
        System.out.printf("%d %% %d = %d\n", x, y, mod);

        boolean b1 = x > y;
        boolean b2 = y % 2 == 0;

        System.out.printf("%d > %d = %s\n", x, y, b1);
        System.out.printf("%d %% 2 == 0 = %s\n", y, b2);

        boolean n = !b1;
        boolean a = b1 && b2;
        boolean o = b1 || b2;
        boolean xo = b1 ^ b2;

        System.out.printf("!%s = %s\n", b1, n);
        System.out.printf("%s && %s = %s\n", b1, b2, a);
        System.out.printf("%s || %s = %s\n", b1, b2, o);
        System.out.printf("%s ^ %s = %s\n", b1, b2, xo);
    }
}

Exercici 2: DebugMethods

Revisa el codi següent amb el depurador i compara el funcionament dels botons Step over, Step into i Step out.

DebugMethods.java
package ud1.exercises;

import java.util.Locale;
import java.util.Scanner;

public class DebugMethods {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in).useLocale(Locale.US);
        System.out.println("Introdueix dos nombres enters: ");
        int a = in.nextInt();
        int b = in.nextInt();

        suma(a, b);
        resta(a, b);
        multiplicacio(a, b);
        divisio(a, b);
    }

    public static void suma(int a, int b) {
        int result = a + b;
        System.out.printf("%d + %d = %d\n", a, b, result);
    }

    public static void resta(int a, int b) {
        int result = a - b;
        System.out.printf("%d - %d = %d\n", a, b, result);
    }

    public static void multiplicacio(int a, int b) {
        int result = a * b;
        System.out.printf("%d * %d = %d\n", a, b, result);
    }

    public static void divisio(int a, int b) {
        int result = a / b;
        System.out.printf("%d / %d = %d\n", a, b, result);
    }
}

Exercici 3: DebugRockPaperScissors

Revisa el codi següent amb el depurador i comprova que el programa decideix correctament qui guanya segons les regles del joc (Figura 1).

Esquema de les regles de pedra, paper i tisores

Figura 1. Esquema de les regles de pedra, paper i tisores.

Corregeix el programa si és necessari.

DebugRockPaperScissors.java
package ud1.exercises;

import java.util.Locale;
import java.util.Scanner;

class DebugRockPaperScissors {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in).useLocale(Locale.US);
        System.out.print("Introdueix l'elecció del jugador 1 (pedra/paper/tisores): ");
        String p1 = in.nextLine();
        System.out.print("Introdueix l'elecció del jugador 2 (pedra/paper/tisores): ");
        String p2 = in.nextLine();

        if(p1.equals(p2))
            System.out.println("Empat!");
        else if (p1.equals("paper")) {
            if(p2.equals("pedra"))
                System.out.println("Guanya jugador 2!");
            else
                System.out.println("Guanya jugador 2!");
        } else if (p1.equals("pedra")) {
            if(p2.equals("paper"))
                System.out.println("Guanya jugador 1!");
            else
                System.out.println("Guanya jugador 1!");
        } else {
            if(p2.equals("paper"))
                System.out.println("Guanya jugador 2!");
            else
                System.out.println("Guanya jugador 1!");
        }
    }
}

Exercici 4: DebugCollatz

Aquest programa és un exemple de la conjectura de Collatz – Viquipèdia. Es parteix de l'operació següent:

  • Si el nombre és parell, es divideix entre 2.
  • Si el nombre és senar, es multiplica per 3 i se li suma 1.
\[ F(n) = \begin{cases} \frac{n}{2} & \text{si } n \text{ és parell}\\ 3n + 1 & \text{si } n \text{ és senar} \end{cases} \]

La conjectura afirma que, si s'aplica aquesta operació de manera repetida a qualsevol nombre natural, sempre s'arriba a 1.

Prova el programa amb l'ajuda del depurador i corregeix-lo si és necessari. Per saber quins resultats ha d'obtindre el programa, pots utilitzar la Collatz Conjecture Calculator – Good Calculators.

Utilitza els casos de prova següents:

  • Per a \(N = 1\), el programa arriba a 1 després de 0 passos.
  • Per a \(N = 5\), el programa arriba a 1 després de 5 passos.
  • Per a \(N = 8\), el programa arriba a 1 després de 3 passos.
  • Per a \(N = 11\), el programa arriba a 1 després de 14 passos.
  • Per a \(N = 27\), el programa arriba a 1 després de 111 passos.

Una vegada comprovat que el programa funciona correctament, utilitza el depurador per saber quin és el resultat d'aplicar 12 vegades l'operació de Collatz al nombre 27. Escriu aquest valor com a comentari en el codi.

DebugCollatz.java
package ud1.exercises;

import java.util.Locale;
import java.util.Scanner;

/*
 * El resultat de l'operació de collatz
 * per a N = 27 després de 12 iteracions
 * és ????
 */

class DebugCollatz {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in).useLocale(Locale.US);
        System.out.print("Introdueix un número: ");
        int inicial = in.nextInt();
        int n = inicial;
        int counter = 0;

        while (n != 0) {
            if(n % 2 == 0)
                n = n * 2 + 1;
            else
                n = (n + 1) / 2;
            counter++;
        } 

        System.out.printf("S'ha arribat del %d al 1 després de %d passos.\n", inicial, counter);
    }
}
📌 Aquest document pot quedar desactualitzat després d’imprimir-lo. Pots consultar la versió més recent a la pàgina web.
🌿 Abans d’imprimir aquest document, considera si és realment necessari. Redueix el consum de paper i ajuda a protegir el nostre entorn.