La Resolución de Problemas utilizando la Computadora

Anuncio
La Resolución de Problemas utilizando la Computadora
Lissette Alvarez
Abril-Julio, 2004
El Computador es una máquina que no puede trabajar por si sola, únicamente realiza aquellas órdenes
que el hombre le indique. Esas órdenes tienen que ser realizadas de tal forma que el computador las entienda,
siendo esta la causa por la cuál se hace necesario darle instrucciones agrupadas. Esto constituye el software,
el cual es pensado y realizado por el hombre. El software esta conformado por el “conjunto de programas que
se diseñan para el funcionamiento del computador”. Deben estar escritos en un lenguaje de programación. El
Software se divide en dos grandes tipos: software del sistema y software de aplicación El software del Sistema
es el conjunto de programas necesarios para que la máquina funcione, estos programas son básicamente, el
Sistema Operativo, los Editores de texto, los Compiladores, Intérpretes y los Programas de utilidad. El
software de aplicación son los que realizan tareas concretas, nóminas, contabilidad, análisis estadı́sticos, etc.,
es decir todos aquellos programas que pueden ser escritos en un Lenguaje de Programación.
1
La Resolución de Problemas utilizando la Computadora
Aunque el proceso de diseñar programas es un proceso creativo, se pueden considerar tres pasos que ayudan
al programador en este proceso:
• Análisis del problema
• Diseño del algoritmo
• Resolución del algoritmo en la computadora
Las fases de análisis y diseño del algoritmo requieren la descripción del problema en subproblemas y una
herramienta de programación: Diagrama de flujo, Pseudocódigo o Diagrama N-S (diagramas de NassiSchneider). En la tercera fase se implementa este algoritmo en un código escrito en un lenguaje de programación, reflejando las ideas obtenidas en las fases de análisis y diseño.
Antes de conocer las tareas a realizar en cada fase, definiremos el concepto de algoritmo.
1
Definición 1.1. Algoritmo. Un algoritmo es un método para resolver un problema mediante una serie de
pasos precisos, definidos y finitos.
Se deriva de la traducción al latı́n de la palabra árabe Alkhowarismi, nombre de un matemático y astrónomo
árabe que escribió un tratado sobre manipulación de números y ecuaciones en el siglo IX.
Caracterı́sticas del Algoritmo
• Preciso: tiene que indicar el orden de realización en cada paso.
• Definido: si el algoritmo se prueba dos veces, en estas dos pruebas, se debe obtener el mismo resultado
(con excepción de los programas que contienen comandos de generación de datos aleatorios).
• Finito: tiene un número determinado de pasos y debe producir un resultado en un tiempo finito.
Veamos algunos ejemplos.
Ejemplo 1.2. Ver una pelı́cula. 1. Buscar el videocasete de la pelı́cula. 2. Si el televisor y la video-casetera
se encuentran apagados, encenderlos. 3. Sacar el video del estuche. 4. Introducirlo en la video-casetera. 5.
Tomar el control del televisor y la video. 6. Dirigirme a el sofá. 7. Ponerme cómodo 8. Ajustar el volumen.
9. Disfrutar la pelı́cula
Ejemplo 1.3. Cocinar arroz. 1. Lavar bien el arroz. 2. Buscar un recipiente (caldero) de tamaño adecuado.
3. Agregar el agua necesaria de acuerdo a la cantidad de arroz. 4. Agregar aceite, sal, cebolla, ajoporro. 5.
Colocar el recipiente en la cocina. 6. Encender la hornilla. 7. Esperar a que hierva el agua. 8. Agregar
el arroz al agua hirviendo. 9. Dejar el recipiente en el fuego hasta que el arroz este blando. 10. Apagar la
hornilla. 11. Servir. 12. Comer. ¡¡Buen provecho!!
Estos pequeños algoritmos cumplen con los requisitos descritos arriba, ya que cada paso precisa un orden
y tiene un orden de pasos finitos.
Los algoritmos se pueden expresar por fórmulas, diagramas de flujo, y pseudo códigos conocidos como
herramientas de programación. Está última representación es la más utilizada por su sencillez y parecido
a el lenguaje humano. El hecho de que un algoritmo sea una representación paso a paso, implica que
está compuesto por instrucciones elementales que no involucran ambigüedades, es decir que no pueden
interpretarse de diferentes maneras
2
Fases para la Resolución de Problemas
1. Análisis del Problema. En la fase de análisis en el proceso de programación se determina que hace el
programa. Esta fase requiere una clara definición donde se contemple exactamente lo que debe hacer el
2
programa y el resultado o solución deseada. Dado que se busca una solución se precisan especificaciones
de entrada y salida. Para poder definir bien un problema es conveniente responder a las siguientes
preguntas: ¿Qué entradas se requieren? (cantidad y tipo) ¿Cuál es la salida deseada? (cantidad y
tipo) ¿Qué método produce la salida deseada?
2. Diseño del Algoritmo. En la fase de diseño se determina como hace el programa la tarea solicitada. Los
métodos utilizados para el proceso del diseño se basan en el conocido divide y vencerás: la resolución de
un problema complejo se realiza dividiendo el problema en subproblemas y a continuación dividir estos
en otros de nivel más bajo, hasta que sea implementada una solución en la computadora. Este método se
conoce técnicamente como diseño descendente (top-down) o modular. El programa principal (el módulo
de nivel más alto) llama a subprogramas (módulos) de nivel más bajo, que a su vez pueden llamar
a otros subprogramas. Estos módulos pueden ser planeados, codificados, comprobados y depurados
independientemente y luego combinarlos entre sı́. Este proceso implica la ejecución de estos pasos
hasta que el programa se ha terminado. El diseño del algoritmo es independiente del lenguaje de
programación en el que se vaya a codificar posteriormente.
3. Implementación del Algoritmo. Para implementar un algoritmo en la computadora, se debe ejecutar
los siguientes pasos: Codificación y documentación, Compilación y ejecución, Verificación y finalmente
la Depuración.
(a) Codificación y documentación. Es la escritura en un lenguaje de programación de la representación de un algoritmo, en el caso de este curso se utilizan como lenguajes Octave o Matlab.
La codificación se conoce como programa fuente. La documentación puede ser interna y externa.
La documentación interna es la contenida en lı́neas de comentarios. La documentación externa
incluye análisis, diagramas de flujo y/o pseudo códigos, manuales de usuarios con instrucciones
para ejecutar el programa y para interpretar los resultados. La documentación es vital cuando se
desea corregir posibles errores futuros o bien cambiar el programa. Estos cambios se denominan
mantenimiento del programa. Además es de buena costumbre para todo buen programador, dejar
comentado su código, para que el futuro programador pueda darle mantenimiento fácilmente a el
programa, o incluso, si es el mismo creador quien debe darle mantenimiento. La importancia de
la documentación debe ser destacada por su influencia en la etapa final, ya que programas pobremente documentados son difı́ciles de leer, más difı́ciles de depurar y casi imposibles de mantener
y modificar.
(b) Compilación y ejecución. Una vez que el algoritmo se ha convertido en un programa fuente, debe
3
ser traducido a lenguaje máquina. Este proceso se realiza con el compilador y el sistema operativo
que se encarga prácticamente de la compilación. Si al compilar el programa fuente se presentan
errores (errores de compilación), es necesario volver a editar el programa, corregir los errores y
compilar de nuevo. Esto se repite hasta que ya no se presenten más errores, obteniéndose el
programa objeto. Cuando no existen errores en el programa fuente se debe instruir al sistema
operativo para que efectúe la fase de montaje o enlace, del programa fuente con las librerı́as del
programa del compilador. Este proceso de montaje produce un programa ejecutable. Cuando se
ha creado un programa ejecutable este se puede ya ejecutar desde el sistema operativo con solo
teclear su nombre. Suponiendo que no existen errores durante la ejecución (errores en tiempo de
ejecución), se obtendrá la salida de resultados correctos del programa.
(c) Verificación y depuración. Es el proceso de ejecución del programa con una amplia variedad
de datos de entrada, llamados datos de test o prueba como son: valores normales de entrada,
valores extremos de entrada que comprueben los lı́mites del programa y valores de entrada que
comprueben aspectos especiales del programa. Estos determinarán si el programa contiene errores
o no.
3
Estructura general de un programa
Un programa puede considerarse como una secuencia de acciones (instrucciones) que manipulan un conjunto
de objetos (datos) para que realice una tarea especı́fica. Un programa contiene dos bloques:
• Bloque de declaraciones: en él se especifican todos los objetos que utiliza el programa (constantes, variables, tablas, registros, archivos, etc.). En el caso particular de Octave/Matlab, este bloque de declaraciones no forma parte del programa, estos lenguajes de programación identifican automáticamente la
estructura de las variables en juego.
• Bloque de instrucciones: constituido por el conjunto de operaciones que se han de realizar para la
obtención de los resultados deseados.
Dentro del bloque de instrucciones de un programa podemos diferenciar tres partes fundamentales. En
algunos casos, estas tres partes están perfectamente delimitadas, pero en la mayorı́a sus instrucciones quedan
entremezcladas a lo largo del programa, si bien mantienen una cierta localización geométrica impuesta por
la propia naturaleza de las mismas.
• Entrada de datos: la constituyen todas aquellas instrucciones que toman datos de un dispositivo
externo, almacenándolos en la memoria central para que puedan ser procesados.
4
• Proceso o algoritmo: está formado por las instrucciones que modifican los objetos a partir de su estado
inicial hasta el estado final, dejando éstos disponibles en la memoria central.
• Salida de resultados: conjunto de instrucciones que toman los datos finales de la memoria central y los
envı́an a los dispositivos externos.
Los algoritmos se encuentran compuestos de varios tipos de instrucciones. Una Instrucción es la parte
más pequeña de un programa que un computador puede ejecutar. Las instrucciones pueden ser:
1. Instrucciones de declaración: se utilizan en aquellos lenguajes de programación que no tienen declaración
explı́cita de los objetos. Su misión consiste en indicar al procesador que reserve espacio en la memoria
para un objeto del programa, indicando asimismo su nombre, tipo y caracterı́sticas. Octave y Matlab disponen de declaraciones explı́citas de los objetos y por ello los programas codificados en estos
lenguajes no requieren de instrucciones de declaración.
2. Instrucciones primitivas: son aquellas que ejecuta el procesador de modo inmediato. Las principales
son asignación, entrada y salida. Una instrucción de asignación calcula el valor de una expresión y lo
almacena en una variable. Una instrucción de entrada toma un dato de un dispositivo de entrada y lo
almacena en un objeto o variable. Eventualmente, los datos de entrada no provienen de un dispositivo
externo, sino que han sido colocados previamente en el mismo programa. Una instrucción de salida
toma el valor de una expresión u objeto y lo lleva a un dispositivo externo (pantalla, por lo general).
3. Instrucciones compuestas: son aquellas que el procesador no puede ejecutar directamente, sino que
realiza una llamada a un subprograma, subrutina o párrafo.
4. Instrucciones de control: son aquellas que controlan la ejecución de otras instrucciones. Instrucción
de selección o alternativa: controla la ejecución de unas u otras instrucciones según una condición.
Puede ser simple o doble (SI y SINO). Instrucción de salto incondicional: altera la secuencia normal de
ejecución de un programa, continuando la misma en la lı́nea indicada en la propia instrucción (IR A).
Instrucción de salto condicional: altera la secuencia normal de ejecución de un programa únicamente
en el caso de cumplimiento de una condición asociada a la propia instrucción (SI ... IR A). Instrucción
repetitiva: hace que se repitan una o varias instrucciones un número determinado o indeterminado de
veces (PARA, MIENTRAS, HASTA e ITERAR).
Algunas variables realizan funciones especı́ficas dentro de un programa, y por su gran utilidad, frecuencia
de uso y peculiaridad, conviene hacer una mención aparte. Las más importantes son:
5
• Contadores. Un contador incrementa una variable en función de un valor constante. En otras palabras, es un campo de memoria cuyo valor se incrementa en una cantidad fija, positiva o negativa,
generalmente asociado a un bucle. Toma un valor inicial antes de comenzar su función, y cada vez que
se realiza el suceso, incrementa su valor. Ejemplo:
Contador = Contador + constante
Contador = Contador + 1
• Acumuladores. Un acumulador incrementa una variable en función de otra variable, es decir, es un
campo de memoria cuyo valor se incrementa sucesivas veces en cantidades variables. Se utiliza en
aquellos casos en que se desea obtener el total acumulado de un conjunto de cantidades, siendo preciso
inicializarlo con el valor 0. Se utiliza con mayor frecuencia para obtener sumas sucesivas. Por ejemplo:
Acumulador = Acumulador + valor variable.
6
Descargar