<div class="page">
<div class="cover text-center">
<img class="mx-auto" src=/itb/images/logo_mislata.png alt="logo">
# Debugging
<div class="text-end fit-content ms-auto my-3 mt-auto pt-3">
<p><strong>Autor:</strong> Joan Puigcerver Ibáñez</p>
<p><strong>Correu electrònic:</strong> j.puigcerveribanez@edu.gva.es</p>
<p><strong>Curs:</strong> 2024/2025</p>
</div>
<div>
<p class="fw-bold mb-0">Llicència: BY-NC-SA</p>
<p class="d-none d-md-block">(Reconeixement - No Comercial - Compartir Igual)</p>
<a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.ca" target="_blank">
<img class="mx-auto" src="/itb/images/license.png" alt="Licence"/>
</a>
</div><!--license-->
</div><!--cover-->
</div><!--page-->
{:toc}
## Codi font
Tot el codi font ha d'estar situat en el package __ud1.exercises__.
## Objectius
L'objectiu d'aquest exercici és familiaritzar-se amb la utilització del depurador.
L'exercici __NO__{.red} té com a objectiu apendre en programar en Java. Pot ser s'utilitzen
operadors i estructures que encara no conegeu. No passa res. Podeu reprendre aquests
exercicis a mesura que aprengueu aquestes estructures en l'assignatura de programació.
## 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.
- <a href="/itb/DAM-ED/files/ud1/exercises/DebugVariables.java" download="DebugVariables.java">DebugVariables.java</a>
```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: DebugRockPaperScissors
Revisa el següent codi utilitzant el debugger i comprova que el programa decideix qui és el guanyador
d'una manera correcta.
{height=400}{.center}
Corregeix el programa si és necessari.
- <a href="/itb/DAM-ED/files/ud1/exercises/DebugRockPaperScissorsError.java" download="DebugRockPaperScissors.java">DebugRockPaperScissors.java</a>
```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 3: DebugCollatz
Aquest programa és un exemple de la [Conjetura de Collatz](https://es.wikipedia.org/wiki/Conjetura_de_Collatz).
Considerem la següent operació:
- Si el nombre és __parell__, divideix el nombre per 2.
- Si el nombre és __imparell__, mutiplica 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 conjetura 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.
- <a href="/itb/DAM-ED/files/ud1/exercises/DebugCollatzError.java" download="DebugCollatz.java">DebugCollatz.java</a>
```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);
}
}
```