Activitats

El nom del dia de la setmana

L’objectiu d’aquesta activitat és saber codificar un mètode amb paràmetres d’entrada i sortida perquè realitzi una tasca concreta.

Donat el codi font parcial del programa DiaSetmana, que es mostra tot seguit, completeu el mètode diaDeLaSetmana (inicialment buit), de manera que, donat un número de dia de la setmana (1-7), retorni el nom del dia (Dilluns…Diumenge). També ha de tenir en compte el cas que el valor d’entrada no sigui cap dia de la setmana.

  1. //Un programa que diu quin dia de la setmana és
  2. public class DiaSetmana {
  3.  
  4. public static void main (String[] args) {
  5. DiaSetmana programa = new DiaSetmana();
  6. programa.inici();
  7. }
  8.  
  9. public void inici() {
  10. String nom = diaDeLaSetmana(3);
  11. System.out.println("El tercer dia de la setmana és " + nom);
  12. nom = diaDeLaSetmana(5);
  13. System.out.println("El cinquè dia de la setmana és " + nom);
  14. nom = diaDeLaSetmana(15);
  15. System.out.println("El quinzè dia de la setmana és " + nom);
  16. }
  17.  
  18. //Param. entrada: número del dia
  19. //Param. sortida: el nom del dia
  20. public String diaDeLaSetmana(int numDia) {
  21. //Poseu el vostre codi
  22. //...
  23. }
  24. }

Si està correctament fet, a la pantalla hauria de veure’s.

