Source: http://www.slideshare.net/alvarezsan/algoritmos-tecnico-en-desarrollo-de-software
Timestamp: 2016-05-02 07:36:50+00:00

Document:
Programas diseñados para realizar ...
by TAMELIMAR
Alfredo Morejon Ignacio
ALGORITMOS Conceptos básicos de algoritmiaTomado de: manuales.gfc.edu.co/dfd/dfd.pdf tutorial Conceptos básicos de algoritmia, Operaciones matemáticas, tablas de Verdad, variables constantes, entrada y salida diagramas de flujo y seudocódigo
manuales.gfc.edu.co/dfd/dfd.pdf tutorial alggoritmo 34
http://manuales.gfc.edu.co/dfd/dfd.pdf tutorial dfd • Algoritmo. Un algoritmo es un método para resolver un problema mediante una serie de pasos precisos (indicar el orden de realización en cada paso), definidos (si se sigue dos veces, obtiene el resultado cada vez) y finitos (tiene fin; un número determinados de pasos). Proviene de un 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. Un algoritmo debe producir un resultado en un tiempo finito. Los métodos que utilizan algoritmos se llaman métodos algorítmicos, en oposición a los métodos que implican algún juicio o interpretación que se denominan métodos heurísticos. Los primeros se pueden implementar en la computadora, los segundos no han sido convertidos fácilmente en las computadoras. Ejemplos de algoritmos son: instrucciones para montar una bicicleta, hacer una receta de cocina, obtener el máximo común divisor de dos números, etc. Pueden expresarse mediante fórmulas, diagramas de flujo o N-S y pseudocódigos. • Programa. Un programa de computadora o un programa de software (usualmente abreviado como un programa), es una lista de instrucciones paso a paso escritas para una arquitectura de computadora en un lenguaje de computación en particular. Estos bloques de instrucciones, una vez compilados (por lo general), son cargados a memoria para su ejecución. • Programación. Proceso de escribir un programa o software. Cuando un programa se ejecuta se deben de teclear datos de entrada, esta información será procesada por la computadora. • Lenguaje de programación. Es una técnica de comunicación estandarizada para describir las instrucciones a una computadora. Cada lenguaje de programación tiene sus propias reglas de sintaxis y semántica. usadas que definen un programa de computadora. Un lenguaje habilita al programador a especificar de forma precisa que datos son dados a la computadora, como son almacenados y transmitidos estos datos, y que acciones bajo que circunstancias van a ser tomados. Los lenguajes de programación son del tipo de los lenguajes de computadora, excluyendo al pseudocódigo el cual es exclusivamente para la comunicación humana. Es decir, sirven para escribir programas que permitan la comunicación usuario/máquina. • Lenguaje máquina. El código máquina o lenguaje máquina es un sistema de instrucciones y datos directamente entendibles por un CPU de una computadora. Las "palabras" del lenguaje máquina son llamadas instrucciones, las cuales tienen una acción elemental por el CPU. Cada CPU tiene su propio conjunto de instrucciones de lenguaje máquina. • Compilador. Un compilador es un programa de computadoras que traslada el texto escrito en un lenguaje de computación (fuente) en otro lenguaje de computación (destino). La secuencia original por lo general se conoce como código fuente, y la salida es llamada código objeto. La razón más común en que se traslada el código fuente, es en un programa ejecutable el cual es una serie de representaciones binarias de instrucciones máquina • Intérprete. Lenguaje de programación el cual ejecuta los programas desde su código fuente. Aún se tienen algunas buenas características sobre los compiladores. • Pseudocódigo. Es una descripción de un algoritmo de programación en computadora, el cual usa las convenciones estructurales de los lenguajes de programación, pero omite detallar las subrutinas o la sintaxis de un lenguaje específico.Definir los términos de:  Identificador. Es un nombre que se les da a las diferentes entidades que puede tener un programa, como lo son las variables, tipos, etiquetas, subrutinas, paquetes, etc. Nombrar las entidades hace posible referenciarlos, lo cual es esencial para cualquier tipo de procesamiento. Este concepto es análogo al "nombre", como por ejemplo el que se le da a una variable. Los lenguajes de computación usualmente 34
definen las restricciones de como debe ser un identificador, como por ejemplo que debe de estar compuesto por letras, números y/o guiones bajos.  Variable. Una variable es un símbolo que denota una cantidad o representación simbólica. En los lenguajes de computación, una variable puede ser tomada como un lugar donde se almacena un valor en la memoria de la computadora. Más precisamente, una variable está asociada a un nombre (llamado algunas veces identificador) dentro de una localidad; el valor se almacena como un objeto de datos en una localidad, de tal manera que este objeto puede ser después accesado mediante una variable, tal como se le refiere a alguien mediante su nombre.  Constante. Una constante es una variable inmutable la cual es referenciada a un lugar donde el valor no puede ser cambiado. El valor de una constante se asigna una sola vez, por ejemplo, HorasPorDia=24. La constante puede ser referenciada múltiples veces en un programa. Usar una constante puede simplificar el mantenimiento del código, disminuyendo el cambio de su valor y suplir un significado a esta constante y consolidándola, como por ejemplo al inicio del programa.Distinguir los tipos de datos: simples (enteros, reales, caracteres, lógicos, enumerados y subrango) yestructurados (cadena de caracteres, arreglos y registros).Identificar las reglas para la asignación de nombres a variables y constantes. • Los identificadores que representan los nombre de módulos, subprogramas, funciones, tipos, variables y otros elementos, debe ser elegidos apropiadamente para conseguir programas legibles. El objetivo es usar interfaces significativos que ayuden al lector a recordar el propósito de un identificador sin tener que hacer referencia continua a declaraciones o listas externas de variables. Hay que evitar las abreviaturas crípticas • Identificadores largos se deben de utilizar para la mayoría de los objetos significativos de un programa, así como los objetos utilizados en muchas posiciones, tales como, por ejemplo, el nombre de un programa usado frecuentemente. Identificadores más cortos se utilizarán estrictamente para los objetos locales: así i, j, k son útiles para índices de arrays en un bucle, variables, contadores de bucle, etc., y son más expresivos que indice, VariableDeControl, etc. • Los identificadores deben utilizar letras mayúsculas y minúsculas. Cuando un identificador consta de dos o más palabras, cada palabra debe de comenzar con una letra mayúscula. Una excepción son los tipos de datos definidos por el usuario, que suelen comenzar con una letra minúscula. Así, identificadores idóneos son: SalarioMes, Nombre, MensajeUsuario, MensajesDatosMal. • o Usar nombres para nombras objetos de datos, tales como variables, constantes y tipos. Utilizar Salario mejor que APagar o Pagar. o Utilizar verbos para nombrar procedimientos. LeerCaracter, LeerSigCar, CalcularSigMov son procedimientos que realizan estas acciones mejor que SigCar o SigMov (siguiente movimiento). o Utilizar formas del verso "ser" o "estas" para funciones lógicas. SonIguales, EsCero, EsListo y EsVacio se utilizan como variables y funciones lógicas. • Los nombres de los identificadores de objetos deben sugerir el significado del objeto al lector del programa. Ser nemónicas. • Es conveniente, también, definir constantes con nombres y evitar las explícitas siempre que sea posible. Por ejemplo, no utilizar 7 para el dìa de la semana ó 3.141592 para representar el valor de la constante.Clasificar los operadores. Las expresiones son combinaciones de constantes, variables, símbolos deoperación, paréntesis y nombres de funciones especiales. Una expresión consta de operandos yoperadores. Según sea el tipo de objetos que manipulan. El resultado de una expresión aritmética es detipo numérico, el resultado de la expresión relacional y de una expresión lógica, es de tipo lógico; elresultado de una expresión carácter es de tipo carácter. Las expresiones se clasifican en: 34
• Aritméticas. Son análogas a las fórmulas matemáticas. Las variables y constantes son numéricas (reales o enteras) y las operaciones son las aritméticas. Los operadores aritméticos son: + suma - resta * multiplicación / división **, ˆ exponenciación div división entera mod módulo (resto)En la expresión 5 + 3 los valores 5 y 3 se denominan operandos. El valor de la expresión 5 + 3 se conocecomo resultado de la expresión. div es la división entera, es decir, 19 div 3 da como resultado 6. Eloperador mod representa el resto de la división entera, algunos lenguajes lo representan con el % o el .15 mod 6 es igual a 3. • Relacionales. Permiten realizar comparaciones de valores de tipo numérico o carácter. Sirven para expresar las condiciones en los algoritmos, los operadores de relación son: < menor > mayor = igual <= menor o igual que >= mayor o igual que <> distinto de (diferente a)El resultado de la operación será verdadero o falso. Los operadores de relación se pueden aplicar acualquiera de los cuatro tipos de datos estándar: enteros, reales, lógicos y carácter. La aplicación avalores numéricos es evidente. Para realizar comparaciones de datos de tipo carácter, se requiere unasecuencia de ordenación de los caracteres similar al orden creciente y decreciente. Esta ordenación sueleser alfabética, tanto mayúsculas como minúsculas, y numérica considerándolas de modo independiente. • Lógicos. Este es el segundo tipo de expresiones también llamado de tipo booleano (se denomina así en honor del matemático británica George Boole, que desarrolló el Álgebra lógica de Boole). El valor resultante de la expresión siempre es verdadero (true) o falso (false). Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones lógicas, utilizando los operadores lógicos y los operadores relacionales. Los operadores lógicos son: and y or o not noLa definición de las operaciones no, y y o se resumen en las tablas conocidas como tablas de la verdad: a no a verdadero falso falso verdadero a b ayb verdadero verdadero verdadero verdadero falso falso falso verdadero falso falso falso falso a b aob 34
verdadero verdadero verdadero verdadero falso verdadero falso verdadero verdadero falso falso falsoExplicar lar siete fases para la solución de problemas en la computadora. El proceso de resolución de unproblema en una computadora conduce a las escritura de un programa y a la ejecución en la misma.Aunque el proceso de diseñar un programa es -esencialmente- un proceso creativo, se puede consideraruna fase o pasos comunes, que generalmente deben de seguir todos los programadores. : • Definición del problema y análisis de los datos. Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada. La computadora requiere especificaciones detalladas de entrada y salida. ¿Qué entradas se requieres? (tipo y cantidad) ¿Cuál es la salida deseada? (tipo y cantidad) ¿Qué método produce la salida deseada?. • Diseño de la solución. En el análisis se determina qué hace el programa. En el diseño se determina cómo hace el programa la tarea solicitada. Los métodos más eficaces para el proceso de diseño se basan en el conocido por divide y vencerás. Es decir, la resolución de un problema complejo se realiza dividiendo el problema en subproblemas (módulos). Cualquier programa consta de un programa principal, que a su vez puede llamar a otros subprogramas. • Herramientas de programación. Las más comunes son los diagramas de flujo (flowchart) y pseudocódigo. Los primeros es una representación gráfica de un algoritmo. Los símbolos más utilizados están normalizados; los segundos son donde las instrucciones se escriben en palabras similares al inglés o español, que facilitan tanto la escritura como la lectura de programas. En esencia, el pseudocódigo se puede definir como un lenguaje de especificaciones de algoritmos. • Codificación. Es la escritura en un lenguaje de programación de la representación de algoritmos desarrollada en las etapas precedentes. Dado que el diseño de un algoritmo es independiente del lenguaje de programación utilizado para su implementación, el código puede ser escrito con igual facilidad en un leguaje o en otro. Para realizar la conversión del algoritmo en programa, se debe de sustituir las palabras reservadas en español por sus homónimos en inglés, y las operaciones/instrucciones indicadas en lenguaje natural expresarlas en el lenguaje de programación correspondiente. La documentación interna es la que se incluye dentro del código del programa mediante comentarios que ayudan a la comprensión del código. • Compilación. Una vez que el algoritmo es convertido en programa fuente, es preciso introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco. Esta operación se realiza con el programa editor, posteriormente el programa fuente se convierte en un archivo de programa que se guarda (graba) en disco. El programa fuente debe 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 tras la compilación, el programa presenta errores (errores de compilación) en el programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo. • Prueba (verificación) y depuración. La verificación de un programa es el proceso de ejecución • Documentación y mantenimiento.Identificar los datos de entrada y salida en el planteamiento de un problema, detallando el proceso desoluciónReconocer las características de los algoritmos. Preciso (indicar el orden de realización de cada paso),definido (si se sigue dos veces, se obtiene el mismo resultado cada vez), y finito (tiene fin; tiene númerodeterminado de pasos).Describir las herramientas de representación algorítmica más comunesUtilizar la simbología para la representación de diagramas de flujo, diagramas Nassi-Shneiderman y reglaspara la elaboración de PseudoCódigo. 34
Aplicar la jerarquía de los operadores aritméticos, relacionales y lógicos en la resolución de expresiones.Las reglas de prioridad en las operaciones aritméticas son primero los exponenciales, luego lamultiplicación y división, despues el mod y el div, y por último la suma y la resta.En palabras sencillas, un algoritmo es una serie de instrucciones que realizadas en orden conducena la solución de un problema determinado. También se puede decir que un algoritmo es la fasepreliminar a escribir un programa en cualquier lenguaje de programación, por lo que la forma deescribirlo puede ser muy personal según el programador que lo esté diseñando, pero en general sedebe hacer en una forma tan clara que cualquier otro programador pueda coger dicho algoritmo,entenderlo fácilmente y poderlo traducir a su lenguaje de programación favorito.Por lo tanto hay varias formas de escribir un algoritmo en el papel: Una de ellas es el diagrama deflujo que consta de rectángulos que encierran las diferentes instrucciones y líneas que apuntanhacia la siguiente instrucción de modo que no se pierda el orden. Además, las operacioneselementales como la entrada de datos, salida de datos, ciclos, etc. (más adelante se explicarán) sereconocen de las demás instrucciones porque no se encierran en rectángulos sino en otra clase defiguras por lo que según la figura en la que esté encerrada la instrucción se reconoce su significado;Es muy didáctico, por lo que es muy fácil de entender así ni siquiera se conozca al programadorque diseñó el algoritmo. También existe el pseudocódigo donde cada instrucción ya no es un dibujosino una línea escrita y las operaciones elementales se escriben de una forma tan clara que seaimposible que algún programador no las entienda. Para este tutorial utilizaremos los DIAGRAMASDE FLUJO, y usaremos el programa DFD para implementar los ejemplos y hacer más sencilla laexplicación.Casi siempre un algoritmo se compone de un inicio, un final y una serie de instrucciones las cualespueden estar complementadas con condiciones, ciclos, etc. En los diagramas de flujo, el inicio y elfinal de un algoritmo se escriben dentro de un CIRCULO a manera de etiqueta, tal y como lomuestra la siguiente imagen:Obviamente, entre estas dos "etiquetas" estarán todas las instrucciones de un algoritmodeterminado. Para realizar las instrucciones en un algoritmo, se utilizan básicamente Variables yOperadores.Como ya se había indicado en otro apartado de este curso, las variables son campos en memoria que puedenalmacenar cualquier tipo de información (números, letras, frases, valores de verdad, etc. ) que pueden tenercualquier nombre, que preferiblemente debe ser mnemotécnico, es decir, que tenga relación con él o los datosque se almacenarán en la variable. Los datos numéricos se almacenan en las variables una vez en el ordenadoren forma binaria (base 2), y los datos de caracteres como letras y frases se almacenan según el código ASCII delas letras, que es un código aceptado mundialmente para representar todos los caracteres posibles (Por lo menosen muchos idiomas). Este código es un numero desde 0 hasta 255 por lo que se almacena también en forma 34
binaria. Los nombres de las variables deben seguir unas convenciones generales, que se crearon para evitarconfusiones entre las variables y los operadores aritméticos. Estas son: • No pueden comenzar con números. • No pueden contener símbolos u operadores en ninguna posición del nombre, excepto el carácter "_". • No pueden contener espacios.Como ejemplo aquí hay varios nombres para variables: • A : Es un nombre correcto, aunque posiblemente muy poco mnemotécnico. • A23: correcto. • OJO5MALO : correcto. • HOLA# : incorrecto, ya que tiene un símbolo dentro de su nombre. • A 23 : incorrecto, porque hay un espacio dentro del nombre. • A-23 : incorrecto. • A_23 : correcto, ya que el carácter "_" es el único símbolo permitido para nombrar variables; se puede usar para separar palabras dentro del nombre de una misma variable. Otro ejemplo podría ser: PRIMER_NOMBRE o RADIO_CIRCULO.Una característica de las variables es que son Case Sensitive, es decir que son sensibles al hecho de sí el nombrefué escrito con mayúsculas o minúsculas, por lo que si se llamó a una variable A23, dentro de las demásinstrucciones del algoritmo, cuando se haga referencia a ésta variable, no podrá utilizarse a23 ya que setomarían como dos variables diferentes.Para almacenar valores a las variables se utilizará el operador de asignación ( < - ) y se lee "a variable se leasigna valor".Como se dijo anteriormente, una variable puede contener números, letras, frases, etc., por lo que en un lenguajede programación, sería necesario al principio del algoritmo definir que clase de datos se van a almacenar y enque variables, pero en el caso del diagrama de flujo esto no es necesario y suponemos que una variable puedeser de cualquier "tipo", pero al asignarle un valor que no sea numerico (una letra, o una frase) debemos tener encuenta que dicho valor debe estar entre comillas simples (ej.: frase).Los tipos de datos que el DFD soporta son tres: Real que van desde -1*102000 hasta el 1*102000 Ejemplo: 1998,1.00007, 0, 328721, -3247781; los de cadena de caracteres que es una secuencia de caracteres encerrada entrecomillas simples. Por ejemplo: Diagramar es fácil, México, 1995; y los de tipo lógico que indican valores deverdadero y falso y se representan por una V o F encerradas entre puntos. Ejemplos: .V., .F., .f., .v.En DFD las variables son tratadas sin diferenciar a las mayúsculas de las minúsculas; es decir, CASA equivale acasa. Cuando una variable recibe un valor por primera vez, el tipo de dato de ésta será igual al tipo de dato delvalor.En los diagramas de flujo, las asignaciones a variables se encierran en RECTANGULOS para diferenciarlas delos demás tipos de instrucciones. Aqui tenemos varios ejemplos de asignaciones en diagramas de flujo: 34
Como se puede ver en el segundo rectángulo se le asignó a otra variable (Edad2) el valor de Edad (el cualcontenía 23), por lo que obviamente Edad2 termina valiendo 23, pero que pasaría si a Edad no se le hubieraasignado nada antes?En este caso, la variable Edad vale lo que se conoce como BASURA, es decir, cualquier valor no controlado enel algoritmo.DEFINICIÓN - BASURA.- Cuando se hace uso de una variable, se debe ver si se le ha asignado un valor antesde usarla, ya que de lo contrario contiene lo que se denomina BASURA. La basura simplemente aparececuando a una variable se le asigna espacio en la memoria del ordenador. Dicho espacio no está en blanco ya quecomo los datos internamente en el ordenador se manejan en forma binaria hay una cantidad determinada deunos y ceros en ese espacio (Estados aleatorios que se crean cada vez que se enciende el ordenador). Si no seasigna a dicha variable un valor y simplemente se utiliza en una operación aritmética o una asignación, el valorde la variable dependerá de los unos y ceros que había cuando se le asignó el espacio, es decir, no se sabrá conseguridad cual es el valor de esa variable en ese momento, por lo que podría producir graves errores en lassiguientes instrucciones del algoritmo.EJEMPLO EN DFD:Para implementar el ejemplo anterior en DFD, ejecutamos el programa DFD.EXE e inmediatamente apareceráun "algoritmo" con las etiquetas de inicio y final, pero sin instrucciones intermedias.En la parte superior izquierda se verá un menú con botones los cuales tienen los simbolos para los diferentestipos de instrucciones en un algoritmo.Para asignación se elige el rectángulo:Luego se coloca el cursor del MOUSE sobre la posición en la cual se va a colocar la instrucción de asignación(en este caso, entre las etiquetas de inicio y fin) hasta que aparezca el dibujo de una "mano".Se hace click e inmediatamente aparece el rectángulo de asignación. 34
Ahora, para colocar las variable se hace doble click sobre el nuevo rectángulo y voalá, ya podemos colocar lasvariables y los valores a asigarles.En el programa DFD, se hace un pequeño control a las variables que contengan BASURA.Esto se puede apreciar ya que si implementamos el ejemplo en el que a "Edad" no se le asignaba ningun valor,sale un error como el siguiente:NOTA: Para verificar si un algoritmo está correcto se presion el botón de EJECUTAR.Los operadores son los que permiten efectuar las operaciones aritméticas en el algoritmo. Los operadoresbásicos que se van a usar en este tutorial son los siguientes:+ , - , * , / : Suma, resta, multiplicación y división respectivamente.Son las mismas operaciones que en el cálculo normal con una pequeña diferencia: El resultado de estasoperaciones puede ser un numero entero o un fraccionario, por lo que se deberá especificar cual es el resultadoque se desea. Para esto se debe colocar en la DOCUMENTACIÓN DEL ALGORITMO (que veremos másadelante) que la variable no SOPORTA FRACCIONES (entero), ya que por defecto, todas las variablesnúmericas podrán ser fracciones. En DFD no podemos especificar cuando deseamos que una variable noposea fracciones ya que todas las variable numericas son "reales".También vamos a usar operadores más complejos como son:MOD: Dá el residuo de dividir un número entre otro sin DECIMALES.Ejemplos: 34
10 MOD 3 = 1; debido a que el 3 está en el 10, 3 veces; y 3*3=9 por lo que el residuo es 1.10 MOD 4 = 2; debido a que el 4 está en el 10, 2 veces; y 4*2=8 por lo que el residuo es 2.^: Potenciación.Ejemplo: 10 ^ 3 = 1000.EJEMPLO EN DFD:En el ejemplo anterior, la variable "res" terminará valiendo 1.5, pero si se especifica que es una variable que nosoporta fracciones (cosa que no se permite en el programa DFD), su valor será 1 (Se le quita la parte decimal).IMPORTANTISIMO: Las operaciones en un ordenador tienen un cierto orden de importancia, es decir,algunas se efectúan primero que otras. Este orden en forma descendente es:Potenciación, modulo, división, multiplicación, suma y resta.Si no se coloca ningún paréntesis en la operación aritmética, el orden anterior es el que tiene la máquina pararealizar las operaciones, pero al colocar algo entre paréntesis, esa parte de operación primará sobre las demás.EJEMPLO EN DFD: 34
En este caso "n1" valdrá 8 ya que la división prima sobre la suma por lo que primero se resuelve 10/2 (5) yluego se suma el 3.En cambio, para n2 el paréntesis hace que la operación interna prime sobre las demás, por lo que el resultadosería 13/2 , o sea 6.5 !!!Nota: Obsérvese que según se coloquen o no paréntesis en las distintas operaciones aritméticas los resultadoscambian, por lo que en el momento de escribir una operación en un algoritmo, se debe tener muy en cuenta laprimacía de los operadores.A parte de los operadores matematicos, tambien existen los llamados operadores lógicos.Operadores lógicos: >,<,<=,>=,=,!=,<>,AND,OR,NOT): Sirven para hacer preguntas lógicas, como si unavariable es mayor que otra, igual, menor o igual, diferente, etc. Retornan lo que se conoce como un valor deverdad, (TRUE o FALSE), (VERDADERO o FALSO).En DFD el valor de FALSO se representa como .F. y VERDADERO como .V.El operador "diferente de", se podrá especificar con != o con < > , según el programador lo elija.Los operadores AND,OR,NOT se usan para ligar operadores logicos. • AND indica que las dos condiciones deben ser verdaderas para que el resultado sea verdadero. • OR indica que solo una de las dos condiciones debe ser verdadera para que la respuesta sea verdadera. • NOT indica que la condicion debe ser falsa para que la respuesta sea verdadera.Aquí se puede visualizar más facilmente el uso de estos operadores: 34
v1 valdrá .F. ya que n1 no es mayor que n2.v2 valdrá .F. ya que n1 si es diferete de 1, pero nom no es igual a pedro (las variables son Case Sensitive) y eloperador AND obliga a que las dos condiciones sean VERDADERAS.v3 valdrá .F. ya que n1 si es diferete de n2, por lo que al negarlo dá FALSO.Aunque no hay un método general para diseñar algoritmos, si se puede decir que lo más adecuadoes seguir con los siguientes pasos al tratar de resolver un problema determinado: 1. EL ANÁLISIS: Es importantísimo hacer un buen análisis de cual es específicamente el problema a resolver. Para esto es bueno ayudarse mediante gráficos del problema o en caso de que no sea graficable, también se puede resolver el problema para casos específicos y luego generalizarlo para todos los posibles casos. También se deben observar cuales serían los casos especiales, es decir, aquellos casos que no cumplan la norma general, y tratar de evaluarlos de otra forma. Este paso es el que más tiempo debe llevarle a un buen programador, ya que de un buen análisis depende los buenos resultados que arroje el algoritmo. 2. ESCRIBIR EL ALGORITMO: Después de haber analizado el problema en una forma abstracta, se debe llevar al papel mediante instrucciones adecuadas al análisis. Si el problema fue bien analizado, este paso es muy rápido a comparación del anterior. 3. PRUEBA DE ESCRITORIO: Este paso es opcional y se aplica siguiendo paso por paso las instrucciones del algoritmo, anotando los diferentes valores que van tomando las variables, de forma que se pueda verificar si hay errores en alguna instrucción. Obviamente éste método es muy engorroso para algoritmos muy extensos, por lo que en estos casos no sería aplicable.Lista de prácticas básicas: 1. Pedir el nombre de la persona 2. Solicitar la edad de una persona y desplegar que edad tendrá el próximo año 3. Pedir la cantidad de hermanos y hermanas que tiene la persona, y desplegar cuantos hijos son 4. Solicitar el sueldo diario de un trabajador e indicar en pantalla, el sueldo semanal y el mensual 5. Pedir las calificaciones de 5 materias, desplegar el promedio de éstas 6. Solicitar un número de horas determinado, indicar el número de minutos y segundos contenido en las horasDefinir el término de flujo de control de un programa. 34
• A finales de los sesentas, uno de los avances en cuestión de fundamentos teóricos de programación, fue en que cualquier algoritmo, independientemente de su complejidad, podía ser construido utilizando combinaciones de las tres estructuras de control de flujo estandarizadas: secuencial, selección y repetitiva o iterativa. Y una cuarta denominada de invocación o salto. • El término flujo de control se refiere al orden en que se ejecutan las sentencias del programa. A menos que se especifique expresamente, el flujo normal de control de todos los programas es el secuencial. Este término significa que las sentencias se ejecutan en secuencia, una después de otra, en el orden en que se sitúan dentro del programa; las tres (o cuatro) estructuras mencionadas anteriormente, modifican de un modo preciso y definido dicha ejecución.Aplicar las estructuras de control secuencial • Una estructura secuencial es aquella que en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el final del proceso. La estructura secuencial tiene una entrada y una salidaAplicar las estructuras de control selectiva: simple (si - entonces) (D) y múltiple (según sea) (D) • La especificación formal de algoritmos tiene realmente utilidad cuando el algoritmo requiere una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existen un número de posibles alternativas resultantes de la evaluación de una determinada condición. Estas estructuras se utilizan para tomar decisiones lógicas (estructuras de decisión o alternativas). • La representación se hace con el pseudocódigo if, then, else o bien es español si, entonces, si_no. Las estructuras selectivas o alternativas pueden ser: o Simples. si - entonces (if - then), esta estructura ejecuta una determinada acción cuando se cumple una determinada condición. Esta selección evalúa la condición y: a) si la condición es verdadera, entonces se ejecuta la acción, o b) si la condición es falsa, no se hace nada. Pseudocódigo en español Pseudocódigo en inglés si <condición> entonces if <condición> then <acción 1> <acción 1> . . . . . . <acción n> <acción n> fin_si endif Sintaxis en PASCAL Sintaxis en C/C++ 34
if (condición) then if (condición)begin { sentencias sentenciasend; }• Dobles. La estructura anterior es muy limitada y normalmente se necesitará una estructura que permita elegir entre dos opciones o alternativas posibles, en función del cumplimiento o no de una determinada condición. Si la condición es verdadera se ejecuta la acción uno, si es falsa se ejecuta la acción dos. Pseudocódigo en español Pseudocódigo en ingléssi <condición> entonces if <condición> then <acción 1> <acción 1>si_no else <acción 2> <acción 2>fin_si endif Sintaxis en PASCAL Sintaxis en C/C++if (condición) then if (condición) begin { grupo sentencias 1 grupo sentencias 1 end }else else begin { grupo sentencias 2 grupo sentencias 2 end; }• Múltiples. Con frecuencia es necesario que existan más de dos elecciones posibles. Se evaluará una expresión que podrá tomar n valores distintos. Según se elija uno de estos valores, se realizará una de las n acciones, o lo que es igual, el flujo del algoritmo seguirá un determinado camino entre los n posibles. 34
Pseudocódigo en español Pseudocódigo en inglés según_sea expresión (E) hacer case expresión of e1: accion(es)1 [e1]: accion(es)1 e2: accion(es)2 [e2]: accion(es)2 en: accion(es)n [en]: accion(es)n si_no accion(es)x otherwise accion(es)x fin_según end_case Sintaxis en PASCAL Sintaxis en C/C++ switch (expresión) { case valor1 sentencia1 sentencia 2 . . break case valor2 sentencia1 sentencia 2 . . break . . default sentencia1 sentencia 2 . . }plicar las estructuras de control selectivas anidadas (D) • Las estructuras de selección si-entonces y si-entonces-si_no implica la selección de una de dos alternativas. Es posible utilizar la instrucción si para diseñar estructuras de selección que contengan más de dos alternativas. Por ejemplo, una estructura si-entonces puede contener otra estructura si-entonces, y esta estructura si-entonces puede contener otra, y así sucesivamente cualquier número de veces; a su vez, dentro de cada estructura puede existir diferentes acciones. 34
• Las estructuras si interiores a otras estructuras si se denominan anidadas o encajadas: si <condición1> entonces si <condición1> entonces . . . <acciones> fin_si fin_si• Una estructura de selección de n alternativas o de decisión múltiple puede ser construida utilizando una estructura si con este formato: si <condición1> entonces <acciones> si_no si <condición2> entonces <acciones> si_no si <condición3> entonces <acciones> si_no . . . <acciones> fin_si fin_si fin_si• Una estructura selectiva múltiple constará de una serie de estructuras si, unas interiores a otras. Como las estructuras si pueden volverse bastante complejas para que el algoritmo sea claro, será 34
preciso utilizar indentación (sangría o sangrado), de modo que exista una correspondencia entre las palabras reservadas si y fin_si, por un lado, y entonces y si_no, por otro.Aplicar las estructuras de control repetitivas: mientras, repetir/hasta (hacer - mientras) y desde (para). • Las computadoras están diseñadas especialmente para todas aquellas pequeñas aplicaciones en las cuales una operación o conjunto de ellas deben repetirse muchas veces. Las estructuras que repiten una secuencia de instrucciones un número determinado de veces se denominan bucles y se denomina iteración al hecho de repetir la ejecución de una secuencia de acciones. Un ejemplo aclarará la cuestión. • Supongamos que se desea sumar una lista de números escritos desde el teclado -por ejemplo, calificaciones de los alumnos de una clase-. El medio conocido hasta ahora para leer los números y añadir sus valores a una variable SUMA que contenga las sucesivas sumas parciales. La variable SUMA se hace igual a cero y a continuación se incrementa en el valor del número cada vez que uno de ellos se lea. El algoritmo que resuelve este problema es:algoritmo sumarcalificacionesvar entero : suma, numeroinicio suma ← 0 leer (numero) suma ← suma + numero leer (numero) suma ← suma + numero leer (numero)fin • Y así sucesivamente para cada número de la lista. En otras palabras, el algoritmo repite muchas veces las acciones: leer (numero) suma ← suma + numero • Tales opciones repetidas se denominan bucles o lazos. La acción (o acciones), que se repite en un bucle se denomina iteración. Las dos principales preguntas a realizarse en el diseño de un bucle son ¿qué contiene el bucle? y ¿cuántas veces se debe repetir? • Cuando se utiliza un bucle para sumar una lista de números, se necesita saber cuántos números se han de sumar. Para ello necesitaremos algún medio para detener el bucle. En el ejemplo anterior usaremos la técnica de solicitar al usuario el número que desea, por ejemplo, N. Existe dos procedimientos para contar el número de iteraciones, usar una variable TOTAL que se inicializar a la cantidad de números que se desea y a continuación se decrementa en uno cada vez que el bucle se repite (este procedimiento añade una acción más al cuerpo del bucle: TOTAL ← TOTAL - 1), o bien inicializar la variable TOTAL en 0 o en 1 e ir incrementando en uno a cada iteración hasta llegar al número deseado.algoritmo suma_numerovar entero : n, total real : numero, sumainicio leer ( n ) total ← n suma ← 0 34
mientras total > 0 hacer leer (numero) suma ← suma + numero total ← total - 1 fin_mientras escribir (La suma de los , n ,números es , suma)fin • El bucle podrá también haberse terminado poniendo cualquiera de estas condiciones: o hasta_que total sea cero o desde 1 hasta N • Para detener la ejecución de los bucles se utiliza una condición de parada. El pseudocódigo de una estructura repetitiva tendrá siempre este formato:inicio// inicialización de variablesrepetir acciones S1, S2, ... salir según condición acciones Sn, Sn+1, ...fin_repetirAunque la condición de salida se indica en el formato anterior en el interior del bucle - y existen lenguajesque así lo contienen expresamente -, lo normal es que la condición se indique al final o al principio delbucle, y así se consideran tres tipos de instrucciones o estructuras repetitivas o iterativas generales y unaparticular que denominaremos iterar, que contiene la salida en el interior del bucle. Estas son: • desde (for) • mientras (while) • hacer-mientras (do while) • repetir (repeat) • En muchas ocasiones se conoce de antemano el número de veces que se desean ejecutar las acciones de un bucle. En estos casos, en el que el número de iteraciones es fijo, se debe de usar la estructura para o desde (for en inglés). La estructura desee ejecuta las acciones del cuerpo del blucle un número especificado de veces y de modo automático controla el número de iteraciones o pasos a través del cuerpo del bucle.La representación gráfica de para o desde ("for") es: 34
Pesudocódigo de la estructura para o desdepara v ← vi hasta vf [incremento incr] hacer <acciones> . . .fin_desdev : variable índicevi, vf : variable inicial y final de la variable • La estructura desde comienza con un valor inicial de la variable índice y las acciones especificadas se ejecutan, a menos que el valor inicial sea mayor que el final. La variable índice se incrementa en uno y si este nuevo valor no excede al final, se ejecutan de nuevo las acciones. Por consiguiente, las acciones específicas en el bucle se ejecutan para cada valor de la variable índice desde el valor inicial hasta el valor final con incremento de uno en uno. El incremento de la variable índice siempre es 1 si no se indica expresamente lo contrario, si este es negativo entonces es decremento. Si el valor inicial de la variable índice es menor que el valor final, los incrementos deben ser positivos, ya que en caso contrario la secuencia de acciones no se ejecutaría. De igual modo, si el valor inicial es mayor que el el valor final, el incremento debe ser, en este caso, negativo, es decir, decremento. Al incremento se le suele denominar también paso («step», en inglés). • La estructura repetitiva mientras (en inglés while o do_while: hacer mientras) es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la 34
instrucción mientras la primera cosa que sucede es que se evalúa la condición (una expresión booleana). Si se evalúa falsa, no se toma ninguna acción y el programa prosigue en la siguiente instrucción del bucle. Si la expresión booleana es verdadera, entonces se ejecuta el cuerpo del bucle, después de lo cual se evalúa de nuevo la expresión booleana. Este proceso se repite una y otra vez mientras la expresión booleana (condición) sea verdadera. Las pruebas de las expresiones booleanas, es conveniente que sean mayor o menor en lugar de pruebas de igualdad o desigualdad, y más cuando la comparación son números reales, en este caso, utilice las relaciones <, <=, > ó >=. La representación gráfica de mientras ("while") es: Pesudocódigo de la estructura mientras ("while")mientras condición hacer <acciones> . . .fin_mientras • Obsérvese que en una estructura mientras la primera cosa que sucede es la evaluación de la expresión booleana: si se evalua falsa en ese punto, entonces el cuerpo del bucle nunca se ejecuta. Puede parecer inútil ejecutar el cuerpo del bucle cero veces, ya que no tendrá efecto en ningún valor o salida. Sin embargo, a veces es la acción deseada. • El bucle mientras al igual que el desde, evalúan la expresión al comienzo del bucle de repetición; siempre se utiliza para crear buble pre-test. Los bucles pre-test se denominan también bucles controlados por la entrada. En numerosas ocasiones se necesita que el conjunto de sentencias que componen el cuerpo del bucle se ejecuten al menos una vez, sea cual sea el valor de la expresión o condición de la evaluación. Estos bucles se denominan bucles post-test o bucles controlados por la salida. • El bucle hacer-mientras es análogo al bucle mientras y el cuerpo del bucle se ejecuta y una y otra vez mientras la condición (expresión booleana) es veradera. Existe, sin embargo, una gran diferencia y es que el cuerpo del bucle está encerrado entre las palabras reservadas hacer y mientras, de modo que las sentencias de dicho cuerpo se ejecutan al menos una vez, antes de que se evalúe la expresión booleana. En otras palabras, el cuerpo del bucle siempre se ejecuta, al menos una vez, incluso aunque la expresión booleana sea falsa. La elección entre estos dos bucles, depende del problema de cómputo a resolver. En la mayoría de los casos, la condición de entrada del bucle mientras es la elección correcta.La representación gráfica de hacer-mientras es: 34
Pesudocódigo de la estructura hacer-mientras ("do- while")hacer <acciones> . . .mientras expresión • Repetir (repeat) es un bucle que se ejecuta al menos una vez antes de comprobar la condición de repetición. En la estructura mientras si el valor de la expresión booleana es inicialmente falso, el cuerpo del bucle no se ejecutará; por ello, se necesitan otros tipos de estructuras repetitivas. La estructura repetir se ejecuta hasta que se cumpla una condición determinada que se comprueba al final del bucle, repitiéndose mientras el valor de la expresión booleana de la condición sea falso, justo la opuesta de la sentencia mientras. Con la estructura repetir el cuerpo del bucle se ejecuta siempre al menos una vez. Cuando una instrucción repetir se ejecuta, lo primero que sucede es la ejecución del bucle y, a continuación, se evalúa la expresión booleana. resultante de la condición. Si se evalúa como falsa, el cuerpo del bucle se repite, y la expresión booleana se evalúa otra vez. Después de cada iteración del cuerpo del bucle, la expresión booleana se evalúa; si es verdadera, el bucle termina y el programa sigue en la siguiente instrucción a hasta_que. El estar evaluando la condición y que esta pueda ser dada mediante un valor, por el usuario, es un sistema llamado interactivo por entablar un «diálogo imaginario» entre la computadora y el programador que se produce en «tiempo real» entre ambas partes, es decir, «interactivol» con el usuario.La representación gráfica de repetir hasta ("repeat ... until") es: Pesudocódigo de la estructura repetir ("repeat") 34
repetir <acciones> . . .hasta_que expresión • Las diferencias entre mientras y repetir son que: mientras termina cuando la condición es falsa, mientras que repetir termina cuando la condición es verdadera; y en la estructura repetir el cuerpo del bucle se ejecuta siempre al menos una vez; por el contrario, mientras es más general y permite la posibilidad de que el bucle pueda no ser ejecutado. Para usar la estructura repetir debe estar seguro de que el cuerpo del bucle -bajo cualquier circunstancia- se repetirá al menos una vez.Aplicar las estructuras de control repetitivas anidadas • Es posible insertar un bucle dentro de otro siguiendo la regla de que la estructura interna deberá estar totalmente incluida en la estructura externa, y no puede existir solapamiento. Las variables índice o de control de los bucles toman valores de modo tal que para cada valor de la variable índice del ciclo externo, se debe ejecutar totalmente el bucle interno. También se puede anidar cualquier tipo de estructura repetitiva con tal de que cumpla la regla anterior.Distinguir la función de una variable acumulador, contador o bandera (PA) • Un acumulador es un campo o variable que sirve para llevar una suma o cuenta de diferentes valores. • Un contador es un acumulador que incrementa en uno una determinada variable. • Una bandera es la variable que sirve de centinela, con la cual, podremos evaluar una expresión para iniciar o terminar un ciclo.Distinguir la terminología de estructura de datos • Una estructura de datos es la forma de almacenar datos en la computadora, de tal manera que puedan ser usados de forma eficiente (tiempo y memoria). Por lo general, se escoge la estructura de datos lo cual permitirá un uso más eficiente del algoritmo. Los tipos de datos más frecuentes utilizados en los diferentes lenguajes de programación son: o Datos simples  Estándar: entero (integer), real (real), carácter (char) y lógico (boolean)  Definidos por el programador - no estándar - : subrango (subrange) y el enumerativo (enumerated) o Datos estructurados  Estáticos: arreglos - arrays - vectores/matrices, registros (records), ficheros - archivos (files), conjuntos (set) y las cadenas (string)  Dinámicos: listas (listas/colas), listas enlazadas, árboles y grafos • Los tipos de datos simples o primitivos significan que no están compuestos por otras estructuras de datos; los más frecuentes y utilizados, en casi todos los lenguajes son: enteros, reales y caracter (char), siendo los tipos lógicos, subrango y enumerativos propios de lenguajes estructurados como Pascal. Los tipos de datos compuestos están construidos basados en tipos de datos primitivos; el ejemplo más representativo es la cadena (string) de caracteres. Los tipos de datos simples pueden ser organizados en diferentes estructuras de datos: estáticas y dinámicas. Las estructuras de datos estáticas son aquellas en el que el tamaño ocupado en memoria se define antes de que el programa se ejecute y no puede modificarse dicho tamaño durante la ejecución del programa. Estás estructuras están implementadas en casi todos los lenguajes: array (vectores/tablas - matrices), registros, ficheros o archivos (los conjuntos son específicos del lenguaje Pascal). Las estructuras de datos dinámicas no tienen las limitaciones o restricciones en el tamaño de memoria ocupada que son propias de las estructuras estáticas. Mediante el uso de un tipo de datos específicos denominados puntero. Es posible construir estructuras de datos dinámicas que son soportados por la mayoría de los lenguajes que ofrecen soluciones eficaces y efectivas en la solución de problemas complejos - Pascal es el lenguaje tipo por excelencia con posibilidad de 34
estructuras de datos dinámicos -. Las estructuras dinámicas son las listas - enlazadas, pilas, colas -, árboles - binarios, árbol-b, búsqueda binaria - y grafos. • La elección del tipo de estructura dependerá esencialmente del tipo de aplicación y, en menor medida, del lenguaje. Una característica importante es que en los tipos de datos simples cada variable representa a un elemento; y en los estructurados tienen un identificador común (nombre) que puede representar múltiples datos individuales, pudiendo cada uno de éstos ser referenciados independientemente.Identificar los tipos de datos estructurados estáticos (arreglos) • Un arreglo es un conjunto finito y ordenado de elementos homogéneos. La propiedad ordenado significa que el elemento primero, segundo, tercero, ..., enésimo de una array puede ser identificado. Los elementos de un array son homogéneos, es decir, del mismo tipo de datos. un array puede estar compuesto de todos sus elementos de tipo cadena, otro puede tener todos sus elementos de tipo entero, etc. Los array se conocen también como matrices -en matemáticas- y tablas -en cálculos financieros-.Define el concepto de arreglo unidimensional (vector) y arreglo bidimensional (matriz) (PA) • El tipo de dato más simple de un arreglo es el arreglo unidimensional o vector (matriz de una dimensión). Un ejemplo de un vector de una dimensión denominado NOTAS que consta de n elementos se puede representar con: NOTAS (1) NOTAS (2) ..... NOTAS (I) ..... NOTAS (I) • El subíndice o índice de un elemento (1,2 ..., i, n) designa su posición en la ordenación del vector. Otras posibles notaciones del vector son: En matemáticas y algunos lenguajes como VB a1, a2, ..., ai, ..., an 6.0 y VB.Net A(1), A(2), ..., A(i), ..., A( n ) En programación: Pascal y C A[1], A[2], ..., A[i], ..., A[n] • Obsérvese que solo el vector global tienen el nombre de NOTAS. Los elementos del vector se referencian por su subíndice o índice (subscript), es decir, su posición relativa al valor. • Otro ejemplo de un vector o array unidimensional, se puede considerar el vector TEMPERATURAS, que contiene las temperaturas horarias de una ciudad durante las veinticuatro horas del día. El vector constará de veinticuatro elementos de tipo real, ya que las temperaturas normalmente no serán enteras siempre. El valor mínimo permitido de un vector se denomina límite inferior (L) y el valor máximo permitido se denomina límite superior (U). En el ejemplo del vector TEMPERATURAS el límite inferior es 1 y el superior 24. TEMPERATURAS(I) donde 1<=I<=24. • El número de elementos de un vector se denomina límite inferior del vector (L) y el valor máximo permitido, se denomina límite superior (U). En el ejemplo del vector TEMPERATURAS el límite inferior es 1 y el superior es 24. Los vectores, como ya se ha mencionado, pueden contener valores no numéricos, es decir, tipo caracter. Por ejemplo, un vector que represente las frutas que se venden en un supermercado, o los nombres de los alumnos de una clase: FRUTAS(1) uvas 1 2 Alumnos FRUTAS(2) manzanas 3 Luis Francisco . . . José . i . Victoria FRUTAS(I) papayas 30 . . Martín . . . . Graciela FRUTAS(N) melocotonesAplicar las operaciones de: declaración, inicialización, asignación y recorrido en los arreglosunidimensionales y bidimensionales (DPA) • La declaración o definición de un arreglo se efectúa con: tipo 34
array [límite_inferior ... límite_superior] de tipo : nombre_arraynombre_array nombre válido del array Límite inferior y superior de los elementos delímite_inferior .. límite_superior rango del array Tipo de datos de los elementos del array:tipo entero, real o caracter. • Mediante la siguiente instrucción, se declarará el arreglo (vector) unidimensional NOMBRES, de diez elementos (1 al 10) de tipo caracter:tipo array [1.. 10] de caracter : NOMBRES • Esta otra instrucción se declarará un vector llamado NUMEROS cuyo subíndice va del 0 al 100, es decir, 101 elementos. Dichos elementos son de tipo entero.tipo array [0.. 100] de entero: NUMERO • La inicialización y asignación es la sustitución de todos los elementos de un vector con valores, para asignar un valor a un elemento se podrá hacer con:A[29] ← 0 • Si se desea inicializar o asignar valores a todos los elementos de un vector, se debe recurrir a las estructuras repetitivas (para, mientras o repetir), e incluso selectivas (si-entonces, según). leer(A[i]) Si se introducen los valores 5, 7, 8, 14 y 12 mediante asignaciones A[1] ← 5 A[2] ← 7 A[3] ← 8 A[4] ← 14 A[5] ← 12 • El ejemplo anterior ha asignado diferentes valores a cada elemento del vector A; si se desea dar el mismo valor a todos los elementos, la notación algorítmica se simplifica con el formato.desde i = 1 hasta 5 hacer A[i]) ← 8fin_desde • Donde A[i] tomará los valores numéricos leer(A[i]) Si se introducen los valores 5, 7, 8, 14 y 12 mediante asignaciones A[1] ← 8, A[2] ← 8, ..., A[5] ← 8, Se puede utilizar también la notación A←8 Debe ser considerada con mucho cuidado para evitar confusión con posibles variables simples numéricas de igual nombre (A). • La lectura/escritura de datos en arreglos u operaciones de entrada/salida, normalmente se realizan con estructuras repetitivas, auqnue pueden también hacerse con estructuras selectivas. Las instrucciones simples de lectura/escritura se representarían como:leer (V[5]) Leer el elemento V[5] del vector V • Las operaciones básicas con vectores podrán ser, de acuerdo a vector X con ocho elementos: X[1] X[2] X[3] X[4] X[5] X[6] X[7] X[8] 34
14.0 12.0 8.0 7.0 6.41 5.23 6.15 7.25Elemento Elemento Elemento 1° 2° 8° Visualiza el valor del X[1] o 14.0 Almacena el valor de 45.0 a X[4]escribir (X[1]) Almacena la suma de X[1] y X[3] o bien 22.0 en laX[4] ← 45 variable SUMASUMA ← X[1] + X[3] Añade en la variable SUMA el valor de X[4], esSUMA ← SUMA + X[4] decir, SUMA = 67.0X[5] ← X[5] + 3.5 Suma 3.5 a X[5]; el nuevo valor de X[5] será 9.91X[6] ← X[1] + X[2] Almacena la suma de X[1] y X[2] en X[6]; el nuevo valor de X[6] será 26.5 • El recorrido de un vector podrá hacerse para introducir datos (escribir) en él, o bien para visualizar su contenido (leer). A la operación de efectuar una acción general sobre todos los elementos de un vector se le denomina recorrido del vector. Estas operaciones se realizan utilizando estructuras repetitivas, cuyas variables de control (por ejemplo, I) se utilizan como subíndices del vector (por ejemplo S[I]). El incremento del contador del bucle producirá el tratamiento sucesivo de los elementos del vector. • Se indicará el pseudocódigo de la lectura de 20 valores sucesivos desde el teclado, rellenará de valores el vector F, comenzando con el elemento F[1] y terminando en F[20]algoritmo leer_vectortipo array [1..20] de entero : FINALvar FINAL : Finicio desde i ← 1 hasta 20 hacer leer (F[i]) fin_desdefin • Si se cambia los límites inferior y superior (por ejemplo, 5 y 10), el bucle de lectura sería:desde i ← 5 hasta 10 hacer leer (F[i])fin_desde • Los elementos del vector, se pueden leer también con bucles mientras:i ←1mientras i <=20 hacer leer (F[i]) i ← i+1fin_mientras • O bien, con repetir:i ←1repetir leer (F[i]) i ← i+1hasta_que i > 20 • La salida o escritura de vectores, se representa de un modo similar. La estructura siguiente, visualiza todo el vector completo (un elemento en cada línea independiente).i ←1repetir leer (F[i]) 34
i ← i+1hasta_que i > 20 • Los vectores examinados hasta ahora se denominan arrays unidimensionales y en ellos, cada elemento se define o referencia por un índice o subíndice. Estos vectores son elementos de datos escritos en una secuencia. Sin embargo, existen grupos de datos que son representados mejor en forma de tabla o matriz con dos o más subíndices. Ejemplos típicos de tablas o matrices son: tablas de distancias kilométricas entre ciudades, cuadros u horarios de trenes u aviones, informe de ventas periódicas (mes/unidades vendidas o bien mes/ventas totales), etc. Se pueden definir tablas o matrices como arrays multidimencionales, cuyos elementos se pueden referenciar por dos, tres o más subíndices. Los arrays no unidimensionales los dividiremos en dos grandes grupos: arrays bidimensionales (2 dimensiones) y los arrays multidimensionales (3 ó más dimensiones). • Un array bidimensional se puede considerar como un vector de vectores. Es, por consiguiente, un conjunto de elementos, todos del mismo tipo, en el cual el orden de los componentes es significativo y en el que se necesita especificar dos subíndices para poder identificar cada elemento del array. Uno de tipo unidimensional contiene una sola columna, el bidimensional es un grupo de columnas como la ilustra la siguiente figura: Fila 1 ---> Fila 2 ---> Fila 3 ---> Fila 4 ---> Fila 5 ---> Col Col Col Col Col Col 1 2 3 4 5 6 • El diagrama representa una tabla o matriz de treinta elementos (5 x 6) con 5 filas y 6 columnas. Como en un vector de 30 elementos, cada uno de ellos tiene el mismo nombre. Sin embargo, un subíndice no es suficiente para especificar un elemento de un array bidimensional; por ejemplo, si el nombre del array es Z, no se puede indicar Z[3], ya que no sabemos si es el tercer elemento de la primer fila o de la primera columna. Para evitar la ambigüedad, los elementos de un array bidimensional, se referencian con dos subíndices: el primer subíndice se refiere a la fila y el segundo subíndice se refiere a la columna. Por consiguiente, Z[2, 3] se refiere al elemento de la segunda fila, tercera columna. • En la siguiente figura tenemos a un arreglo B, la representación estándar de un elemento podrá ser así: B[I,J], el cual estará en B ocupando la Iª fila y la Jª columna. 1 2 3 4 ... J ... N 1 2 ... I B[I,J] ... M • Se dice que el array B tiene N por M elementos. Existe N elementos en cada fila y M elementos en cada columna (M*N). En el ejemplo del vector Z, donde se tienen 30 elementos con Z[5,6], el subíndice M, de las filas, va desde 1 hasta 5; y N, de las columnas, va desde 1 hasta el 6. Dependiendo del lenguaje de programación, los subíndices empiezan en 0 ó en 1. • El almacenamiento de valores en un arreglo bidimensional, por ejemplo el arreglo Z, podrá hacerse de las siguientes maneras, por columna mayor:total ← 0desde j ← 1 hasta 6 hacer desde i ← 1 hasta 5 hacer Z[i,j]) ← 10 34
fin_desdefin_desde • O por fila mayor:total ← 0desde i ← 1 hasta 5 hacer desde j ← 1 hasta 6 hacer Z[i,j]) ← 10 fin_desdefin_desdeEn las expresiones lógicas se pueden mezclar operadores de relación y lógicos.Redactar, en lenguaje natural, algoritmos básicos de procedimientos cotidianosExplicar lar siete fases para la solución de problemas en la computadora. El proceso de resolución de unproblema en una computadora conduce a las escritura de un programa y a la ejecución en la misma.Aunque el proceso de diseñar un programa es -esencialmente- un proceso creativo, se puede consideraruna fase o pasos comunes, que generalmente deben de seguir todos los programadores. : • Definición del problema y análisis de los datos. Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada. La computadora requiere especificaciones detalladas de entrada y salida. ¿Qué entradas se requieres? (tipo y cantidad) ¿Cuál es la salida deseada? (tipo y cantidad) ¿Qué método produce la salida deseada?. • Diseño de la solución. En el análisis se determina qué hace el programa. En el diseño se determina cómo hace el programa la tarea solicitada. Los métodos más eficaces para el proceso de diseño se basan en el conocido por divide y vencerás. Es decir, la resolución de un problema complejo se realiza dividiendo el problema en subproblemas (módulos). Cualquier programa consta de un programa principal, que a su vez puede llamar a otros subprogramas. • Herramientas de programación. Las más comunes son los diagramas de flujo (flowchart) y pseudocódigo. Los primeros es una representación gráfica de un algoritmo. Los símbolos más utilizados están normalizados; los segundos son donde las instrucciones se escriben en palabras similares al inglés o español, que facilitan tanto la escritura como la lectura de programas. En esencia, el pseudocódigo se puede definir como un lenguaje de especificaciones de algoritmos. • Codificación. Es la escritura en un lenguaje de programación de la representación de algoritmos desarrollada en las etapas precedentes. Dado que el diseño de un algoritmo es independiente del lenguaje de programación utilizado para su implementación, el código puede ser escrito con igual facilidad en un leguaje o en otro. Para realizar la conversión del algoritmo en programa, se debe de sustituir las palabras reservadas en español por sus homónimos en inglés, y las operaciones/instrucciones indicadas en lenguaje natural expresarlas en el lenguaje de programación correspondiente. La documentación interna es la que se incluye dentro del código del programa mediante comentarios que ayudan a la comprensión del código. • Compilación. Una vez que el algoritmo es convertido en programa fuente, es preciso introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco. Esta operación se realiza con el programa editor, posteriormente el programa fuente se convierte en un archivo de programa que se guarda (graba) en disco. El programa fuente debe 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 tras la compilación, el programa presenta errores (errores de compilación) en el programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo. • Prueba (verificación) y depuración. La verificación de un programa es el proceso de ejecución • Documentación y mantenimiento.Identificar los datos de entrada y salida en el planteamiento de un problema, detallando el proceso desolución 34
Reconocer las características de los algoritmos. Preciso (indicar el orden de realización de cada paso),definido (si se sigue dos veces, se obtiene el mismo resultado cada vez), y finito (tiene fin; tiene númerodeterminado de pasos).Describir las herramientas de representación algorítmica más comunesUtilizar la simbología para la representación de diagramas de flujo, diagramas Nassi-Shneiderman y reglaspara la elaboración de PseudoCódigo.Aplicar la jerarquía de los operadores aritméticos, relacionales y lógicos en la resolución de expresiones.Las reglas de prioridad en las operaciones aritméticas son primero los exponenciales, luego lamultiplicación y división, después el mod y el div, y por último la suma y la resta.En las expresiones lógicas se pueden mezclar operadores de relación y lógicos.Redactar, en lenguaje natural, algoritmos básicos de procedimientos cotidianosExplicar lar siete fases para la solución de problemas en la computadora. El proceso de resolución de unproblema en una computadora conduce a las escritura de un programa y a la ejecución en la misma.Aunque el proceso de diseñar un programa es -esencialmente- un proceso creativo, se puede consideraruna fase o pasos comunes, que generalmente deben de seguir todos los programadores. : • Definición del problema y análisis de los datos. Esta fase requiere una clara definición, donde se contemple exactamente lo que debe hacer el programa y el resultado o solución deseada. La computadora requiere especificaciones detalladas de entrada y salida. ¿Qué entradas se requieres? (tipo y cantidad) ¿Cuál es la salida deseada? (tipo y cantidad) ¿Qué método produce la salida deseada?. • Diseño de la solución. En el análisis se determina qué hace el programa. En el diseño se determina cómo hace el programa la tarea solicitada. Los métodos más eficaces para el proceso de diseño se basan en el conocido por divide y vencerás. Es decir, la resolución de un problema complejo se realiza dividiendo el problema en subproblemas (módulos). Cualquier programa consta de un programa principal, que a su vez puede llamar a otros subprogramas. • Herramientas de programación. Las más comunes son los diagramas de flujo (flowchart) y pseudocódigo. Los primeros es una representación gráfica de un algoritmo. Los símbolos más utilizados están normalizados; los segundos son donde las instrucciones se escriben en palabras similares al inglés o español, que facilitan tanto la escritura como la lectura de programas. En esencia, el pseudocódigo se puede definir como un lenguaje de especificaciones de algoritmos. • Codificación. Es la escritura en un lenguaje de programación de la representación de algoritmos desarrollada en las etapas precedentes. Dado que el diseño de un algoritmo es independiente del lenguaje de programación utilizado para su implementación, el código puede ser escrito con igual facilidad en un leguaje o en otro. Para realizar la conversión del algoritmo en programa, se debe de sustituir las palabras reservadas en español por sus homónimos en inglés, y las operaciones/instrucciones indicadas en lenguaje natural expresarlas en el lenguaje de programación correspondiente. La documentación interna es la que se incluye dentro del código del programa mediante comentarios que ayudan a la comprensión del código. • Compilación. Una vez que el algoritmo es convertido en programa fuente, es preciso introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco. Esta operación se realiza con el programa editor, posteriormente el programa fuente se convierte en un archivo de programa que se guarda (graba) en disco. El programa fuente debe 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 tras la compilación, el programa presenta errores (errores de compilación) en el programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo. • Prueba (verificación) y depuración. La verificación de un programa es el proceso de ejecución • Documentación y mantenimiento. 34
Identificar los datos de entrada y salida en el planteamiento de un problema, detallando el proceso desoluciónReconocer las características de los algoritmos. Preciso (indicar el orden de realización de cada paso),definido (si se sigue dos veces, se obtiene el mismo resultado cada vez), y finito (tiene fin; tiene númerodeterminado de pasos).Describir las herramientas de representación algorítmica más comunesUtilizar la simbología para la representación de diagramas de flujo, diagramas Nassi-Shneiderman y reglaspara la elaboración de PseudoCódigo.Aplicar la jerarquía de los operadores aritméticos, relacionales y lógicos en la resolución de expresiones.Las reglas de prioridad en las operaciones aritméticas son primero los exponenciales, luego lamultiplicación y división, después el mod y el div, y por último la suma y la resta.Tema 4Identificar cada una de las técnicas de programación: estructurada, modular, orientada a objetos,orientada a eventos, funcional y lógica • Una técnica de programación es una metodología que debe de seguirse y tomarse en cuenta al momento de programar. Deberá entenderse que para la programación deberán asumirse ciertas normas que permitan la estandarización de la programación, implicando una disminución de costos, independencia del programador y seguridad. Debe de tomarse en cuenta los paradigmas de la programación. • La programación estructurada es escribir un programa en base a lo siguiente: el programa tiene un diseño modular, los módulos son diseñados de forma descendente; y cada módulo se codifica utilizando las tres estructuras de control básicas: secuencia, selección y repetición. Este término se refiere a un conjunto de técnicas que han ido evolucionando desde los primeros trabajos de Edsger Dijkstra. Estas técnicas aumentan considerablemente la productividad del programa reduciendo en elevado grado el tiempo requerido para escribir, verificar, depurar y mantener los programas. La programación estructurada utiliza un número limitado de estructuras de control que minimiza la complejidad de los programas y, por consiguiente, reducen los errores; hace los programas más fáciles de escribir, verificar, leer y mantener. Los programas deberán estar dotados de una estructura, incorporando: a) recursos abstractos (esto consiste en descomponer una determinada acción compleja en términos de un número de acciones más simples capaces de ejecutarlas o que constituyan instrucciones de computadoras disponibles); b) diseños descendentes (top-down). (descomponer el problema en una serie de niveles o pasos sucesivos de refinamiento - stepwise -, efectuando una relación entre las diferentes etapas de estructuración de modo que se relacionasen unas con otras mediante entradas y salidas de información, es decir, considerando cada estructura desde dos puntos de vista: ¿qué hace? y ¿cómo lo hace?.; y el uso de estructuras de control básicas (secuencia, selección y repetición). • Programación modular se refiere al mejoramiento más flexible y eficiente del programa. El programa se divide en módulos (partes independientes), cada una de las cuales ejecuta una única actividad o tarea y se codifica independientemente de otros módulos. Cada uno de estos módulos se analizan, codifican y ponen a punto por separado. Cada programa contiene un módulo llamado programa principal, que controla todo lo que sucede; se transfiere el control a submódulos (posteriormente se denominarán subprogramas), de modo que ellos pueden ejecutar sus funciones; sin embargo, cada submódulo devuelve el control al módulo principal cunado se haya completado su tarea. Si la tarea asignada a cada submódulo es demasiado compleja, éste deberá romperse en otros módulos más pequeños. Los módulos son independientes en el sentido en que ningún módulo puede tener acceso directo a cualquier otro módulo, excepto el módulo al que llama y a sus propios submódulos. Sin embargo, los resultados producidos por un módulo pueden ser utilizados por cualquier otro módulo cuando se transfiera a ellos el control. Dado que los módulos son independientes, diferentes programadores pueden trabajar simultáneamente en diferentes partes del mismo programa. Esto reducirá el tiempo de diseño del algoritmo y posterior codificación 34
del programa. Además, un módulo se puede modificar radicalmente sin afectar a los otros módulos, incluso sin alterar su función principal. La descomposición de un programa en módulos independientes más simples se conoce también como el método «divide y vencerás» (divide and conquer). Se diseña cada módulo con independencia de los demás, y siguiendo un método ascendente o descendente se llegará hasta la descomposición final del problema en módulos en forma jerárquica. • Para llegar a programar de modo orientado a objetos, se basa en los conceptos de modularidad, abstracción procedimental, abstracción de datos y ocultación de la información de acuerdo al módulo o tipo de dato objeto. Las prioridades fundamentales de un tipo son: encapsulamiento (combinar datos y operaciones que se puedan ejecutar sobre esos datos en un objeto. En C+ +/Java el encapsulamiento en un objeto se codifica mediante una clase), herencia (es la propiedad que permite a un objeto transmitir sus propiedades a otros objetos denominados descendientes; la herencia permite la reutilización de objetos que se hayan definido con anterioridad) y polimorfismo (es la propiedad que permite decidir en tiempo de ejecución la función a ejecutar, al contrario que sucede cuando no existe polimorfismo, en el que la función ejecutar se decide previamente y sin capacidad de modificación, en tiempo de compilación). • La orientada a eventos no es programar de forma tradicional, donde se sigue un patrón que controla el propio flujo del programa, solamente cambia algunas veces cuando se llega a una posición donde existen dos caminos, el control del flujo de un programa orientado a eventos es extremadamente conducido por eventos externos. En vez de esperar por un comando el cual ordene que se procede determinada información, el sistema esta pre-programado para realizar un ciclo de forma repetida, para verla y realizar una función que desencadena en su procesamiento. Por lo tanto, cuando se desencadena la función previamente definida, corresponderá al comportamiento requerido. • Funcional trata a la computación como una evaluación de funciones matemáticas. Aquí se enfatiza en la definición de funciones que implementen estados de la máquina, en contraparte con la programación basada en procedimientos, la cual está basada en la ejecución de comandos de forma secuencial. Un programa puramente funcional no usa la mutación, cuando modifica el valor de un estado para producir valores, construye nuevos valores, sin sobre escribirlos, de los existentes. • La lógica hace uso de patrones de invocaciones directas de procedimientos por afirmaciones y objetivos.Identificar la correspondencia entre las técnicas de programación (estructurada, modular, orientada aobjetos, orientada a eventos, funcional y lógica) y los lenguajes de programación • Cada una de las diferentes técnicas de programación pueden utilizarse y obtener lo mejor de cada una de ellas dependiendo del lenguaje de programación, por lo que debe de aprovecharse cada uno de los aspectos que más nos convenga. Cada una de las técnicas ha sido eficientada y creada para resolver determinadas situaciones, debemos de conocerlas, aprovecharlas y utilizarlas en el lenguaje de programación de nuestra preferencia.mprender la importancia de dividir un algoritmo en subrutinas para simplificarlo y facilitar su solución • Un método para solucionar un problema complejo es subdividirlo en subproblemas - problemas más sencillos - y a continuación dividir estos subproblemas en otros más simples. Aunque las funciones son útiles para resolver problemas, en ocasiones es necesario tener subprogramas que calculen varios resultados en ver de uno solo, o que realicen la ordenación de una serie de números, etc. En estas situaciones la función no es apropiada y se necesita disponer del otro tipo de subprograma: el procedimiento o subrutina. • Un procedimiento o subrutina es un subprograma que ejecuta un proceso especifico. Ningún valor está asociado con el nombre del procedimiento, por consiguiente, no puede ocurrir en una expresión. Un procedimiento se llama escribiendo su nombre, por ejemplo, SORT, para indicar que un procedimiento denominado SORT se va a usar. Cuando se invoca el procedimiento, los pasos que lo definen se ejecutan y a continuación se devuelve el control al programa que lo llamó. Las funciones regresan un valor, los procedimientos pueden devolver 0, 1 o n valores y en forma de lista de parámetros. El procedimiento se declara igual que la función, pero su nombre no está asociado a ninguno de los resultados que obtiene. procedimiento nombre (clase tipo_de_dato: F1; clase tipo_de_dato: F2; ........................... clase tipo_de_dato: 34
Fn) . . acciones S1, S2, ... salir según condición acciones Sn, Sn+1, ... fin_procedimientoY la llamada al subprograma con llamar_a nombre (A1, A2, ..., An) • Cuando un programa llama a un subprograma, la información se comunica a través de la lista de parámetros y se establece una correspondencia automática entre los parámetros formales y actuales. Los parámetros actuales son «sustituidos» o «utilizados» en lugar de los parámetros formales. • Existen dos métodos para establecer la correspondencia entre parámetros: la correspondencia posicional se establece aparejando los parámetros reales y formales según su posiciónAplicar la programación modular en el desarrollo de sus algoritmos • Como ya se mencionó antes, la programación modular es dividir un programa en módulos o programas independientes ejecutando una actividad única. Existe un programa principal el cual llama a los submódulos transfiriéndoles el control, estos ejecutarán sus funciones para posteriormente devolver el control al módulo principal una vez que haya completado su tarea.Aplicar el paso de parámetros para hacer más eficiente sus funciones • Una función es una operación que toma uno o más valores llamados argumentos y produce un valor denominado resultado - valor de la función para los argumentos dados -. Todos los lenguajes de programación tienen funciones incorporadas o intrínsecas y funciones definidas por el usuario. Un parámetro formal es un valor que no está asociado con la definición de la función. La definición de una función constará de una cabecera que comenzará con el tipo de valor devuelto por la función, seguido de la palabra función y del nombre y argumentos de dicha función. A continuación irá el cuerpo de dicha función que será una serie de acciones o instrucciones cuya ejecución hará que se asigne un valor al nombre de la función. Esto determina el valor particular del resultado que ha de devolverse al programa llamador. La declaración de la función será:<tipo_de_resultado> funcion <nombre_fun> (lista deparámetros)[declaraciones locales]inicio acciones // cuerpo de la función devolver (<expresión>)fin_funciónIdentificar el desarrollo algorítmico de un problema con su codificación en un lenguaje de programación • Para solucionar un problema mediante un diagrama de flujo o un lenguaje de programación, se deberán contemplar cuatro pasos: Entender cabalmente el problema a solucionar; planear la solución del problema en papel observando todas las situaciones y condiciones que tendrá la solución del problema; ejecutar lo planeado en papel pasándolo al diagrama de flujo o al lenguaje de programación; y la revisión de la solución para que cumpla las condiciones para resolver el problema. • Una de las características más importantes en la construcción de programas, sobre todo los de gran tamaño, es el estilo de programación. La buena calidad de los programas tiene relación con la escritura de estos, su legibilidad y comprensibilidad. Un buen estilo suele venir con la práctica, pero el requerimiento de unas reglas hace necesario seguirlas para que el programa pueda ser leído y modificado por otra persona. Las reglas dependen del tipo de programación y lenguaje elegido, es conveniente considerar las siguientes reglas de estilos: o Modularizar un programa en partes coherentes (uso amplio de subprogramas). Dividirlo para hacerlo más manejable, dividirlo no garantiza un sistema bien organizado, será preciso encontrar reglas que permitan una buena organización. La independencia es la clave en la división, es decir, acoplamiento de los módulos. El acoplamiento se refiere al grado de 34
interdependencia entre los módulos. Este grado se puede utilizar para evaluar la calidad de un diseño de un sistema.o Evitar variables globales en subprogramas. Los efectos de las variables globales producen efectos laterales indeseados, normalmente. No es correcto el uso de variables globales en subprogramas, pero su uso no tiene porque ser perjudicial.o Usar nombres significativos para identificadores. Los nombres de los módulos, subprogramas, funciones, tipos, variables y otros elementos deben de ser significativos para que ayuden al lector a recordar el propósito del identificador sin tener que hacer referencia continua a declaraciones o listas externas de variables. Hay que evitar abreviaturas crípticas.o Definir constantes con nombres. Este sistema tiene la ventaja de cambiar un valor determinado bien por necesidad o por cualquier error tipográfico.o Evitar el uso de ir (goto). Uno de los factores que mas contribuyen a diseñar programas bien estructurados es el flujo de control ordenado que implica: el flujo es adelante y directo; la entrada solamente se hace al principio y la salida al final; la condición para la terminación de un bucle, debe ser clara y uniforme; y los casos alternativos de las sentencias condicionales, también, han de ser claros y uniformes. El uso de goto casi siempre viola las anteriores condiciones, por consiguiente, evite su uso.o Uso adecuado de parámetros valor/variable. Un programa se comunica con otro mediante el uso de parámetros. Los parámetros valor pasan los valores al subprograma, pero ningún cambio que el programa hace a estos parámetros se refleja en los parámetros reales de entorno a la rutina llamadora. La comunicación entre la rutina llamadora y el subprograma, es de un solo sentido; por esta causa, en el caso de módulos aislados, se deben utilizar parámetros valor siempre que sea posible. El uso de parámetros variable es más evidente cuando un procedimiento necesita devolver valores a la rutina llamadora. Sin embargo, si el procedimiento necesita devolver sólo un único valor, puede ser más adecuado usar una función.o Uso adecuado de funciones. Las funciones deben de utilizarse siempre que se necesite obtener un único valor. Este uso corresponde a la noción matemática de función. Por consiguiente, es muy extraño que una función realice una tarea diferente de devolver un valor y no debe hacerlo. Una función debe de devolver un valor requerido y nunca tener un efecto lateral, por lo tanto: una función no deberán asignar valores a variables globales; y las funciones no deben de utilizar parámetros variables que puedan cambiar dentro de estas, si se necesitan parámetros variables, utilice procedimientos.o Tratamiento de errores. Un programa diseñado ante fallos debe comprobar errores en las entradas y en su lógica e intentar comportarse bien cuando los encuentra. El tratamiento de errores con frecuencia necesita acciones excepcionales que constituirán un mal estilo en la ejecución normal del programa. Por ejemplo, un programa deberá validar las entradas y ejecutar una acción cuando se encuentra este error, como presentar un mensaje de error y devolver un indicador o bandera lógica a la rutina llamadora para indicarle que ha encontrado una línea de datos no válida; en este caso, el procedimiento deja la responsabilidad de realizar la acción apropiada a la rutina llamadora. Dependiendo del contexto, las acciones apropiadas pueden ir desde ignorar los datos erróneos hasta continuar la ejecución para terminar el programa. En caso de un error fatal, la terminación no es un método más limpio sino la de interrumpir la ejecución. Otra situación es la encontrada en las estructuras condicionales o repetitivas donde se puede presentar un error fatal; la primera acción puede ser llamar a un procedimiento de diagnóstico que imprima la información necesaria para ayudarle a determinar la causa del error, y cuando el procedimiento muestra toda esa información, el programa puede terminarse. Sin embargo, si el procedimiento de diagnóstico devuelve el control al punto en el que fue llamado, debe salir de muchas capas de estructura de control anidadas. En este caso la solución más limpia es que la última sentencia del procedimiento de diagnóstico sea INTERRUMPIR.o Legibilidad. Para que un programa sea fácil de seguir su ejecución (la traza) debe tener una buena estructura y diseño, una buena elección de identificadores, buen sangrado consistente (de 3 a 5 espacios y la sentencia inicio-fin debe de estar alineadas) y utilizar líneas en blanco en lugares adecuados, y una buena documentación. 34

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución