← Tornar a l'índex d'exercicis

Exercicis i Qüestionaris U4: Utils del JDK

Autoavaluació interactiva d'U4: Utils del JDK

Posa a prova els teus coneixements sobre les eines essencials del JDK: la lectura de dades per teclat amb Scanner, el tractament i manipulació de text amb String, els càlculs i constants amb Math, i la generació de valors aleatoris amb Random.

1. Scanner

Declaració, inicialització i mètodes de lectura per consola segons el tipus de dada introduït.

Fes coincidir cada mètode de Scanner amb el tipus de dada que llegeix o el seu comportament:

nextLine()
Llegeix tota la línia de text fins a prémer Enter
next()
Llegeix només una paraula (s'atura en trobar un espai en blanc)
nextInt()
Llegeix un nombre enter (int)
nextDouble()
Llegeix un nombre decimal (double)
nextBoolean()
Llegeix un valor booleà (true o false)

Si l'usuari escriu Pere Pi a la consola i prem Enter, què mostrarà el següent codi?

Scanner scanner = new Scanner(System.in); String paraula1 = scanner.next(); String paraula2 = scanner.next(); println(paraula2 + ", " + paraula1);
Pi, Pere
Pere, Pi
Pere Pi, Pere Pi
Genera un error d'execució

Ordena les línies de codi per crear un programa funcional que demane el nom de l'usuari i el salude:

Arrossega des d'ací (o clica dues línies per intercanviar-les):

void main() {
Scanner scanner = new Scanner(System.in);
print("Com et dius? ");
String nom = scanner.nextLine();
println("Hola, " + nom + "!");
}

Tria l'opció correcta per completar la preparació del lector i la lectura de dades:

Scanner scanner = new Scanner(System.in);
Scanner scanner = new Scanner(System.out);
Scanner scanner = new Scanner();
Scanner scanner = new Scanner("keyboard");
double alcada = scanner.nextDouble();
double alcada = scanner.nextInt();
double alcada = scanner.readDouble();
double alcada = scanner.next();
boolean esSoci = scanner.nextBoolean();
boolean esSoci = scanner.nextBool();
boolean esSoci = scanner.readBoolean();
boolean esSoci = scanner.next();

Si invoquem el mètode next() i l'usuari introdueix el dígit 9 a l'entrada estàndard, de quin tipus de dada serà la variable que rebi el resultat?

String
int
char
double

2. String

Operacions fonamentals sobre cadenes de text: inspecció, subcadenes, comparacions, divisions i format amb .formatted().

Fes coincidir cada mètode de String amb la seva funció corresponent:

text.length()
Retorna el nombre total de caràcters
text.charAt(0)
Retorna el primer caràcter (posició 0)
text.trim()
Elimina els espais en blanc sobrants dels extrems
text.substring(0, 4)
Extreu els caràcters des de l'índex 0 fins al 3
text.replace("vell", "nou")
Substitueix totes les aparicions d'un fragment per un altre
text.split(";")
Divideix la cadena en un array utilitzant el delimitador

Escriu el resultat exacte (sense cometes) que retorna cadascuna de les següents operacions sobre cadenes:

"Programació".length()
11
"Java".charAt(2)
v
" Hola ".strip()
Hola
"Barcelona".substring(0, 4)
Barc
"27/10/1981".split("/")[0]
27

Donada la variable String s = "Java 26";, quines de les següents expressions booleanes avaluen a true?

s.contains("26")
s.startsWith("Java")
s.endsWith("26")
s.equalsIgnoreCase("java 26")
s.equals("java 26")
s.startsWith("26")

Quin especificador de format hem d'utilitzar amb .formatted() per a mostrar un decimal amb exactament dues xifres decimals?

%.2f
%2d
%s.2
%.2decimal

Ordena les línies de codi per construir i formatar una plantilla de factura simplificada utilitzant Text Blocks (cometes triples):

Arrossega des d'ací (o clica dues línies per intercanviar-les):

String producte = "Portàtil";
double preu = 899.95;
String factura = """
Article: %s
Total: %.2f €
""".formatted(producte, preu);
println(factura);

3. Math

Constants matemàtiques, arrels quadrades, càlcul de potències, extrems, arrodoniments i generació decimal bàsica.

Emparella cadascuna d'aquestes operacions de Math amb el seu valor de retorn:

Math.floor(4.7)
4.0 (arrodoneix cap avall a l'enter inferior)
Math.ceil(4.2)
5.0 (arrodoneix cap amunt a l'enter superior)
Math.round(4.5)
5 (arrodoneix a l'enter més proper)
Math.sqrt(144)
12.0 (arrel quadrada, retorna double)
Math.pow(2, 4)
16.0 (potència base^exponent, retorna double)
Math.abs(-15)
15 (elimina el signe negatiu)

Quin és el tipus de dada retornat per la crida Math.pow(3, 2) i quin és el seu valor exacte?

double amb valor 9.0
int amb valor 9
float amb valor 9.0f
long amb valor 9L

Escriu el resultat numèric retornat per cadascuna de les següents instruccions de Math:

Math.max(45, 80)
80
Math.min(45, 80)
45
Math.abs(-99)
99
Math.round(7.2)
7
Math.round(7.8)
8

Selecciona totes les afirmacions correctes sobre la classe Math:

Math.random() retorna un double aleatori entre 0.0 (inclòs) i 1.0 (exclòs).
No cal afegir cap instrucció import per utilitzar Math, ja que pertany al paquet bàsic java.lang.
Math.PI és una constant que conté el valor aproximat del nombre pi (3.14159...).
Math.floor(x) arrodoneix sempre cap a l'enter superior més proper.
Math.sqrt(x) retorna sempre un nombre enter (int).

Quina és l'expressió correcta per generar un nombre enter aleatori entre 1 i 10 (ambdós inclosos) fent servir Math.random()?

(int) (Math.random() * 10) + 1
(int) Math.random() * 10 + 1
Math.random(1, 10)
Math.round(Math.random() * 10)

4. Random

La classe java.util.Random per generar enters en intervals concrets, decimals i valors booleans.

Tenint un generador Random random = new Random();, emparella cada mètode amb el resultat que produeix:

random.nextInt(6)
Enter entre 0 i 5 (límit superior exclòs)
random.nextInt(1, 7)
Enter entre 1 i 6 (dau clàssic de 6 cares)
random.nextDouble()
Decimal aleatori entre 0.0 i 1.0
random.nextBoolean()
Valor booleà true o false (50% de probabilitat)

Si executem int resultat = random.nextInt(10);, quin dels següents valors MAI no podrà ser assignat a la variable resultat?

10
0
5
9

Ordena les línies de codi per crear un programa que simuli el llançament de dos daus de 6 cares i n'imprimeixi la suma:

Arrossega des d'ací (o clica dues línies per intercanviar-les):

import java.util.Random;
void main() {
Random random = new Random();
int dau1 = random.nextInt(1, 7);
int dau2 = random.nextInt(1, 7);
println("Suma dels daus: " + (dau1 + dau2));
}

Selecciona la instrucció més idònia de l'objecte random per a cadascuna d'aquestes simulacions:

boolean esCara = random.nextBoolean();
boolean esCara = random.nextInt(2);
boolean esCara = random.nextDouble();
boolean esCara = random.nextCoin();
int carta = random.nextInt(1, 13);
int carta = random.nextInt(12);
int carta = random.nextInt(1, 12);
int carta = random.nextDouble() * 12;
double percentatge = random.nextDouble() * 100;
double percentatge = random.nextInt(100);
double percentatge = random.nextPercent();
double percentatge = random.nextFloat();

Quina és la diferència principal a l'hora d'utilitzar Random respecte a Math.random()?

Random requereix afegir import java.util.Random; i instanciar el generador amb new Random(), però ofereix mètodes més directes com nextInt(inici, fi) i nextBoolean().
Math.random() requereix crear un objecte amb new Math() i Random s'utilitza de forma estàtica.
Random només pot generar nombres enters i mai decimals.
No hi ha cap diferència; són dos noms diferents per a la mateixa funció.

5. Exercicis Pràctics d'Utils del JDK

Exercicis proposats

  1. Comptador i analitzador de caràcters (Scanner + String)

    Demana a l'usuari el seu nom complet mitjançant scanner.nextLine(). El programa ha de netejar els espais sobrants dels extrems amb trim() i mostrar:

    • El nom net entre cometes simples.
    • La longitud total de la cadena neta.
    • El nombre de caràcters sense comptar els espais en blanc (utilitzant replace(" ", "")).
    • El primer caràcter en majúscules.
    • L'últim caràcter en majúscules.
    Com et dius? Maria Garcia Pérez Nom net: 'Maria Garcia Pérez' Longitud total: 18 caràcters Lletres (sense espais): 16 Primer caràcter: M Últim caràcter: Z
  2. Generador d'àlies i correu institucional (String + split + formatted)

    Demana a l'usuari el seu nom i el seu primer cognom en una sola línia separats per un espai (ex: "Gerard Falco"). Utilitza split(" ") per separar ambdues parts i genera un àlies combinant les 3 primeres lletres del nom i les 3 primeres lletres del cognom en minúscules amb substring(0, 3) i toLowerCase(). Finalment, mostra les dades formatades amb .formatted():

    Introdueix nom i cognom: Gerard Falco Nom: Gerard | Cognom: Falco Àlies d'usuari: gerfal Correu institucional: gerfal@institut.cat
  3. Calculadora geomètrica (Scanner + Math)

    Demana a l'usuari la longitud dels dos catets d'un triangle rectangle ($a$ i $b$). Calcula la hipotenusa $c = \sqrt{a^2 + b^2}$ fent servir Math.sqrt() i Math.pow(). Després, demana el radi $r$ d'un cercle i calcula la seva àrea ($A = \pi \cdot r^2$) i el seu perímetre ($P = 2 \cdot \pi \cdot r$) amb Math.PI. Mostra els resultats amb 2 xifres decimals amb %.2f i el perímetre arrodonit amb Math.round():

    Catet A: 3 Catet B: 4 Hipotenusa: 5.00 Radi del cercle: 2.5 Àrea del cercle: 19.63 Perímetre del cercle: 15.71 (arrodonit a l'enter més proper: 16)
  4. Simulador de combat per torns (Random + Math)

    Crea una simulació de combat entre un Heroi i un Monstre utilitzant Random:

    • L'Heroi llança dos daus de 6 cares (random.nextInt(1, 7) cadascun) i en suma el valor base.
    • Amb random.nextBoolean() es determina si l'Heroi aconsegueix un cop crític (duplica l'atac).
    • El Monstre llança un dau de 12 cares (random.nextInt(1, 13)).
    • Utilitza Math.max() per determinar quin dels dos ha infligit més dany i mostra qui guanya la ronda.
    --- RONDA DE COMBAT --- Heroi tira dos daus de 6: [4] + [5] = 9 Cop crític aconseguit? true -> Dany final heroi: 18 Monstre tira dau de 12: [10] -> Dany final monstre: 10 Dany més alt de la ronda: 18 Resultat: L'Heroi guanya la ronda!
  5. Tiquet de compra amb Text Blocks i format (Scanner + String formatting)

    Demana a l'usuari el nom d'un article, el preu unitari en euros (scanner.nextDouble()) i la quantitat d'unitats (scanner.nextInt()). Calcula el subtotal, l'IVA aplicat del 21% i el preu total final. Mostra un tiquet de caixa perfectament alineat utilitzant una plantilla multilínia Text Block ("""...""") i especificadors de format (%15s, %3d, %8.2f €):

    Nom de l'article: Auriculars Bluetooth Preu unitari: 29.99 Quantitat: 3 =========== TIQUET DE COMPRA =========== Article: Auriculars Bluetooth Unitats: 3 Preu unitari: 29.99 € ---------------------------------------- Subtotal: 89.97 € IVA (21%): 18.89 € TOTAL A PAGAR: 108.86 € ========================================
  6. Analitzador de matrícules d'un vehicle (String)

    Demana a l'usuari una matrícula en el format actual espanyol (quatre xifres i tres lletres, per exemple, 4821KLM). El programa ha de mostrar:

    • La matrícula en majúscules, encara que s'haja introduït en minúscules.
    • Les quatre xifres inicials per separat.
    • Les tres lletres finals per separat.
    • El codi format per les lletres en ordre invers.
    • La matrícula amb un guió entre les xifres i les lletres.
    Introdueix la matrícula: 4821klm Matrícula normalitzada: 4821KLM Part numèrica: 4821 Part alfabètica: KLM Lletres en ordre invers: MLK Matrícula completa: 4821-KLM
  7. Generador de codis d'inventari (String + Math + formatted)

    Demana el nom d'un producte i el número de prestatgeria on s'emmagatzema. Genera un codi d'inventari a partir de:

    • Les dues primeres lletres del producte en majúscules.
    • El número de prestatgeria amb tres xifres, completant amb zeros a l'esquerra.
    • La longitud del nom del producte.
    Nom del producte: Teclat Número de prestatgeria: 7 Producte: Teclat Codi d'inventari: TE-007-06 Longitud del nom: 6 caràcters
  8. Calculadora de consum elèctric (Scanner + Math)

    Demana la potència d'un aparell elèctric en watts, el nombre d'hores que funciona al dia i el preu del kWh. Calcula el consum diari i mensual (30 dies) en kWh, així com el cost mensual.

    • Converteix la potència de watts a quilowatts.
    • Calcula el consum multiplicant la potència en kW per les hores.
    • Calcula el cost mensual del consum.
    • Mostra el cost mensual amb dos decimals i el nombre enter de cèntims més pròxim amb Math.round().
    Potència de l'aparell (W): 1500 Hores de funcionament al dia: 3 Preu del kWh (€): 0.20 Consum diari: 4.50 kWh Consum mensual: 135.00 kWh Cost mensual: 27.00 € Cost mensual en cèntims: 2700
  9. Simulador d'una màquina recreativa (Random + Math)

    Simula una tirada d'una màquina recreativa amb tres símbols representats per nombres aleatoris entre 1 i 5. Utilitza random.nextInt(1, 6) per generar-los.

    • Mostra els tres nombres obtinguts.
    • Calcula la suma dels tres nombres.
    • Calcula la puntuació màxima de la tirada amb Math.max().
    • Calcula la puntuació mínima amb Math.min().
    • Calcula la diferència entre la puntuació màxima i la mínima.

    Per a aquest exercici, no cal determinar si l'usuari ha guanyat ni aplicar premis segons el resultat.

    --- MÀQUINA RECREATIVA --- Resultat: [4] [2] [5] Suma dels símbols: 11 Valor màxim: 5 Valor mínim: 2 Diferència màxim-mínim: 3
  10. Targeta d'embarcament (Scanner + String + Text Blocks)

    Demana el nom complet d'un passatger, el codi del vol i el número del seient. Genera una targeta d'embarcament amb el format següent:

    • El nom del passatger en majúscules.
    • El codi del vol en majúscules.
    • El seient dividit en fila i lletra, per exemple, 14C.
    • Un text de confirmació que incloga el nom i el codi del vol.

    Utilitza toUpperCase(), substring(), .formatted() i una plantilla multilínia amb Text Blocks.

    Nom del passatger: Maria Garcia Codi del vol: ab123 Seient: 14c ======================================== TARGETA D'EMBARCAMENT ======================================== PASSATGER: MARIA GARCIA VOL: AB123 SEIENT: 14C ---------------------------------------- Maria Garcia, el seu vol AB123 està confirmat. ========================================
  11. Calculadora de distàncies GPS (Scanner + Math)

    Demana les coordenades X i Y de dos punts d'un mapa. Calcula la distància en línia recta entre aquests punts mitjançant la fórmula:

    d = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))

    A continuació, calcula el temps necessari per recórrer aquesta distància si un vehicle es desplaça a una velocitat constant de 60 unitats per hora. Expressa el resultat en minuts i mostra també el temps arrodonit amb Math.round().

    Coordenada X del punt A: 1 Coordenada Y del punt A: 2 Coordenada X del punt B: 4 Coordenada Y del punt B: 6 Distància entre A i B: 5.00 unitats Velocitat del vehicle: 60.00 unitats/h Temps estimat: 5.00 minuts Temps arrodonit: 5 minuts
  12. Generador de contrasenyes temporals (Random + String)

    Genera una contrasenya temporal de sis xifres. Cada xifra s'ha d'obtindre amb una crida a random.nextInt(0, 10). Concatena els resultats en una cadena de text.

    • Mostra la contrasenya completa.
    • Mostra la primera i l'última xifra.
    • Mostra la contrasenya amb un asterisc en lloc de les quatre xifres centrals.
    • Mostra la longitud de la contrasenya.

    La contrasenya s'ha de tractar com una cadena, no com un nombre, perquè pot començar per zero.

    --- GENERADOR DE CLAUS --- Clau generada: 038572 Primera xifra: 0 Última xifra: 2 Clau oculta: 0****2 Longitud: 6 caràcters
  13. Factura d'un servei de missatgeria (Scanner + Math + formatted)

    Demana el pes d'un paquet en quilograms, la distància d'enviament en quilòmetres i si el servei és urgent, representat per un valor booleà.

    Calcula el preu final amb les tarifes següents:

    • Preu base: 3,50 €.
    • Cost per quilogram: 1,20 €.
    • Cost per cada 10 km: 0,50 €.
    • Recàrrec d'urgència: 5,00 € si el servei és urgent.

    Considera que el cost per distància és proporcional a la distància recorreguda. Utilitza Math.ceil() per arrodonir el nombre de trams de 10 km cap amunt. Mostra un resum de la factura amb dos decimals.

    Pes del paquet (kg): 2.5 Distància (km): 23 Servei urgent (true/false): true ========== FACTURA D'ENVIAMENT ========== Preu base: 3.50 € Pes del paquet: 2.50 kg 3.00 € Distància: 23 km 1.50 € Servei urgent: 5.00 € ---------------------------------------- TOTAL: 13.00 € =========================================