martes, 25 de marzo de 2008

Una Metodología de Resolución de Problemas II




CLASE 2: Una Metodología de resolución de problemas II.

2. Diseñar una ESTRATEGIA:


Es elaborar un plan de acción global. Una planificación en la cual se establece qué debe hacerse. Es identificar las acciones relevantes. Es ver el bosque antes que el propio árbol. Es mirar de arriba hacia abajo, es decir, de lo general a lo particular. El bosque representa lo general, mientras que el árbol representa lo particular, los detalles. Por lo tanto, “en el nivel de estrategia se deben establecer las acciones más importantes del proceso”, sin entrar en los detalles para no vernos abrumados por ellos, ya que podemos perder el rumbo, desorientarnos y hacer fracasar nuestro objetivo a resolver. La metodología que va de lo general a lo particular se conoce como diseño descendente o TOP – DOWN.
La estrategia será pues un conjunto de acciones relevantes interrelacionadas, dispuestas en un orden lógico, que tendrá como meta alcanzar un objetivo.
El concepto de Sistema es algo complejo de entender. Lo que hacemos para poder asimilarlo es, dividirlo en problemas menores, más fácil de comprender; si aún algunas de estas partes fuera complejo, volvemos a dividir nuevamente, hasta alcanzar un punto en el cual ya no es necesario seguir dividiendo, debido a su evidencia. La solución del Sistema queda definido cuando c/u. de estas partes brinden la solución esperada y queden establecidas las interrelaciones, conectadas por medio de interfases, que posibilitan la comunicación entre ellas.
Divide y vencerás es el axioma de la estrategia.
Si tomamos como Sistema un Automóvil, vemos que este es bastante difícil de comprender. Pues bien, nuestra tarea consiste entonces en dividirlo en subsistemas, los cuales podrían ser: Eléctrico, Mecánico, Frenos, Dirección, Chasis entre otros. Notamos que el Sistema Eléctrico, para nosotros es aún complejo, por lo cual decidimos volver a dividir en los siguientes subsistemas: Batería, Alternador, Bujías, Luces y Cableado. Aún podemos continuar con la Batería en: Bornes,, Nivel del Líquido, etc..

  • Sistema AUTOMÓVIL
    • S. ELÉCTRICO
      • S. BATERÍA
        • BORNES
        • NIVEL DEL LÍQUIDO
        • Placas
        • Caja Contenedora
      • S. ALTERNADOR
      • S. BUJÍAS
      • S. LUCES Y CABLEADO
    • S. MECÁNICO
    • S. FRENOS
    • S. DIRECCIÓN
    • S. CHASIS-CARROCERÍA
El concepto de caja negra, representa para los científicos una abstracción de detalles, conoce su interfase, sabe lo que realiza, pero no le interesa como lo hace; es este un concepto, muy importante, ya que ayuda a simplificar notablemente la idea de algún tema; lo opuesto es el de caja transparente, en este caso está representando el poder ver como funcionan las cosas por dentro, los detalles de su mecanismo de acción. Al simple automovilista que solo le interesa manejar su vehículo, ve a este en cada una de sus partes como una caja negra, mientras que el mecánico necesita verlo como una caja transparente. Un televisor es también una caja negra, para el simple usuario que requiere ver un programa televisivo, él sabe qué finalidad cumple dicho aparato, también sabe que requiere de entradas y salidas, digamos alimentación eléctrica, la señal desde la antena o cable o satélite y las salidas del aparato de, imagen y sonido. Por otro lado el técnico en TV verá a ese aparato como a una caja transparente, debido a que requiere poder entender todo su mecanismo interno de funcionamiento para darle solución en caso de algún problema técnico que se presente.
3. Refinar la estrategia: El ALGORITMO y su prueba :

Algoritmo: Es una secuencia de acciones dadas en un orden lógico que conociendo ciertos datos debemos obtener ciertos resultados esperados. Ciertas acciones deberán ir antes que otras, y en determinados casos ciertas acciones podrán ir antes o después de otras indistintamente. La palabra deriva del nombre del matemático y astrónomo árabe Alkhôwarîzmi
[1] del siglo IX.

Todo algoritmo debe ser:

  • Preciso, se debe indicar el orden de ejecución en cada paso.
  • Definido, cada vez que se lo realice, se deben obtener los mismos resultados.
  • Finito, tiene un número determinado de acciones, debe terminar.

Las 2 herramientas más comúnmente empleadas para diseñar algoritmos son:

  • Pseudocódigo: utiliza palabras en castellano para indicar las acciones a realizar.
  • Diagramas de estructuras: utiliza una representación gráfica, denominados símbolos o bloques que indican las acciones a realizar.
El diseño del algoritmo se basa en dos etapas una de análisis y otra de diseño. En la etapa de análisis se determina qué debe realizar, mientras que en la etapa de diseño se determina cómo lo debe hacer. La realización de un problema complejo se lleva a cabo dividiendo el problema original en sub-problemas de menor complejidad, continuando con estas divisiones hasta alcanzar un nivel en el cual ya no es necesario seguir avanzando. Este método se conoce como diseño descendente o modular. El proceso de explotar el problema en etapas y expresar cada paso en forma más detallada se denomina refinamiento sucesivo.
Todo programa bien diseñado consta de un bloque principal –es el módulo de nivel más alto- y es el que llama a otros módulos –de nivel más bajo- los cuales pueden llamar a otros módulos. Los algoritmos diseñados de esta forma se dice que tienen un diseño modular. Cada módulo puede ser realizado, probado, depurado en forma independiente del resto.
Programación estructurada:
La programación estructurada significa escribir un programa de acuerdo a las siguientes reglas:

  • El algoritmo tiene un diseño modular.
  • Los módulos son diseñados de modo descendente.
  • Cada módulo se codifica utilizando las tres estructuras de control básicas:
    • Concatenación
    • Selección
    • Repetición
Además la programación estructurada es el conjunto de técnicas que han evolucionado desde los primeros trabajos de Edsgar Dijkstra y que incorporan:
  • Recursos abstractos.
  • Diseño descendente.
  • Estructuras básicas.
El teorema de la programación estructurada establecido en mayo de 1966 por Böhm y Jacopini, demostró que un programa propio puede ser escrito utilizando solamente tres tipos de estructuras de control: la Concatenación, la Selección y la Repetición.
Un programa se define como propio si cumple las siguientes características:
  • Posee un solo punto de entrada y uno de salida.
  • Existen caminos desde la entrada hasta la salida que se pueden seguir y que pasan por todas las partes del programa.
  • Todas las acciones son ejecutables y no existen ciclos o iteraciones infinitas.
Terminologías:

Palabras reservadas: Es un conjunto restringido de palabras creadas por el lenguaje y que son utilizadas por él para cumplir una tarea específica. El programador debe conocer estos nombres y evitar así utilizarlos para otro propósito.

Identificador: Son palabras creadas por el programador para poder identificar a diferentes objetos empleados en un algoritmo, como ser constantes con nombres, nombres de variables, de módulos, de programa, de campos, de unidades, de tipos; el cual debe seguir ciertas reglas, a saber:
  • Debe comenzar con una letra o subrayado, a continuación podrá seguir con letras y/o dígitos y/o subrayado –guión bajo-.
  • No hay diferencias entre mayúsculas y minúsculas.
  • Se reconocen los primeros 63 caracteres. Los restantes no serán reconocidos.
Además el nombre de un identificador debe ser significativo, es decir, representar su contenido, para hacer más claro el entendimiento al leer un algoritmo. El nombre que se elija no debe ser demasiado largo ni muy compacto, sino un punto de equilibrio, p.e.: para asignar el nombre de identificador a una variable que va a contener los nombres de personas, ellos podrían ser: apellidoyNombre, an, apenom, apeNom, Ape_Nom, ApeNom2, APENOM. En el 1ro. notamos que es muy largo, el 2do. es muy compacto, los restantes es una medida equilibrada. De éstos vemos que fueron escritos de diversas formas, en los casos de apenom, apeNom y APENOM hacen referencia a una misma variable –asumiendo que han sido definidas en el mismo bloque, el compilador en estos casos responderá con un mensaje de Identificador duplicado-, debido a que no hay diferencias entre mayúsculas de minúsculas, pero no sucede lo mismo con Ape_Nom o ApeNom2.

Constantes: Es un valor que no cambia a lo largo de un algoritmo.

Ejemplos:

