UNIVERSIDAD DE PANAMA CENTRO REGIONAL UNIVERSITARIO DE VERAGUAS FACULTAD DE INFORMÁTICA, ELECTRÓNICA Y COMUNICACIÓN INGENIERÍA EN INFORMÁTICA
INF 222 - PROGRAMACIÓN III LABORATORIO #5
SOBRE: ENCAPSULACIÓN
INTEGRANTES: FELIX RIVERA EUFEMIA BUITRAGO
PROFESOR: DIEGO SANTIMATEO
INTRODUCCION La encapsulación es la capacidad de un objeto de ser un contenedor (o cápsula) de sus propiedades y comportamiento. Esto significa que los datos o variables y el código del objeto deben estar ocultos detrás de la interfaz. La idea es que la interfaz (método público en una clase) que esté bien diseñada y en consecuencia sea permanentemente consistente, permita interactuar con los objetos aún cuando se den cambios en sus respectivos códigos.
PROBLEMA PLANTEADO Escriba un programa en Java estrictamente orientado a objetos que capture el nombre, el puesto académico que ocupa y el código de la asignatura de mayor calificación para cada uno de los N estudiantes de un grupo. El programa debe determinar el nombre del estudiante con mayor puesto y desplegar la descripción de la asignatura con mayor calificación. Ni la clase que representa al estudiante, ni la que representa las asignaturas, ni la clase que contiene al main deben realizar entradas ni salidas. La clase Asignatura maneja un archivo que contiene el código y la descripción de cada materia. Puede crear el archivo con el editor de texto. Considere los siguientes aspectos: Diseñe e implemente una clase que permita capturar datos para cualquiera que sea la aplicación, de manera que el programa que recurra a ella sea el único conocedor de lo que se desea capturar. Deben existir N objetos Estudiantes creados en la clase principal (la que contiene al main). La salida debe desplegarse con un mensaje a un método de la clase que hace la entrada y salida (I/O). Esto implica que usted debe construir el mensaje de salida para usarlo en la interfaz del método de la clase I/O. Ni la clase principal ni la clase Estudiante pueden hacer I/O La clase Estudiante contiene todos los métodos relativos a la actividad del o con el estudiante. Cada método debe atender solo una tarea o función. Incluya cada clase en un archivo diferente.
II. Adicione a la clase Estudiante un método para calcular la calificación promedio de un estudiante. Use la clase I/O sin modificarla para capturar las M notas de los N estudiantes, sus respectivos nombres y cédulas. Implemente otra clase Principal para controlar la ejecución. Lea una cédula para saber a que estudiante se le debe calcular el promedio.
SOLUCION DEL PROBLEMA
Primera Clase (Main de la Parte “a”): import java.io.*; //declaración de las librerías utilizadas import java.util.*; import javax.swing.*; import java.lang.String; class Principal { public static void main(String[] args)throws IOException { try { String dat,t; //declaración de las variables a utilizar int i,puesto; CapturaDespliega acces = new CapturaDespliega();//se crea un objet Asignatura cap_dat_txt = new Asignatura(); //se crea un objeto int n=acces.getCantidad(); //llama método q’ indica cant. de estud Estudiante [] estud= new Estudiante[n]; String no = new String(); String c = new String(); String p = new String(); JOptionPane.showMessageDialog(null,"Ingrese los datos separados por una coma ',' :"); for(i=0;i
Tabla que representa las diversas variables, invocación a los métodos, etc. en la clase Principal. VARIABLE Ó MÉTODO
DESCRIPCIÓN
TIPO
dat
Captura el resultado del método que captura los datos. Captura el resultado del método donde se lee el archivo y se comparan los códigos. Guarda el primer token(parte del String dat) Guarda el segundo token(parte del String dat) Guarda el tercer token(parte del String dat) Captura el resultado del método que captura la cantidad de estudiantes Almacena el valor del puesto convertido en Double.
String
t no c p n puest[0] puest i nomb co pue[] CapturaDespliega acces = new CapturaDespliega(); Asignatura cap_dat_txt = new Asignatura(); acces.getCantidad(); Estudiante [] estud= new Estudiante[n]; acces.captura_teclado(); estud[i]=new Estudiante(no,c,puest); on on.mayor(estud,n); h.no(); h.c(); cap_dat_txt.capturar(nomb,co,pue);
Controla el ciclo para la cantidad de estudiantes Captura el resultado del método que captura el nombre del estudiante con puesto mayor Captura el resultado del método que captura el código del estudiante con puesto mayor Captura el resultado del método que captura el puesto Se crea un objeto de clase CapturaDespliega llamado acces. Se crea un objeto de la clase Asignatura llamado cap_dat_txt. Invocación al método que indica la cantidad de estudiantes Se crea un objeto de la clase Estudiante llamado estud[] Invocación al método que captura los datos que se ingresan por teclado Constructor el cual tiene como argumentos, el nombre, código, puesto Variable que captura el resultado del estudiante con el mayor puesto Método que captura el estudiante con mayor puesto. Método que captura el nombre del estudiante con puesto mayor Método que captura el código del estudiante con puesto mayor Se lee el archivo y se verifica el código para desplegar cual es la materia correspondiente
String String String String Double int String String Double CapturaDespliega Asignatura int Estudiante String Estudiante Estudiante Estudiante String String String
Segunda Clase (Main de la Parte “b”): Principal2 import java.io.*; //declaración de las librerías utilizadas import java.util.*; import javax.swing.*; import java.lang.String; class Principal2 { public static void main(String[] args)throws IOException { try { InputStreamReader isr=new InputStreamReader(System.in); BufferedReader br=new BufferedReader(isr); //flujo de datos int i; String dat; CapturaDespliega acces = new CapturaDespliega(); Asignatura cap_dat_txt = new Asignatura(); int n=acces.getCantidad(); Estudiante [] estud= new Estudiante[n]; String no = new String(); String c = new String(); String m = new String(); JOptionPane.showMessageDialog(null,"Ingrese los datos separados por una coma ',' :"); //se ingresan los datos for(i=0;i
String as = on.compara(estud,n); //invocación al método donde se comparan las cedulas… acces.imprimir(as); //invocación al método para imprimir } catch(Exception e){ JOptionPane.showMessageDialog(null," ****Error en la captura****");} } }
Este main es muy similar al anterior, ya que ambos realizan funciones semejantes en la captura de datos. A diferencia del anterior donde el dato del puesto se guarda en una variable tipo vector donde solamente se utiliza una posición; obviamente la primera para guardar ese dato, en éste caso el valor de las notas se guarda en una variable tipo vector pero sus posiciones pueden abarcar una o más de una posiciones; de acuerdo a la cantidad de notas. Los datos como el nombre se guardan de la misma manera en ambos casos; y respecto al código y la cedula también se guardan de iguales.
Clase 3: CapturaDespliega import javax.swing.*; //librerías utilizadas import java.io.*; class CapturaDespliega { String texto,valores; //declaracion de las variables utilizadas InputStreamReader isr=new InputStreamReader(System.in); //flujo de datos BufferedReader br=new BufferedReader(isr); //************************************************************************************* public int getCantidad() //método que indica la cantidad de estudiantes { try { texto = JOptionPane.showInputDialog(null,"Indique cantidad estudiantes:",JOptionPane.QUESTION_MESSAGE); //se ingresa la cantidad int num = Integer.parseInt(texto); //se convierte a entero return(num); //retorna el valor al main } catch (Exception e) { JOptionPane.showMessageDialog(null," ****Error en captura****");} return(0); }
de
la
//************************************************************************************* public String captura_teclado()throws IOException //método donde se capturan los datos por el teclado
{ try { valores = JOptionPane.showInputDialog(null,"Datos estudiante:",JOptionPane.QUESTION_MESSAGE); //se ingresan los datos } catch(Exception e){ JOptionPane.showMessageDialog(null," ****Error en captura****");} return(valores); //retorna los datos capturados }
del
la
//************************************************************************************* public void imprimir(String imp) // método que imprime los resultados finales de ambos main { JOptionPane.showMessageDialog(null,imp); //impresión de resultados } //************************************************************************************* }
Tabla que representa las diversas variables, métodos, etc. en la clase CapturaDespliega. VARIABLE Ó MÉTODO texto valores num public int getCantidad() public String captura_teclado() public void imprimir(String imp)
DESCRIPCIÓN Guarda la cantidad de estudiantes que se desean Guarda los datos que se ingresan por teclado Guarda la cantidad de estudiantes pero el valor convertido en entero. Método que indica la cantidad de estudiantes Método donde se capturan los datos por el teclado Método que imprime los resultados finales de ambos main
TIPO String String int int String void
Clase 4: Asignatura import java.io.*; //librerías utilizadas import javax.swing.*; public class Asignatura { public String capturar(String n,String co,Double p[]) //lee el archivo y compara el código con las líneas leídas del archivo { String datos="datos.txt"; //declaración de las variables utilizadas String ret=null; String r=null; int u=0,g=0; try { FileReader arch1 = new FileReader(datos); //flujo para leer el archivo BufferedReader in = new BufferedReader(arch1); String s = new String(); while((s = in.readLine())!= null) //lectura por línea del archivo { int val = s.indexOf(co); //se compara si en cada línea leída del archive se encuentra el código del estudiante con el mayor puesto if(val>=0) { ret=s; //se guarda la línea leída si se encuentra u=1; } else g=0; } in.close(); //se cierra el archivo leído //Se guarda en una sola variable los resultados para luego retornarlos e invocar al método de impresión. r="\n\t\t***DATOS DEL ESTUDIANTE QUE OCUPA EL PRIMER PUESTO***"; r=r+"\n\nEl nombre del estudiante es: "+n; if((u==1)&&(g==0)) r=r+"\nEl código y nombre de la materia es: "+ret; else r=r+"\nEsta materia no existe"; r=r+"\nEl puesto del estudiante es: "+p[0]; } catch(Exception e){ JOptionPane.showMessageDialog(null," ****Error en captura****");} return(r); //se retorna la variable que contiene todos los resultados } }
la
Tabla que representa las diversas variables, métodos, etc. en la clase Asignatura. VARIABLE Ó MÉTODO datos ret r
u,g s val
public String capturar(String n,String co,Double p[])
DESCRIPCIÓN Guarda el nombre del archivo que se va a leer Guarda la línea en caso de encontrar el código Guarda todos los resultados concatenados para retornarlos al main e invocar al método de impresión Variables cuya función es verificar si el código se encontró en alguna línea del archivo. Guarda las líneas leídas del archivo Guarda el valor resultado de la comparación del código con las líneas del archivo. Si es mayor que “0” existió. Método que contiene como argumentos el nombre, código y puesto del estudiante con el mayor puesto; donde también se lee el archivo para comparar los códigos y desplegar el respectivo nombre de la materia.
TIPO String String String int String int String
Clase 5: Estudiante import java.io.*; //librerías utilizadas import javax.swing.*; class Estudiante { private String nombre; private String codigo; private Double[] puesto; int i,pos; InputStreamReader isr=new InputStreamReader(System .in); //flujo de datos BufferedReader br=new BufferedReader(isr); //*************************************************************** public Estudiante(String no,String c,Double puest[])//constructor que almacena el nombre, código, puesto o notas de acuerdo al caso { this.nombre = no; this.codigo = c; this.puesto=puest; } //*************************************************************** public String no() //almacena el nombre { return(this.nombre); //retorna nombre } //***************************************************************
public String c() //almacena el código { return( this.codigo); //retorna código } //*************************************************************** public Double[] puest() //almacena puesto o notas de acuerdo al caso { return(this.puesto); //retorna puesto o notas de acuerdo al caso } //*************************************************************** public Estudiante mayor(Estudiante estud[],int n) //método que busca el estudiante de mayor puesto { Estudiante may = estud[0]; for(i=0;i
c="*****Datos
del
estudiante
del
cual
se
ingresó
cédula*****\n\n"; c=c+"Nombre del estudiante: "+nom_verd; c=c+"\nCédula del estudiante: "+cedula; c=c+"\nPromedio del estudiante: "+prom; } return(c); //se retorna la variable que contiene todos los resultados } }
Tabla que representa las diversas variables, métodos, etc. en la clase Estudiante. VARIABLE Ó MÉTODO nombre codigo Double[] puesto i may k l nom_verd
mi,mo c
public Estudiante(String no,String c,Double puest[]) public String no() public String c() public Double[] puest()
DESCRIPCIÓN Guarda los nombre de los estudiantes Guarda los códigos de los estudiantes Guarda el puesto o notas de los estudiantes Controla el ciclo de la cantidad de estudiantes Contiene los mismos datos que el objeto estud[] Controla el ciclo que procesa las notas para sumarlas Guarda la longitud del vector que contiene las notas Guarda el nombre del estudiante del cual se ingresó la cedula Verifican si la cedula existió o no Guarda todos los resultados concatenados para retornarlos al main e invocar al método de impresión Constructor que almacena el nombre, código, puesto o notas de acuerdo al caso Método que guarda el nombre específicamente Método que guarda el código específicamente Método que guarda el puesto específicamente
TIPO String String Double int Estudiante Int int String int String
Estudiante String String Double
la
public Estudiante mayor(Estudiante estud[],int n)
public String compara(Estudiante estud[],int n)
Método que calcula el estudiante con mayor puesto, el cual cuenta con los argumentos como el objeto estud[] y la cantidad de estudiantes n. Método que compara las cedulas de los estudiantes con la cedula ingresada para sacarle el promedio de sus notas. Contiene como argumentos el objeto estud[] y la cantidad de estudiantes n.
Estudiante
String
Este archivo es donde se encuentran los códigos con los respectivos nombres de las materias. Nota: Estos códigos no son los que representan verdaderamente a éstas materias.
RESULTADOS DE LA EJECUCION: Este primer ejemplo muestra la parte “a” del laboratorio.
,
Este mensaje indica que los datos se deben ingresar separados por coma “ ”.
Datos del estudiante 1
Datos del estudiante 2
Datos del estudiante 3
Resultado Final
Este ejemplo muestra la parte “b” del laboratorio.
Al igual que el main anterior éste mensaje indica que los datos se deben ingresar separados por
,
coma “ ”.
Datos del estudiante 1
Datos del estudiante 2
Datos del estudiante 3
A continuación se ingresa la cédula del estudiante al cual se le va a sacar su promedio
Resultado Final
CONCLUSIÓN Este informe de laboratorio muestra el uso de encapsulamiento en las clases; ya que éste mecanismo hace unir en la Clase las características y comportamientos; es decir, las variables y métodos. En fin es tener todo esto es una sola entidad. La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, en consecuencia interesa conocer solo lo qué hace la Clase, pero no será necesario saber cómo lo hace. El encapsulamiento es algo que debe estar entre las prácticas de todo desarrollador de software. Con el tiempo una va ganado más y más experiencia y esto se vuelve algo natural en el proceso de diseño de software. La experiencia de cuando usar y cuando no se va ganando con el tiempo pero haciendo un buen análisis antes de empezar a desarrollar ayuda mucho.