TC9 Grupo 5
TC9 Grupo 5
ENUNCIADO:
Realizar la siguiente actividad:
RUBRICA:
-Creamos al padre, que será aquel que contendrá todo lo que los hijos van a contener por
defecto.
package padre;
-Creamos a los hijos, en este caso, serán empleado y cliente, ambos con los mismos atributos
heredados del padre, solo que con algunas distinciones.
package hijos;
import padre.Persona;
package hijos;
import padre.Persona;
public class Cliente extends Persona{
protected int telefono, DNI;
//
public Cliente(int cod, int edad, String nom, String ape, int
telefono, int dNI) {
super(cod, edad, nom, ape);
this.telefono = telefono;
DNI = dNI;
}
public String Datos_Cliente(){
return Datos_Persona() + "\nTeléfono: " + telefono + "\nDNI: " +
DNI ;
}
}
-Creamos a la ventana, en la cual procederemos a programar los botones, en este caso, serán
procesar y limpiar, en donde en el botón procesar llamaremos a todos los atributos y serán
convertidos, y en el botón limpiar, quitaremos cualquier texto de las cajas de manera
automática, adicionalmente se crean métodos y listado.
txtcodemp.setText(" ");
txtedademp.setText(" ");
txtnomemp.setText(" ");
txtapellidoemp.setText(" ");
txtsueldoemp.setText(" ");
txtcargoemp.setText(" ");
//
txtcodcli.setText(" ");
txtedadcli.setText(" ");
txtnomcli.setText(" ");
txtapellidocli.setText(" ");
txttelefono.setText(" ");
txtDNI.setText(" ");
txtS.setText(" ");
txtcodemp.grabFocus();
}
protected void do_btnProcesar_actionPerformed(ActionEvent arg0) {
//EMPLEADO
int codEmp = Integer.parseInt(txtcodemp.getText());
int edadEmp = Integer.parseInt(txtedademp.getText());
String nomEmp = txtnomemp.getText();
String ApeEmp = txtapellidoemp.getText();
int sueldoEmp = Integer.parseInt(txtsueldoemp.getText());
String CargoEmp = txtcargoemp.getText();
//CLIENTE
int codCli = Integer.parseInt(txtcodcli.getText());
int edadCli = Integer.parseInt(txtedadcli.getText());
String nomCli = txtnomcli.getText();
String ApeCli = txtapellidocli.getText();
int Telefono = Integer.parseInt(txttelefono.getText());
int DNI = Integer.parseInt(txtDNI.getText());
Empleado e = new Empleado(codEmp, edadEmp, nomEmp, ApeEmp,
sueldoEmp, CargoEmp);
Cliente c = new Cliente(codCli, edadCli, nomCli, ApeCli,
Telefono, DNI);
Listado(e, c);
}
void Imprimir(String S){
txtS.append(S+ "\n");
}
void Imprimir(){
txtS.append("==========================================\n");
}
void Listado(Empleado e, Cliente c){
Imprimir("EMPLEADO");
Imprimir(e.Datos_Empleado());
Imprimir();
Imprimir("CLIENTE");
Imprimir(c.Datos_Cliente());
Imprimir();
}
Herencia ejercicio 1: Diagrama de clases
Ambos apuntan a la persona, que es el padre, donde se ve que de una persona pueden salir
muchos empleados, y clientes.
package padre;
El proceso de instanciación de las clases hijas que también son padres. En este contexto, las
mencionadas clases corresponden al docente y al estudiante. Ambas clases heredan de la clase
padre exactamente los mismos atributos, si bien incorporan distinciones específicas
package hijos_padre;
import padre.Persona;
---------------------------------------------------------------------------------------------------------------------
package hijos_padre;
import padre.Persona;
public Estudiante(int cod, String nom, double n1, double n2, double n3) {
super(cod, nom);
this.n1 = n1;
this.n2 = n2;
this.n3 = n3;
}
public double Promedio(){
return (n1+n2+n3)/3;
}
public String DatosE(){
return DatosP()+"\nNota 1: "+n1+"\nNota 2: "+n2+"\nNota 3: "+n3+"El
promedio es: "+Promedio();
}
}
El proceso de instanciación de las clases hijas ha sido llevado a cabo. En este contexto, las
mencionadas clases corresponden al docente contratado/nombrado y al estudiante
becado/regular. Ambas clases heredan de la clase hijos_padre exactamente los mismos
atributos, si bien incorporan distinciones específicas
package hijos;
import hijos_padre.Docente;
public DContratado(int cod, String nom, String profesión, double ht, double
th) {
super(cod, nom, profesión);
this.ht = ht;
this.th = th;
}
public double Sueldo(){
return th*th;
}
public String DatosDC(){
return DatosD()+"\nEl sueldo es: "+Sueldo();
}
}
---------------------------------------------------------------------------------------------------------------------
package hijos;
import hijos_padre.Docente;
---------------------------------------------------------------------------------------------------------------------
package hijos;
import hijos_padre.Estudiante;
public EBecado(int cod, String nom, double n1, double n2, double n3, String
sustento) {
super(cod, nom, n1, n2, n3);
this.sustento = sustento;
}
public String DatosEB(){
return DatosE()+"\nEl sustento es: "+sustento;
}
}
---------------------------------------------------------------------------------------------------------------------
package hijos;
import hijos_padre.Estudiante;
package gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import hijos.DContratado;
import hijos.DNombrado;
import hijos.EBecado;
import hijos.ERuglar;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JComboBox;
import javax.swing.DefaultComboBoxModel;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
/**
*/
EventQueue.invokeLater(new Runnable() {
try {
V222 frame = new V222();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
});
/**
*/
public V222() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(contentPane);
contentPane.setLayout(null);
contentPane.add(lblNewLabel);
contentPane.add(lblNombre);
contentPane.add(lblNota1);
contentPane.add(lblNota2);
contentPane.add(lblNota3);
contentPane.add(txtcodest);
txtcodest.setColumns(10);
}
txtnomest.setColumns(10);
contentPane.add(txtnomest);
txtn1est.setColumns(10);
contentPane.add(txtn1est);
txtn2est.setColumns(10);
contentPane.add(txtn2est);
txtn3est.setColumns(10);
contentPane.add(txtn3est);
contentPane.add(lblNewLabel_1);
cboTipoE.addActionListener(this);
contentPane.add(cboTipoE);
lblPensión.setEnabled(false);
contentPane.add(lblPensión);
lblSustento.setEnabled(false);
contentPane.add(lblSustento);
txtpensiónest.setEnabled(false);
contentPane.add(txtpensiónest);
txtpensiónest.setColumns(10);
txtsustentoest.setEnabled(false);
txtsustentoest.setColumns(10);
contentPane.add(txtsustentoest);
btnProcesar.addActionListener(this);
contentPane.add(btnProcesar);
contentPane.add(scrollPane);
scrollPane.setViewportView(txtS);
contentPane.add(label_1);
txtcoddoc.setColumns(10);
contentPane.add(txtcoddoc);
contentPane.add(label_2);
txtnomdoc.setColumns(10);
contentPane.add(txtnomdoc);
txtprofedoc.setColumns(10);
txtprofedoc.setBounds(122, 422, 116, 22);
contentPane.add(txtprofedoc);
contentPane.add(lblProfesin);
lblSueldo.setEnabled(false);
contentPane.add(lblSueldo);
txtsueldo.setEnabled(false);
txtsueldo.setColumns(10);
contentPane.add(txtsueldo);
contentPane.add(lblTipoDeDocente);
{
cboTipoD = new JComboBox();
cboTipoD.addActionListener(this);
contentPane.add(cboTipoD);
txtTH.setEnabled(false);
txtTH.setColumns(10);
contentPane.add(txtTH);
txtHT.setEnabled(false);
txtHT.setColumns(10);
contentPane.add(txtHT);
lblHt.setEnabled(false);
contentPane.add(lblHt);
{
lblTh = new JLabel("TH");
lblTh.setEnabled(false);
contentPane.add(lblTh);
btnLimpiar.addActionListener(this);
contentPane.add(btnLimpiar);
if (e.getSource() == btnLimpiar) {
do_btnLimpiar_actionPerformed(e);
if (e.getSource() == cboTipoD) {
do_cboTipoD_actionPerformed(e);
if (e.getSource() == btnProcesar) {
do_btnProcesar_actionPerformed(e);
if (e.getSource() == cboTipoE) {
do_cboTipoE_actionPerformed(e);
lblPensión.setEnabled(true);
txtpensiónest.setEnabled(true);
else {
lblSustento.setEnabled(true);
txtsustentoest.setEnabled(true);
int TipoE(){
int codE=Integer.parseInt(txtcodest.getText());
String nomE=txtnomest.getText();
double n1=Double.parseDouble(txtn1est.getText());
double n2=Double.parseDouble(txtn2est.getText());
double n3=Double.parseDouble(txtn3est.getText());
if(TipoE()==0){
double pensión=Double.parseDouble(txtpensiónest.getText());
ListadoR(er);
else{
String sustento=txtsustentoest.getText();
int codD=Integer.parseInt(txtcoddoc.getText());
String nomD=txtnomdoc.getText();
String profesiónD=txtprofedoc.getText();
if(TipoD()==0){
double ht=Double.parseDouble(txtHT.getText());
double th=Double.parseDouble(txtTH.getText());
ListadoC(dc);
} else{
double sueldo=Double.parseDouble(txtsueldo.getText());
ListadoN(dn);
txtS.append(s+"\n");
void Imprimir(){
txtS.append("--------------------\n");
Imprimir("Estudiante Regular");
Imprimir(r.DatosER());
Imprimir();
}
Imprimir("Estudiante Becado");
Imprimir(b.DatosEB());
Imprimir();
Imprimir("Docente Nombrado");
Imprimir(n.DatosDN());
Imprimir("Docente Contratado");
Imprimir(c.DatosDC());
if(TipoD()==0){
lblTh.setEnabled(true);
txtTH.setEnabled(true);
lblHt.setEnabled(true);
txtHT.setEnabled(true);
else {
lblSueldo.setEnabled(true);
txtsueldo.setEnabled(true);
}
int TipoD(){
txtcodest.setText("");
txtnomest.setText("");
txtn1est.setText("");
txtn2est.setText("");
txtn3est.setText("");
txtcoddoc.setText("");
txtnomdoc.setText("");
txtprofedoc.setText("");
txtcodest.grabFocus();
}
EL PROGRRAMA EXPLICARA LA AGREGACION ENTRE EL
AUTO Y LA BICICLETA CON LOS CLIENTES, PARA LO
CUAL SE NECESITARAN 3 CLASES CON ATRIBUTOS
ESPECIFICOS COMO COLOR,MODELO,CÓDIGO,APELLIDOS
NOMBRES,ETC.
package ejercicios;
package ejercicios;
String color;
String modelo;
public Bicicleta(String color, String modelo) {
this.color = color;
this.modelo = modelo;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getModelo() {
return modelo;
}
public void setModelo(String modelo) {
this.modelo = modelo;
}
package ejercicios;
}
Para brindar de manera rápida los
siguientes mensajes.
Al hacer referencia a las clases
Auto y Bicicleta dentro de la clase
Empleado se puede acceder a los
atributos de la bicicleta y del
auto desde adentro de la clase
Empleado.
package ejercicios;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
public class Agregacion extends JFrame implements ActionListener {
/**
*/
EventQueue.invokeLater(new Runnable() {
try {
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
/**
*/
public Agregacion() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setContentPane(contentPane);
contentPane.setLayout(null);
contentPane.add(txtNombre);
txtNombre.setColumns(10);
contentPane.add(lblNombre);
contentPane.add(textField);
textField.setColumns(10);
}
contentPane.add(lblCodigo);
contentPane.add(textField_1);
textField_1.setColumns(10);
contentPane.add(textField_2);
textField_2.setColumns(10);
contentPane.add(textField_3);
textField_3.setColumns(10);
contentPane.add(lblNewLabel);
{
lblNewLabel_1 = new JLabel("Color");
contentPane.add(lblNewLabel_1);
contentPane.add(lblNewLabel_2);
btnProcesar.addActionListener(this);
contentPane.add(btnProcesar);
contentPane.add(scrollPane);
scrollPane.setViewportView(txtS);
if (arg0.getSource() == btnProcesar) {
do_btnProcesar_actionPerformed(arg0);
}
protected void do_btnProcesar_actionPerformed(ActionEvent arg0) {
listado();
System.out.println("----------------- detalles de la
bicicleta-----------");
System.out.println("modelo de la bicicleta:"+a.modelo);
DIAGRAMA DE CLASE
Ejercicio 3:Agregación y composición:
package comp;
package comp;
package comp;
public Veterinaria(){
codveterinaria=0;
nombreveterinaria=null;
mascota=new Mascota();
}
Por ultimo creamos la interfaz gráfica o ventana, donde vamos a diseñar la funcionalidad de
dos botones: "Procesar" y "Limpiar". Cuando el botón "Procesar" sea presionado, se tomarán
todos los atributos y se realizará una conversión necesaria. En cambio, al hacer clic en el botón
"Limpiar", se eliminará automáticamente cualquier texto presente en las cajas de entrada.
Además, se implementarán métodos adicionales y se establecerá una lista de funcionalidades
en la aplicación.
}
protected void do_btnProcesar_actionPerformed(ActionEvent arg0) {
int coddueño=coddueño();
int codmasco=codmasco();
int codveterinaria=codveterinaria();
String nomveterinaria=nomveterinaria();
String nommasco=nommasco();
String nomdueño=nomdueño();
if(nomveterinaria==null && codveterinaria==0){
Dueño d=new Dueño(coddueño, nomdueño);
Mascota m=new Mascota();
Veterinaria v=new Veterinaria();
Listar(v);
Listar(v,d);
}
else{
Dueño d=new Dueño(coddueño, nomdueño);
Mascota m=new Mascota(codmasco, nommasco);
Veterinaria v=new Veterinaria(codveterinaria, nomveterinaria,m);
Listar(v);
Listar(v,d);
}
}
void Listar(Veterinaria v)
{ Imprimir("El codigo de la veterinaria es:
"+v.getCodveterinaria());
Imprimir("El nombre de la veterinaria es:
"+v.getNombreveterinaria());
Imprimir("El codigo de la mascota es:
"+v.getMascota().getCodmascota());
Imprimir("El nombre de la mascota es:
"+v.getMascota().getNombremascota());
Imprimir();
}
void Listar(Veterinaria v,Dueño d)
{ Imprimir("El codigo de la veterinaria es:
"+v.getCodveterinaria());
Imprimir("El nombre de la veterinaria es:
"+v.getNombreveterinaria());
Imprimir("El codigo del dueño es: "+d.getCoddueño());
Imprimir("El nombre del dueño es: "+d.getNombredueño());
}
void Imprimir(String x){
textArea.append(x+"\n");
}
void Imprimir(){
textArea.append("------------------------------------------------------------
--------------------\n");
}
int coddueño(){
if(txtcoddueño.getText().isEmpty()){
return 0;
}
else return Integer.parseInt(txtcoddueño.getText());
}
int codmasco(){
if(txtcodmasco.getText().isEmpty())return 0;
else return Integer.parseInt(txtcodmasco.getText());
}
int codveterinaria(){
if(txtcodveterinaria.getText().isEmpty())return 0;
else return Integer.parseInt(txtcodveterinaria.getText());
}
String nomveterinaria(){
if(txtnomveterianaria.getText().isEmpty())return null;
else return txtnomveterianaria.getText();
}
String nomdueño(){
if(txtnomdueño.getText().isEmpty())return null;
else return txtnomdueño.getText();
}
String nommasco(){
if(txtnommasco.getText().isEmpty())return null;
else return txtnommasco.getText();
}
Diagrama de clases: Agregación y composición
La clase "Mascota" tiene un atributo "veterinaria" que apunta a una instancia de la clase "Veterinaria".
Esto significa que cada mascota está relacionada con una única veterinaria.
La clase "Veterinaria" tiene una lista de mascotas (atributo "mascotas") y puede atender a varias
mascotas. Además, tiene una lista de dueños que no se muestra en el diagrama.
La clase "Dueño" también tiene un atributo "veterinaria" que apunta a una instancia de la clase
"Veterinaria", lo que significa que un dueño puede llevar a su mascota a una única veterinaria.
Relación reflexiva de clases:
Ejemplo:
En este ejemplo, la clase Mascota representa a los pacientes de la veterinaria. Cada Mascota
tiene un nombre, código, dueño, raza, edad que lo identifica. Hemos definido el método
esIgual en la clase Mascota, que verifica si una Mascota es igual a sí mismo mediante la
comparación de referencias. Luego, en el botón procesar de la clase Mascota, creamos dos
objetos de la clase Mascota(mascota1 y mascota2) y comprobamos si son iguales a sí mismos
utilizando el método esIgual.
Código:
package reflexiva;
public Mascota() {
}
public Mascota(int idmascota, String nombre, String dueño, String
raza, int edad) {
this.idmascota = idmascota;
this.nombre = nombre;
this.dueño = dueño;
this.raza = raza;
this.edad = edad;
}
public int getIdmascota() {
return idmascota;
}
public void setIdmascota(int idmascota) {
this.idmascota = idmascota;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getDueño() {
return dueño;
}
public void setDueño(String dueño) {
this.dueño = dueño;
}
public String getRaza() {
return raza;
}
public void setRaza(String raza) {
this.raza = raza;
}
public int getEdad() {
return edad;
}
public void setEdad(int edad) {
this.edad = edad;
}
public boolean esIgual(Mascota otroAnimal) {
return this == otroAnimal;
}
}
Gui:
package gui;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import reflexiva.Mascota;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JLabel;
import javax.swing.JTextField;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ventana1 frame = new ventana1();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ventana1() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 458, 364);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
{
btnProcesar = new JButton("Procesar");
btnProcesar.setBounds(156, 151, 97, 25);
btnProcesar.addActionListener(this);
contentPane.setLayout(null);
contentPane.add(btnProcesar);
}
{
lblCodigo = new JLabel("codigo:");
lblCodigo.setBounds(22, 46, 56, 16);
contentPane.add(lblCodigo);
}
{
lblMascota = new JLabel("Mascota:");
lblMascota.setBounds(12, 13, 56, 16);
contentPane.add(lblMascota);
}
{
lblNombre = new JLabel("Nombre:");
lblNombre.setBounds(158, 46, 62, 16);
contentPane.add(lblNombre);
}
{
lblDueo = new JLabel("due\u00F1o:");
lblDueo.setBounds(22, 103, 56, 16);
contentPane.add(lblDueo);
}
{
lblNewLabel = new JLabel("raza:");
lblNewLabel.setBounds(158, 103, 44, 16);
contentPane.add(lblNewLabel);
}
{
lblEdad = new JLabel("edad:");
lblEdad.setBounds(297, 103, 44, 16);
contentPane.add(lblEdad);
}
{
scrollPane = new JScrollPane();
scrollPane.setBounds(39, 189, 363, 115);
contentPane.add(scrollPane);
{
txtS = new JTextArea();
scrollPane.setViewportView(txtS);
}
}
{
txtcodigo = new JTextField();
txtcodigo.setBounds(65, 43, 81, 22);
contentPane.add(txtcodigo);
txtcodigo.setColumns(10);
}
{
txtdueño = new JTextField();
txtdueño.setColumns(10);
txtdueño.setBounds(65, 100, 81, 22);
contentPane.add(txtdueño);
}
{
txtnombre = new JTextField();
txtnombre.setColumns(10);
txtnombre.setBounds(211, 43, 81, 22);
contentPane.add(txtnombre);
}
{
txtraza = new JTextField();
txtraza.setColumns(10);
txtraza.setBounds(192, 100, 81, 22);
contentPane.add(txtraza);
}
{
txtedad = new JTextField();
txtedad.setColumns(10);
txtedad.setBounds(347, 100, 81, 22);
contentPane.add(txtedad);
}
}
public void actionPerformed(ActionEvent arg0) {
if (arg0.getSource() == btnProcesar) {
do_btnProcesar_actionPerformed(arg0);
}
}
protected void do_btnProcesar_actionPerformed(ActionEvent arg0)
{
int idmascota=idcodigo();
String nombre=nombre();
String dueño=dueño();
String raza=raza();
int edad=edad();
Mascota mascot=new Mascota(idmascota, nombre, dueño, raza,
edad);
Imprimir("codigo: "+mascot.getIdmascota()+"\n"+
"nombre: "+mascot.getNombre()+"\n"+
"dueño : "+mascot.getDueño()+"\n"+
"raza : "+mascot.getRaza()+"\n"+
"edad : "+mascot.getEdad()+"\n");
Imprimir("¿animal es igual a si
mismo: ?"+mascot.esIgual(mascot));
Imprimir();
}
int idcodigo(){
if(txtcodigo.getText().isEmpty()){
return 0;
}
else return Integer.parseInt(txtcodigo.getText());
}
int edad(){
if(txtedad.getText().isEmpty())return 0;
else return Integer.parseInt(txtedad.getText());
}
String nombre(){
if(txtnombre.getText().isEmpty())return null;
else return txtnombre.getText();
}
String dueño(){
if(txtdueño.getText().isEmpty())return null;
else return txtdueño.getText();
}
String raza(){
if(txtraza.getText().isEmpty())return null;
else return txtraza.getText();
}
void Listado(Mascota m){
}
void Imprimir(String s){
txtS.append(s+"\n");
}
void Imprimir(){
txtS.append("----------------------------------------------\n");
}
}
Diagrama Relacional:
+-------------------+
| Mascota |
+-------------------+
| IdMascota |
| Nombre |
| Dueño |
| Raza |
| Edad |
+-------------------+
| |
| |
| |
| |
| |
↓ |
+-------------------+
| Relación |
| esIgual |
En este diagrama, he añadido los atributos IdMascota, Nombre, Dueño, Raza y Edad a la
entidad "Mascota". Estos atributos representan información adicional sobre las mascotas que
pueden ser administradas en el sistema de la veterinaria. La relación reflexiva "esIgual" sigue
conectada a la entidad "Mascota" como se muestra en el diagrama anterior.
El diagrama debería verse más como una entidad que se relaciona consigo misma sin flechas ni
líneas, ya que no hay un "inicio" ni un "fin" en la relación, dado que la entidad está relacionada
con sí misma. En el caso de la relación reflexiva "esIgual," esta implica que una mascota es
igual a sí misma, por lo que no hay una dirección definida en la relación.
Este es un ejemplo básico de cómo se vería el diagrama de entidad-relación con los atributos
adicionales en la entidad "Mascota" en el contexto de una veterinaria. Ten en cuenta que, en
una aplicación real, probablemente habría relaciones adicionales entre las entidades, como
relaciones entre mascotas y sus registros médicos, o entre mascotas y sus citas veterinarias,
dependiendo de los requerimientos del sistema.
Diseño: