lunes, 10 de octubre de 2011

18. Programación orientada a objetos.

Un objeto es una estructura que contiene tanto las variables (llamadas propiedades) como las funciones que manipulan dichas variables (llamadas métodos). A partir de esta estructura se ha creado un nuevo modelo de programación (la programación orientada a objetos) que atribuye a los mismos propiedades como herencia o polimorfismo. Como veremos, JavaScript simplifica en algo este modelo y hace una programación híbrida entre la programación estructurada y la programación orientada a objetos.

El modelo de la programación orientada a objetos normal y corriente separa los mismos en dos: clases e instancias (objetos). Las primeras son entes más abstractos que definen un conjunto determinado de objetos. Las segundas son miembros de una clase, poseyendo las mismas propiedades que la clase a la cual pertenecen.

Propiedades y métodos.
Para acceder a los métodos y propiedades de un objeto debemos utilizar la siguiente sintaxis:
objeto.propiedad
objeto.metodo(parametros)

Conceptos Básicos.

Objetos
Son todas las cosas con identidad propia. Se relacionan entre si. Poseen características (atributos) y tienen responsabilidades (funciones, métodos) que deben cumplir. Son ejemplares (instancias) de una clase y conocen a la clase a la cual pertenecen.

Atributos o propiedades
Son las características, cualidades distintivas de cada objeto. Deben ser mínimos para poder realizar todas las operaciones que requiere la aplicación.

Ejemplos de objetos del mundo real:


- Casa: 
           atributos: tamaño, precio, cantidad de habitaciones, etc.;
    responsabilidades: comodidad, seguridad, etc.
 - Mesa: 
           atributos: altura, largo, ancho, etc.;
    responsabilidades: contener elementos.
 - Ventana:
           atributos: tamaño, color, etc.;
    responsabilidades: abrirse, cerrarse, etc.
Ejemplos de objetos del mundo de la programación:

- Ventana: 
             atributos: tamaño, color, etc.;
           responsabilidades: mostrar título,achicarse
                                etc.
Responsabilidades o Métodos.
Son las responsabilidades que debe cumplir la clase. El objetivo de un método es ejecutar las actividades que tiene encomendada la clase.

Es un algoritmo (conjunto de operaciones) que se ejecuta en respuesta a un mensaje; respuestas a mensajes para satisfacer peticiones.

Un método consiste en el nombre de la operación y sus argumentos. El nombre del método identifica una operación que se ejecuta.

Un método está determinado por la clase del objeto receptor, todos los objetos de una clase usan el mismo método en respuesta a mensajes similares.

La interpretación de un mensaje (selección del método ejecutado) depende del receptor y puede variar con distintos receptores, es decir, puede variar de una clase a otra.

Clases
Una clase es una agrupación de objetos que comparten las mismas propiedades y comportamientos. Es un molde para objetos que poseen las mismas características (que pueden recibir los mismos mensajes y responden de la misma manera).

Una clase es una representación de una idea o concepto. Unidad que encapsula códigos y datos para los métodos (operaciones).

Todos los ejemplares de una clase se comportan de forma similar (invocan el mismo método) en respuesta a mensajes similares.

La clase a la cual pertenece un objeto determina el comportamiento del objeto.

Una clase tiene encomendadas actividades que ejecutan los métodos.
Las clases están definidas por:

- Atributos (Propiedades),
 - Comportamiento (operaciones o métodos) y
 - Relaciones con otros objetos.
Una aplicación es un conjunto de objetos de determinadas clases.

sábado, 1 de octubre de 2011

17. Funciones que retornan un valor.

Son comunes los casos donde una función, luego de hacer un proceso, retorne un valor.
Ejemplo 1: Confeccionar una función que reciba un valor entero comprendido entre 1 y 5. Luego retornar en castellano el valor recibido.


<html>
<head>
</head>
<body>
<script language="javascript">
function convertirCastellano(x)
{
  if (x==1)
    return "uno";
  else
    if (x==2)
      return "dos";
    else
      if (x==3)
        return "tres";
      else
        if (x==4)
          return "cuatro";
        else
          if (x==5)
            return "cinco";
          else
            return "valor incorrecto";
}
var valor;
valor=prompt("Ingrese un valor entre 1 y 5","");
valor=parseInt(valor);
var r;
r=convertirCastellano(valor);
document.write(r);
</script>
</body>
</html>
Podemos ver que el valor retornado por una función lo indicamos por medio de la palabra clave return. Cuando se llama a la función, debemos asignar el nombre de la función a una variable, ya que la misma retorna un valor.

Una función puede tener varios parámetros, pero sólo puede retornar un único valor.

La estructura condicional if de este ejemplo puede ser remplazada por la instrucción switch, la función queda codificada de la siguiente manera:

function convertirCastellano(x)
{
  switch (x) 
  {
    case 1:return "uno";
    case 2:return "dos";
    case 3:return "tres";
    case 4:return "cuatro";
    case 5:return "cinco";
    default:return "valor incorrecto";
  }
}
Esta es una forma más elegante que una serie de if anidados. La  instrucción switch analiza el contenido de la variable x con respecto al  valor de cada caso. En la situación de ser igual, ejecuta el bloque  seguido de los 2 puntos hasta que encuentra la instrucción return o  break.

Ejemplo 2: Confeccionar una función que reciba una fecha con el formato de día, mes y año y retorne un string con un formato similar a: "Hoy es 10 de junio de 2003".

<html>
<head>
</head>
<body>
<script language="javascript">
 
function formatearFecha(dia,mes,año)
{
  var s='Hoy es '+dia+' de ';
  switch (mes) {
  case 1:s=s+'enero ';
         break;
  case 2:s=s+'febrero ';
         break;
  case 3:s=s+'marzo ';
         break;
  case 4:s=s+'abril ';
         break;
  case 5:s=s+'mayo ';
         break;
  case 6:s=s+'junio ';
         break;
  case 7:s=s+'julio ';
         break;
  case 8:s=s+'agosto ';
         break;
  case 9:s=s+'septiembre ';
         break;
  case 10:s=s+'octubre ';
         break;
  case 11:s=s+'noviembre ';
         break;
  case 12:s=s+'diciembre ';
         break;
  } //fin del switch
  s=s+'de '+año;
  return s;
}
document.write(formatearFecha(11,6,2006));
</script>
</body>
</html>
Analicemos un poco la función formatearFecha. Llegan tres parámetros con el día, mes y año. Definimos e inicializamos una variable con:

var s='Hoy es '+dia+' de ';
Luego le concatenamos o sumamos el mes:

s=s+'enero ';
Esto, si el parámetro mes tiene un uno. Observemos como acumulamos lo  que tiene 's' más el string 'enero '.

En caso de hacer s='enero ' perderíamos el valor previo que tenía la variable s.

Por último concatenamos el año:
s=s+'de '+año;
Cuando se llama a la función directamente, al valor devuelto se lo  enviamos a la función write del objeto document. Esto último lo podemos  hacer en dos pasos:

var fec= formatearFecha(11,6,2006);
  document.write(fec);
Guardamos en la variable 'fec' el string devuelto por la función.

PROBLEMAS

1 - Confeccionar una función a la cual le envíe tres enteros y retorne el mayor de ellos.

2 - Elaborar una función a la cual le envíe el valor del lado de un cuadrado y me retorne su perímetro.

3 - Desarrollar una función que retorne la cantidad de dígitos que tiene una variable entera positiva.

4 - Elaborar una función que reciba tres enteros y retorne el promedio.

5 - Confeccionar una función que solicite la carga de 5 valores por teclado y retorne su suma. 

16. Funciones con parámetros.

Explicaremos con un ejemplo, una función que tiene datos de entrada.

Ejemplo: Confeccionar una función que reciba dos números y muestre en la página los valores comprendidos entre ellos de uno en uno. Cargar por teclado esos dos valores.

<html>
<head>
</head>
<body>
<script language="javascript">
function mostrarComprendidos(x1,x2)
{
  var inicio;
  for(inicio=x1;inicio<=x2;inicio++)
  {
    document.write(inicio+' ');
  }
}
var valor1,valor2;
valor1=prompt('Ingrese valor inferior:','');
valor1=parseInt(valor1);
valor2=prompt('Ingrese valor superior:','');
valor2=parseInt(valor2);
mostrarComprendidos(valor1,valor2);
</script>
</body>
</html>
El programa de JavaScript empieza a ejecutarse donde definimos las  variables valor1 y valor2 y no donde se define la función. Luego de  cargar los dos valores por teclado se llama a la función  mostrarComprendidos y le enviamos las variables valor1 y valor2. Los  parámetors x1 y x2 reciben los contenidos de las variables valor1 y  valor 2.

Es importante notar que a la función la podemos llamar la cantidad de veces que la necesitemos.

PROBLEMAS

1 - Elaborar una función a la cual le enviemos tres enteros y muestre el menor.

2 - Confeccionar una función a la cual le envíe tres enteros y los muestre ordenados de menor a mayor. 

15. Funciones

En programación es muy frecuente que un determinado procedimiento de cálculo definido por un grupo de sentencias tenga que repetirse varias veces, ya sea en un mismo programa o en otros programas, lo cual implica que se tenga que escribir tantos grupos de aquellas sentencias como veces aparezca dicho proceso.

La herramienta más potente con que se cuenta para facilitar, reducir y dividir el trabajo en programación, es escribir aquellos grupos de sentencias una sola y única vez bajo la forma de una FUNCION.

Un programa es una cosa compleja de realizar y por lo tanto es importante que esté bien ESTRUCTURADO y también que sea inteligible para las personas. Si un grupo de sentencias realiza una tarea bien definida, entonces puede estar justificado el aislar estas sentencias formando una función, aunque resulte que sólo se le llame o use una vez.

Hasta ahora hemos visto como resolver un problema planteando un único algoritmo.
Con funciones podemos segmentar un programa en varias partes.

Frente a un problema, planteamos un algoritmo, éste puede constar de pequeños algoritmos.
Una función es un conjunto de instrucciones que resuelven una parte del problema y que puede ser utilizado (llamado) desde diferentes partes de un programa.

Consta de un nombre y parámetros. Con el nombre llamamos a la función, es decir, hacemos referencia a la misma. Los parámetros son valores que se envían y son indispensables para la resolución del mismo. La función realizará alguna operación con los parámetros que le enviamos. Podemos cargar una variable, consultarla, modificarla, imprimirla, etc.

Incluso los programas más sencillos tienen la necesidad de fragmentarse. Las funciones son los únicos tipos de subprogramas que acepta JavaScript. Tienen la siguiente estructura:

function <nombre de función>(argumento1, argumento2, ..., argumento n) 
{ 
  <código de la función> 
} 
Debemos buscar un nombre de función que nos indique cuál es su objetivo  (Si la función recibe un string y lo centra, tal vez deberíamos llamarla  centrarTitulo). Veremos que una función puede variar bastante en su  estructura, puede tener o no parámetros, retornar un valor, etc. 

Ejemplo: Mostrar un mensaje que se repita 3 veces en la página con el siguiente texto:

'Cuidado'
'Ingrese su documento correctamente'

'Cuidado'
'Ingrese su documento correctamente'

'Cuidado'
'Ingrese su documento correctamente'

La solución sin emplear funciones es:

<html>
<head>
</head>
<body>
<script language="javascript">
document.write("Cuidado<br>");
document.write("Ingrese su documento correctamente<br>");
document.write("Cuidado<br>");
document.write("Ingrese su documento correctamente<br>");
document.write("Cuidado<br>");
document.write("Ingrese su documento correctamente<br>");
</script>
</body>
</html>
Empleando una función:

<html>
<head>
</head>
<body>
<script languaje="javascript">
function mostrarMensaje()
{
  document.write("Cuidado<br>");
  document.write("Ingrese su documento correctamente<br>");
}
mostrarMensaje();
mostrarMensaje();
mostrarMensaje();
</script>
</body>
</html>
Recordemos que JavaScript es sencible a mayúsculas y minúsculas. Si fijamos como nombre a la función mostrarTitulo (es decir la segunda palabra con mayúscula) debemos respetar este nombre cuando la llamemos a dicha función.

Es importante notar que para que una función se ejecute debemos llamarla desde fuera por su nombre (en este ejemplo: mostrarMensaje()).

Cada vez que se llama una función se ejecutan todas las líneas contenidas en la misma.
Si no se llama a la función, las instrucciones de la misma nunca se ejecutarán.

A una función la podemos llamar tantas veces como necesitemos.

Las funciones nos ahorran escribir código que se repite con frecuencia y permite que nuestro programa sea más entendible.

14. Estructura repetitiva (for)

Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura while. Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas situaciones.

Esta estructura se emplea en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 números, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita.


Por último, hay que decir que la ejecución de la sentencia break dentro de cualquier parte del bucle provoca la salida inmediata del mismo.


Sintaxis:
for (<Inicialización> ; <Condición> ; <Incremento o Decremento>)
{
  <Instrucciones>
}
Esta estructura repetitiva tiene tres argumentos: variable de inicialización, condición y variable de incremento o decremento.


Funcionamiento:
- Primero se ejecuta por única vez el primer argumento .
          Por lo general se inicializa una variable.
 - El segundo paso es evaluar la (Condición), en caso de ser verdadera se ejecuta el bloque,
          en caso contrario continúa el programa.
 - El tercer paso es la ejecución de las instrucciones.
 - El cuarto paso es ejecutar el tercer argumento (Incremento o Decremento).
 - Luego se repiten sucesivamente del Segundo al Cuarto Paso.
Este tipo de estructura repetitiva se utiliza generalmente cuando  sabemos la cantidad de veces que deseamos que se repita el bloque. 

Ejemplo: Mostrar por pantalla los números del 1 al 10.
 
<html>
<head>
</head>
<body>
<script language="javascript">
var f;
for(f=1;f<=10;f++)
{
  document.write(f+" ");
}
</script>
</body>
</html>
Inicialmente f se la inicializa con 1. Como la condición se verifica  como verdadera se ejecuta el bloque del for (en este caso mostramos el  contenido de la variable f y un espacio en blanco). Luego de ejecutar el  bloque pasa al tercer argumento del for (en este caso con el operador  ++ se incrementa en uno el contenido de la variable f, existe otro  operador -- que decrementa en uno una variable), hubiera sido lo mismo  poner f=f+1 pero este otro operador matemático nos simplifica las cosas.

Importante: Tener en cuenta que no lleva punto y coma al final de los tres argumentos del for. El disponer un punto y coma provoca un error lógico y no sintáctico, por lo que el navegador no avisará.

PROBLEMAS

1 - Confeccionar un programa que lea 3 pares de datos, cada par de datos corresponde a la medida de la base y la altura de un triángulo. El programa deberá informar:
a) De cada triángulo la medida de su base, su altura y su superficie.
b) La cantidad de triángulos cuya superficie es mayor a 12.

2 - Desarrollar un programa que solicite la carga de 10 números e imprima la suma de lo últimos 5 valores ingresados.

3- Desarrollar un programa que muestre la tabla de multiplicar del 5 (del 5 al 50).

4 - Confeccionar un programa que permita ingresar un valor del 1 al 10 y nos muestre la tabla de multiplicar del mismo (los primeros 12 términos)
Ejemplo: Si ingreso 3 deberá aparecer en pantalla los valores 3, 6, 9, hasta el 36.