Constantes enteras: 293, -12, 0, 15981, 3
Constantes reales de punto fijo: 24.92, -2438.7321, 3.0, -4.2, 0.00004.
Constantes reales de punto flotante –notación científica-: 1E6, -3.827E-7.
Constantes booleanas o lógicas: false, true.
Constantes carácter: ‘A’, ‘3’, ‘+’, ‘ ‘.
Constantes de cadena: ‘esto es una cadena de caracteres’, ‘3+2’, ‘’.

Variables: Contiene un valor que podrá ser modificado a lo largo de un algoritmo. Debe tener un nombre y ser definida perteneciente a un tipo de datos. Al hacer esto estamos indicando qué valores podrá contener, enteros con o sin signo, reales, booleanos, carácter, cadenas de caracteres –string-, entre otros. Cada variable ocupa un lugar de almacenamiento en la memoria interna de la computadora y de acuerdo al tipo de dato en que ha sido declarada será la cantidad de bytes que reserve.

Expresiones: Están formadas por operandos y operadores. Los operandos pueden ser constantes, variables o funciones. Los operadores pueden ser:
Aritméticos: Suma +, Resta -, Multiplicación *, División real /, Cociente entero div y Resto de división entera mod, siendo además div y mod palabras reservadas y requiere que sus operandos sean de tipo entero. Las prioridades de estos operadores son:
  • suma y resta como operadores unarios,
  • multiplicación, división, div y mod
  • suma y la resta como operadores binarios.
Para alterar las operaciones de acuerdo a esta prioridad se utilizan paréntesis que poseen la mayor prioridad. A igualdad de prioridades se evalúan las operaciones de izquierda a derecha. El resultado final de una expresión aritmética es un número. El símbolo + también es utilizado para realizar las operaciones entre cadenas de caracteres y es la operación de concatenación y para operaciones entre conjuntos, es la operación de la Unión.

Ejemplos:
2 + 3 * 5 = 17
(2 + 3) * 5 = 25.

Relacionales o comparativos: Son los siguientes: Igual =, Mayor >, Menor <, Distinto <>, Mayor o igual >=, Menor o igual <=, Pertenencia in. Todos ellos están en el mismo nivel de prioridad. Son de menor jerarquía que los operadores aritméticos. El resultado final de la expresión es un valor lógico de verdad o falsedad.
Ejemplos:
3 > x; es verdad si el valor de x es menor o igual a 3;
x2 – 2 <= 2 * z, es falso si el resultado de la expresión aritmética del miembro izquierdo es mayor al resultado de la expresión aritmética del miembro derecho de la expresión relacional.
Booleanos o lógicos: Son los siguientes: and ^, or v, xor v, not ~, todas ellas palabras reservadas. Las prioridades son: 1ro. Not, 2do. And, 3ro. Or , Xor. El resultado de evaluar una expresión boolean es un valor de verdad o falsedad. Se deben encerrar las expresiones relacionales entre paréntesis cuando haya operadores booleanos, debido a las prioridades, ya que el not está al mismo nivel que los operadores unarios, el and al mismo nivel que los aritméticos de la multiplicación, división, cociente entero y resto entero; y el or y xor al mismo nivel que los operadores binarios de suma y resta.
Ejemplos:

(3 / x + 1 > h – 2) ^ (a + b < 2 =" sqrt(x)"> t * g)

Inicializar: Es asignar un valor inicial a una variable por primera vez.

Acumuladores: Los acumuladores pueden ser, contadores y sumadores.

Contador: Es una variable que está en ambos miembros de una asignación interna, a la que se le suma un valor constante. Es necesario haber inicializado en un momento previo a esta variable, ya que va a ser leído su contenido.

Ejemplos:
c <-- 0;
c <-- c + 1

Sumador:
Es una variable que está en ambos miembros de una asignación interna a la que se le suma un valor variable. Es necesario haber inicializado en un momento previo a esta variable, ya que va a ser leído su contenido.
Ejemplos:
c,s <-- 0;
c <-- c + 1;
s <-- s + c;
c <-- c + 1,
s <-- s + c
Señales: Son variables utilizadas para que nos indiquen si sucedió o no un determinado evento, al cual hemos establecido ciertos valores convenidos para indicar tal o cual situación. Si solo adoptan 2 valores posibles, entonces el tipo de dato más apropiado es el boolean.

