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:
Exercicis de POO
- Usa el mateix projecte que l'usat als exercicis
- Crea un package cat.itb.elteuusuari(*).dam.m03.uf4.exercices
- 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
Exercicis
POO
Board
Converteix la següent classe amb funcions estàtiques a una versió no estàtica
public class BoardFunctions {
public static double getTotalArea(List<Rectangle> rectangles){
double area = 0;
for(Rectangle rectangle: rectangles){
area+= rectangle.getArea();
}
return area;
}
public static int countRectangle(List<Rectangle> rectangles){
return rectangles.size();
}
}
BicycleModel
Una empresa de venda de bicicletes vol fer una aplicació per tenir constància del seu estoc. De cada model de bicicleta en vol guardar el nom, marxes i marca.
De cada marca en vol guardar el nom i el país (el nom del país).
Crea les classes necessaries per guardar aquesta informació.
Fes un petit programa que crei 2 bicicletes d'una única marca i les imprimeixi per pantalla (no s'ha de llegir res de l'usuari).
Output
BicycleModel{name='modelX', gears=5, brand=BycicleBrand{name='lorem', country='Togo'}}
BicycleModel{name='model5s628', gears=7, brand=BycicleBrand{name='lorem', country='Togo'}}
ThreeRectangles
Crea un subpackage nou figures
Volem fer programa que dibuixi rectangles de colors a la consola.
Volem que dibuixi els següents 3 rectanlges.
color: RED, llargada: 4, amplada: 5
color: YELLOW, llargada: 2, amplada: 2
color: GREEN, llargada: 3, amplada: 5
Crea la classe RectangleFigure
Colors
Per pintar amb colors a la consola, primer copia la següent classe que conté la definició de colors.
/**
* Colors for system out
*/
public class ConsoleColors {
// Reset
public static final String RESET = "\033[0m"; // Text Reset
// Regular Colors
public static final String BLACK = "\033[0;30m"; // BLACK
public static final String RED = "\033[0;31m"; // RED
public static final String GREEN = "\033[0;32m"; // GREEN
public static final String YELLOW = "\033[0;33m"; // YELLOW
public static final String BLUE = "\033[0;34m"; // BLUE
public static final String PURPLE = "\033[0;35m"; // PURPLE
public static final String CYAN = "\033[0;36m"; // CYAN
public static final String WHITE = "\033[0;37m"; // WHITE
}
Per imprimir amb un color has d'usar:
System.out.println(ConsoleColors.RED + "RED COLORED" +
ConsoleColors.RESET + " NORMAL");
Output (sense colors)
XXXXX
XXXXX
XXXXX
XXXXX
XX
XX
XXXXX
XXXXX
XXXXX
MechanicalArmApp
Volem fer un petit programa que simuli un braç mecànic.
El braç meànic
- Pot estar encès o apagat
- Tenir una certa obertura (en angles)
- Tenir una certa alçada (en cm).
Volem que el braç pugui
- Modificar si està encès o apagat
- Modificar l'obertura (sumar a l'actual)
- Modificar l'alçada (sumar a l'actual)
Per defecte un braç està apagat, amb obertura 0 i alçada 0.
Notes:
- Si està apagat, no es mot moure ni obrir
- No es pot obrir menys de 0 graus ni més de 360
- No pot estar a una altura inferior a 0
Fes un programa que apliqui al braç les següents instruccions:
- setTurnedOn(true)
- updateAltitude(3)
- updateAngle(180)
- updateAltitude(-3)
- updateAngle(-180)
- updateAltitude(3)
- setTurnedOn(false)
Després de cada instrucció printa per pantalla l'estat del robot
Output
MechanicalArm{openAngle=0.0, altitude=0.0, turnedOn=true}
MechanicalArm{openAngle=0.0, altitude=3.0, turnedOn=true}
MechanicalArm{openAngle=180.0, altitude=3.0, turnedOn=true}
MechanicalArm{openAngle=180.0, altitude=0.0, turnedOn=true}
MechanicalArm{openAngle=0.0, altitude=0.0, turnedOn=true}
MechanicalArm{openAngle=0.0, altitude=3.0, turnedOn=true}
MechanicalArm{openAngle=0.0, altitude=3.0, turnedOn=false}
Testos (extra)
Quan acabis, fes un test per a comprovar cada una de les condicions exposades.
Inheritance
ThreeRectanglesOneLeftPiramid
Volem fer programa que dibuixi rectangles i piramides (aliniades a l'esquerre) de colors a la consola.
Volem que dibuixi el següent rectanlges.
rectangle: color: RED, llargada: 4, amplada: 5
triangle: color: YELLOW, altura: 3
rectangle color: GREEN, llargada: 3, amplada: 5
Output (sense colors)
XXXXX
XXXXX
XXXXX
XXXXX
X
XX
XXX
XXXXX
XXXXX
XXXXX
Versió 1
Versió 2
VehicleModel
L'empresa que feia bicicletes ara també ven patinets.
Tingues en compte que els patinets no tenen marxes. Per altre banda si que t'has de guardar la potencia que tenen.
Crea i modifica les classes que necessitis.
Fes un petit programa que crei una bicicleta i un patinet d'una única marca i les imprimeixi per pantalla (no s'ha de llegir res de l'usuari).
Output
BicycleModel{name='modelX', gears=5, brand=VehicleBrand{name='lorem', country='Togo'}}
ScooterModel{name='s562', power=45.3, brand=VehicleBrand{name='lorem', country='Togo'}}
MovingMechanicalArmApp
Volem afegir un nou tipus de braç mecànic que es pugui desplaçar per una cinta.
En concret, el braç mecànic mòbil es pot desplaçar un nombre real (double) de metres endavant i endarrere. Comença a la posició 0, no es pot despaçar en una posició inferior a la 0.
Crea les classes que necessitis per a poder-ho representar. Hem de tenir en compte que volem poder seguir creant robots del tipus MechanicalArm (que no es puguin moure).
Fes un programa que apliqui al braç les següents instruccions:
- setTurnedOn(true)
- updateAltitude(3)
- move(4.5)
- updateAngle(180)
- updateAltitude(-3)
- updateAngle(-180)
- updateAltitude(3)
- move(-4.5)
- setTurnedOn(false)
Inheritance - Abstract
ListOfFigurePainter
Volem fer un programa que sigui capaç de pintar una llista de figures.
Versió 1
Versió 2
Versió 3 (extra)
Crea noves figures a pintar (piramide, cercle, línia, punt, …).
InstrumentSimulator
Usa el subpackage instrumentsimulator
Volem fer un petit programa d'emulació d'instruments.
Tenim els següents instruments.
- Tambor
- Triangle
Cada tambor té un to que pot ser A, O, U.
Els tambors amb A fan TAAAM, els tambors amb O fan TOOOM i els tambors amb U fan TUUUM.
Els tirangles tenen una resonancia que va del 1 al 5.
Els triangles amb resonancia1 fan TINC, els de dos TIINC, … i els de 5 TIIIIINC.
Fes les classes necessaries per poder executar el següent programa
public class IntrumentSimulator {
public static void main(String[] args) {
List<Instrument> instruments = new ArrayList<>();
instruments.add(new Triangle(5));
instruments.add(new Drump("A"));
instruments.add(new Drump("O"));
instruments.add(new Triangle(1));
instruments.add(new Triangle(5));
play(instruments);
}
private static void play(List<Instrument> instruments) {
for(Instrument instrument: instruments){
instrument.makeSound();
}
}
}
Quiz
Volem fer un petit programa de preguntes.
Tenim dos tipus de preguntes:
- opció múltiple
- text lliure
Necessitaràs les següents classes
- Question
- FreeTextQuestion
- MultipleChoiseQuestion
- Quiz (conté una llista de preguntes)
Pas 1: Fes l'estructura de dades que et permeti guardar aquestes preguntes.
Pas 2: Fes un programa que, donat un quiz creat per codi, imprimeixi les preguntes.
Pas 3: Permet que l'usuari pugui respondre les preguntes.
Pas 4: Un cop acabat, imprimeix quantes respostes són correctes.
Interface
PlantWaterSystemApp
Volem fer un petit sistema de rec automàtic amb un company que és un expert en sensors. Nosaltres som els experts programadors.
El sistema rebrà del sensor les 20 últims registres d'humitat (valors decimals). Si la mitja d'aquests valors és inferior a 2 hem d'activar el sistema de rec automàtic.
Mentre que el nostre company va fent la seva part nosaltres volem tenir enllestida la nostre. Ell ens informa que, quan acabi, el seu sistema tindrà dos mètodes
public List<double> getHumidityRecord();
public void startWatterSystem();
Deixa-ho tot enllestit i provat per a que quan el teu company acabi ho pogueu conectar rapidament.
Ajuda
- Crea una interfície que defineixi el comportament del dispositiu
- Crea una implementaćió "mocked" per a poder fer els testos
- Crea la classe PlantWaterControler que s'encarregui d'activar el sistema segons els valors d'humitat.
VehicleComparableApp
L'empresa que fa bicicletes i patinets, ja té molt d'estoc.
Vol poder ordenar els models per nom.
Fes un petit programa que crei una llista de vehicles, els ordeni per nom i els printi per pantalla
TranslatorApp
Volem fer un programa per la traducció simultània. L'usuari introdurià text per pantalla, i al finalitzar la línia imprimirem la versió traduida.
Degut al gran nombre de empreses que ofereixen serveis de traducció volem que ens sigui molt senzill de passar d'una a l'alte. A més a més, aquesta part encara no està implementada.
Fes un programa que llegeixi linies per pantalla i les imprimeixi traudides. Per ara, el traductor retornarà el mateix text introduit.
Input
Hola,
Bon dia,
Bona tarda,
Bona Nit.
Output
Hola,
Bon dia,
Bona tarda,
Bona Nit.
Enums
StudentWithTextGrade
Volem enmagatzemar d'un estudiant, el seu nom, i la seva nota en format text. Una nota pot ser suspès, aprovat, bé, notable o excel·lent.
Fes un programa que crei 2 estudiants amb dues notes diferents i printa'ls per pantalla
Output
Student{name='Mar', textGrade=FAILED}
Student{name='Joan', textGrade=EXCELLENT}
Generals
CarpentryShop
Una petita fusteria ens ha encarregat un programa per fer els tiquets de venta. A la fusteria venen taulells de fusta i llistons. Els taulells de fusta tenen un preu per metre quadrat. Quan es venen es ven una llargada i una amplada. Els llistons es venen per un preu al metre i es venen per metres.
Fes un programa que donada una llista de llistons i taulells en calculi el preu total.
L'usuari primer introduirà el nombre d'elements.
A cada linia hi haurà pels taulells:
taulell preu llargada aplada
I pel llistons:
llistó preu llargada
Legeix l'entrada i imprimeix el preu total
Taulell 15 20 12
Taulell 25 20 20
Taulell 15 2 5
Llistó 12 4
Taulell 10 20 12
Llistó 24 6
Output
El preu total és: XX€
AutonomousCarPrototype
Volem fer un primer prototip de inteligència artíficial que permeti conduir un cotxe de forma autònoma. Volem que el nostre sistema funcioni per diferents models i marques de cotxes. Així que en una reunió entre diferents empreses hem acordat una interfície comú:
public boolean isThereSomethingAt(Direction direction);
public void go(Direction direction);
public void stop();
Direction pot tenir els valors
FRONT, LEFT, RIGHT.
Per cada pas el cotxe anirà endavant si no té cap obstacle. Si el té anirà cap a la dreta si no hi ha obstacle o cap a l'esquerre. Si té obstacles a tot arreu pararà.
El cotxe anirà fent passos successivament.
Crea la classe AutonomousCar que tingui el mètode
public void doNextNSteps(int n);
Que executa N passos.
PostSetmanaSanta
Aquests exercicis els farem a la tornada de setmana santa
TeamMotto
Un diari esportiu ens ha dit que els hi fem una petita aplicació. Volem tenir registrada la informació de diversos equips. Cada equip té un nom. A més a més, cada equip té un crit que utilitzen abans de cada partit.
Volem que els equips tinguin la funció shoutMotto() que printi per pantalla el lema de l'equip.
Tenim els següents tres equips, amb els següents lemes:
- Mosques, Bzzzanyarem
- Dragons, Grooarg
- Abelles, Piquem Fort
Fes un programa que creei una llista amb els 3 equips i els printi per pantalla usant el següent mètode:
public static void shoutMottos(List<Team> teams){
for(Team team: teams)
team.shoutMotto();
}
SportTeamMotto
Ens demanen ampliar l'aplicació anterior. Hem vist que segons a quin esport jugui a cada equip, fan el crit una mica diferent.
- Els equips de basquet, abans de cridar el lema diuen "1,2,3"
- Els de volei després del lema crien un color
- Els de golf, com que són equips indiviuals diuen primer el nom del golfista
Dels equips anteriors tenim
- Mosques és un equip de bàsquet
- Dragons és un equip de volei i el seu color és el verd
- Abelles és un equip de golf i el seu jugador és la Marta Ahuja
Fes un programa que creei una llista amb els 3 equips i els printi per pantalla usant el següent mètode anterior
AliveBeings
Volem fer un petit programa per enregistrar diferents organismes vius que tenim al jardi per tenir constància de si estan vius. Cada esser viu li hem posat un nom i té una data de naixement (LocalDateTime).
Per saver si estan vius, en el cas dels arbres mirarem si estan secs. En el cas animals sense sitema circulatori (insectes), direm que estan vius si tenen funció celebral. En el cas dels animals amb sistema circulatori (tots menys els insectes), direm que estan vius si tenen funció celebral i els hi funciona el cor.
Fes un programa que crei la següent llista d'animals. Imprimeix-ne els detalls i si estan vius:
- Jan, arbre, sec
- Iu, arbre, no sec.
GymControlApp
Volem fer un programa per el control d'entrada d'un club esportiu. El programa ha de ser genèric per tots els clubs, però tenim clubs que usen un dispositiu de lectura dactilar, uns altres amb targeta, uns altres usen entrada manual, … Tots els gimnasos tenen un únic punt d'entrada i per tant, el primer cop que es registra un identificador és que l'usuari ha entrat, i que ha sortit el segon.
Per tal de resoldre-ho hem pactat una interfcície comuna anomenada GymControlReader que ens retorna l'identificador del següent usuari registrat:
String nextId();
A més a més, ens donen el següent implementació que és la usada per el sistema de lectura manual
public class GymControlManualReader implements GymControlReader {
Scanner scanner;
public GymControlManualReader(Scanner scanner) {
this.scanner = scanner;
}
@Override
public String nextId() {
return scanner.next();
}
}
Crea un programa que, donat un UserLector, llegeixi 8 identificadors. Imprimeix per pantalla si l'usuari ha entrat o ha sortit. Usa la implementació donada.
Input
1548
8768
4874
1548
1354
1548
3586
1354
Output
1548
8768
4874
1548
1354
1548
3586
1354