Nychol Bazurto Gómez
Problemas y
Comprensión y especificación del problema
Elementos de un
Diseño de la solución
Construcción de la solución
Elementos de un programa: Algoritmos
Solución de un problema muy preciso y pequeño
Secuencia de instrucciones
conjunto de algoritmos, cada uno responsable de una parte de la solución del problema global.
Secuencia ordenada de pasos para realizar una actividad
Algoritmo para
Algoritmo para enviar un mensaje por Whatsapp.
Algoritmo para preparar un desayuno.
Algoritmo para ir a una fiesta.
Elementos de un programa: Algoritmos
tienen un conjunto de reglas para expresar
Elementos de un programa: Algoritmos
Elementos de un programa: Clases
Un programa en JAVA está formado por un conjunto de clases.
Cada clase se guarda en un archivo distinto cuyo nombre debe ser igual al nombre de la clase.
Empleado.java
Empresa.java
Elementos de un programa: Clases en Java
| Empleado |
|---|
| nombre apellido sexo salario |
| Fecha |
|---|
| dia mes anio |
public class Empleado
{
//Atributos
private String nombre;
private String apellido;
private int salario;
private int sexo;
}public class Fecha
{
//Atributos
private int dia;
private int mes;
private int anio;
}Archivo
Empleado.java
Archivo
Fecha.java
Elementos de un programa: Clases en Java
public class Empleado
{
//Atributos
private String nombre;
private String apellido;
private int salario;
private int sexo;
}public class Fecha
{
//Atributos
private int dia;
private int mes;
private int anio;
}Archivo: Empleado.java
Archivo: Fecha.java
int
double
String
Elementos de un programa: Clases en Java
public class Empleado
{
//Atributos
private String nombre;
private String apellido;
private int salario;
private int sexo;
private Fecha fechaNacimiento;
private Fecha fechaIngreso;
}Archivo: Empleado.java
| Empleado |
|---|
| nombre apellido sexo salario |
| Fecha |
|---|
| dia mes anio |
fechaNacimiento
fechaIngreso
Las relaciones entre clases, se declaran como atributos.
El tipo de atributo es el nombre de la clase.
1. Registrar una llamada en alguna de las líneas
2.Mostrar la información detallada de cada línea
–Número de llamadas realizadas
–Duración total de las llamadas en minutos
–Costo total de las llamadas en pesos
3.Mostrar un consolidado total de la información de todas las líneas (costo total en pesos de las tres líneas, número total de llamadas realizadas, duración total de llamadas en minutos y el cálculo del costo promedio por minuto según el costo total y el total de minutos).
4.Reiniciar el uso las líneas telefónicas, dejando todos sus valores en cero.
Caso de estudio: Línes telefónicas
Caso de estudio: Línes telefónicas
R1:Registrar (agregar) una llamada en alguna de las líneas.
R2: Mostrar la información detallada de cada línea.
R3: ...
R4: ...
Caso de estudio: Línes telefónicas
Caso de estudio: Línes telefónicas
| Empresa |
|---|
|
|
| LineaTelefonica |
|---|
| int numeroLlamadas int numeroMinutos double costoLlamadas |
|
|
linea1
linea2
linea3
No tiene atributos particulares
Hay 3 líneas telefónicas
(asociaciones)
Caso de estudio: Línes telefónicas
| LineaTelefonica |
|---|
| int numeroLlamadas int numeroMinutos double costoLlamadas |
|
|
Archivo: LineaTelefonica.java
public class LineaTelefonica
{
private int numeroLlamadas;
private int numeroMinutos;
private double costoLlamadas;
}Caso de estudio: Línes telefónicas
Archivo: Empresa.java
public class Empresa
{
private LineaTelefonica linea1;
private LineaTelefonica linea2;
private LineaTelefonica linea3;
}Son las 3
Elementos de un programa: Métodos
| LineaTelefonica |
|---|
| int numeroLlamadas int numeroMinutos double costoLlamadas |
|
|
Son los algoritmos de la clase
Lo que la clase sabe hacer:
Servicio que la clase debe prestar a las demás clases del modelo
Piense que …
–Una clase es la responsable de manejar la información contenida en sus atributos
–Los métodos son el medio para hacerlo
Elementos de un programa: Métodos
–El número total de sus llamadas
–El costo total de sus llamadas
–La cantidad de minutos consumidos
–Una llamada local
–Una llamada de larga distancia
–Una llamada de celular
darNumeroLlamadas
darCostoLlamadas
darNumeroMinutos
agregarLlamadaLocal
agregarLlamadaLargaDistancia
agregarLlamadaCelular
Elementos de un programa: Métodos
public void agregarLlamadaLocal( int minutos )nombre
Para definir métodos se utiliza el siguiente código Java.
<visibilidad> <tipo> <nombre> (parámetros)
Elementos de un programa: Métodos
¿qué información, que no tenga ya el objeto, es indispensable para poder resolver el problema puntual?
public void agregarLlamadaLocal( int minutos )Lista de parámetros
Conjunto de valores necesarios para resolver el problema
Son equivalentes a las entradas definidas en los requerimientos funcionales, deben tener un tipo y un nombre.
Elementos de un programa: Métodos
Tipo de dato al que pertenece el resultado que va a retornar el método. Si no hay respuesta, se indica el tipo void.
public void agregarLlamadaLocal( int minutos )Tipo de respuesta
Elementos de un programa: Métodos
public void agregarLlamadaLocal( int minutos )
{
numeroLlamadas = numeroLlamadas + 1;
numeroMinutos = numeroMinutos + minutos;
costoLlamadas = costoLlamadas + ( minutos * 35 );
}Cuerpo del método
Elementos de un programa: Tipos de instrucciones
public void agregarLlamadaLocal( int minutos )
{
numeroLlamadas = numeroLlamadas + 1;
numeroMinutos = numeroMinutos + minutos;
costoLlamadas = costoLlamadas + ( minutos * 35 );
}Elementos de un programa: Tipos de instrucciones
numeroLlamadas = numeroLlamadas + 1;
Atributo que va a ser modificado
Expresión que indica el
nuevo valor que debe
guardarse en el atributo
Pueden hacer parte de una expresión: los atributos, los parámetros y los valores constantes.
Con operadores
aritméticos (+, -, *, /)
Elementos de un programa: Tipos de instrucciones
public int darNumeroLlamadas( )
{
return numeroLlamadas;
}Elementos de un programa: Tipos de instrucciones
Usar métodos de la
Usar métodos de un objeto de otra clase con el cual existe una asociación.
Elementos de un programa: Tipos de instrucciones
Se hace para construir métodos complejos a partir de métodos mas simples que ya están escritos.
Elementos de un programa: Tipos de instrucciones
Ejemplo: calcular el monto de los impuestos que debe pagar el empleado en un año. Los impuestos se calculan como el 19.5% del total de salarios recibidos en un año.
Vamos a descomponer el problema en dos métodos:
– Cálculo del valor total del salario anual.
– Cálculo del monto del impuesto, que usa el método anterior.
| Empleado |
|---|
| String nombre String apellido int sexo int salario |
| int calcularSalarioAnual( ) double calcularImpuesto( ) |
Elementos de un programa: Tipos de instrucciones
| Empleado |
|---|
| String nombre String apellido int sexo int salario |
| int calcularSalarioAnual( ) double calcularImpuesto( ) |
public class Empleado
{
...
public int calcularSalarioAnual( )
{
return (salario * 12 );
}
public double calcularImpuesto( )
{
return ( calcularSalarioAnual( ) * 19.5 / 100 );
}
}Llamado al método calcularSalarioAnual
Elementos de un programa: Tipos de instrucciones
| Empleado |
|---|
| String nombre String apellido int sexo int salario |
| int calcularSalarioAnual( ) double calcularImpuesto( ) |
public class Empleado
{
...
public int calcularSalarioAnual( )
{
int salarioAnual = salario * 12;
return salarioAnual;
}
public double calcularImpuesto( )
{
double impuesto = calcularSalarioAnual( ) * 19.5 / 100;
return impuesto;
}
}Variables
Elementos de un programa: Tipos de instrucciones
Se hace cuando se necesita obtener o modificar alguna información de un objeto de otra clase con el cual existe una asociación.
| Empresa |
|---|
|
int darNumeroLlamadas() |
| LineaTelefonica |
|---|
| int numeroLlamadas int numeroMinutos double costoLlamadas |
|
int darNumeroLlamadas() |
linea1
linea2
linea3
En la clase LineaTelefonica existe el
método darNumeroLlamadas
El método darTotalNumeroLlamadas de la clase Empresa DEBE invocar el método darNumeroLlamadas de la clase LineaTelefonica
Elementos de un programa: Tipos de instrucciones
public class EmpresaTelefonica
{
…
public int darTotalNumeroLlamadas( )
{
return (linea1.darNumeroLlamadas( ) +
linea2.darNumeroLlamadas( ) +
linea3.darNumeroLlamadas( ) );
}
}| Empresa |
|---|
|
int darNumeroLlamadas() |
Nombre de la asociación
Punto
Nombre del método de la asociación. No tiene parámetros en este caso ( )
Elementos de un programa: Tipos de instrucciones
public class LineaTelefonica
{
…
public void agregarLlamadaLocal( int minutos )
{
numeroLlamadas = numeroLlamadas + 1;
numeroMinutos = numeroMinutos + minutos;
costoLlamadas = costoLlamadas + ( minutos * 35 );
}
}public class Empresa
{
…
public void agregarLlamadaLocalLinea1( int minutos )
{
linea1.agregarLlamadaLocal( minutos );
}
}Nombre de la asociación
Nombre del método de la asociación.
Parámetros
Elementos de un programa: Tipos de instrucciones
Basta con utilizar el nombre del parámetro en el cuerpo del método de la misma manera que se utilizan los atributos
¿Cuándo
¿Cómo
¿Cómo se utiliza el valor de un parámetro?
Cuando la información que tiene el objeto en sus atributos no es suficiente para resolver el problema
En la signatura del método se define el tipo del dato del parámetro y se le asocia un nombre
Elementos de un programa: Tipos de instrucciones
En el momento de hacer la llamada, se deben pasar tantos valores como parámetros está esperando el método. Esos valores pueden ser:
¿Se puede utilizar el parámetro por fuera del cuerpo del método?
Aquel que hace la llamada del método, ¿cómo hace para definir los valores de los parámetros ?
NO, en ningún caso
Elementos de un programa: Tipos de instrucciones
/**
* Inicializa las líneas telefónicas de la empresa <br>
* <b>post: </b> Se inicializaron las 3 líneas telefónicas.
*/
public void inicializar( )
{
//
//Inicializa la línea 1
linea1 = new LineaTelefonica( );
linea1.inicializar( );
//
//Inicializa la línea 2
linea2 = new LineaTelefonica( );
linea2.inicializar( );
//
//Inicializa la línea 3
linea3 = new LineaTelefonica( );
linea3.inicializar( );
}Elementos de un programa: Tipos de instrucciones
/**
* Inicializa la línea telefónica. <br>
* <b>post: </b> La línea se inicializó con valores en cero.
*/
public LineaTelefonica ( )
{
numeroLlamadas= 0;
numeroMinutos = 0;
costoLlamadas= 0;
}
Tengo un problema ...
Etapa 1
Etapa 2
Etapa N
Conjunto de etapas para entender el problema del cliente y construir una solución de buena calidad
Diseño de la solución
Diseño de la solución: Clases
Se quiere construir un programa que permita dibujar un triángulo.
Esta figura geométrica está definida por tres puntos, cada uno de los cuales tiene dos coordenadas X, Y. Este triángulo tiene, además, un color para las líneas y un color para el relleno.
Un color, por su parte, está definido por tres valores numéricos entre 0 y 255 (estándar RGB por Red-Green-Blue). El primer valor numérico define la intensidad en rojo, el segundo en verde y el tercero el azul.
El programa debe permitir:
1. Dibujar el triángulo en la interfaz.
2. Cambiar los puntos del triángulo.
3. Cambiar el color de relleno del triángulo.
4. Cambiar el color de las líneas (bordes) del triángulo.
5. Mostrar el perímetro del triángulo.
6. Mostrar el área del triángulo.
7. Mostrar la altura del triángulo.
Diseño de la solución: Clases
1. Definir clases
Casi siempre una por entidad definida en el análisis
Un nombre para cada clase
| Triangulo |
|---|
| Punto |
|---|
| Color |
|---|
Diseño de la solución:
Relaciones dentro de las clases
2. Definir relaciones dentro de las clases.
Multiplicidad y
"Flechas" de dependencia entre las clases.
| Triangulo |
|---|
|
|
|
|
| Punto |
|---|
| Color |
|---|
-punto1
-punto2
-punto3
-colorLineas
-colorRelleno
Diseño de la solución: Atributos dentro de las clases
3. Definir atributos dentro de las clases
Caracteres, números enteros, números reales, otros.
Nombre y tipo de dato
| Triangulo |
|---|
|
|
|
|
| Punto |
|---|
| -x: double -y: double |
| Color |
|---|
| -verde: int -rojo: int -azul: int |
-punto1
-punto2
-punto3
-colorLineas
-colorRelleno
Diseño de la solución: Métodos dentro de las clases
4. Definir métodos dentro de las clases.
Pueden ser analizadores o modificadores.
Nombre y tipo de operación
DEBEN entregar (retornar) un valor, que puede ser calculado o un simple atributo (pueden o no alterar el valor de algún atributo).
alteran los valores de algunos atributos y no entregan ningún valor.
Diseño de la solución: Métodos dentro de las clases
| Métodos | JAVA |
|---|---|
| Analizadores | String, int, double (dependiendo del valor que retornan |
| Modificadores | void |
public int darX ()
{
//Acciones
return x;
}public void cambiarX (double pX)
{
//Acciones
}Diseño de la solución: Métodos dentro de las clases
Tengo un problema ...
Etapa 1
Etapa 2
Etapa N
Conjunto de etapas para entender el problema del cliente y construir una solución de buena calidad
Construcción de la solución
Construcción de la solución
Construcción de la solución
/**
* Clase que representa un color.
*/
public class Color
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Componente rojo del RGB (Red).
*/
private int rojo;
/**
* Componente verde del RGB (Green).
*/
private int verde;
/**
* Componente azul del RBG (Blue).
*/
private int azul;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa el color. <br>
* <b>post: </b> Se inicializaron los atributos con los valores dados por parámetro.<br>
* @param pRojo Valor rojo del RGB. pRojo >= 0.
* @param pVerde Valor green de RGB. pVerde >= 0.
* @param pAzul Valor blue de RGB. pAzul >= 0.
*/
public Color( int pRojo, int pVerde, int pAzul )
{
rojo = pRojo;
verde = pVerde;
azul = pAzul;
}
/**
* Devuelve la valor del componente rojo (R) en el color.
* @return Valor del componente rojo.
*/
public int darRojo( )
{
return rojo;
}
/**
* Devuelve la valor del componente verde (G) en el color.
* @return Valor del componente verde.
*/
public int darVerde( )
{
return verde;
}
/**
* Devuelve la valor del componente azul (B) en el color.
* @return Valor del componente azul.
*/
public int darAzul( )
{
return azul;
}
/**
* Cambia el valor del componente rojo (R) en el color.
* @param pRojo Nuevo valor rojo del RGB. pRojo>=0.
*/
public void cambiarRojo( int pRojo )
{
rojo = pRojo;
}
/**
* Cambia el valor del componente verde (G) en el color.
* @param pVerde Nuevo valor verde del RGB. pVerde>=0.
*/
public void cambiarVerde( int pVerde )
{
verde = pVerde;
}
/**
* Cambia el valor del componente azul (B) en el color.
* @param pAzul Nuevo valor azul del RGB. pAzul>=0.
*/
public void cambiarAzul( int pAzul )
{
azul = pAzul;
}
}Construcción de la solución
/**
* Clase que representa un triángulo.
*/
public class Triangulo
{
// -----------------------------------------------------------------
// Atributos
// -----------------------------------------------------------------
/**
* Primer punto del triángulo.
*/
private Punto punto1;
/**
* Segundo punto del triángulo.
*/
private Punto punto2;
/**
* Tercer punto del triángulo.
*/
private Punto punto3;
/**
* Color de las líneas.
*/
private Color colorLineas;
/**
* Color del relleno.
*/
private Color colorRelleno;
// -----------------------------------------------------------------
// Métodos
// -----------------------------------------------------------------
/**
* Inicializa el triángulo. <br>
* <b>post: </b> Se inicializaron los atributos con los siguientes valores:<br>
* Punto 1: 200, 50
* Punto 2: 300, 200
* Punto 3: 100, 200
* Color relleno: 50, 168, 56
* Color líneas: 0, 83, 24
*/
public Triangulo( )
{
// Inicializa los puntos
punto1 = new Punto( 200, 50 );
punto2 = new Punto( 300, 200 );
punto3 = new Punto( 100, 200 );
// Inicializa los colores
colorRelleno = new Color( 60, 168, 56 );
colorLineas = new Color( 0, 83, 24 );
}
/**
* Retorna el punto 1 del triángulo.
* @return Punto 1.
*/
public Punto darPunto1( )
{
return punto1;
}
/**
* Retorna el punto 2 del triángulo.
* @return Punto 2.
*/
public Punto darPunto2( )
{
return punto2;
}
/**
* Retorna el punto 3 del triángulo.
* @return Punto 3.
*/
public Punto darPunto3( )
{
return punto3;
}
/**
* Retorna el color de las líneas del triángulo.
* @return Color de las líneas.
*/
public Color darColorLineas( )
{
return colorLineas;
}
/**
* Retorna el color del relleno del triángulo.
* @return Color del relleno.
*/
public Color darColorRelleno( )
{
return colorRelleno;
}
/**
* Retorna el perímetro del triángulo.
* @return Perímetro del triángulo.
*/
public double darPerimetro( )
{
// Retorna la suma de todos los lados
return calcularLado1( ) + calcularLado2( ) + calcularLado3( );
}
/**
* Retorna el área del triángulo, calculada utilizando la formula de Herón. <br>
* @return Área del triángulo.
*/
public double darArea( )
{
// Calcula el valor S para la formula
double perimetro = darPerimetro( );
double s = perimetro / 2;
// Calcula las restas para cada uno de los lados
double valorLado1 = s - calcularLado1( );
double valorLado2 = s - calcularLado2( );
double valorLado3 = s - calcularLado3( );
// Calcula y devuelve el área
double area = Math.sqrt( s * valorLado1 * valorLado2 * valorLado3 );
return area;
}
/**
* Calcula la altura del triángulo, teniendo en cuenta como base la línea entre el punto 1 y 2.<br>
* Tenga en cuenta que Área = (Base * Altura) / 2
* @return Altura del triángulo.
*/
public double darAltura( )
{
double area = darArea( );
double base = calcularLado1( );
double altura = ( area / base ) * 2;
return altura;
}
/**
* Calcula la distancia entre el punto 1 y 2.
* @return Distancia entre el punto 1 y el punto 2.
*/
private double calcularLado1( )
{
// Calcula las restas
double valorX = Math.pow( punto1.darX( ) - punto2.darX( ), 2 );
double valorY = Math.pow( punto1.darY( ) - punto2.darY( ), 2 );
// calcula la distancia
double distancia = Math.sqrt( valorX + valorY );
return distancia;
}
/**
* Calcula la distancia entre el punto 2 y 3.
* @return Distancia entre el punto 2 y 3.
*/
private double calcularLado2( )
{
// Calcula las restas
double valorX = Math.pow( punto2.darX( ) - punto3.darX( ), 2 );
double valorY = Math.pow( punto2.darY( ) - punto3.darY( ), 2 );
// calcula la distancia
double distancia = Math.sqrt( valorX + valorY );
return distancia;
}
/**
* Calcula la distancia entre el punto 3 y 1.
* @return Distancia entre el punto 3 y 1.
*/
private double calcularLado3( )
{
// Calcula las restas
double valorX = Math.pow( punto3.darX( ) - punto1.darX( ), 2 );
double valorY = Math.pow( punto3.darY( ) - punto1.darY( ), 2 );
// calcula la distancia
double distancia = Math.sqrt( valorX + valorY );
return distancia;
}
/**
* Calcula el ángulo opuesto entre un vértice de referencia y los otros dos vértices de un triángulo.
* @param pX1 Coordenada X del vértice de referencia.
* @param pY1 Coordenada Y del vértice de referencia.
* @param pX2 Coordenada X del vértice opuesto 1.
* @param pY2 Coordenada Y del vértice opuesto 1.
* @param pX3 Coordenada X del vértice opuesto 2.
* @param pY3 Coordenada Y del vértice opuesto 2.
* @return Ángulo opuesto entre vértice de referencia y los otros dos vértices.
*/
public double calcularAnguloOpuesto( double pX1, double pY1, double pX2, double pY2, double pX3, double pY3 )
{
// Ángulo 1
double angulo1 = Math.atan2( pY2 - pY1, pX2 - pX1 );
// Ángulo 2
double angulo2 = Math.atan2( pY3 - pY1, pX3 - pX1 );
// Garantiza que la diferencias de ángulos sea la más pequeña.
if( Math.abs( angulo1 - angulo2 ) > Math.PI )
{
angulo1 = angulo1 < 0 ? angulo1 + 2.d * Math.PI : angulo1;
angulo2 = angulo2 < 0 ? angulo2 + 2.d * Math.PI : angulo2;
}
// Calcula el ángulo opuesto
double anguloOpuesto = ( angulo1 + angulo2 ) / 2.d + Math.PI;
anguloOpuesto = anguloOpuesto % ( 2.d * Math.PI );
return anguloOpuesto;
}
/**
* Cambia el valor de la coordenada X y Y del punto 1.
* @param pX Nuevo valor de la coordenada X. pX>0.
* @param pY Nuevo valor de la coordenada Y. pY>0.
*/
public void cambiarPunto1( double pX, double pY )
{
punto1.cambiarX( pX );
punto1.cambiarY( pY );
}
/**
* Cambia el valor de la coordenada X y Y del punto 2.
* @param pX Nuevo valor de la coordenada X. pX>0.
* @param pY Nuevo valor de la coordenada Y. pY>0.
*/
public void cambiarPunto2( double pX, double pY )
{
punto2.cambiarX( pX );
punto2.cambiarY( pY );
}
/**
* Cambia el valor de la coordenada X y Y del punto 3.
* @param pX Nuevo valor de la coordenada X. pX>0.
* @param pY Nuevo valor de la coordenada Y. pY>0.
*/
public void cambiarPunto3( double pX, double pY )
{
punto3.cambiarX( pX );
punto3.cambiarY( pY );
}
/**
* Cambia el color de relleno del triángulo.
* @param pRojo Valor de componente rojo del RGB. pRojo>=0.
* @param pVerde Valor de componente verde del RGB. pVerde>=0.
* @param pAzul Valor de componente azul del RGB. pAzul>=0.
*/
public void cambiarColorRelleno( int pRojo, int pVerde, int pAzul )
{
colorRelleno.cambiarRojo( pRojo );
colorRelleno.cambiarVerde( pVerde );
colorRelleno.cambiarAzul( pAzul );
}
/**
* Cambia el color de la líneas del triángulo.
* @param pRojo Valor de componente rojo del RGB. pRojo>=0.
* @param pVerde Valor de componente verde del RGB. pVerde>=0.
* @param pAzul Valor de componente azul del RGB. pAzul>=0.
*/
public void cambiarColorLineas( int pRojo, int pVerde, int pAzul )
{
colorLineas.cambiarRojo( pRojo );
colorLineas.cambiarVerde( pVerde );
colorLineas.cambiarAzul( pAzul );
}
// -----------------------------------------------------------------
// Puntos de Extensión
// -----------------------------------------------------------------
/**
* Método para la extensión 1.
* @return Respuesta 1.
*/
public String metodo1( )
{
return "Respuesta 1";
}
/**
* Método para la extensión 2.
* @return Respuesta 2.
*/
public String metodo2( )
{
return "Respuesta 2";
}
}Text