Download Ejemplo Figuras y Lectura de Consola

Document related concepts
no text concepts found
Transcript
Programación Avanzada
Curso 2013. Juan Manuel Fernández Peña
Figuras y Lectura de consola
Ejemplos de uso de figuras a partir de una interfaz (IFigura) con dos casos: un círculo y un cuadrado.
Notese que cada clase tiene atributos que le son útiles, pero no comunes. Lo que es común es el par de
métodos que implementan de la interfaz.
/*
* Proyecto Geometría
* Interfaz general para todas las figuras.
* Curso 2013. Juan Manuel Fernández
*/
public interface IFigura {
public double calculaÁrea();
public double calculaPerímetro();
}
public class Círculo implements IFigura {
private double radio;
private static final double pi = 3.14159;
public Círculo(double rr){
radio = rr;
}
@Override
public double calculaPerímetro() {
return 2* pi * radio;
}
@Override
public double calculaÁrea() {
return pi * radio * radio;
}
}
public class Cuadrado implements IFigura {
private double lado;
public Cuadrado(double la){
lado = la;
}
@Override
public double calculaPerímetro() {
return 4* lado;
}
@Override
public double calculaÁrea() {
return lado * lado;
}
}
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class CírculoTest {
private Círculo circ;
@Before
public void setUp() throws Exception {
circ = new Círculo(5.0);
}
@Test
public void testCalculaPerímetro() {
assertEquals(31.4159,circ.calculaPerímetro(),0.01);
}
@Test
public void testCalculaÁrea() {
assertEquals(78.53, circ.calculaÁrea(),0.1);
}
}
A partir de las figuras anteriores, se construye una clase que maneja una lista de figuras, las cuales pueden
ser agregadas y consultadas. (También se podrían quitar y aplicar otras acciones). Las clases se muestran
a continuación. Note que la lista de finguras no sabe exactamente qué tipo de figura es cada una, por lo
que confía en que sus métodos son comunes a todas y en el método final le pregunta a cada figura de que
tipo (clase) es usando el método “getClass()” que ya viene incluido en todos los objetos de Java.
import java.util.LinkedList;
public class LasFiguras {
private LinkedList<IFigura> listaFig;
// al poner <IFigura> se indica que la lista solo tendrá Figuras
public LasFiguras(){
listaFig = new LinkedList<IFigura>();
}
public void agregaFigura(IFigura fig){
listaFig.add(fig);
}
public double dameArea(int ix){
IFigura aux = listaFig.get(ix);
return aux.calculaÁrea();
}
public double damePerímetro(int ix){
IFigura aux = listaFig.get(ix);
return aux.calculaPerímetro();
}
public String dameTodo(){
String resp ="";
IFigura aux;
for (int kx=0;kx<listaFig.size();kx++){
aux = listaFig.get(kx);
resp += aux.getClass()+" perímetro= "+aux.calculaPerímetro()+" área=
"+aux.calculaÁrea()+"| ";
}
return resp;
}
public int getNumFig(){
return listaFig.size();
}
}
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class LasFigurasTest {
LasFiguras misFiguras;
IFigura fig;
@Before
public void setUp() throws Exception {
misFiguras = new LasFiguras();
fig = new Círculo(12);
misFiguras.agregaFigura(fig);
fig = new Cuadrado(8);
misFiguras.agregaFigura(fig);
fig = new Círculo(22);
misFiguras.agregaFigura(fig);
}
@Test
public void testDameArea() {
assertEquals(64,misFiguras.dameArea(1),0.1);
}
@Test
public void testDamePerímetro() {
assertEquals(138.23,misFiguras.damePerímetro(2),0.1);
}
@Test
public void testDameTodo() {
System.out.println("Lista de Figuras "+misFiguras.dameTodo());
assertTrue(misFiguras.getNumFig()==3);
}
}
Lectura desde Consola.
La lectura desde consola permite construir intefaces de texto que luego pueden usarse para leer datos
desde archivos en disco. En la clase ITFig se tiene un método control, que es un ciclo de lectura. El
archivo de consola es System.in, pero solo lee caracteres, uno a uno. Se le envuelve en un BufferedReader
que permite leer un stream, es decir, leer todo lo que viene línea por línea, de manera continua.
Cada línea leida en el BufferedReader se pasará a un Scanner que permite separar elementos de la línea,
como strings, enteros o números de punto flotante. Se usan operaciones como next(), nextInt(),
nextDouble() para obtener esos elementos y se puede preguntar hasNext() para saber si aún hay algo más.
En el ejemplo, se leen órdenes que permiten crear círculos y cuadrados y guardarlos en la lista de
LasFiguras; también se puede pedir el área o perímetro de una figura, dando su índice. Por último, puede
pedirse la lista de figuras con su área y perímetro.
Para leer en la consola, use el área de console que aparece abajo en Eclipse, haga clic sobre el área y
escriba lo que desea que se lea (aparecerá en verde) y de return al final. La salida a consola aparece en la
misma ventana, pero en negro.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
/*
* Interfaz con el usuario usando texto leido desde consola
*/
public class ITFig {
private LasFiguras figus;
public ITFig(){
figus = new LasFiguras();
}
public boolean control(){
String np, kp
;
boolean resp = false;
boolean sigue = true;
Scanner lin=null;
Scanner token=null;
BufferedReader lee = new BufferedReader(
new InputStreamReader(System.in));
try{
while (sigue){
np = lee.readLine();
if (np.equals("FIN")){sigue=false; resp = true; break;}
lin = new Scanner(np);
kp = lin.next();
if (kp.equals("Círculo")){
figus.agregaFigura(new Círculo(lin.nextInt()));
}
else
if (kp.equals("Cuadrado")){
figus.agregaFigura(new Cuadrado(lin.nextInt()));
}
else
if (kp.equals("Area")){
int ni = lin.nextInt();
System.out.println("Área de figura "+ni+"= "+
figus.dameArea(ni));
}
else
if (kp.equals("Perimetro")){
int ni = lin.nextInt();
System.out.println("Perímetro de figura "+ni+"= "+
figus.damePerímetro(ni));
}
else
if (kp.equals("Todo")){
System.out.println("Lista de Figuras: "+figus.dameTodo());
}
else{
System.out.println("Auxiliar de figuras. Ayuda");
System.out.println("FIN para salir");
System.out.println("Círculo y el radio para agregar un círculo");
System.out.println("Cuadrado y el lado para agregar un cuadrado");
System.out.println("Area y número de figura para calcular su área");
System.out.println("Perimetro y número de figura para calcular su
perímetro");
System.out.println("Todo: saca toda la información");
}
}
}catch(IOException ie){}
return resp;
}
}
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
public class ITFigTest {
ITFig interfaz;
@Before
public void setUp() throws Exception {
interfaz = new ITFig();
}
@Test
public void testControl() {
assertTrue(interfaz.control());
}
}
Ejemplo de consola
Cuadrado 34
Cuadrado 89
Todo
Lista de Figuras: class Cuadrado perímetro= 136.0 área= 1156.0| class Cuadrado
perímetro= 356.0 área= 7921.0|