Adicionalmente el CodeBlocks se puede bajar de la siguiente dirección:
UNIDAD 1: Lenguaje Algorítmico y Estructuras de Control. Algoritmos. Definición formal de Algoritmo
En general, no existe ningún consenso definitivo en cuanto a la definición formal de algoritmo.
Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten los datos de un problema (entrada) en una solución (salida). Sin embargo cabe notar que algunos algoritmos no necesariamente tienen que terminar o resolver un problema en particular.
Por ejemplo, una versión modificada de la premisa de Eratóstenes” que nunca termine de calcular números primos no deja de ser un algoritmo.
A lo largo de la historia varios autores han tratado de definir formalmente a los algoritmos utilizando modelos matemáticos como máquinas de Turing entre otros Sin embargo, estos modelos están sujetos a un tipo particular de datos como son números, símbolos o gráficas mientras que, en general, los algoritmos funcionan sobre una vasta cantidad de estructuras de datos. En general, la parte común en todas las definiciones se puede resumir en las siguientes tres propiedades siempre y cuando no consideremos algoritmos paralelos:
Tiempo secuencial. Un algoritmo funciona en tiempo discretizado –paso a paso–, definiendo así una secuencia de estados “computacionales” por cada entrada válida (la entrada son los datos que se le suministran al algoritmo antes de comenzar).
Estado abstracto. Cada estado computacional puede ser descrito formalmente utilizando una Estructura de primer orden y cada algoritmo es independiente de su implementación (los algoritmos son objetos abstractos) de manera que en un algoritmo las estructuras de primer orden son invariantes bajo isomorfismo.
Exploración acotada. La transición de un estado al siguiente queda completamente determinada por una descripción fija y finita; es decir, entre cada estado y el siguiente solamente se puede tomar en cuenta una cantidad fija y limitada de términos del estado actual.
En resumen, un algoritmo es cualquier cosa que funcione paso a paso, donde cada paso se pueda describir sin ambigüedad y sin hacer referencia a una computadora en particular, y además tiene un límite fijo en cuanto a la cantidad de datos que se pueden leer/escribir en un solo paso. Esta amplia definición abarca tanto a algoritmos prácticos como aquellos que solo funcionan en teoría, por ejemplo el Métodos de Newton y la eliminación Gauss – Jordan funcionan, al menos en principio, con números de precisión infinita; sin embargo no es posible programar la precisión infinita en una computadora, y no por ello dejan de ser algoritmos.
En particular es posible considerar una cuarta propiedad que puede ser usada para validar la Tesis de Curch- Turing de que toda función calculable se puede programar en una máquina de Turing (o equivalentemente, en un lenguaje de programación suficientemente general)
Aritmetizabilidad. Solamente operaciones innegablemente calculables están disponibles en el paso inicial.
Medios de expresión de un algoritmo Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo,diagramas de flujo y lenguajes de programación entre otros.
Las descripciones en lenguaje natural tienden a ser ambiguas y extensas. El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural.
Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.
La descripción de un algoritmo usualmente se hace en tres niveles:
- Descripción de alto nivel. Se establece el problema, se selecciona un modelo matemático y se explica el algoritmo de manera verbal, posiblemente con ilustraciones y omitiendo detalles.
- Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.
- Implementación. Se muestra el algoritmo expresado en un lenguaje de programación específico o algún objeto capaz de llevar a cabo instrucciones.
También es posible incluir un teorema que demuestre que el algoritmo es correcto, un análisis de complejidad o ambos.
Representación de Algoritmos Hay distintos métodos de representar los algoritmos como:
o Texto: Se usa el lenguaje común para describir el algoritmo
o Pseudocódigo: este tipo de representación mezcla el lenguaje de programación con un idioma, ya sea español, ingles o cualquier otro, se puede definir como un lenguaje de especificación de algoritmos. Es la representación narrativa de los pasos que debe de seguir un algoritmo. Este método es mas compacto, mas fácil de escribir y mas fácil de transcribir a un lenguaje de programación que el diagrama de flujo.
o Diagrama de flujo: son herramientas graficas para representar algoritmos. esta compuesto por símbolos, como: rectángulos rombos, cuadrados, etc., unidos por flechas, estos símbolos representan acciones y orden en como se realizan estas. Es decir, los diagramas de flujo son diagramas que emplean símbolos gráficos para representar algoritmos.
o Diagrama de Nassi-Schneiderman: También conocido como diagrama de Chapín, es un método se representación de algoritmos que combina la descripción textual con la descripción grafica, es como una combinación del Pseudocódigo con el diagrama de flujo. Por lo general todo lo que se puede representar en un diagrama de flujo se puede representar en este tipo de diagrama. Este tipo de representación cuenta con un conjunto limitado de símbolos para representar los pasos del algoritmo
El diagrama Nassi-Shneiderman refleja la descomposición del problema en una forma simple usando cajas anidadas para representar cada uno de los sub-problemas. Ejemplos:
o Nivel de implementación: consiste en expresar un algoritmo mediante una maquinaria, un programa de computadora o algún objeto que realice las acciones planteadas por el algoritmo en cuestión. En general, la implementación es el objetivo de diseñar un algoritmo (pero no siempre).
Descripción Narrada
Este algoritmo es caracterizado porque sigue un proceso de ejecución común y lógico, describiendo textualmente paso a paso cada una de las actividades a realizar dentro de una actividad determinada.
Ejemplo 1 Algoritmo para asistir a clases:
1. Levantarse
2. Bañarse
3. Vestirse
4. Desayunar
5. Cepillarse los dientes
6. Salir de casa
7. Tomar el autobús
8. Llegar a la ESPE
9. Buscar el aula
10. Ubicarse en un asiento
Pseudocódigo El pseudocódigo (falso lenguaje, el prefijo pseudosignifica falso) es una descripción de alto nivel de un algoritmo que emplea una mezcla de lenguaje natural con algunas convenciones sintácticas propias de lenguajes de programación, como asignaciones, ciclos y condicionales, aunque no está regido por ningún estándar. Es utilizado para describir algoritmos en libros y publicaciones científicas, y como producto intermedio durante el desarrollo de un algoritmo, como los Diagramas de flujo, aunque presentan una ventaja importante sobre estos, y es que los algoritmos descritos en pseudocódigo requieren menos espacio para representar instrucciones complejas.
El pseudocódigo está pensado para facilitar a las personas el entendimiento de un algoritmo, y por lo tanto puede omitir detalles irrelevantes que son necesarios en una implementación. Programadores diferentes suelen utilizar convenciones distintas, que pueden estar basadas en la sintaxis de lenguajes de programación concretos. Sin embargo, el pseudocódigo, en general, es comprensible sin necesidad de conocer o utilizar un entorno de programación específico, y es a la vez suficientemente estructurado para que su implementación se pueda hacer directamente a partir de él.
Así el pseudodocódigo cumple con las funciones antes mencionadas para representar algo abstracto los protocolos son los lenguajes para la programación. Busque fuentes más precisas para tener mayor comprensión del tema.
Ejemplo 1
Diseñar un algoritmo que lea cuatro variables y calcule e imprima su producto, suma y media aritmética.
inicio
leer (a, b, c, d)
producto <– (a * b * c * d)
suma <– (a + b + c + d)
media <– (a + b + c + d) / 4
escribir (producto, suma, media)
fin
Diagramas N-S
Son herramientas que favorece la programación estructurada y reúne características gráficas propias de diagramas de flujo y lingüísticas propias de pseudocódigos. Constan de una serie de cajas contiguas que se leerán siempre de arriba-abajo y sus estructuras lógicas son las siguientes:
Estructura Secuencial
Diagrama de flujo
Son la representación gráfica de la solución algorítmica de un problema. Para diseñarlos se utilizan determinados símbolos o figuras que representan una acción dentro del procedimiento. Utilizan unos símbolos normalizados, con los pasos del algoritmo escritos en el símbolo adecuado y los símbolos unidos con flechas, denominadas líneas de flujo, que indican el orden en que los pasos deben ser ejecutados.
La Figura de Diagramas de Flujo que expresa un algoritmo para calcular la raíz cuadrada de un número
Los diagramas de flujo son descripciones gráficas de algoritmos; usan símbolos conectados con flechas para indicar la secuencia de instrucciones y están regidos por ISO.
Los diagramas de flujo son usados para representar algoritmos pequeños, ya que abarcan mucho espacio y su construcción es laboriosa. Por su facilidad de lectura son usados como introducción a los algoritmos, descripción de un lenguaje y descripción de procesos a personas ajenas a la computación.
Los algoritmos pueden ser expresados de muchas maneras, incluyendo al lenguaje natural, pseudocódigo, diagramas de flujo y lenguajes de programación entre otros. Las descripciones en lenguaje natural tienden a ser ambiguas y extensas.
El usar pseudocódigo y diagramas de flujo evita muchas ambigüedades del lenguaje natural. Dichas expresiones son formas más estructuradas para representar algoritmos; no obstante, se mantienen independientes de un lenguaje de programación específico.
Diagramas de Flujo
Los diagramas de flujo sirven para representar algoritmos de manera gráfica.
En matemáticas, ciencias de la computación y disciplinas relacionadas, un algoritmo (del griego y latín, dixit algorithmus y este a su vez del matemático persa Al-Juarismi ) es un conjunto preescrito de instrucciones o reglas bien definidas, ordenadas y finitas que permite realizar una actividad mediante pasos sucesivos que no generen dudas a quien deba realizar dicha actividad. Dados un estado inicial y una entrada, siguiendo los pasos sucesivos se llega a un estado final y se obtiene una solución. Los algoritmos son el objeto de estudio de la algoritmia.
En la vida cotidiana, se emplean algoritmos frecuentemente para resolver problemas. Algunos ejemplos son los manuales de usuario, que muestran algoritmos para usar un aparato, o las instrucciones que recibe un trabajador por parte de su patrón. Algunos ejemplos en matemática son el algoritmo de la división para calcular el cociente de dos números, el Algoritmo de Euclides para obtener el Máximo Común Divisor de dos enteros positivos, o el Método de Gauss para resolver un Sistema Lineal de Ecuaciones.
Para su elaboración se siguen ciertas reglas:
- Se escribe de arriba hacia abajo y de izquierda a derecha
- Siempre se usan flechas verticales u horizontales, jamás curvas
- Evitar cruce de flujos
- En cada paso expresar una acción concreta
Secuencia de flujo normal en una solución de problema
- Tiene un inicio
- Una lectura o entrada de datos
- El proceso de datos
- Una salida de información
- Un final
Simbología para diseñar flujogramas.
VENTAJAS DE USAR FLUJOGRAMAS
- Rápida comprensión de las relaciones
- Análisis efectivo de las diferentes secciones del programa
- Pueden usarse como modelos de trabajo en el diseño de nuevos programas o sistemas
- Comunicación con el usuario
- Documentación adecuada de los programas
- Codificación eficaz de los programas
- Depuración y pruebas ordenadas de programas
DESVENTAJAS DE LOS FLUJOGRAMAS
- Diagramas complejos y detallados suelen ser laboriosos en su planteamiento y diseño
- Acciones a seguir tras la salida de un símbolo de decisión, pueden ser difíciles de seguir si existen diferentes caminos
- No existen normas fijas para la elaboración de los diagramas de flujo que permitan incluir todos los detalles que el usuario desee introducir.
Representando el ejemplo como flujograma tenemos:
Sistemas formales
La teoría de autómatas y la teoría de funciones recursivas proveen modelos matemáticos que formalizan el concepto de algoritmo.
Los modelos más comunes son la máquina de Turing, máquina de registro y funciones u-recursivas. Estos modelos son tan precisos como un lenguaje de máquina, careciendo de expresiones coloquiales o ambigüedad, sin embargo se mantienen independientes de cualquier computadora y de cualquier implementación
Implementación
Muchos algoritmos son ideados para implementarse en un programa. Sin embargo, los algoritmos pueden ser implementados en otros medios, como una red neuronal, un circuito eléctrico o un aparato mecánico y eléctrico. Algunos algoritmos inclusive se diseñan especialmente para implementarse usando lápiz y papel. El algortitmo de multiplicación tradicional, elalgoritmo de Euclides, la criba de Erástones y muchas formas de resolver la raíz cuadrada son sólo algunos ejemplos.
Variables
Son elementos que toman valores específicos de un tipo de datos concreto. La declaración de una variable puede realizarse comenzando con var. Principalmente, existen dos maneras de otorgar valores iniciales a variables:
- Mediante una sentencia de asignación.
- Mediante un procedimiento de entrada de datos (por ejemplo: ‘read’).
Ejemplo:
…
i:=1;
read(n);
while i < n do begin
(* cuerpo del bucle *)
i := i + 1
end;
…
Estructuras secuenciales
La estructura secuencial es aquella en la que una acción sigue a otra en secuencia. Las operaciones se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el fin del proceso. La asignación de esto consiste, en el paso de valores o resultados a una zona de la memoria. Dicha zona será reconocida con el nombre de la variable que recibe el valor. La asignación se puede clasificar de la siguiente forma:
- Simples: Consiste en pasar un valor constante a una variable (a ← 15)
- Contador: Consiste en usarla como un verificador del número de veces que se realiza un proceso (a ← a + 1)
- Acumulador: Consiste en usarla como un sumador en un proceso (a ← a + b)
- De trabajo: Donde puede recibir el resultado de una operación matemática que involucre muchas variables (a ← c + b*2/4).
Un ejemplo de estructura secuencial, Codificado en C++, como obtener la área de un triángulo:
Inicio
…
float b, h, a;
printf(“Diga la base”);
scanf(“%f”, &b);
printf(“Diga la altura”);
scanf(“%f”, &h);
a = (b*h)/2;
printf(“El área del triángulo es %f”, a)
…
Fin
INSTRUCCIONES SI … ENTONCES SI Y SI … ENTONCES – SINO
La instrucción Si … Entonces permite controlar qué procesos tienen lugar en función del valor de una o varias variables o de las decisiones del usuario. Escribiremos esta instrucción de la siguiente manera:
Se podrán introducir instrucciones a realizarse en caso de no cumplirse la condición:
Nótese que el uso de sangrías permite identificar el bloque de sentencias a ejecutar. Gráficamente:INSTRUCCIÓN SI – ENTONCES
INSTRUCCIÓN SI – ENTONCES – SINO
Recordemos que para expresar condiciones disponemos de símbolos matemáticos como =, >, <, etc. así como de los operadores y (and) y ó (or).
EJEMPLO
La instrucción Si … Entonces es anidable dentro de sí misma. Esto significa que puede haber un bloque Si … Entonces dentro de otro. Se hace más necesario que nunca el sangrado para que el pseudocódigo sea legible. Ha de verificarse que todo Si se cierra con un FinSi
Los anidamientos se pueden convertir en triples, cuádruples, quíntuples, etc. lo cual convierte en farragosa la lectura y seguimiento del pseudocódigo. Habrá que tratar de evitar excesos usando otros recursos, desviando a módulos independientes, etc.
Cuando sea necesario por la complejidad en la toma de decisiones, se recurrirá a una tabla de decisión como paso previo a la confección del pseudocódigo o diagrama de flujo.
EN RESUMEN:
Una instrucción de control condicional es un bloque de código que se ejecuta si cumple una condición, que nosotros pongamos. Esta condición es una expresión lógica que debe dar como resultado true o false, para ello es habitual usar los operadores relacionales y lógicos.
Las dos mas utilizadas son:
- Condicional simple: si la condición es verdadera se ejecuta el bloque de código que contenga y ya esta. Su sintaxis es:
SI (condición) Entonces
Instrucciones
Fin-Si
Por ejemplo:
| 123456 | Inicio Leer numero1 Si (numero1>0) Entonces Escribir numero1 " es mayor que 0" FinSi Fin |
- Condicional doble: si la condición es verdadera se ejecuta el bloque de código que contenga y sino se cumple pues ejecuta otro bloque de codigo. Ejecuta uno o otro. Su sintaxis es:
SI (condición) Entonces
Instrucciones
Sino
Instrucciones
Fin-Si
| 12345678 | Inicio Leer numero1 Si (numero1>0) Entonces Escribir numero1 " es mayor que 0" Sino Escribir numero1 " es menor que 0" FinSi Fin |
Algo que se suele hacer es anidar estructuras Si, se puede usar para especificar aun mas una condición Debemos recordar que debemos cerrar las estructuras Si que abramos, es recomendable tabular las instrucciones para mayor legibilidad. Veamos un ejemplo:
| 1234567891011 | Inicio Si (condicion) Entonces Si (condicion) Entonces Instrucciones Sino Intrucciones FinSi Sino Instrucciones FinSiFin |
También existe otra instrucción de control condicional, llamado segun sea, que según un valor (de una variable, una constante, etc.) o expresión hace una operación u otra. No puede ser una condición. Su sintaxis es:
Segun (valor o expresion) hacer
valor1:
Instrucciones
valor2:
Instrucciones
….
FinSegun
Por ejemplo:
| 1234567891011121314151617181920212223242526272829 | Inicio Leer mes Segun mes Hacer 1: escribir "Enero" 2: escribir "Febrero" 3: escribir "Marzo" 4: escribir "Abril" 5: escribir "Mayo" 6: escribir "Junio" 7: escribir "Julio" 8: escribir "Agosto" 9: escribir "Septiembre" 10: escribir "Octubre" 11: escribir "Noviembre" 12: escribir "Diciembre" FinSegunFin |
Múltiples (En caso de): Las estructuras de comparación múltiples, es una toma de decisión especializada que permiten evaluar una variable con distintos posibles resultados, ejecutando para cada caso una serie de instrucciones especificas. La forma es la siguiente:
Pseudocódigo:
Diagrama de flujo:
Veamos algunos ejemplos donde se aplique todo lo anterior:
Se pide leer tres notas del alumno, calcular su definitiva en un rango de 0-5 y enviar un mensaje donde diga si el alumno aprobó o reprobó el curso. Exprese el algoritmo usando Pseudocódigo y diagrama de flujos.
Pseudocódigo:
INICIO
Not1, Not2, Not 3 :REAL
Def: REAL
LEA Nota1, Nota2, Nota3
Def ß (Not1 + Not2 + Not3) /3
Si Def < 3 entonces
Escriba Reprobó el curso
Sino
Escriba Aprobó el curso
Fin-Si
FIN
EJEMPLO:
Se desea escribir un algoritmo que pida la altura de una persona, si la altura es menor o igual a 150 cm envíe el mensaje: Persona de altura baja; si la altura está entre 151 y 170 escriba el mensaje: Persona de altura media y si la altura es mayor al 171 escriba el mensaje: Persona alta. Exprese el algoritmo usando Pseudocódigo y diagrama de flujos.
Pseudocódigo:
INICIO
Altura: ENTERO
ESCRIBA Cuál es tu altura?
LEA Altura
Si Altura <=150 entonces
ESCRIBA persona de altura baja
Sino
Si Altura <=170 entonces
ESCRIBA persona de altura media
Sino
Si Altura>170 ENTONCES
ESCRIBA persona alta
Fin-Si
Fin-Si
Fin-Si
FIN
Diagrama de flujo:
EJEMPLO:
Dado un numero entre 1 y 7 escriba su correspondiente día de la semana así:
1- Lunes 2- Martes 3- Miércoles 4- Jueves 5- Viernes 6- Sábado 7- Domingo
Exprese el algoritmo usando Pseudocódigo y diagrama de flujos.
Pseudocódigo: Pseudocódigo:
INICIO
Dia: ENTERO
ESCRIBA Diga un número para escribir su día
LEA Dia
En-caso-de Dia haga
Caso 1: ESCRIBA Lunes
Caso 2: ESCRIBA Martes
Caso 3: ESCRIBA Miércoles
Caso 4: ESCRIBA Jueves
Caso 5: ESCRIBA Viernes
Caso 6: ESCRIBA Sábado
Caso 7: ESCRIBA Domingo
SINO: ESCRIBA Escribió un numero fuera del rango 1-7
Fin-Caso
FIN
Estructuras Repetitivas
El computador está especialmente diseñado para aplicaciones en las que una operación o un conjunto de ellas deben repetirse muchas veces. En este sentido, definiremos bucle o lazo (loop), como un segmento de un programa cuyas instrucciones se repiten bien un número determinado de veces o mientras se cumpla una determinada condición.
Es imprescindible que se establezcan mecanismos para controlar esta tarea repetitiva, ya que si éstos no existen, el bucle puede convertirse en un proceso infinito. Así, en el bucle representado por el organigrama de la Figura , se observa que las instrucciones incluidas en él se repiten indefinidamente. El mecanismo de control citado se establece mediante una condición que se comprueba en cada paso o iteración del bucle.
En la Figura se coloca una condición tras la lectura de la variable N (comprobar si su valor es cero), de forma que tenemos la oportunidad de que el bucle deje de ser infinito, ya que podrá interrumpirse cuando la condición sea verdadera.
Los procesos que se repiten varias veces en un programa necesitan en muchas ocasiones contar el numero de repeticiones habidas. Una forma de hacerlo es utilizar una variable llamada contador, cuyo valor se incrementa o decrementa en una cantidad constante en cada repetición que se produzca.
La Figura siguiente presenta un diagrama de flujo para un algoritmo en el que se desea repetir 50 veces un grupo de instrucciones, que llamaremos cuerpo del bucle, donde el contador se representa con la variable CONT. La instrucción que actualiza al contador es la asignación:
CONT ß CONT+1.
El contador puede ser positivo (incrementos de uno en uno) o negativo (decrementos de uno en uno).
En la Figura, el contador cuenta desde 1 a 50 y deja de repetirse cuando la variable CONT toma el valor 51 y termina el bucle.
En la Figura siguiente se muestra un algoritmo que efectúa la operación de multiplicación n x m, sumando m un número n de veces. En él, el contador se decrementa: comienzaa contar en n y se va decrementando hasta llegar a cero; en ese momento se termina el bucle y se realiza la acción escribir.
Otro tipo de variable, normalmente asociada al funcionamiento de un bucle es un acumulador o totalizador, cuya misión es almacenar una cantidad variable, resultante de operaciones sucesivas y repetidas. Un acumulador realiza una función parecida a la de un contador, con la diferencia de que el incremento o decremento, de cada operación es variable en lugar de constante.
Una estructura repetitiva es aquella que marca la reiteración de una serie de acciones basándose en un bucle. De acuerdo con lo anterior, esta estructura debe constar de tres partes básicas:
– decisión (para finalizar la repetición)
– cuerpo del bucle (conjunto de instrucciones que se repiten)
– salida del bucle (instrucción a la que se accede una vez se decide finalizar)
Tomando el caso anterior, donde para obtener la suma de una serie de números, hemos utilizado la estrategia siguiente: tras leer cada número lo añadimos a una variable SUMA que contenga las sucesivas sumas parciales (SUMA se hace igual a cero al inicio).
Observemos que el algoritmo correspondiente deberá utilizar sucesivamente instrucciones tales como:
leer número
si N < 0 entonces
escribir SUMA
si-no
SUMA ß SUMA+número
fin-si
que se pueden repetir muchas veces; éstas constituyen el cuerpo del bucle.
Una vez se ha decidido el cuerpo del bucle, se plantea la cuestión de cuántas veces se debe repetir. De hecho conocemos ya la necesidad de contar con una condición para detener el bucle. En el Ejemplo 8, se pide al usuario el número N de números que desea sumar, esto es, el número de iteraciones del bucle.
Usamos un contador de iteraciones, TOTAL, que se inicializa a N y a continuación se decrementa en uno cada vez que el bucle se repite; para ello introducimos una acción más al cuerpo del bucle: TOTAL ß TOTAL -1. También podríamos inicializar la variable TOTAL en 0 o en 1, e ir incrementándolo en uno, en cada iteración, hasta llegar al número deseado N.
Ejemplo :
Hallar la suma de N números, a través de una estructura repetitiva
algoritmo suma_números
{leer número total de números a sumar en variable N}
TOTAL ß N
SUMA ß 0 { la suma parcial es 0 al inicio}
{comienzo de bucle}
mientras que TOTAL > 0 hacer
leer número
SUMA ß SUMA+número
TOTAL ß TOTAL-1
fin_mientras
{fin del bucle}
escribir “la suma de los” , N , “números es “ , SUMA
Aunque la condición de finalización puede evaluarse en distintos lugares del algoritmo, no es recomendable que ésta se pueda efectuar a mitad del cuerpo del bucle, por lo que es bueno que se produzca al principio o al final del mismo. Según donde se sitúe la condición de salida, dará lugar a distintos tipos de estructuras repetitivas que analizaremos a continuación: estructura desde-hasta, estructura mientras y estructura repetir-hasta_que.
ESTRUCTURA DESDE-HASTA
Esta estructura consiste en que la condición de salida se basa en un contador que cuenta el número de iteraciones. Por ejemplo, el ejemplo 8 podría hacerse de la siguiente manera:
desde i = 1 hasta N con_incremento 1 hacer
leer número
SUMA ß SUMA + número
fin_desde
donde i es un contador que cuenta desde un valor inicial (1) hasta el valor final (N) con los incrementos que se consideren (de uno en uno en este caso). Esta es la llamada estructura Desde (“for”), que es la más simple desde el punto de vista de la condición de salida, ya que viene predeterminada por el código. Su utilidad reside en el hecho de que, en muchas ocasiones, se conoce de antemano el número de iteraciones. Esta estructura ejecuta las acciones del cuerpo del bucle, un número especificado de veces y de modo automático controla el número de iteraciones. Su formato en pseudocódigo es:
desde v=vi hasta vf hacer
<acciones>
.
.
fin_desde
v: variable índice
vi, vf: valores inicial y final de la variable
La variable índice o de control normalmente será de tipo entero y es normal emplear como identificador, las letras I,J,K como herencia de los índices y subíndices utilizados en cálculo científico. El incremento de la variable índice es 1 en cada iteración si no se indica expresamente lo contrario. Si debemos expresar incrementos distintos de +1 el formato de la estructura es:
desde v = vi hasta vf inc incremento hacer
<acciones> si vi > vf entonces usar
. en lugar de inc incremento
. la expresión dec decremento
fin_desde
Obviamente, 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 valor final, el incremento debe ser en este caso negativo. Así:
desde I=20 hasta 10 hacer
<acciones>
fin_desde
for(v=vi; v<=vf; vt+=step)
<accion o bloque de acciones >
(más genéricamente)
for(inicio;condición;actualización)
<accion o bloque de acciones >
ESTRUCTURA MIENTRAS
verdadera, entonces se ejecuta el cuerpo del bucle. No todos los lenguajes incluyen
la estructura mientras.
En lenguaje C:
Cuando la condición de salida del bucle se realiza al principio del mismo, éste se ejecuta mientras se verifica una cierta condición. Es la llamada estructura repetitiva mientras (“while”); en ella el cuerpo del bucle se repite mientras se cumple una determinada condición. Su pseudocódigo es:
mientras condición hacer
<acciones>
fin_mientras
Cuando se ejecuta la instrucción mientras, la primera cosa que sucede es la evaluación de la condición. Si es falsa, no se ejecuta ninguna acción y el programa prosigue en la siguiente instrucción a la finalización del bucle; si la condición es
while (condicion)
<accion>
Obsérvese que en una estructura mientras si la primera evaluación de la condición es falsa, 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, puede ser una acción deseada. Por ejemplo el siguiente bucle para procesar las notas de unos examenes contando el número de alumnos presentados dejará de ejecutarse cuando el numero leído sea negativo. Si la primera nota introducida fuera negativa, la acción deseada es, efectivamente, que no se ejecute el bucle ninguna vez.
C ß 0
leer nota
mientras nota = 0 hacer
{procesar nota}
C ß C+1
leer nota
fin_mientras
ESTRUCTURA REPETIR-HASTA_QUE
En esta estructura la condición de salida se sitúa al final del bucle; el bucle se ejecuta hasta que se verifique una cierta condición. Es la llamada estructura Repetir-hasta (“repeat-until”). Existen muchas situaciones en las que se desea que un bucle se ejecute al menos una vez, antes de comprobar la condición de repetición. Para ello la estructura repetir-hasta_que se ejecuta hasta que se cumpla una condición determinada que se comprueba al final del bucle. En pseudocódigo se escribe:
repetir
<acciones>
hasta_que <condición>
do
<accion o bloque>
while (condicion);
(en C se “dice” mientras se cumpla la condición, no hasta que se cumpla)
El bucle repetir-hasta_que se repite mientras la condición sea falsa, justo lo opuesto a la estructura mientras. Sea el siguiente algoritmo:
inicio
contador ß 1
repetir
leer número
ontador ß contador+1
hasta_que contador > 30
escribir “números leídos: 30”
fin
Este bucle se repite hasta que el valor de variable contador exceda a 30, lo que sucederá después de 30 ejecuciones del mismo. Nótese que si en vez de 30 pusiéramos 0, el cuerpo del bucle se ejecutará siempre al menos una vez.
Ejemplo :
Calcular el factorial de un número N, usando la estructura repetir.
inicio
leer N
Factorial ß1
I ß 1
repetir
Factorial Factorial * I
I ß I+1
hasta_que I > N
escribir “el factorial del número”, N, “es”, Factorial
fin
Las tres estructuras repetitivas son susceptibles de intercambio entre ellas, así por ejemplo es posible, sustituir una estructura desde, por una mientras; con incrementos positivos o negativos de la variable índice. En efecto, la estructura desde con incremento positivo es equivalente a la estructura mientras marcada con la A), y la estructura desde con incremento negativo es equivalente a la estructuramientras marcada con la B).
A) B)
v ß vi v ß vi
mientras v < = vf hacer mientras v > = vf hacer
<acciones> <acciones>
v ß v + incremento v ß v – decremento
fin_mientras fin_mientras
Ejemplo 10:
Calcular los factoriales de n números leídos por el teclado.
El problema consiste en realizar una primera estructura repetitiva de n iteraciones del algoritmo de cálculo del factorial, que a su vez se efectúa con una segunda estructura repetitiva.
inicio
leer n {lectura de la cantidad de números}
desde i = 1 hasta n hacer
leer NUMERO
FACTORIAL ß 1
desde j = 1 hasta NUMERO hacer
FACTORIALß FACTORIAL *j
fin_desde
escribir “el factorial del número”, NUMERO, “es”, FACTORIAL
fin_desde
fin
Sharing is caring
Share
+1
Tweet
Share
Share