Академический Документы
Профессиональный Документы
Культура Документы
ESCUELA DE INGENIERÍA
DEPARTAMENTO DE CIENCIA DE LA COMPUTACIÓN
IIC 1102 INTRODUCCIÓN A LA PROGRAMACIÓN
Profesor: Rodrigo Sandoval U.
1.2 Definiciones
1.2.1 Problema
Un problema es una abstracción de la realidad para la cual nos interesa conocer una solución,
entendiendo que una solución altera el estado inicial del problema, llevándolo a un estado deseado. Es
decir, una solución es un procedimiento o método para establecer el mecanismo de transformación del
mundo que nos lleve a satisfacer ciertos requerimientos.
1.2.2 Objeto
El mundo está compuesto de objetos físicos y simbólicos. Los “objetos” en programación OO son
elementos simbólicos que representan objetos físicos del mundo real.
En particular se utiliza el término “clase” para describir un tipo de objeto en particular, que tiene ciertas
características comunes.
1.2.3 Instancia
Una instancia es un objeto específico que se puede relacionar con otras instancias u objetos del mismo
tipo o de otro tipo. Específicamente, una instancia es un objeto de una clase específica.
1.2.4 Modelo
Toda estructura que se utiliza para dar razón y abstraer de la realidad a un conjunto de acciones o
fenómenos que guardan entre sí ciertas relaciones.
El ejemplo más simple de un modelo es una instancia, la que no tiene relación alguna mas que la de ella
misma con su objeto respectivo.
Modelos más complejos son los arreglos, registros, archivos y combinaciones de éstos. Los lenguajes de
programación normalmente proveen varias combinaciones (no todas) de modelos más complejos. Un
enfoque más reciente (años ‘90) para la resolución de problemas, se basa en la utilización de “Objetos”,
estableciendo un esquema en que cada elemento del mundo real se representa con mayor precisión y
fidelidad, logrando así soluciones modulares (compuestas por partes hasta cierto punto independientes,
que potencialmente pueden reutilizarse en otros modelos) y con encapsulación (que logra ocultar la
complejidad de soluciones en ciertos módulos, evitando que los participantes de la solución tengan que
dominar cada parte de ésta). A este esquema se le conoce como Orientación a Objetos.
El diseño e implementación de un modelo son fundamentales para la solución de un problema
computacional.
1.3 Algoritmos
Luego, a partir de los objetos y operaciones definidas, se procede a enumerar los pasos que componen el
algoritmo. En esta etapa se puede emplear los componentes básicos de control de flujo (decisión e
iteración).
La principal destreza que se debe desarrollar para escribir algoritmos consiste en poder abstraer un
problema y conceptualizarlo de modo que se pueda expresar su solución en términos de las operaciones
básicas entre objetos que se definieron. Para esto nos apoyaremos en la descomposición en partes y
subproblemas más simples, las cuales también requieren de cierto grado de conceptualización.
Aún cuando muchos algoritmos resulten simples al final, el proceso para llegar a ellos puede ser muy
complicado. Existen varios enfoques que se pueden seguir para elaborar un algoritmo a partir de la
definición del problema:
• Buscar similitud con otros problemas
• Utilizar ejemplos conocidos
• Utilizar algoritmos genéricos conocidos
• Conceptualizar actividades y objetos participantes
• Descomponer en subproblemas
La metodología presentada en este curso hace uso de los dos últimos, aunque en algunos casos
recurriremos al resto como apoyo.
una secuencia de pasos, o algoritmo, que establece las relaciones entre los objetos, alcanzando el
objetivo buscado.
Una especificación de un algoritmo de solución, puede presentar problemas: que el algoritmo resuelva
más de lo que el problema pide (aunque esto por lo general no es perjudicial) o que el algoritmo no
resuelva todo lo que el problema requiere.
Para resolver estos problemas es necesario entonces validar la solución y/o especificar limitaciones del
algoritmo de solución. A veces esta tarea puede ser compleja, debido que para validar la solución y
conocer sus limitaciones hay que ser exhaustivo con el análisis o seguimiento de la especificación del
algoritmo, considerando todos los casos posibles.
Los casos posibles que generalmente no resuelven todas las partes del problema dado, son los casos
extremos, como por ejemplo datos nulos si se trata de números, datos negativos si se trata de
operaciones aritméticas con números positivos, o por ejemplo para la receta de cocina que se utilice
"huevos" pasados en lugar de frescos, etc.
Tanto para el diseño de un algoritmo de solución a un problema dado, como para su validación se
requiere experiencia. PARA TENER EXPERIENCIA ES NECESARIO TENER PRÁCTICA EN LA
RESOLUCION DE PROBLEMAS. PARA TENER PRÁCTICA ES NECESARIO RESOLVER MUCHOS
PROBLEMAS.
2 Orientación a Objetos
En años recientes se ha adoptado, más que una técnica, un enfoque basado en lo que genéricamente se
denomina “Objeto”, a diferencia de esquemas tradicionales, denominados “Procedurales”, en los cuales la
solución se especifica como una secuencia de pasos y subpasos.
En el esquema de Orientación a Objetos se parte de la premisa “El Mundo Real está compuesto de
Objetos que interactúan”, y no es un mundo procedural, en que todo ocurre secuencialmente.
La Programación Orientada a Objetos tiene como punto medular el uso de “objetos”, que en realidad son
estructuras lógicas que representan elementos o entidades del mundo real. Esta representación se basa
en los siguientes aspectos:
• Se usan nombres que permiten hacer una rápida asociación con el correspondiente objeto. Por
ej: para representar un vehículo, se puede definir un objeto o entidad denominado “Auto”.
• Para representar el estado del objeto, se utilizan variables, denominadas atributos o
propiedades, que almacenan diferentes valores que pueden ir cambiando en el tiempo. Por ej: el
auto puede estar representado por “cilindraje”, “velocidad”, etc.
• Para describir el comportamiento del objeto y cómo éste interactúa con otros de su mismo tipo o
de otro tipo, se definen métodos, que corresponden a acciones específicas del objeto, una vez
más, simulando el mundo real. Por ej: “avanzar”, “frenar”, “abrir la puerta delantera derecha”, etc.
Especificar la secuencia de actividades que conforman la solución del problema. Esta especificación debe
ser autocontenida y debe estar dada en términos de las entidades/objetos definidos en (2).
Cada uno de los pasos del algoritmo podrá ser una operación simple o alguna operación sobre uno de las
instancias de los objetos.
4. Validación de la Solución
El cuarto paso: habiendo definido el problema y descrito una solución se hace un estudio
de los posibles escenarios en que la solución puede funcionar. Los escenarios se definen
en función de los rangos de valores que los parámetros de la solución pueden recibir.
4.1. Dominios. Especificar un conjunto de problemas tipo y sus soluciones, los cuales
caracterizan el dominio del problema. Debe haber un problema para cada posible dominio.
4.2. Ejecución. Ejecutar el algoritmo obtenido en (3) para cada uno de los problemas que representan
los distintos dominios, validando que se obtengan las soluciones especificadas, es decir, que se
alcancen los objetivos propuestos en cada caso.
Tomemos por ejemplo el caso de un cajero automático. En este caso, consideraremos que el programa
que reside en el cajero es la aplicación a describir, y que los actores involucrados son: un usuario o
cliente que acudirá al cajero, y el sistema central que tiene los datos de las cuentas corrientes de los
clientes.
En este modelo, un cliente efectúa dos posibles acciones sobre el cajero: Consulta de Saldo y Retiro de
Dinero. El cajero a su vez requiere consultar los datos al sistema central para ambos casos, y en
particular en el retiro de dinero, adicionalmente actualiza el saldo del cliente en el mismo sistema central.
2. Conceptualización de la solución
Entidades Involucradas: Dos objetos esenciales se reconocen en este problema: el jugador y el arquero.
Clases de Objetos: En este caso particular, ambas entidades se representan cada una por su respectiva
clase.
Clase Jugador: Representa a un jugador que lanzará la pelota tratando de convertir el penal.
Atributos: El número en su camiseta, y la dirección en que lanzará.
Métodos: patear la pelota
Clase Arquero: Representa a un jugador que intentará impedir que el gol sea convertido.
Atributos: la dirección en que se lanza para atajar.
Métodos: Lanzarse a atajar.
Instancias Involucradas: en este caso sólo se necesita una instancia de la clase Jugador, que representa
a quien ejecutará el penal, y adicionalmente se requiere una única instancia de la clase Arquero, ya que
sólo uno de ellos participa en el penal.
Atributos:
- Número
- Dirección
Atributos:
- Dirección
Métodos:
- Lanzarse
Métodos:
- Patear
4. Validación de la Solución
Dominios: Los posibles dominios que existen en el contexto de este problema se constituyen a partir de
los valores de dirección que el usuario puede ingresar. Es decir, los escenarios posibles se conforman de
las 4 diferentes combinaciones de direcciones para ambos jugadores: der-der; izq-izq; izq-der; der-izq.
Validación: revisando las cuatro posibles combinaciones de valores indicados por el usuario, se llega en
todos ellos a un resultado predecible por el algoritmo principal, por lo que se valida su ejecución.
5. Limitaciones
Si los valores ingresados por el usuario no son controlados, entonces se podría asumir que el programa
podría tener un comportamiento incoherente.
Posibles soluciones:
Versión de Consola
Versión Windows
2. Conceptualización de la solución
Entidades Involucradas: el objeto principal es la receta del pastel, que será preparado durante el
proceso. La receta se compone de las cantidades respectivas de cada ingrediente, además del tiempo de
horneado, el tipo de fruta, y los trozos en que deberá partirse.
Clases de Objetos: la única clase requerida es pastel, la cual se define con ciertas propiedades privadas,
y algunos métodos públicos. Las propiedades privadas son las cantidades de huevos, harina,
mantequilla, y fruta, el tiempo de horneado, el tipo de fruta, y la cantidad de pedazos. Todos ellos son
datos numéricos a excepción del tipo de fruta, que es de tipo texto.
El proceso de hornear y servir el pastel abarca varias etapas. En primera instancia se debe obtener la
receta a emplear. Esto consiste en especificar la cantidad de huevos, mantequilla y harina, así como el
tipo y la cantidad de fruta que se utilizará. El segundo paso consiste en preparar la base del pie,
mezclando la cantidad especificada de huevos, harina y mantequilla. Luego, la base es horneada durante
cierto tiempo (lo cual también es parte de la receta). El siguiente paso es preparar la fruta con la que se
cubrirá la base. Finalmente, se procede a cortarlo y servirlo a todos los comensales. Por esto, los
métodos de esta clase son:
MezclarBase(): Se toman las cantidades definidas de huevos, harina y mantequilla y se mezclan para
lograr la base.
HornearBase(): Según el tiempo definido, que representa la cantidad de minutos que deberá permanecer
la base en el horno, este proceso se encarga de hornear la base durante dicho tiempo.
PrepararFruta(): Usando el tipo o nombre de la fruta que se empleará para cubrir la base, y la cantidad
(en gramos) de dicha fruta que debe emplearse (según la receta), este proceso prepara la cubierta.
CortarServir(): Tomando el tipo de fruta con que se cubrió el pastel y la cantidad de invitados
establecidos, este proceso se encarga de cortar el pastel en tantos pedazos como comensales haya y lo
sirve para que los invitados lo puedan comer. El tipo de fruta es necesario para que al servirlo a los
comensales se les pueda indicar qué tipo de pie van a comer.
Instancias: En el contexto de nuestro problema, será necesario representar una variable u objeto de clase
Pastel, que representa el pastel a preparar en base a su receta (huevos, harina, mantequilla, fruta), el
tiempo que debe permanecer el pie en el horno, y la cantidad de comensales que lo disfrutarán. El
nombre de esta instancia: pas.
Atributos:
- Huevos Métodos:
- Harina - MezclarBase()
- Mantequilla - HornearBase()
- Fruta - PrepararFruta()
- Tiempo de horneado - CortarServir()
- Tipo de fruta
- Cantidad pedazos
La implementación en C# de este algoritmo resulta bastante simple. Basta con implementar e invocar el
método para cada una de las tareas involucradas. Esta función simulará el proceso que debe llevar a
cabo la tarea. Las primeras líneas del algoritmo involucran la creación de la instancia, junto con la entrada
de datos por parte del usuario del programa (debe proporcionar los valores apropiados para las
propiedades de esta instancia).
4. Validación de la Solución
Dominios: Los posibles dominios que existen en el contexto de este problema se constituyen a partir de
los distintos valores de entrada que pueden recibirse del usuario. Es decir, distintos tipos de fruta,
distintas cantidades para cada ingrediente, distintos tiempos en el horno y distintas cantidades de
comensales.
Validación: Debe ejecutarse (verbalizarse su ejecución) el algoritmo para los dominios definidos, es decir,
cambiando valores para cada dato de entrada, y verificando que se puede alcanzar el objetivo buscado.
A priori, no hay validación de las cantidades numéricas indicadas, por lo que el algoritmo funcionaría, aún
cuando se ingresen valores que no tengan sentido de acuerdo al contexto, como por ejemplo usar
cantidades de minutos negativas o cero, o nombres incongruentes de frutas.
5. Limitaciones de la Solución
En principio, no hay limitaciones evidentes en el caso de la solución planteada en este ejemplo, ya que el
programa funcionaría incluso con números incoherentes (números negativos, nulos) en los valores
indicados por el usuario.
2. Conceptualización de la solución
Entidades Involucradas: el objeto principal es claramente el auto. Es esta entidad la que contiene todos
los elementos relevantes de manejar en esta solución, como son las ruedas, el maletero, y todos los
elementos dentro de él, necesarios para el cambio de rueda.
Clases de Objetos: la única clase requerida en este caso, es Auto, la cual es descrita por medio de
ciertos atributos y métodos.
Los atributos se definen directamente en función de los elementos pasivos requeridos en la solución, más
un atributo indicando la rueda que está desinflada: maletero, gata hidráulica; llave de cruz; un perno (su
número: 1, 2, 3, ó 4); neumático desinflado; neumático de repuesto.
El método constructor de esta clase recibirá como parámetro el Nº del neumático desinflado.
Los otros métodos, se pueden resumir en las siguientes actividades:
- Retirar y colocar cosas
- Aflojar y apretar pernos
- Subir y bajar el auto con la gata
De esa manera, se podrían definir los siguientes métodos:
- Retirar "algo" de un "lugar"
- Colocar "algo" en un "lugar"
- Aflojar "un determinado perno"
- Apretar "un determinado perno"
- Subir auto desde "una determinada posición"
- Bajar auto desde "una determinada posición"
Los términos resaltados en cursiva corresponden a variables de entrada (parámetros) que proporcionan
generalidad a las operaciones. Por ejemplo, el primer método puede emplearse para retirar el neumático
de repuesto del maletero, pero también para retirar la llave de cruz del maletero y un perno de la rueda.
Una definición más formal involucra especificar claramente cuáles son los parámetros con los que trabaja
cada operación. Así, la lista definitiva de operaciones será la siguiente:
- Retirar
Parámetros: Lo que se desea retirar y el lugar de dónde se retirará
- Colocar
Parámetros: Lo que se desea colocar y el lugar dónde se colocará
- Aflojar perno
Parámetros: La posición de la rueda, el número de perno que se desea aflojar.
- Apretar perno
Parámetros: La posición de la rueda, el número de perno que se desea apretar, y la herramienta
que se usará
- Subir auto
Parámetros: La posición de la rueda en donde se desea subir el auto y la herramienta (gata) que
se usará
- Bajar auto
Parámetros: Ninguno.
Instancias: En el contexto del problema la única instancia necesaria es una de la clase Auto, que
simplemente se llamará auto1, la cual contiene todos los atributos necesarios para representar la
situación.
2. Conceptualización de la solución
Entidades: Para efectos prácticos y funcionales, el problema global de efectuar la llamada telefónica
puede descomponerse en las siguientes tareas actividades: Manipular el auricular (levantarlo y colgarlo);
Manipular las monedas (recolectarlas, ponerlas en la ranura, recuperarlas cuando son devueltas);
Escuchar en el auricular (por el tono de marcar, de llamada en proceso, de conexión aceptada, o de
ocupado); Marcar un número en el teclado del teléfono; Hablar.
El problema se describe en la relación que un usuario hace entre la manipulación de un teléfono y sus
dispositivos, y un conjunto de monedas desde el cual saca la cantidad requerida para realizar las
llamadas.
Clases: Las únicas dos clases que permiten definir la solución a este problema son Telefono, y Bolsillo,
los cuales en forma explícita verbalizan su representación de la realidad. Adicionalmente se define un tipo
de dato especial, que representa un conjunto particular de monedas. Cada una de las clases formales se
compone de atributos y métodos como se describe a continuación:
Clase Telefono
Atributos:
- costo de la llamada, en este caso siempre valdrá $100, por lo que podría manejarse como
una constante.
- tiempo: Corresponde al tiempo que el usuario ha hablado con al teléfono que marcó.
Métodos públicos
o LevantarAuricular(): representa la acción de tomar el auricular, que provoca la activación del
teléfono y la petición de tono.
o DepositarMonedas(monedas): deposita el conjunto de monedas indicado en el teléfono.
o ColgarAuricular(): representa la acción de devolver el auricular a su posición de cuelgue,
desactivando así el teléfono.
o EscucharAuricular(): representa la acción de detectar el tono que tiene el teléfono. Como
retorno, devuelve el tono esuchado, identificando uno de los siguientes valores: TONO,
CONEXION EXITOSA y OCUPADO, DESCONEXION (este tono se escucha cuando se ha
esperado por un tiempo determinado y nadie contesta el teléfono marcado).
o RecuperarMonedas(): permite recuperar las monedas sobrantes, retornando como resultado
el conjunto de estas monedas.
o Marcar(numero): Esta operación marca en el teclado numérico cada uno los dígitos del
número al que se desea llamar.
Variables locales:
D: almacena los dígitos del número al que se desea hablar.
Algoritmo:
1. Iterar sobre cada una de los dígitos D del número que se desea marcar
1.1 Presionar en el teclado numérico el número correspondiente al dígito D
o Hablar(): Esta operación permite que el usuario hable con la persona a la que llamó. Por cada
segundo hablado se incrementa en 1 el tiempo de la llamada. Cuando se han cumplido 5
minutos (300 seg.) se debe introducir $100 para seguir hablando.
Variables propias:
tiempo: almacena el tiempo que se ha hablado hasta el momento.
MB: monedas en el bolsillo seleccionadas. Corresponde a las monedas que el usuario posee.
MS: monedas seleccionadas. Corresponde a las monedas que el usuario utilizará para
efectuar la llamada.
Algoritmo:
1. Al comienzo tiempo es 0 seg.
2. Iterar mientras se desee seguir hablando
2.1 Hablar un segundo.
2.2 Incrementar en 1 la variable tiempo.
2.3 Si tiempo tiene el valor 300 seg.
2.3.1 Recolectar monedas para una llamada de $100 desde conjunto de monedas
MB y almacenarlas en el conjunto de monedas MS.
2.3.2 Depositar monedas del conjunto MS en el teléfono.
2.3.3 Devolver tiempo a 0 seg.
Clase Bolsillo
Métodos públicos
o RecolectarMonedas(monto): recolecta una combinación de monedas de $100, $50, y $10,
que sumen el monto indicado. Como retorno entrega el conjunto de monedas seleccionadas.
Variables locales:
- monto recolectado: almacena el valor de las monedas que se han seleccionado hasta el
momento.
Algoritmo:
1. Al comienzo el monto recolectado es $0.
2. Iterar hasta que el monto recolectado sea el indicado
2.1 Seleccionar del bolsillo del usuario una moneda (una de las de mayor valor
que tenga) y pasarla al conjunto de monedas seleccionadas
2.2 Sumar el monto de la nueva moneda con el monto recolectado
3. Devolver el conjunto de monedas seleccionadas.
Instancias: En el contexto del problema que se intenta resolver, se necesitarán las siguientes instancias:
- El aparato telefónico que se utilizará para la llamada
- El bolsillo que contiene las monedas
- Adicionalmente será necesario representar como dato el número de teléfono que se desea
marcar. La variable que lo denotará será Num.
- Por otro lado, es necesario representar las monedas seleccionadas desde el bolsillo. Esto se
hará con la variable MS.
- tono: Corresponde al tono escuchado en el teléfono.
- intentos: Corresponde al número de intentos que ha hecho el usuario.