Llicència
Pots copiar i redistribuir aquest material seguint la llicència Attribution-NonCommercial-ShareAlike 4.0 International CC BY-NC-SA 4.0, indicant-ne autors originals, l'origen (aquesta web), sense fins comercials i mantenint-ne aquesta la llicència
Autors:
Altres Exercicis
- Utilitza el mateix projecte que el que hem utilitzat als exercicis
- Crea un package cat.itb.elteuusuari(*).dam.m03.uf5.exercices.regex
- La classe de cada exercici ha de ser el nom de l'exercici
(*) elteuusuari correspon a la direcció de correu eltectrònic del centre, sense punts, fins a @itb.cat
Sumari
- Mine
- MathematicExpression
- NodeList
- ListImplementations
- SortPersons
- BasquetStatistics
- Employees
- DeleteEmployee
- Palindrom
Mine
Donada una mina de diamants, representada mitjançant una cadena de caràcters '<' , '>', '(' i ')' de qualsevol longitud i ordre, s'ha de retornar el número de diamants blancs i diamants negres que existeixen a la mina. Un diamant blanc està format pel símbol '<' seguit de '>', és a dir; "<>" i un diamant negre està format pel símbol '(' seguit de ')', és a dir; "()" . S'ha de tenir en comte que cada vegada que s'extreu un diamant se'n poden formar altres.
Exemples:
Mina (Entrada) | n Diamants (Sortida) | Explicació |
---|---|---|
"" | 0 | Mina buida, 0 diamants |
"<>" | 1b | Mina amb un únic diamant blanc |
"()" | 1n | Mina amb un únic diamant negre |
"«»" | 2b | Mina amb un diamant blanc sencer i un altre que es forma quan s'extreu el primer. |
"<>«»<(<)" | 3b | Mina amb dos diamants blancs i un tercer que es forma amb l'extracció del segon. |
"<>(<>)<(<)" | 3b 1n | Mina amb dos diamants blancs i un negre que es forma amb l'extracció del segon blanc. |
MathematicExpression
Cal resoldre un comprovador d'expressions matemàtiques. Un exemple d'expressió algebraica correcta seria:
25+3(1+2+(304))/2
Exemples erronis:
25+3(1+2+(304))/(2
25+3(1+2+(304))/)2(
25+3(1+2)+(304))/2
Com que realitzar el càlcul d'una expressió algebraica és complicat, limitarem l'exercici a comprovar que els parèntesis siguin correctes.
L'algorisme ha de fer:
- Extreure els parèntesis de l'expressió i ficar-los en la Cua. En l'exemple correcte de més amunt ens quedarien els següents elements a la cua:
['(','(',')',')'] -
Extreure element per element de la Cua i avaluar-lo utilitant la Pila:
◦ Si és "(" el fiquem a la pila.
◦ Si és ")" extraiem un element de la pila. Si és un "(" tot ok. Si hem esgotat la pila, és que hi ha un error. - Al final de l'algorisme la pila ha d'estar buida, altrament és que hi ha algun error.
NodeList
Implementa una una llista anomenada NodeList, serà una llista simplement enllaçada.
Els elements la llista seran objectes Node, formats pels atributs elem (de tipus Object), un (link) següent (tipus Node).
Crea la classe Node com a classe privada dins de NodeList, ha de contenir una constructora I els getters i setters
Finalment la classe NodeList contindrà els atributs primer I últim de tipus Node I un enter que indicarà el número d'elements que conté la llista.
Afegeix els mètodes de list (esBuida, afegir, eliminar, mida …).
Finalment en una classe nova crea un main I verifica que funciona tot allò que has codificat. Assegura't que els casos “perillosos” funcionin, com ara eliminar un element d'una llista buida…
Un cop fet això converteix la teva classe en genèrica, per fer-ho la declaració de la classe ha de ser: public class NodeList
ListImplementations
Crea dues llistes una implementada amb linkedlist i l'altre amb arrayList i afegeix a cada una d'elles 10.000 elements.
- Insereix a cada una d'elles un element (sense especificar la funció) i mostra el temps que el sistema ha tardat en fer la inserció (tempsInicial:Long = System.nanoTime())
- Insereix un element a l'inici de la llista, mostra el temps i compara el temps entre les dues llistes i amb els resultats anteriors
- Insereix a cada una d'elles un element a la posició 5.000 de la llista i compara el temps entre les dues llistes i amb els resultats anteriors
- Insereix a cada una d'elles un element a la posició 10.000 de la llista i compara el temps entre les dues llistes i amb els resultats anteriors
Inserció | ArrayList | LinkedList |
---|---|---|
“per defecte” | ||
Posicio [0] | ||
Posició [5.000] | ||
Posició[10.000] |
Explica els resultats.
-Fes el mateix però enlloc d'inserir obtén l'element de la posició 0, 5.000 i 10.000
Obtenció | ArrayList | LinkedList |
---|---|---|
“per defecte” | ||
Posicio [0] | ||
Posició [5.000] | ||
Posició[10.000] |
SortPersons
Donada una llista de persones (Persona conté els següents atributs: nom, cognoms, data de naixement i dni). Ordena la llista. Farem servir l'edat com a criteri d'ordenació i si van néixer en el mateix dia, utilitzarem el primer cognom.
- Opció 1: Implementa el mètode Comparable.
- Opció 2: Suposem que dins la teva aplicació no sempre voldràs fer servir el mateix mètode d'ordenació utilitza el mètode sortedWith() que necessita un Comparator, fes servir compareBy i després thenBy.
BasquetStatistics
BasquetReadData
Inicialment començarem carregant les dades. La gent del diari Farsa ens ha passat un document anomenat jugadors.txt amb el següent contingut:
- La primera línia és de control i ens indica el contingut de les següents línies (rebutjarem aquesta informació).
-
Les següents línies contenen la informació relativa a les estadístiques d'un jugador.
Per cada jugador trobarem aquesta informació: - jugador: Cognom i Nom del jugador
- PJ: Partits jugats, total dels partits jugats aquesta temporada.
- MJ: Minuts jugats, mitjana dels minuts jugats per partit.
- Asis: Assistències, mitjana de les assistències per partit
- BP: Pilotes perdudes (balones perdidos), mitjana de les pilotes perdudes per partit
- BR: Pilotes recuperades (balones recuperados), mitjana de les pilotes recuperades per partit
- FC: Faltes comeses, mitjana de les faltes comeses per partit.
- FR: Faltes rebudes, mitjana de les faltes rebudes per partit.
- RD: Rebots defensius, mitjana dels rebots defensius agafats per partit.
- RO: Rebots ofensius, mitjana dels rebots ofensius agafats per partit.
- T2 (%): Percentatge de tirs de 2 punts.
- T3 (%): Percentatge de triples (3 punts).
- T1 (%): Percentatge de tirs lliures (1 punt).
- TC: Taps en contra, mitjana dels taps rebuts per partit.
- TF: Taps a favor, mitjana dels taps realitzats per partit.
- Valorc: Valoració, s'obté a partir de la fórmula: Valorc = punts + ASIS + RD + RO + TF + BR + FR + T1convertit + T2c + T3c – BP – TC – FC – T1intentat – T2i – T3i
*Les mitjanes i la valoració són valors racionals amb dos dígits
Fes una funció anomenada loadPlayersFromFile(file); que llegeix l'arxiu passat per paràmetre i carrega una col·lecció de Players segons la informació llegida.
ShowDataPlayer
La següent tasca a realitzar és la funció printPlayer(number); que donat el número d'un jugador ens imprimeixi per pantalla la informació relativa d'aquest jugador.
Tenim una restricció per disseny i és que l'objecte Player no conté l'atribut número, per tant mantindrem un registre que ens relacioni cada número amb un jugador.
Per fer aquest registre disposem de la següent informació que ens ha comentat el client per telèfon:
“El número de samarreta dels jugadors ordenats alfabèticament són 10,5,20,25,21,13”.
Ho sigui que el 10 és l'Abrines, el 5 el Doellman, 20 l' Eriksson…
ShowOtherDataPlayer
Fes una funció per imprimir tots els jugadors per ordre de valoració (de més a menys valorat).
Employees
Explica breument en el comentari del codi quina estructura de dades utilitzes i perquè. En cada un
dels apartats
2.1 En una certa empresa volen mantenir un registre dels empleats(nom,sou) segons el departament
en el què treballen. Ens demanen que mostrem per cada departament el nom dels seus empleats.
Exemple:
Departament | Treballador Nom | Treballador Sou |
---|---|---|
Informàtica | Marc | 300 |
Informàtica | Anna | 600 |
Electrònica | Jasmine | 400 |
Electrònica | Walid | 500 |
Empleats del departament Informàtica:
[Empleat [nom=Marc, sou=300], Empleat [nom=Anna, sou=600]]
Empleats del departament Electrònica:
[Empleat [nom=Jasmine, sou=400], Empleat [nom=Walid, sou=500]]
DeleteEmployee
A continuació fes un registre amb tots els empleats i elimina els 3 empleats amb més sou.
Sortida del programa segons l'exemple anterior
[Empleat [nom=Marc, sou=300]]
Palindrom
Implementa una funció que indiqui si una paraula és palindrom.
Una paraula és palíndrom si les seves lletres es repeteixen en el mateix ordre quan són llegides en la
direcció inversa.
Per fer-ho segueix la següent especificació:
esPalindrom(Pila p, Cua c ) retorna booleà
Assumeix que et passen per paràmetre una pila i una cua que contenen les lletres d'una certa
paraula. Seguint l'exemple següent:
var text = listOf('r','o','t','o','r')
for ( myCaracter in text) {
pila.push(myCaracter);
cua.add(myCaracter);
}
b: Boolean = esPalindrom(pila, cua);
//En aquest esemple b és true