Ejemplo:
                  Luego de ingresar una lista de valores se solicita informar si se ingresó algún valor negativo. Se procede de la siguiente manera: antes de ingresar algún valor se inicializa una variable, digamos negativo <-- false, luego se ingresan de a uno por vez los valores y por c/u. de ellos se averigua si es MENOR 0, si es así entonces se cambia el valor de negativo <-- true, por último al finalizar el ingreso de todos los valores se determina, si negativo es verdadero, se emite 'hubo algún valor negativo ingresado' o caso contrario este otro cartel 'no se ingresó ningún valor negativo'.

Auxiliar: Son variables que nos auxilian en determinados procesos, el caso más típico quizás sea el de intercambiar 2 valores.

Ejemplo:
                 Se quieren intercambiar los valores de las variables a y b, realizamos entonces las siguientes acciones: a <-- 4; b <-- 7; aux <-- a; a <-- b, b <-- aux; luego de esto, en la variable a quedó el valor 7 y en la variable b quedó el valor 4.

Centinela: Es un valor elegido en forma arbitraria por el usuario programador, a efectos de establecer si alcanzamos el final de un ingreso de datos, en el cual de antemano no sabíamos cuantos valores se iban a conocer. El valor centinela será entonces un valor especial que ingresaremos una vez hayamos ingresado todos los valores a ser procesados, para indicar la finalización del mismo.
Máximos y Mínimos: Son variables que utilizamos para guardar el valor de un máximo o mínimo de una lista de valores. Procedemos de la siguiente manera: si el problema es de máximo inicializamos con un valor ficticio que esté por fuera de los posibles valores reales a ingresar en el proceso y que esté por debajo de esos valores reales, de tal manera que aseguremos que al ingresar el primer valor real sea reemplazado por éste, luego los próximos valores que se vayan conociendo podrán reemplazar o no al valor guardado en ese instante en la variable que hemos elegido como máximo, realizando una pregunta si el valor actual ingresado es mayor al valor guardado en la variable máximo. Al terminar el proceso estamos en condiciones de emitir o de realizar cualquier otra acción necesaria con dicha variable. Tratándose de un problema de mínimo presenta características similares, pero inicializando con un valor mayor que cualquier valor real que se ingrese en el proceso y preguntando durante el momento en que se vayan conociendo c/u. de los valores reales si es menor que el valor guardado en la variable elegida para contener el mínimo en el momento actual. Otro método a elegir podría asignarse a la variable máximo o mínimo el primer valor real ingresado, luego se procede de la manera indicada anteriormente, con los restantes datos.
Ejemplo:
                  Se ingresan edades de personas, informar la persona con mayor edad. Inicializar MayEdad <-- 0, luego por cada edad conocida se pregunta Edad > MayEdad por verdad se modifica MayEdad <-- Edad, caso contrario no hacemos nada. Al finalizar el ingreso de todas las edades, informamos que la persona de mayor edad tiene MayEdad años.
Ejemplo:
                 Temperaturas registradas en alguna región geográfica.

Promedios y Porcentajes:
Son cálculos que debemos realizar en el proceso.

Ejemplo:

                 Se pide los promedios de notas en un examen de Algoritmos, en el cual se saben la cantidad de alumnos y las notas alcanzadas por c/u. de ellos. Se requiere uso de un sumador, el cual vaya sumando las notas de cada alumno, al finalizar de ingresar todas las notas, se obtiene el promedio asignando a Prom <-- SumNotas / N, en donde SumNotas es la suma de todas las notas y N la cantidad de alumnos.

Ejemplo:
                 Se solicita obtener los porcentajes de alumnos aprobados y de alumnos reprobados en el mismo examen. Necesitamos un contador de alumnos que aprueban. Este contador se inicializa en cero, luego tras conocer c/u. de las notas de cada alumno y de comparar si es mayor o igual a 4 se sumará uno en dicho contador. Finalmente, al término de todas las notas, se calculan los porcentajes, de la siguiente forma: PorcApr <-- CantApr / N x 100; PorcRepr <-- (N – CantApr) / N x 100.




[1]
Escribió un tratado sobre manipulación de números y ecuaciones titulado Kitab al-jabr w’almugabala.


Podcast en:

http://www.ivoox.com/metodologia-estrategia-algoritmo-terminologias_md_1262364_1.mp3


Anterior: Metodología I
Siguiente: Sentencias

No hay comentarios: