Lab 1
Lab 1
. De cada rectngulo se conocen las longitudes de sus lados y se sabe que la longitud mnima que puede tener un lado cualquiera es 1. De los crculos se conocen las coordenadas del centro y el radio, del cual se sabe que la longitud mnima es 1. Identificar las clases necesarias y sus atributos. a) Modelar las clases identificadas en UML. b) Definir las clases identificadas en Java garantizando los mtodos que permitan: i. hallar el permetro/longitud de la circunferencia. ii. hallar el rea. iii. no violar el encapsulamiento. c) Declare y construya una instancia de cada clase. d) Solicitar a las instancias un servicio a travs del paso de mensajes. e) Construir un nuevo rectngulo cuyos lados tengan igual longitud que el radio del crculo construido en c). Circle a) Rectangle float sideA; float sideB; float area() float perimeter() float getSideA() void setSideA(float pSideA) float getSideB() void setSideB(float pSideB) float x; float y; float radius; float area() float longitud() float getX() void setX (float pX) float getY() void setSideB(float pY) float getRadius() void setRadius(float pRadius)
ltima actualizacin: 05/02/13 b) public class Rectangle { private float sideA; private float sideB; public Rectangle(){ // todavia no se ha dado el tema de constructores} public float area(){ return sideA * sideB; } public float perimeter(){ return 2*(sideA + sideB); } public float getSideA(){ return sideA; } public void setSideA(float pSideA) { if (pSideA >= 1) sideA= pSideA; } public float getSideB(){ return sideA; } public void setSideB(float pSideB) { if (pSideB >= 1) sideB= pSideB; } } c) Rectangle rectangle; rectangle= new Rectangle(); Circle circle = new Circle(); //declarando una referencia a instancia //construyendo una instancia referenciada por rectangle
//actualizando el lado A con valor 20 //actualizando el lado B con valor 10 //solicitndole al objeto su permetro
e) Rectangle nuevoRect ; nuevoRect = new Rectangle(); float radio = circle.getRadius(); nuevoRect.setSideA(radio); // nuevoRect.setSideB(radio); //
nuevoRect.setSideA(circle.getRadius()); nuevoRect.setSideB(circle.getRadius());
ltima actualizacin: 05/02/13 Ejercicio # 2 En una cierta competencia de atletismo participan un grupo de deportistas y se necesita manipular la informacin correspondiente a un deportista, del cual se conoce: nombre, edad, el deporte en que compite, as como, su mejor tiempo en cada uno de los ltimos 5 aos. Identificar las clases necesarias y sus atributos. a) Modele las clases identificadas en UML b) Defnalas en Java garantizando mtodos que permitan: I. No violar el encapsulamiento. II. Verificar si el promedio de sus tiempos anuales est por debajo de un valor record dado. III. Conocer su mejor registro c) Declare y construya una instancia de cada clase. d) Solicitar a las instancias un servicio a travs del paso de mensajes.
Respuesta: SportMan int Id; int age; String name; float[] records; //diferente a C++ String sport; boolean bestRecordMax int getAge() void setAge(int pAge) float average() bool compareRecord(float value) int getId() String getName() void setName(String pName) float getRecord(int year) void setRecord(int year, float record ) String getSport() void setSport(String pSport) void setbestRecordMax() void setbestRecordMin() float maxRecord() float minRecord() float BestRecord()
b) package sporTMan; public class SportMan { // campos private int Id; private int age; private String name; private float[] records; private String sport; private boolean bestRecordMax; //true si el mejor record es el mayor // mtodos public SportMan(){ // no ver el constructor porque no se ha dado records= new float[5]; bestRecordMax= false; }
ltima actualizacin: 05/02/13 public float average(){ float sum= 0; for (int i=0; i < records.length; i++) sum += records[i]; return sum / 5; } public boolean compareRecord(float pValue) { return pValue > average(); } public int getId(){ return Id; } public void setId(int pId) { Id= pId; } public int getAge(){ return age; } public void setAge(int pAge) { age= pAge; } public String getName(){ return name; } public void setName(String pName) { name= pName; } public float getRecord(int pYear) { return (pYear >=1 && pYear <= 5)? records[pYear-1] : -1; } public void setRecord(int pYear, float pRecord) { if (pYear >=1 && pYear <= 5) records[pYear-1]= pRecord; } public String getSport() { return sport; } public void setSport(String pSport) { sport= pSport; } public void setBestRecordMax(){ bestRecordMax= true; } public void setBestRecordMin(){ bestRecordMax= false; } private float MaxRecord() { float max= records[0]; for(int i= 1; i < records.length; i++) if (records[i] > max) max= records[i]; return max; } private float MinRecord() { float min= records[0]; for(int i= 1; i < records.length; i++) if (records[i] < min) min= records[i]; return min; } public float BestRecord(){
ltima actualizacin: 05/02/13 return bestRecordMax? MaxRecord(): MinRecord(); } } c) Un ejemplo de clase que usa la clase SportMan public class Main { public static void main(String[] args) { //programa principal SportMan sportMan = new SportMan();//creando un deportista sportMan.setName("juan"); //asignndole nombre al deportista sportMan.setRecord(1,1); /*poniendo el mejor record del primero de los ltimos 5 aos*/ sportMan.setRecord(2,2); /*poniendo el mejor record del segundo de los ltimos 5 aos */ sportMan.setRecord(3,3); sportMan.setRecord(4,4); sportMan.setRecord(5,5); sportMan.setBestRecordMax();//el mejor record es el mayor valor System.out.println(sportMan.average()); /*mostrando su mejor record Promedio*/ System.out.println(sportMan.getName()); //mostrando su nombre System.out.println(sportMan.getAge()); //mostrando su edad System.out.println(sportMan.BestRecord()); /*mostrando su mejor record en los ltimos 5 aos*/ } } Explicar los siguientes aspectos: No se hace un mtodo que permita cambiar el Id de un deportista, pues esto es lo que lo identifica, por lo que debe crearse con un Id que se mantiene fijo durante toda su existencia. Como el tema de constructores se imparte en la segunda conferencia, quedar pendiente la creacin con inicializacin de miembros. Ahora estamos suponiendo que el constructor inicializa los campos en los valores por defecto. Explicar las diferencias de la declaracin y uso de arreglos en C++ y Java. Insistir en que no siempre los mtodos son pblicos, por ejemplo: MinRecord() y MaxRecord() Insistir en que los campos no se pasan por parmetros a los mtodos. Reforzar la idea de que el encapsulamiento se logra por una adecuada especificacin de visibilidad ms la incorporacin de mtodos de lectura (get) y escritura (set) de todos los campos cuyos valores puedan ser requeridos o modificados por los usuarios de la clase. Explicar la clase Main. Este es un contenido no estudiado en la conferencia. Los modificadores de durabilidad no se explicaron
Ejercicio # 4 Cree una clase para manipular nmeros fraccionarios y ejecutar aritmtica con fracciones. Garantice que: - el denominador nunca sea cero - se almacene la fraccin en forma simplificada, es decir, 2/4 debe almacenarse como 1/2 - proporcione funciones para: sumar dos fracciones, restar dos fracciones, multiplicar dos fracciones, dividir dos fracciones, sumar fracciones y enteros, restar fracciones y enteros, multiplicar fracciones por enteros y dividir fracciones y enteros.
int minComunMultiply(int num1, int num2) int MaximoComunDivisor(int m,int n) RationalNumber simplificated(int numerator, int denominator) int getNum() void setNum(int pNum) int getDen() void setDen(int pDen) RationalNumber addition(RationalNumber ratNumb) RationalNumber addition(int numb) void add(RationalNumber ratNumb) void add(int numb) RationalNumber subtraction(RationalNumber ratNumb) RationalNumber subtraction(int numb) void subtract (RationalNumber ratNumb) void subtract (int numb) RationalNumber multiplication(RationalNumber ratNumb) RationalNumber multiplication(int nNumb) void multiply(RationalNumber ratNumb) void multiply(int numb) RationalNumber division(RationalNumber ratNumb) RationalNumber division(int numb) void divide(RationalNumber ratNumb) void divide(int numb)
package Fraccion; public class RationalNumber { private int num; private int den; private int minComunMultiply(int num1, int num2){ //devuelve el mnimo comn mltiplo entre dos nmeros if(num1 == num2) return num1; int menor, mayor; if(num1 > num2){ menor= num2; mayor= num1; } else{ menor= num1; mayor= num2; } int i= mayor; while(i < menor * mayor && (i%menor != 0 || i%mayor != 0)) i++; return i < menor * mayor? i: menor * mayor;
ltima actualizacin: 05/02/13 } private int MaximoComunDivisor(int m,int n){ //Algoritmo de Euclides //Devuelve el mximo comn divisor o -1 si no es posible encontrarlo if (m >= 0 && n >= 0){ if (n > m){ int temp= m; m= n; n= temp; } int R; while (n != 0){ R = m % n; m = n; n = R; } return m; } else return -1; } private RationalNumber simplificated(int numerator, int denominator){ //obtiene la fraccin simplificada a su mnima expresin RationalNumber result= new RationalNumber(); int maxComDiv= MaximoComunDivisor(numerator,denominator); if(maxComDiv == -1 || maxComDiv == 1){ result.setNum(numerator); result.setDen(denominator); } else{ result.setNum(numerator/maxComDiv); result.setDen(denominator/maxComDiv); } return result; } public int getNum(){ return num; } public void setNum(int pNum){ num= pNum; } public int getDen(){ return den; } public void setDen(int pDen){ if (pDen != 0) den= pDen; } public String fraction(){ return ((Integer)num).toString()+'/'+((Integer)den).toString(); } public RationalNumber addtion(RationalNumber ratNumb){ int minComunDenominator= minComunMultiply(den,ratNumb.getDen()); int numerator= minComunDenominator/den*num + minComunDenominator/ratNumb.getDen()*ratNumb.getNum(); return simplificated(numerator,minComunDenominator); } public RationalNumber addition(int number){ int numerator= num + number* den; return simplificated(numerator,den);
ltima actualizacin: 05/02/13 } public void add(RationalNumber ratNumb){ int minComunDenominator= minComunMultiply(den,ratNumb.getDen()); int numerator= minComunDenominator/den*num + minComunDenominator/ratNumb.getDen()*ratNumb.getNum(); RationalNumber temp= simplificated(numerator,minComunDenominator); num= temp.getNum(); den= temp.getDen(); } public void add(int number){ int numerator= num + number* den; RationalNumber temp= simplificated(numerator,den); num= temp.getNum(); den= temp.getDen(); } public RationalNumber subtraction(RationalNumber ratNumb){ return null; } public RationalNumber subtraction(int numb){ return null; } public void subtract(RationalNumber ratNumb){ } public void subtract(int numb){ } public RationalNumber multiplication(RationalNumber ratNumb){ return null; } public RationalNumber multiplication(int nNumb){ return null; } public void multiply(RationalNumber ratNumb){ } public void multiply(int numb){ } public RationalNumber division(RationalNumber ratNumb){ return null; } public RationalNumber division(int numb){ return null; } public void divide(RationalNumber ratNumb){ } public void divide(int numb){ } } Observaciones: - No es necesario implementar la clase completa. Se sugiere implementar slo los mtodos privados y los de adicin y dejar propuesto como estudio independiente la implementacin del resto. - Este ejercicio ofrece buenas posibilidades para ejercitar la lgica de programacin. - Permite trabajar con ms de una instancia, especficamente en los mtodos que esperan una instancia del mismo tipo. Esto refuerza el conocimiento sobre el acceso a los miembros de instancia a travs de sus mtodos y permite desarrollar habilidades en ello.
ltima actualizacin: 05/02/13 Permite apreciar la necesidad de crear instancias en un mtodo. El algoritmo de Euclide aparece explicado e implementado en el documento del taller de repeticiones en IP. Es muy posible que no se haya trabajado en clase, pero estaba en el documento con las soluciones.
Conclusiones Insistir en que la POO no consiste simplemente en unas cuantas caractersticas nuevas aadidas a los lenguajes de programacin, es ms que eso: es una nueva forma de pensar. La POO considera un programa como a una coleccin de objetos, vindose stos como una cpsula donde coexisten sus datos y comportamiento. Estudio independiente
Analice las siguientes situaciones y encuentre las categoras de objetos o clases que deben modelarse para la solucin de las mismas. Defina segn su criterio cuales podran ser los datos y las operaciones o responsabilidades de cada una de ellas relacionadas con la solucin del problema. Implemente las clases en Java. 1.- El centro recreativo La Giraldilla necesita automatizar su almacn de vinos. A partir de las entrevistas realizadas a sus trabajadores se obtuvieron las siguientes informaciones: cada vino tiene un nombre, una cosecha, un tipo (tinto, blanco y rosado) y una disponibilidad. Adems, se conoce el valor de las ventas de los ltimos 10 aos y el suministrador del cual se conoce, nombre que lo identifica, pas y tiempo que demora la entrega. A peticin del administrador del complejo hay que decidir hacer nuevos pedidos a los suministradores del vino dependiendo de si las ventas de los ltimos 5 aos superan el promedio de las ventas realizadas durante los primeros 5 aos y el plazo de entrega es menor que 30 das. a) Identificar las clases y sus atributos que permitan resolver la situacin anterior b) Defnalas en Java Implementar los mtodos que permitan: c) ayudar al administrador a decidir si hace un nuevo pedido de un vino en particular.
2.- Una estacin territorial del Instituto de Meteorologa necesita automatizar algunos clculos semestrales que realiza relacionados con la lluvia cada en ese territorio. Se dispone de la informacin siguiente: cantidad de lluvia cada en cada uno de los meses del semestre as como el valor de la lluvia histrica en el semestre estudiado. La estacin necesita poder determinar el promedio de lluvia cada en el semestre as como el mayor valor de lluvia cada mensualmente en el semestre y la cantidad de meses en los cuales la cantidad de lluvia cada supera el valor de lluvia histrica. a) Identificar las clases y sus atributos que permitan resolver la situacin anterior b) Defnalas en Java. Implemente los mtodos que permitan: c) los mtodos que permitan darle solucin a las necesidades de la estacin.