El tercer dia de la setmana és dimecres
El cinquè dia de la setmana és divendres
El quinze dia de la setmana és (No existeix aquest dia)

  1. //Un programa que diu quin dia de la setmana és
  2. public class DiaSetmana {
  3.  
  4. public static void main (String[] args) {
  5. DiaSetmana programa = new DiaSetmana();
  6. programa.inici();
  7. }
  8.  
  9. public void inici() {
  10. String nom = diaDeLaSetmana(3);
  11. System.out.println("El tercer dia de la setmana és " + nom);
  12. nom = diaDeLaSetmana(5);
  13. System.out.println("El cinquè dia de la setmana és " + nom);
  14. nom = diaDeLaSetmana(15);
  15. System.out.println("El quinzè dia de la setmana és " + nom);
  16. }
  17.  
  18. //Param. entrada: número del dia
  19. //Param. sortida: el nom del dia
  20. public String diaDeLaSetmana(int numDia) {
  21. //Aquesta solució usa una estructura de selecció
  22. String nomDia = "(No existeix aquest dia)";
  23. switch(numDia){
  24. case 1:
  25. nomDia = "dilluns";
  26. break;
  27. case 2:
  28. nomDia = "dimarts";
  29. break;
  30. case 3:
  31. nomDia = "dimecres";
  32. break;
  33. case 4:
  34. nomDia = "dijous";
  35. break;
  36. case 5:
  37. nomDia = "divendres";
  38. break;
  39. case 6:
  40. nomDia = "dissabte";
  41. break;
  42. case 7:
  43. nomDia = "diumenge";
  44. break;
  45. }
  46. return nomDia;
  47. }
  48. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Test de primalitat

L’objectiu d’aquesta activitat és saber usar successives invocacions a mètodes fets per vosaltres per tal de dur a terme una tasca senzilla repetides vegades.

Feu un programa anomenat NumeroPrimer que inclogui un mètode anomenat esPrimer. Aquest mètode, donat un número enter, ha de dir si és primer o no. Un número primer és aquell que no pot ser dividit per cap altre número excepte l’1 o ell mateix. Només cal que funcioni amb valors positius, però no es pot usar System.out.println(…) dins d’aquest mètode. Proveu que funciona fent successives invocacions des del mètode inici.

A mode d’exemple, si es prova pels valors 18, 13 i 33, aquest programa podria mostrar per pantalla el següent:

El 18 és primer? false
El 13 és primer? true
El 33 és primer? false

  1. //Un programa que comprova la primalitat d'un valor
  2. public class NumeroPrimer {
  3.  
  4. public static void main (String[] args) {
  5. NumeroPrimer programa = new NumeroPrimer();
  6. programa.inici();
  7. }
  8.  
  9. public void inici() {
  10. int i = 18;
  11. System.out.println("El " + i + " és primer? " + esPrimer(i));
  12. i = 13;
  13. System.out.println("El " + i + " és primer? " + esPrimer(i));
  14. i = 33;
  15. System.out.println("El " + i + " és primer? " + esPrimer(i));
  16. }
  17.  
  18. //Param. entrada: el valor a testejar
  19. //Param. sortida: si és primer (true) o no (false)
  20. public boolean esPrimer(int valor) {
  21. //El codi és més simple si es fa return directament
  22. for (int i = 2; i < valor; i++) {
  23. if (valor%i == 0) {
  24. return false;
  25. }
  26. }
  27. return true;
  28. }
  29.  
  30. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Màxim Comú Divisor

L’objectiu d’aquesta activitat és saber codificar un mètode amb paràmetres d’entrada i sortida perquè realitzi una tasca concreta.

Donat el codi font parcial del programa MaximComuDivisor, que es mostra tot seguit, completeu el mètode mcd (inicialment buit), de manera que, donats dos valors enters (positius o negatius), calculi el seu Màxim Comú Divisor (MCD) seguit l'algorisme d'Euclides.

  1. import java.util.Scanner;
  2.  
  3. //Un programa que calcula l'MCD de dos números
  4. public class MaximComuDivisor {
  5.  
  6. public static void main (String[] args) {
  7. MaximComuDivisor programa = new MaximComuDivisor();
  8. programa.inici();
  9. }
  10.  
  11. public void inici() {
  12. System.out.print("Escriu el valor a: ");
  13. int a = llegirEnterTeclat();
  14. System.out.print("Escriu el valor b: ");
  15. int b = llegirEnterTeclat();
  16. //Recordar que un mètode s'avalua com una expressió
  17. System.out.println("L'MCD de " + a + " i " + b + " és " + mcd(a, b));
  18. }
  19.  
  20. public int llegirEnterTeclat() {
  21. Scanner lector = new Scanner(System.in);
  22. int enterLlegit = 0;
  23. boolean llegit = false;
  24. while (!llegit) {
  25. llegit = lector.hasNextInt();
  26. if (llegit) {
  27. enterLlegit = lector.nextInt();
  28. } else {
  29. System.out.println("Això no és un enter.");
  30. lector.next();
  31. }
  32. }
  33. lector.nextLine();
  34. return enterLlegit;
  35. }
  36.  
  37. public int mcd(int a, int b) {
  38. //Poseu el vostre codi
  39. //...
  40. }
  41.  
  42. }

Si està correctament fet, a la pantalla hauria de veure’s, per exemple.

Escriu el valor a: 14
Escriu el valor b: 21
L'MCD de 14 i 21 és 7

  1. import java.util.Scanner;
  2.  
  3. //Un programa que calcula l'MCD de dos numeros
  4. public class MaximComuDivisor {
  5.  
  6. public static void main (String[] args) {
  7. MaximComuDivisor programa = new MaximComuDivisor();
  8. programa.inici();
  9. }
  10.  
  11. public void inici() {
  12. System.out.print("Escriu el valor a: ");
  13. int a = llegirEnterTeclat();
  14. System.out.print("Escriu el valor b: ");
  15. int b = llegirEnterTeclat();
  16. //Recordar que un mètode s'avalua com una expressió
  17. System.out.println("L'MCD de " + a + " i " + b + " és " + mcd(a, b));
  18. }
  19.  
  20. public int llegirEnterTeclat() {
  21. Scanner lector = new Scanner(System.in);
  22. int enterLlegit = 0;
  23. boolean llegit = false;
  24. while (!llegit) {
  25. llegit = lector.hasNextInt();
  26. if (llegit) {
  27. enterLlegit = lector.nextInt();
  28. } else {
  29. System.out.println("Això no és un enter.");
  30. lector.next();
  31. }
  32. }
  33. lector.nextLine();
  34. return enterLlegit;
  35. }
  36.  
  37. public int mcd(int a, int b) {
  38. if (a < 0) {
  39. a = -a;
  40. }
  41. if (b < 0) {
  42. b = -b;
  43. }
  44. int r = 0;
  45. while (b != 0) {
  46. r = a % b;
  47. a = b;
  48. b = r;
  49. }
  50. return a;
  51.  
  52. }
  53.  
  54. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Mitjana de valors màxims

L’objectiu d’aquesta activitat és saber usar invocacions a mètodes per treballar amb valors dins un array.

Feu un programa anomenat MitjanaTresMaxims que llegeixi una seqüència de 10 valors enters des del teclat, els desi a un array i mostri per pantalla quina és la mitjana aritmètica dels seus tres valors més grans. A mode d’exemple, el comportament del programa podria ser el següent:

Escriu deu enters separats per espais: 
10 3 5 8 12 3 5 0 11 1
La mitjana dels tres valors més grans és 11.0

  1. import java.util.Scanner;
  2.  
  3. //Un programa que diu quina és la mitjana entre els tres valors més grans
  4. public class MitjanaTresMaxims {
  5.  
  6. public static void main (String[] args) {
  7. MitjanaTresMaxims programa = new MitjanaTresMaxims();
  8. programa.inici();
  9. }
  10.  
  11. public void inici() {
  12. System.out.println("Escriu deu enters separats per espais: ");
  13. int[] array = llegirArrayEntersTeclat();
  14. double res = calculaMitjanaTresMaxims(array);
  15. System.out.println("La mitjana dels tres valors més grans és " + res);
  16. }
  17.  
  18. public int[] llegirArrayEntersTeclat() {
  19. Scanner lector = new Scanner(System.in);
  20. int[] llistaEnters = new int[10];
  21. int entersLlegits = 0;
  22. while (entersLlegits < 10) {
  23. if(lector.hasNextInt()) {
  24. llistaEnters[entersLlegits] = lector.nextInt();
  25. entersLlegits++;
  26. } else {
  27. lector.next();
  28. }
  29. }
  30. lector.nextLine();
  31. return llistaEnters;
  32. }
  33.  
  34. public double calculaMitjanaTresMaxims(int[] array) {
  35. ordenarDescendent(array);
  36. return (array[0] + array[1] + array[2])/3;
  37. }
  38.  
  39. public void ordenarDescendent(int[] array) {
  40. for (int i = 0; i < array.length - 1; i++) {
  41. for(int j = i + 1; j < array.length; j++) {
  42. if (array[i] < array[j]) {
  43. int canvi = array[i];
  44. array[i] = array[j];
  45. array[j] = canvi;
  46. }
  47. }
  48. }
  49. }
  50.  
  51. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Ordenar per número de zeros

L’objectiu d’aquesta activitat és crear un programa basat en invocacions a mètodes amb paràmetres d’entrada i de sortida.

Feu un programa anomenat OrdenarPerZeros que, donat un array de números enters inicialitzat amb valors concrets, primer el mostri per pantalla i després el mostri ordenat de manera ascendent d’acord al nombre de 0 de cada valor. Declareu l’array com variable dins el mètode inici. A mode d’exemple, el comportament del programa podria ser el següent:

[ 100 2014 12 30 302 40020 7009 500000 ]
[ 500000 40020 7009 100 2014 30 302 12 ]

  1. //Un programa que ordena un seguit de valors pel seu nombre de 0
  2. public class OrdenarPerZeros {
  3.  
  4. public static void main (String[] args) {
  5. OrdenarPerZeros programa = new OrdenarPerZeros();
  6. programa.inici();
  7. }
  8.  
  9. public void inici() {
  10. int[] array = {100, 2014, 12, 30, 302, 40020, 7009, 500000 };
  11. mostrarArray(array);
  12. ordenarZeros(array);
  13. mostrarArray(array);
  14. }
  15.  
  16. public void mostrarArray(int[] array) {
  17. System.out.print("[ ");
  18. for (int i = 0; i < array.length; i++) {
  19. System.out.print(array[i] + " ");
  20. }
  21. System.out.println("]");
  22. }
  23.  
  24. public void ordenarZeros(int[] array) {
  25. for (int i = 0; i < array.length - 1; i++) {
  26. for(int j = i + 1; j < array.length; j++) {
  27. int iZeros = comptarZeros(array[i]);
  28. int jZeros = comptarZeros(array[j]);
  29. if (iZeros < jZeros) {
  30. int canvi = array[i];
  31. array[i] = array[j];
  32. array[j] = canvi;
  33. }
  34. }
  35. }
  36. }
  37.  
  38. public int comptarZeros(int valor) {
  39. int res = 0;
  40. while (valor > 0) {
  41. int num = valor%10;
  42. valor = valor/10;
  43. if (num == 0) {
  44. res++;
  45. }
  46. }
  47. return res;
  48. }
  49. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Paraula amb més vocals

L’objectiu d’aquesta activitat és crear un programa basat en invocacions a mètodes amb paràmetres d’entrada i de sortida.

Feu un programa anomenat MesVocals que llegeixi una frase i, tot seguit, mostri per pantalla quina és la paraula amb més vocals (sense importar majúscules i minúscules). A mode d’exemple, el comportament del programa podria ser el següent:

Escriu una frase: 
Hi havia una vegada una noia anomenada Caputxeta Vermella
La frase amb mes vocals és "anomenada".

  1. import java.util.Scanner;
  2.  
  3. //Un programa que diu quina paraula té més vocals
  4. public class MesVocals {
  5.  
  6. public static void main (String[] args) {
  7. MesVocals programa = new MesVocals();
  8. programa.inici();
  9. }
  10.  
  11. public void inici() {
  12. System.out.println("Escriu una frase: ");
  13. Scanner lector = new Scanner(System.in);
  14. String frase = lector.nextLine();
  15. String res = cercaMesVocals(frase);
  16. System.out.println("La frase amb més vocals és \"" + res + "\".");
  17. }
  18.  
  19. public String cercaMesVocals(String frase) {
  20. String[] paraules = frase.split(" ");
  21. String res = paraules[0];
  22. int maxVocals = comptaVocals(paraules[0]);
  23. for (int i = 1; i < paraules.length; i++) {
  24. int parVocals = comptaVocals(paraules[i]);
  25. if (parVocals > maxVocals) {
  26. maxVocals = parVocals;
  27. res = paraules[i];
  28. }
  29. }
  30. return res;
  31. }
  32.  
  33. public int comptaVocals(String paraula) {
  34. int numVocals = 0;
  35. String paraulaMin = paraula.toLowerCase();
  36. for (int i = 0; i < paraulaMin.length();i++) {
  37. boolean esVocal = mirarVocal(paraulaMin.charAt(i));
  38. if (esVocal) {
  39. numVocals++;
  40. }
  41. }
  42. return numVocals;
  43. }
  44.  
  45. public boolean mirarVocal(char c) {
  46. boolean res = false;
  47. switch(c) {
  48. case 'a':
  49. case 'e':
  50. case 'i':
  51. case 'o':
  52. case 'u':
  53. res = true;
  54. }
  55. return res;
  56. }
  57.  
  58. }

Nota: Cal aplicar disseny descendent per descompondre el codi en diferents invocacions a mètodes. Sempre que sigui possible, cal usar paràmetres d’entrada i sortida per tractar totes les dades (en qualsevol cas, mai variables globals). El mètode inici no pot tenir cap estructura de selecció o repetició.

Anar a la pàgina anterior:
Parametrització de mètodes
Anar a la pàgina següent:
Exercicis d'autoavaluació