<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. ![Rock paper scissors image](/itb/DAM-ED/UD1/exercicis/img/rock_paper_scissors.png){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); } } ```