Exercicis de POO

(*) elteuusuari correspon a la direcció de correu eltectrònic del centre, sense punts, fins a @itb.cat

Sumari

  1. Exercicis
    1. POO
      1. Board
      2. BicycleModel
        1. Output
      3. ThreeRectangles
        1. Colors
        2. Output (sense colors)
      4. MechanicalArmApp
        1. Output
        2. Testos (extra)
    2. Inheritance
      1. ThreeRectanglesOneLeftPiramid
        1. Output (sense colors)
        2. Versió 1
        3. Versió 2
      2. VehicleModel
        1. Output
      3. MovingMechanicalArmApp
    3. Inheritance - Abstract
      1. ListOfFigurePainter
        1. Versió 1
        2. Versió 2
        3. Versió 3 (extra)
      2. InstrumentSimulator
      3. Quiz
    4. Interface
      1. PlantWaterSystemApp
        1. Ajuda
      2. VehicleComparableApp
      3. TranslatorApp
        1. Input
        2. Output
    5. Enums
      1. StudentWithTextGrade
        1. Output
  2. Generals
    1. CarpentryShop
      1. Output
    2. AutonomousCarPrototype
  3. PostSetmanaSanta
    1. TeamMotto
    2. SportTeamMotto
    3. AliveBeings
    4. GymControlApp
      1. Input
      2. Output

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

classDiagram class RectangleFigure RectangleFigure : +String color RectangleFigure : +int width RectangleFigure : +int height RectangleFigure : +paint (PrintStream printStream)
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

Volem que el braç pugui

Per defecte un braç està apagat, amb obertura 0 i alçada 0.

Notes:

Fes un programa que apliqui al braç les següents instruccions:

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
classDiagram class LeftPiramidFigure LeftPiramidFigure : +String color LeftPiramidFigure : +int base LeftPiramidFigure : +paint (PrintStream printStream) class RectangleFigure RectangleFigure : +String color RectangleFigure : +int width RectangleFigure : +int height RectangleFigure : +paint (PrintStream printStream)
Versió 2
classDiagram class Figure Figure : +String color Figure : prepareColor(PrintStream printStream) Figure : clearColor(PrintStream printStream) Figure <|-- LeftPiramidFigure LeftPiramidFigure : +int base LeftPiramidFigure : +paint (PrintStream printStream) Figure <|-- RectangleFigure RectangleFigure : +int width RectangleFigure : +int height RectangleFigure : +paint (PrintStream printStream)

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:


Inheritance - Abstract

ListOfFigurePainter

Volem fer un programa que sigui capaç de pintar una llista de figures.

Versió 1
classDiagram class Figure Figure : +String color Figure : +paint (PrintStream printStream)* Figure : prepareColor(PrintStream printStream) Figure : clearColor(PrintStream printStream) Figure <|-- LeftPiramidFigure LeftPiramidFigure : +int base Figure <|-- RectangleFigure RectangleFigure : +int width RectangleFigure : +int height
Versió 2
classDiagram class Figure Figure : +String color Figure : +paint (PrintStream printStream) Figure : +paintText (PrintStream printStream)* Figure : prepareColor(PrintStream printStream) Figure : clearColor(PrintStream printStream) Figure <|-- LeftPiramidFigure LeftPiramidFigure : +int base Figure <|-- RectangleFigure RectangleFigure : +int width RectangleFigure : +int height
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.

  1. Tambor
  2. 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:

Necessitaràs les següents classes

  1. Question
  2. FreeTextQuestion
  3. MultipleChoiseQuestion
  4. 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
classDiagram class PlantWaterControler PlantWaterControler : -PlantWater plantWater PlantWaterControler : +waterIfNeeded()

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:

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.

Dels equips anteriors tenim

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:

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