martes, 28 de mayo de 2024

SIMULADOR PARA CALCULO DE RED INTERNA HFC

SIMULADOR DE RED INTERNA HFC

SIMULADOR DE RED INTERNA HFC

Cable Módem

Decodificador 1

Decodificador 2

Decodificador 3

jueves, 2 de mayo de 2024

DTH: DIRECT TO HOME

DTH: Direct to Home

DTH: Direct to Home

Imagen de antena DTH

¿Qué es DTH (Direct to Home- Directo al hogar) y qué servicios ofrece?

DTH (Direct to Home) es un servicio de televisión satelital que ofrece programación directamente a los hogares a través de señales satelitales. Los servicios ofrecidos incluyen una amplia gama de canales de televisión, así como servicios interactivos, de alta definición y de pago por visión. Consiste en transmitir señales de televisión a un hogar del cliente a través de un satélite de telecomunicaciones. Las señales de televisión se reciben a través de una antena parabólica y luego se decodifican a través de un STB (Set-Top-Box).

Imagen de satélite geoestacionario

¿Qué son los satélites geoestacionarios?

Son satélites que permanecen fijos en un punto específico del planeta porque orbitan la Tierra a una altitud y velocidad que coinciden con la rotación de la Tierra. Se utilizan ampliamente en telecomunicaciones, televisión por satélite y observación de la Tierra. Si el satélite gira en el mismo sentido que la Tierra y está bien colocado, siempre estará en la misma posición que la Tierra. Es como tener una estación de radio y televisión en la punta de una súper torre de 36.000 kilómetros de alto, pero sin la torre en sí misma.

Imagen de uplink y downlink

¿Qué es el uplink y el downlink?

El uplink y el downlink son los dos tipos de comunicaciones que se realizan entre la sonda espacial y la estación de seguimiento ubicada en la Tierra. El uplink se refiere a la transmisión de datos desde una estación terrestre a un satélite, mientras que el downlink es la transmisión de datos desde el satélite de vuelta a la estación terrestre. El término "simplex" se refiere a las comunicaciones en las que solo hay un enlace descendente. Por otro lado, un "dúplex" se produce cuando una comunicación uplink y downlink funciona simultáneamente.

Imagen de azimut y elevación

¿Qué es la elevación y el azimut?

El azimut y la elevación son las dos coordenadas que definen la posición de un cuerpo celeste (sol, luna) en el cielo cuando es observado desde una localización concreta, en un momento determinado. La elevación es la distancia angular vertical que hay entre un cuerpo celeste y el horizonte local o plano local del observador. Para nosotros, el ángulo que forma la dirección del centro geométrico y el horizonte local del observador es la elevación del sol mientras que el azimut es el ángulo horizontal medido en dirección norte desde una ubicación específica hacia el satélite.

King Kong

Consulta sobre el medidor sat Finder King Kong.

El medidor Sat Finder King Kong es un dispositivo utilizado para alinear adecuadamente una antena parabólica con un satélite específico. Permite medir la calidad de la señal y la potencia recibida. Se le dará acimut, elevación e inclinación del LNB para su ubicación (basado en el GPS) y el satélite elegido de la lista. El resultado se muestra tanto como datos numéricos y gráficos en los mapas de Google.

¿Cuáles son sus parámetros MER, BER?

MER (Relación de Energía de la Señal) es la relación entre la potencia de la señal deseada y la potencia de ruido en el transpondedor del satélite. BER (Tasa de error de bits) es la cantidad de bits incorrectos recibidos en relación con el total de bits transmitidos.

¿Qué es la banda C y la banda Ku? ¿Cuáles son sus diferencias?

La banda C y la banda Ku son rangos de frecuencia utilizados para la comunicación satelital. La banda C tiene frecuencias más bajas (generalmente entre 4 y 8 GHz) y se utiliza comúnmente para telecomunicaciones. La banda Ku tiene frecuencias más altas (generalmente entre 12 y 18 GHz) y se utiliza principalmente para televisión directa al hogar y servicios de Internet.

Bandas
Logo CRC

¿Qué entidad regula este servicio en Colombia?

En Colombia, la Comisión de Regulación de Comunicaciones (CRC) es la entidad encargada de regular el servicio de telecomunicaciones.

Algunos operadores de servicios DTH en Colombia incluyen DirecTV, Movistar TV Satelital y Claro TV Satelital.

¿Menciona satélites utilizados para dar esta tecnología y en qué países operan?

Algunos de los satélites utilizados para ofrecer servicios DTH en América Latina incluyen el Satmex 6, Hispasat 30W-5, SES-6 y Amazonas 3, entre otros. Estos satélites operan en diferentes posiciones orbitales y cubren diferentes áreas geográficas, incluida Colombia.

¿Cuáles son los componentes para la instalación de DTH?

Imagen de la Antena

Antena:

Es un dispositivo diseñado para recibir señales electromagnéticas, como las de radio o televisión, y convertirlas en señales eléctricas que puedan ser utilizadas por un receptor. En el contexto de la televisión por satélite, una antena parabólica se utiliza para recibir señales de satélite.

Imagen del LNB

LNB (Low Noise Block):

Es un dispositivo ubicado en el extremo frontal de una antena parabólica que recibe las señales de satélite reflejadas por la antena y las convierte en señales eléctricas que pueden ser procesadas por el receptor. También amplifica estas señales y reduce el ruido para mejorar la calidad de la señal.

Imagen del Cable Coaxial RG-6

Cable Coaxial RG-6:

Es un tipo de cable utilizado para transmitir señales de radiofrecuencia, como las utilizadas en la televisión por cable o satélite. El RG-6 es una variante específica de cable coaxial que se utiliza comúnmente en aplicaciones de televisión por satélite debido a su capacidad para transportar señales de alta frecuencia con pérdidas mínimas.

Imagen del Decodificador

Decodificador:

También conocido como receptor de satélite o set-top box, es un dispositivo electrónico utilizado para recibir señales de televisión por satélite y convertirlas en imágenes y sonidos que pueden ser mostrados en un televisor. El decodificador también puede ofrecer funciones adicionales, como la capacidad de grabar programas, acceder a servicios de video bajo demanda o interactuar con servicios interactivos.

Imagen del Cable de Conexión a TV

Cable de Conexión a TV:

Es el cable utilizado para conectar el decodificador al televisor. Suele ser un cable HDMI o un cable RCA, dependiendo de las conexiones disponibles en el televisor y en el decodificador.

Imagen del Televisor

Televisor:

Es un dispositivo electrónico diseñado para mostrar imágenes y reproducir sonido. En el contexto de la televisión por satélite, el televisor se utiliza como pantalla para mostrar los programas transmitidos por el decodificador a partir de las señales recibidas por la antena y el LNB.

Instalación de servicios de Direct TV

miércoles, 1 de noviembre de 2023

DISPOSITIVOS ACTIVOS HFC RED EXTERNA

Dispositivos Activos en Redes HFC

Dispositivos Activos en Redes HFC

Fuente de Alimentación, Nodo Óptico, Amplificadores

Fuente de Alimentación

Fuente de Alimentación

La fuente de alimentación proporciona la energía necesaria para los dispositivos activos de la red HFC, asegurando su correcto funcionamiento.

Símbolo Fuente de Alimentación
Nodo Óptico

Nodo Óptico

El nodo óptico convierte las señales ópticas en eléctricas, distribuyendo la señal a través del cable coaxial. Es esencial para transmitir datos a los usuarios finales.

Símbolo Nodo Óptico
Amplificador de una salida

Amplificador de Una Salida

Este amplificador refuerza la señal que viaja por el cable coaxial, ideal para áreas con pocos usuarios o donde se requiere una única salida de señal.

Símbolo Amplificador de una salida
Amplificador de tres salidas

Amplificador de Tres Salidas

El amplificador de tres salidas permite la distribución de la señal a varias ubicaciones, garantizando que llegue con la potencia adecuada a cada destino.

Símbolo Amplificador de tres salidas

domingo, 1 de octubre de 2023

EJERCICIOS VARIOS DE PYTHON

 

Saludos a todos, les traigo unos ejercicio variados para practicar, pueden aplicar para exámenes.

Consta en la creación de 7 funciones, espero les sirva:

1. Obtener un número binario: recibe como argumento un número entero mayor ó igual a cero y lo devuelve en su representación binaria. Debe recibir y devolver un valor de tipo entero.

1
2
3
4
5
6
def numeroBinario(numero):
    if (isinstance(numero, int)) and numero>-1:
        binario=format(numero,'b')
        return int(binario)
    else:
        return None


2.  Dividir y multiplicar números en listas: La función recibe como argumento una lista de números enteros, y debe retornar una lista con los siguientes parámetros:

  • Los números que sean positivos y pares se deben dividir por 2, y el resultado expresado como entero (sin decimales, no redondeando, debe tomar sólo la parte entera de la división por 2).
  • Los números negativos multiplicados por 2.
  • Los que no cumplan los criterios anteriores deben quedar igual al valor original.
  • Ordenar los números de mayor a menor.

   Ej: dividirMultiplicar([2,4,1,-3]): debe retornar: [2, 1, 1, -6]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def dividirMultiplicar(lista):
   lista_entero = []
   for i in lista:
      if (i >= 0 and i%2 == 0):
         lista_entero.append(i//2)
      elif i<0:
         lista_entero.append(i*2)
      else:
         lista_entero.append(i)
   lista_entero.sort(reverse=True)      
   return lista_entero

3. Ordenar palabras: La función recibe como argumento una secuencia de palabras unidas por guiones, y debe retornar las mismas palabras, unidas por guiones, pero en orden alfabético. Si el argumento que se le pasa no es un string o no contiene guiones, debe retornar nulo.

   EJ: ordenarPalabras('saco-libro-casa') debe retornar 'casa-libro-saco'

   EJ: ordenarPalabras('Hola') debe retornar nulo

   Pista: investigar métodos de string

1
2
3
4
5
6
7
8
def ordenarPalabras(palabras):
   if "-" not in palabras:
       return None
   palabras_separadas = palabras.split("-")
   palabras_ordenadas = sorted(palabras_separadas)
   resultado = "-".join(palabras_ordenadas)

   return resultado

  4. Triángulo rectángulo  La función debe recibir como argumentos el valor en cm de los lados de un triángulo (a y b son los catetos), y dado estos valores, retornar True si en efecto corresponden a un triángulo rectángulo, o False en caso contrario. Sólo se debe poder pasar valores enteros como argumentos de la función, caso contrario debe retornar nulo.

   EJ: trianguloRectangulo(3.5,3.5,2.4), debe retornar nulo

   EJ: trianguloRectangulo(3,3,3), debe retornar False

   EJ: trianguloRectangulo(3,4,5), debe retornar True

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
def trianguloRectangulo(a,b,c):
   if (isinstance(a, int)==True and isinstance(b, int)==True and isinstance(c, int)==True):
       if (a>b and a>c): # la hipotenusa es a
          hipotenusa = a
          cateto1 = b
          cateto2 = c
       elif (b>a and b>c): #la hipotenusa es b
          hipotenusa = b
          cateto1 = a
          cateto2 = c
       elif (c>a and c>b): # la hipotenusa es c
          hipotenusa = c
          cateto1 = a
          cateto2 = b
       else:
          hipotenusa = a
          cateto1 = b
          cateto2 = c   

       if (hipotenusa**2 == cateto1**2 + cateto2**2 ):
          return True
       else:
          return False
   
   return None


5. Diccionario: La función recibe como argumento una lista de números enteros, y debe retornar un diccionario con tres claves, "multiplos3", 'cuadrados", "menores_promedio".

   Para la clave "multiplos3", el valor debe ser una lista con los múltiplos de 3 de la lista original.

   Para la clave "cuadrados", el valor debe ser una lista con los valores de la lista original elevados al cuadrado.

   Para la clave "menores_promedio", el valor debe ser una lista con los valores menores al promedio de la lista original.

   EJ: crearDiccionario([3,6,7,12]): debe retornar: {'multiplos3': [3, 6, 12], 'cuadrados': [9, 36, 49, 144], 'menores_promedio': [3, 6]}

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def crearDiccionario(lista):


   multiplos3=[]
   cuadrados=[]
   menores_promedio=[]
   longitud_lista=len(lista)
   suma_lista=sum(lista)
   promedio_lista=suma_lista/longitud_lista

   for numero in lista:
       cuadrados.append(numero**2)
       if numero%3==0:
           multiplos3.append(numero)
       if numero<promedio_lista:
           menores_promedio.append(numero)
       
   diccionario ={
        'multiplos3':multiplos3,
        'cuadrados':cuadrados,
        'menores_promedio':menores_promedio
    }  
       
   return diccionario

6. Diccionario adicional: Dado el siguiente diccionario ciudades, la función debe retornar una lista de listas, donde cada elemento de la lista sea una lista con el par ['ciudad', población], pero sólo de las ciudades que comiencen con la letra 'B', y como último elemento de la lista el par ['promedio', promedio de población] con el promedio de población de las ciudades seleccionadas.

ciudades = {

      'São Paulo': 21048514,

      'Buenos Aires': 14975587,

      'Río de Janeiro': 11902701,

      'Bogotá': 10777931,

      'Lima': 10479899,

      'Santiago de Chile': 7112808,

      'Belo Horizonte': 6006091,

      'Caracas': 5622798,

      'Brasília': 4291577

      }

   Ej: Si se pidiera ciudades que comiencen con la letra 'S', debe devolver: [['São Paulo', 21048514], ['Santiago de Chile', 7112808],['promedio', 14080661.0]]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
def ciudadesPoblacion(diccionario):

   ciudades_B=[]
   total_poblacion=0
   for ciudad, poblacion in diccionario.items():

        if ciudad.startswith('B'):
            ciudades_B.append([ciudad,poblacion])
            total_poblacion=total_poblacion+poblacion
   promedio=total_poblacion/len(ciudades_B)
   ciudades_B.append(["promedio",promedio])

   
   return ciudades_B

Muchas gracias por la visita.

jueves, 11 de mayo de 2023

CONCEPTOS BÁSICOS DE JAVA: PROGRAMACION ORIENTADA A OBJETOS (POO)

PROGRAMACION ORIENTADA A OBJETOS(POO)

La Programación Orientada a Objetos (POO) es un paradigma de la programación la cual se basa en la creación y manipulación de objetos, cuyos conceptos más importantes son: 
  • Clase
  • Objeto
  • Encapsulamiento
  • Herencia
  • Polimorfismo
  • Asociación
  • Composición
CLASE

Es un modelo que define propiedades y comportamientos comunes a un grupo de objetos. Las clases son los componentes fundamentales de la POO y se utilizan para crear instancias u objetos.

public class Persona {
private String nombre;
private int edad;

public Persona(String nombre, int edad) {
//Constructor
this.nombre = nombre;
this.edad = edad;
}

public void saludar() {
//método
System.out.println(
"Hola, soy " + nombre + " y tengo " + edad + " años.");
}

public static void main(String[] args) {
//método
Persona persona1 = new Persona(
"Juan", 25);//Creación instancia de la clase Persona
System.out.println(persona1.nombre);
// Imprime "Juan"
System.out.println(persona1.edad); // Imprime 25
persona1.saludar(); // Imprime "Hola, soy Juan y tengo 25 años."
}
}
Se define la clase Persona con dos atributos: nombre (de tipo String) y edad (de tipo int). El constructor de la clase se llama Persona y se utiliza para inicializar los atributos.

El método saludar imprime un mensaje de saludo utilizando los valores de nombre y edad.

En el método main, se crea una instancia de la clase Persona llamada persona1, pasando los valores "Juan" y 25 para el nombre y la edad, respectivamente. Luego, se accede a los atributos nombre y edad de la instancia y se llama al método saludar, que muestra un mensaje en la consola.


OBJETO

Un objeto es una instancia concreta de una clase. Posee propiedades (atributos) y comportamientos (métodos) definidos por su clase. Los objetos representan entidades del mundo real y se utilizan para interactuar con el sistema.

public class Persona {
    private String nombre;
    private int edad;

    public Persona(String nombre, int edad) {
        this.nombre = nombre;
        this.edad = edad;
    }

    public void saludar() {
        System.out.println(
"Hola, soy " + nombre + " y tengo " + edad + " años.");
    }

    public static void main(String[] args) {
        Persona persona1 = new Persona(
"Juan", 25);
        persona1.saludar(); // Imprime "Hola, soy Juan y tengo 25 años."
   
}
}


En el método main, se crea una instancia de Persona llamada persona1 con los valores "Juan" y 25 para el nombre y la edad, respectivamente. Luego, se llama al método saludar de persona1, lo cual muestra un mensaje de saludo en la consola.

ENCAPSULAMIENTO

 La encapsulación es un principio de la POO que consiste en ocultar los detalles internos de un objeto y exponer solo una interfaz para interactuar con él. Permite proteger los datos y asegurar que solo puedan ser accedidos y modificados a través de métodos definidos en la clase.

public class Persona {
private String nombre;
private int edad;

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
if (edad > 0) {
this.edad = edad;
} else {
System.out.println("La edad debe ser mayor que 0.");
}
}
}

En este ejemplo, los atributos nombre y edad están definidos como privados, lo que significa que solo se pueden acceder a ellos desde dentro de la clase Persona. Para acceder a estos atributos desde fuera de la clase, se proporcionan métodos públicos de acceso, conocidos como getters y setters.

Los métodos getNombre y getEdad son getters, que devuelven el valor de los atributos nombre y edad, respectivamente.

Los métodos setNombre y setEdad son setters, que permiten establecer los valores de los atributos nombre y edad, respectivamente. En el caso del setter setEdad, se realiza una validación para asegurarse de que la edad sea mayor que 0 antes de establecerla. Si la edad no cumple esta condición, se muestra un mensaje de error en la consola.

ABSTRACCIÓN: La abstracción es el proceso de simplificar un objeto o sistema enfocándose solo en los aspectos relevantes para un contexto determinado. Permite definir clases y objetos que representen conceptos del dominio de manera abstracta, sin considerar todos los detalles de implementación.

HERENCIA

La herencia es un mecanismo que permite crear nuevas clases basadas en clases existentes, heredando sus propiedades y comportamientos. La clase existente se denomina clase base o superclase, mientras que la nueva clase se denomina clase derivada o subclase. La herencia facilita la reutilización de código y la extensibilidad.

Volvemos a utilizar nuestra clase Persona la cuál sería la clase existente, por lo tanto es nuestra clase base(superclase)