5 - Realizar un programa que lea los lados de 4 triángulos, e informar: a) De cada uno de ellos, qué tipo de triángulo es: equilátero (tres lados iguales), isósceles (dos lados iguales), o escaleno (ningún lado igual)
b) Cantidad de triángulos de cada tipo.
c) Tipo de triángulo del que hay menor cantidad.

6 - Escribir un programa que pida ingresar coordenadas (x,y) que representan puntos en el plano. Informar cuántos puntos se han ingresado en el primer, segundo, tercer y cuarto cuadrante. Al comenzar el programa se pide que se ingrese la cantidad de puntos a procesar.

7 - Se realiza la carga de 10 valores enteros por teclado. Se desea conocer: a) La cantidad de valores negativos ingresados.
b) La cantidad de valores positivos ingresados.
c) La cantidad de múltiplos de 15.
d) El valor acumulado de los números ingresados que son pares.

8 - Se cuenta con la siguiente información:
Las edades de 50 estudiantes del turno mañana.
Las edades de 60 estudiantes del turno tarde.
Las edades de 110 estudiantes del turno noche.
Las edades de cada estudiante deben ingresarse por teclado.
a) Obtener el promedio de las edades de cada turno (tres promedios).
b) Imprimir dichos promedios (promedio de cada turno).
c) Mostrar por pantalla un mensaje que indique cual de los tres turnos tiene un promedio de edades mayor.



domingo, 25 de septiembre de 2011

13. Estructura repetitiva (do/while)

La sentencia do/while es otra estructura repetitiva, la cual ejecuta al menos una vez su bloque repetitivo, a diferencia del while que puede no ejecutar el bloque.

Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo.

La condición de la estructura está abajo del bloque a repetir, a diferencia del while que está en la parte superior.

Finaliza la ejecución del bloque repetitivo cuando la condición retorna falso, es decir igual que el while.

Problema: Escribir un programa que solicite la carga de un número entre 0 y 999, y nos muestre un mensaje de cuántos dígitos tiene el mismo. Finalizar el programa cuando se cargue el valor 0.


<html>
<head>
</head>
<body>
<script language="javascript">
var valor;
do {
  valor=prompt('Ingrese un valor entre 0 y 999:','');
  valor=parseInt(valor);
  document.write('El valor '+valor+' tiene ');
  if (valor<10)
  {
    document.write('Tiene 1 digitos');
  }
  else
  {
    if (valor<100)
    {
      document.write('Tiene 2 digitos');
    }
    else
    {
      document.write('Tiene 3 digitos');
    }
  }
  document.write('<br>');
} while(valor!=0);
</script>
</body>
</html>
En este problema por lo menos se carga un valor. Si se carga un valor  menor a 10 se trata de un número de una cifra, si es mayor a 10 pero  menor a 100 se trata de un valor de dos dígitos, en caso contrario se  trata de un valor de tres dígitos. Este bloque se repite mientras se  ingresa en la variable 'valor' un número distinto a 0.

PROBLEMAS

1 - Realizar un programa que acumule (sume) valores ingresados por teclado hasta ingresa el 9999 (no sumar dicho valor, solamente indica que ha finalizado la carga). Imprimir el valor acumulado e informar si dicho valor es cero, mayor a cero o menor a cero.

2 - En un banco se procesan datos de las cuentas corrientes de sus clientes. De cada cuenta corriente se conoce: número de cuenta, nombre del cliente y saldo actual. El ingreso de datos debe finalizar al ingresar un valor negativo en el número de cuenta.

Se pide confeccionar un programa que lea los datos de las cuentas corrientes e informe:

a) De cada cuenta: número de cuenta, nombre del cliente y estado de la cuenta según su saldo, sabiendo que:
Estado de la cuenta 'Acreedor' si el saldo es >0.
   'Deudor' si el saldo es <0.
   'Nulo' si el saldo es =0.
