Salta el contingut
 

Exercici: Debugging

Autor: Joan Puigcerver Ibáñez

Correu electrònic: j.puigcerveribanez@edu.gva.es

Llicència: CC BY-NC-SA 4.0

(Reconeixement - NoComercial - CompartirIgual) 🅭

Objectius

L'objectiu d'aquest exercici és familiaritzar-se amb la utilització del depurador.

Advertència

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

Pot ser s'utilitzen operadors i estructures que encara no conegueu. No passa res. Podeu reprendre aquests exercicis a mesura que aprengueu aquestes estructures en mòdul de programació.

Observacions

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

Exercici 1: DebugVariables

Revisa el següent codi utilitzant el debugger i explica què fan les diferents operacions.

Comprova els valors que pren cada variable amb el depurador.

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 següent codi amb el debugger. Compara el funcionament de , i .

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 següent codi utilitzant el debugger i comprova que el programa decideix qui és el guanyador d'una manera correcta.

Esquema regles pedra, paper i tisores

Figura 1. Esquema regles pedra, paper i tisores

Corregeix el programa si és necessari.

DebugRockPaperScissors.java
package ud1.exercises;

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

public 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.

Considerem la següent operació:

  • Si el nombre és parell, divideix el nombre per 2.
  • Si el nombre és imparell, multiplica el nombre per 3 i suma 1.
\[ F(n) = \begin{cases} \frac{n}{2} & \text{if n is even}\\ 3n + 1 & \text{if n is odd} \end{cases} \]

La conjectura diu que si apliquem aquesta operació a qualsevol nombre natural indefinidament, el resultat serà sempre 1.

Prova el programa (i corregeix-lo si és necessari) amb l'ajuda del depurador.

Podeu utilitzar la web https://goodcalculators.com/collatz-conjecture-calculator/ per veure quins resultats ha d'obtindre el programa.

Podeu utilitzar els següents casos de prova:

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

Una vegada heu comprovat que el programa funciona correctament, utilitza el depurador per saber quin és el resultat d'aplicar 12 vegades l'operació Collatz al número 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 ????
 */

public 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);
    }
}