class Persona {
private String nombre;
private int edad;

public Persona(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public String getNombre() {
return nombre;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public int getEdad() {
return edad;
}

public void setEdad(int edad) {
this.edad = edad;
}

public void saludar() {
System.out.println("Hola, soy " + nombre + " y tengo " + edad + " años.");
}
}

Aplicaremos la herencia utilizando la clase Estudiante la cual se denomina clase derivada o subclase.

class Estudiante extends Persona {
private String curso;

public Estudiante(String nombre, int edad, String curso) {
super(nombre, edad);
this.curso = curso;
}

public String getCurso() {
return curso;
}

public void setCurso(String curso) {
this.curso = curso;
}

public void estudiar() {
System.out.println("Estoy estudiando " + curso);
}
}
public class EjemploHerencia {
public static void main(String[] args) {
Estudiante estudiante = new Estudiante("Juan", 20, "Informática");
estudiante.saludar();
estudiante.estudiar();
}
}

Ejercicio: De acuerdo a lo estudiado a este punto, ¿Cuáles son las salidas que nos dará la implementación del código?

POLIMORFISMO

El polimorfismo permite que un objeto pueda tomar diferentes formas y comportarse de manera distinta en diferentes contextos. Puede manifestarse a través de la sobrecarga de métodos (mismos nombres, diferentes parámetros) o la sobrescritura de métodos (implementaciones diferentes en las subclases).

public class Animal {
public void hacerSonido() {
System.out.println("El animal hace un sonido.");
}
}

public class Perro extends Animal {
@Override
public void hacerSonido() {
System.out.println("El perro ladra.");
}
}

public class Gato extends Animal {
@Override
public void hacerSonido() {
System.out.println("El gato maulla.");
}
}

public class EjemploPolimorfismo {
public static void main(String[] args) {
Animal animal1 = new Perro();
Animal animal2 = new Gato();

animal1.hacerSonido();
animal2.hacerSonido();
}
}

En este ejemplo, tenemos una clase base Animal con un método hacerSonido(). Las subclases Perro y Gato heredan de la clase Animal y sobrescriben el método hacerSonido() con su propia implementación. 

En el método main(), creamos objetos de las subclases Perro y Gato pero los asignamos a variables de tipo Animal. Esto es posible debido al principio de polimorfismo en la programación orientada a objetos. 

Al llamar al método hacerSonido() en los objetos animal1 y animal2, se ejecutará la implementación específica de cada subclase (Perro y Gato). Esto demuestra cómo el mismo método puede comportarse de manera diferente dependiendo del tipo de objeto al que se llama en tiempo de ejecución.

El @Override es una anotación en Java que se utiliza para indicar que un método de una subclase está sobrescribiendo un método de la clase base. Esta anotación es opcional, pero se considera una buena práctica incluirla para mejorar la legibilidad del código y evitar posibles errores.

 Cuando se utiliza @Override, el compilador de Java verificará si el método decorado con esta anotación realmente está sobrescribiendo un método de la clase base. Si no se encuentra un método en la clase base que coincida con la firma del método anotado, se generará un error de compilación.

ASOCIACIÓN

La asociación es una relación entre dos o más clases, donde cada clase conserva su independencia. Puede haber asociaciones unidireccionales o bidireccionales, y pueden ser de tipo uno a uno, uno a muchos o muchos a muchos.

public class Usuario {
private String nombre;
private int edad;

public Usuario(String nombre, int edad) {
this.nombre = nombre;
this.edad = edad;
}

public String getNombre() {
return nombre;
}

public int getEdad() {
return edad;
}
}

public class Biblioteca {
private String nombre;
private Usuario[] usuarios;

public Biblioteca(String nombre) {
this.nombre = nombre;
this.usuarios = new Usuario[100];
}

public void agregarUsuario(Usuario usuario) {
// Lógica para agregar un usuario a la biblioteca
// Aquí se puede implementar la asociación entre Usuario y Biblioteca
}

public void mostrarUsuarios() {
// Lógica para mostrar los usuarios de la biblioteca
// Aquí se puede acceder a los datos de los usuarios asociados
}
}

public class EjemploAsociacion {
public static void main(String[] args) {
Usuario usuario1 = new Usuario("Juan", 25);
Usuario usuario2 = new Usuario("María", 30);

Biblioteca biblioteca = new Biblioteca("Biblioteca Central");
biblioteca.agregarUsuario(usuario1);
biblioteca.agregarUsuario(usuario2);

biblioteca.mostrarUsuarios();
}
}

En este ejemplo, las clases Usuario y Biblioteca están asociadas. La clase Usuario representa a un usuario con un nombre y una edad. La clase Biblioteca representa una biblioteca con un nombre y una lista de usuarios.

La asociación se establece a través del método agregarUsuario() en la clase Biblioteca. Este método permite agregar un usuario a la lista de usuarios de la biblioteca.

Mediante esta asociación, la clase Biblioteca puede acceder a los datos de los usuarios asociados y realizar operaciones relacionadas, como mostrar la lista de usuarios en el método mostrarUsuarios().

En el método main(), creamos instancias de Usuario y una instancia de Biblioteca. Luego, agregamos los usuarios a la biblioteca utilizando el método agregarUsuario(). Finalmente, mostramos la lista de usuarios llamando al método mostrarUsuarios() de la biblioteca.

Este ejemplo ilustra cómo las clases Usuario y Biblioteca están asociadas, permitiendo que la biblioteca gestione y acceda a los usuarios asociados.

COMPOSICIÓN

La composición es un tipo especial de asociación donde una clase contiene a otras clases como parte de su estructura interna. La relación de composición es más fuerte que la asociación, ya que las clases contenidas no existen de forma independiente y su ciclo de vida está estrechamente ligado a la clase contenedora.

public class Coche {
private String marca;
private Motor motor;

public Coche(String marca, String tipoMotor) {
this.marca = marca;
this.motor = new Motor(tipoMotor);
}

public String getMarca() {
return marca;
}

public String getTipoMotor() {
return motor.getTipo();
}
}

public class EjemploComposicion {
public static void main(String[] args) {
Coche coche = new Coche("Toyota", "Gasolina");

System.out.println("Marca: " + coche.getMarca());
System.out.println("Tipo de motor: " + coche.getTipoMotor());
}
}

En este ejemplo, la clase Coche tiene una composición con la clase Motor. Cada instancia de Coche contiene un objeto Motor como parte de su estructura interna.

La clase Motor representa el motor de un coche y tiene un atributo tipo que indica el tipo de motor.

La clase Coche tiene un atributo marca para indicar la marca del coche y un atributo motor que es una instancia de la clase Motor.

En el constructor de Coche, se crea una instancia de Motor pasando el tipo de motor como argumento y se asigna a la variable motor.

En el método main(), creamos un objeto Coche y obtenemos la marca y el tipo de motor llamando a los métodos getMarca() y getTipoMotor() respectivamente.

La composición se refleja en el hecho de que un coche está compuesto por un motor. El objeto Motor es creado y gestionado por la clase Coche, y forma parte integral de la estructura del coche.

La salida del programa será:

Marca: Toyota
Tipo de motor: Gasolina