b) La suma total de los saldos acreedores. 

3 - Se realizó un censo provincial y se desea procesar la información obtenida en dicho censo. De cada una de las personas censadas se tiene la siguiente información: número de documento, edad y sexo ('femenino' o 'masculino')

Se pide confeccionar un programa que lea los datos de cada persona censada (para finalizar ingresar el valor cero en el número de documento) e informar:
a) Cantidad total de personas censadas.
b) Cantidad de varones.
c) Cantidad de mujeres.
d) Cantidad de varones cuya edad varía entre 16 y 65 años.

12. Concepto de acumulador.

Explicaremos el concepto de un acumulador con un ejemplo.

Problema: Desarrollar un programa que permita la carga de 5 valores por teclado y nos muestre posteriormente la suma.


<html>
<head>
</head>
<body>
<script language="javascript">
var x=1;
var suma=0;
var valor;
while (x<=5)
{
  valor=prompt('Ingrese valor:','');
  valor=parseInt(valor);
  suma=suma+valor;
  x=x+1;
}
document.write("La suma de los valores es "+suma+"<br>");
</script>
</body>
</html>
En este problema, a semejanza de los anteriores, llevamos un CONTADOR  llamado x que nos sirve para contar las vueltas que debe repetir el  while.

También aparece el concepto de ACUMULADOR (un acumulador es un tipo especial de variable que se incrementa o decrementa con valores variables durante la ejecución del programa).

Hemos dado el nombre de suma a nuestro acumulador. Cada ciclo que se repita la estructura repetitiva, la variable suma se incrementa con el contenido ingresado en la variable valor.

La prueba del diagrama se realiza dándole valores a las variables:


valor  suma  x   
0  0
(Antes de entrar a la estructura repetitiva estos son los valores).
5  5  1
16  21  2
7  28  3
10  38  4
2  40  5

Este es un seguimiento del programa planteado. Los números que toma la variable valor dependerá de qué cifras cargue el operador durante la ejecución del programa.

Hay que tener en cuenta que cuando en la variable valor se carga el primer valor (en este ejemplo es el valor 5), al cargarse el segundo valor (16), el valor anterior 5 se pierde, por ello la necesidad de ir almacenando en la variable suma los valores ingresados.

PROBLEMAS

1 - Escribir un programa que lea 10 notas de alumnos y nos informe cuántos tienen notas mayores o iguales a 7 y cuántos menores.

2 - Se ingresan un conjunto de 5 alturas de personas por teclado. Mostrar la altura promedio de las personas.

3 - En una empresa trabajan 5 empleados cuyos sueldos oscilan entre $100 y $500, realizar un programa que lea los sueldos que cobra cada empleado e informe cuántos empleados cobran entre $100 y $300 y cuántos cobran más de $300. Además el programa deberá informar el importe que gasta la empresa en sueldos al personal.

4 - Realizar un programa que imprima 20 términos de la serie 5 - 10 - 15 - 20, etc. (No se ingresan valores por teclado).

5 - Mostrar los múltiplos de 10 hasta el valor 1500.
Debe aparecer en pantalla 10 - 20 -30 etc.

6 - Realizar un programa que permita cargar dos listas de 3 valores cada una. Informar con un mensaje cual de las dos listas tiene un valor acumulado mayor (mensajes 'Lista 1 mayor', 'Lista 2 mayor', 'Listas iguales')
Tener en cuenta que puede haber dos o más estructuras repetitivas en un algoritmo.

7 - Desarrollar un programa que permita cargar 5 números enteros y luego nos informe cuántos valores fueron pares y cuántos impares.
Emplear el operador "%" en la condición de la estructura condicional.
if (valor%2==0)
El operador "%" retorna el resto de la división valor / 2. Por ejemplo: 12 % 2, retorna 0; 13 % 2, retorna 1, porque el resto de dividir 13 en 2 es 1.