2. 1.2 Representación de algoritmos: gráfica y pseudocódigo.
El término algoritmo parece derivar del nombre de un matemático árabe llamado
Mohamed ibn Musa al – Khuwarizmi, que vivió en Bagdad alrededor del año 830
de nuestra era, y que escribió un libro que contenía un sistema de numeración
decimal y reglas de cálculo. Dicho libro sería utilizado con posterioridad
impulsando la sustitución del uso del ábaco.
Modernamente, se ha usado el término algoritmo en referencia a cualquier
procedimiento sistemático de cálculo, que da lugar a un resultado después de
seguirse una serie de instrucciones precisas.
En el campo de la informática y la programación, se ha adoptado el término para
describir cualquier serie de instrucciones precisas que dan lugar a un resultado.
La relación con las matemáticas sigue siendo estrecha, aunque ha ganado peso
la concepción como serie de instrucciones precisas, que no necesariamente
implican cálculo. Así, podríamos hacernos una primera idea de qué es un algoritmo
pensando en las instrucciones para montar un mueble desarmado, o en la
preparación de un plato a partir de una receta de cocina.
Las herramientas utilizadas para diseñar algoritmos son:
• Diagramas de flujo
• Pseudocódigo
•
Diagramas de flujo
Los diagramas de flujo son una manera de representar visualmente el flujo de
datos a través de sistemas de tratamiento de información. Los diagramas de flujo
describen que operaciones y en que secuencia se requieren para solucionar un
problema dado.
Un diagrama de flujo u organigrama es una representación diagramática que
ilustra la secuencia de las operaciones que se realizarán para conseguir la
solución de un problema. Los diagramas de flujo se dibujan generalmente antes
de comenzar a programar el código frente a la computadora. Los diagramas de
flujo facilitan la comunicación entre los programadores y la gente del negocio.
Estos diagramas de flujo desempeñan un papel vital en la programación de un
problema y facilitan la comprensión de problemas complicados y sobre todo muy
largos. Una vez que se dibuja el diagrama de flujo, llega a ser fácil escribir el
3. programa en cualquier idioma de alto nivel. Vemos a menudo cómo los diagramas
de flujo nos dan ventaja al momento de explicar el programa a otros. Por lo tanto,
está correcto decir que un diagrama de flujo es una necesidad para la
documentación mejor de un programa complejo.
Reglas para dibujar diagramas de flujo.
Los Diagramas de flujo se dibujan generalmente usando algunos símbolos
estándares; sin embargo, algunos símbolos especiales pueden también ser
desarrollados cuando sean requeridos. Algunos símbolos estándares, que se
requieren con frecuencia para diagramar programas de computadora se muestran
a continuación:
Inicio o fin del programa
Pasos, procesos o líneas de instrucción de programa de
computo
Operaciones de entrada y salida
Toma de decisiones y Ramificación
Conector para unir el flujo a otra parte del diagrama
Cinta magnética
Disco magnético
Conector de pagina
Líneas de flujo
Anotación
4. Display, para mostrar datos
Envía datos a la impresora
Símbolos gráficos
Dentro de los símbolos fundamentales para la creación de diagramas de flujo, los
símbolos gráficos son utilizados específicamente para operaciones aritméticas y
relaciones condicionales. La siguiente es una lista de los símbolos más
comúnmente utilizados:
+ Sumar
- Menos
* Multiplicación
/ División
± Mas o menos
= Equivalente a
> Mayor que
< Menor que
³ Mayor o igual que
£ Menor o igual que
¹ o <> Diferente de
Si
No
True
False
Reglas para la creación de Diagramas
Los Diagramas de flujo deben escribirse de arriba hacia abajo, y/o de izquierda a
derecha.
Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que
indica la dirección que fluye la información procesos, se deben de utilizar
solamente líneas de flujo horizontal o verticales (nunca diagonales).
Se debe evitar el cruce de líneas, para lo cual se quisiera separar el flujo del
diagrama a un sitio distinto, se pudiera realizar utilizando los conectores. Se debe
tener en cuenta que solo se van a utilizar conectores cuando sea estrictamente
necesario.
5. No deben quedar líneas de flujo sin conectar
1. Todo texto escrito dentro de un símbolo debe ser legible, preciso, evitando
el uso de muchas palabras.
2. Todos los símbolos pueden tener más de una línea de entrada, a excepción
del símbolo final.
3. Solo los símbolos de decisión pueden y deben tener más de una línea de
flujo de salida.
Ejemplos de diagramas de flujo
Diagrama de flujo que encuentra la suma de los primeros 50 números naturales
6. Bueno, y ahora la descripción del diagrama anterior
Suma, es la variable a la que se le va agregando la valor de cada número natural.
N, es el contador. Éste recorrerá los números hasta llegar al 50.
• El primer bloque indica el inicio del Diagrama de flujo
• El segundo bloque, es un Símbolo de procesos
En este bloque se asume que las variables suma y N han sido declaradas
previamente y las inicializa en 0 para comenzar a el conteo y la suma de
valores (Para declararlas existe el bloque Tarjeta perforada).
• El tercer bloque, es también un Símbolo de procesos
En éste paso se incrementa en 1 la variable N (N
= N + 1). Por lo que, en la primera pasada esta N valdrá 1, ya que estaba
inicializada en 0.
• El cuarto bloque es exactamente lo mismo que el anterior
Pero en éste, ya se le agrega el valor de N a la
variable que contendrá la suma (En el primer caso contendrá 1, ya que N =
1).
• El quinto bloque es un Símbolo de Toma de decisiones y Ramificación
Lo que hay dentro del bloque es una pregunta que se le hace a los valores
que actualmente influyen en el proceso ¿Es
N=50?, Obviamente la respuesta es no, ya que N todavía es 1. por lo que
el flujo de nuestro programa se dirigirá hacía la parte en donde se observa
la palabra no: Tercer Bloque, éste le sumará 1 (N=N+1) y vuelve a llegar a
éste bloque, donde preguntará ¿Es N=50?... ¡No!, todavía es 2. Ha pues,
regresa al Tercer bloque y vuelve hacer lo mismo. Y así hasta llegar a 50,
obteniendo así la suma de los primeros 50 primeros números naturales.
7. • Por último indicamos que el resultado será mostrado en la impresora (Este
lo puedes cambiarlo por el display para mostrar datos).
• Fin del programa (o diagrama)
Pseudocódigo
Es una herramienta de programación en la que 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. (Joyanes Aguilar, s/f)
Es la representación narrativa de los pasos que debe seguir un algoritmo para dar
solución a un problema determinado. El pseudocódigo utiliza palabras que indican
el proceso a realizar. (Hernández, 2010)
Ejemplos:
Ejemplo 1: Pseudocódigo que permita calcular el área de un rectángulo. Se
debe introducir la base y la altura para poder realizar el cálculo..
Programa; área
Entorno: BASE, ALTURA, AREA son número enteros
Algoritmo:
escribir “Introduzca la base y la altura”
leer BASE, ALTURA
calcular AREA = BASE * ALTURA
escribir “El área del rectángulo es “AREA
Finprograma
Ejemplo 2: Pseudocódigo que permita al usuario introducir por teclado dos
notas, calculando la suma y el producto de las notas.
Programa: SumaProducto
Entorno: NOTA1,NOTA2,SUMA,PRODUCTO son números enteros
Algoritmo:
escribir “Introduzca las notas”
leer NOTA1,NOTA2
8. calcular SUMA = NOTA1 + NOTA2
calcular PRODUCTO = NOTA1 * NOTA2
escribir “La suma de las dos notas es:” SUMA
escribir “El producto de las dos notas es :”PRODUCTO
Finprograma
Ejemplo 3: Pseudocódigo que permita saber si un número es mayor, menor
o igual a cero.
Programa: ComparaNúmeros
Entorno: NUMERO es un número entero
Algoritmo:
Escribir “Introduzca un número “
leer NUMERO
SI NUMERO>0 ENTONCES
escribir “El número introducido es positivo”
SI NO
SI NUMERO<0 ENTONCES
escribir “El número introducido es negativo”
SI NO
escribir “El número es cero”
FINSI
FINSI
Finprograma
1.3 Diseño de algoritmos.
Fase en la resolución de problemas
Joyanes Aguilar, señala que el proceso de resolución de problemas con una
computadora conduce a la escritura de un programa y a su ejecución en la misma.
Reconoce que el proceso de diseño de un programa es un “proceso creativo”, en
el cual se puede considerar una serie de fases o pasos comunes, que
generalmente deben seguir los programadores.
9. Las fases de resolución de un problema con computadora son:
1. Análisis del problema.
2. Diseño del algoritmo.
3. Codificación.
4. Compilación y ejecución.
5. Verificación.
6. Depuración.
7. Mantenimiento.
8. Documentación.
Constituyen el ciclo de vida del software y las fases o etapas usuales son:
1. Análisis. El problema se analiza teniendo presente la especificación de los
requisitos dados por el cliente de la empresa o por la persona que se encarga del
programa.
2. Diseño. Una vez analizado el problema, se diseña una solución que conduzca
a un algoritmo que resuelva el problema.
3. Codificación (implementación). La solución se escribe en la sintaxis del lenguaje
de alto nivel (por ejemplo, C++) y se obtiene un programa.
4. Compilación, ejecución y verificación. El programa se ejecuta, se comprueba
rigurosamente y se eliminan todos los errores que puedan aparecer.
5. Depuración y mantenimiento. El programa se actualiza y modifica cada vez que
sea necesario, de modo que se cumplan todas las necesidades de cambio de sus
usuarios.
6. Documentación. Escritura de las diferentes fases del ciclo de vida del software,
específicamente, el análisis, diseño y codificación, unidos a manuales de usuario
y de referencia, así como normas para el mantenimiento.
10. ALGORITMOS COTIDIANOS
Se refiere a los algoritmos que ayudan a resolver problemas diarios, y que las
personas llevan a cabo sin darse cuenta de que están siguiendo una metodología
para resolverlos.
Algunos ejemplos son:
Diseñar un algoritmo para cambiar una llanta a un auto:
1. Inicio.
2. Conseguir un gato hidráulico.
3. Levantar el auto con el gato.
4. Aflojar los tornillos de las llantas.
5. Retirar los tornillos de las llantas.
6. Quitar la llanta.
7. Colocar la llanta de repuesto.
8. Colocar los tornillos.
9. Apretar los tornillos.
10.Bajar el gato hidráulico.
11.Retirar el gato hidráulico.
12.Fin
Diseñar un algoritmo que compare el mayor de dos números
1. Inicio
2. Obtener el primer número (entrada), denominado NUMERO1.
3. Obtener el segundo número (entrada), denominado NUMERO2.
4. Si NUMERO1 es igual a NUMERO 2 entonces
3.1 Visualizar “son iguales”
4. Si NUMERO1 es mayor a NUMERO2 entonces
11. 4.1 NUMERO1 es mayor
4.2 SINO
4.3 NUMERO2 es mayor
5. Fin
Diseñar un algoritmo que permita obtener un refresco de una máquina
automática expendedora de bebidas embotelladas.
1. Inicio
2. Verificar el panel de bebidas, ubicando la bebida deseada.
3. Identificar el costo de la bebida.
4. Introducir en la ranura correspondiente la cantidad monetaria que así
corresponda a la bebida deseada, de preferencia introducir la cantidad exacta.
5. Pulsar el botón que corresponda a bebida deseada.
6. Si existe producto entonces
a. En la bandeja de salida saldrá la bebida seleccionada.
b. Sino
c. En el panel se visualizará producto agotado.
7. Si cantidad introducida es igual al precio de producto entonces
a. No devolverá cambio.
8. Si cantidad introducida es mayor al precio de producto entonces
a. Devolverá el efectivo de diferencia en la bandeja pertinente.
9. Si cantidad introducida es menor al precio de producto entonces
a. En el panel visualizará efectivo insuficiente.
10.Fin
12. 1.4 Diseño algorítmico de funciones
Una función algorítmica se refiere a la implementación de un algoritmo y
normalmente forma parte de un programa grande. También se llama una función
algorítmica como procedimiento, rutina, método o subprograma. Un algoritmo es
un procedimiento detallado paso a paso para resolver un problema, pero es
independiente de cualquier lenguaje de programación ya que representa el
concepto abstracto de la solución. Por lo tanto, después de diseñar un algoritmo y
desarrollar su pseudocódigo, el siguiente paso es implementar en un lenguaje de
programación específico.
Al diseñar un algoritmo que muchos factores como tiempo, espacio y tamaño
esperado de entrada se consideran. Desarrollo y análisis de algoritmos también
implican encontrar peor de los casos, el mejor de los casos y situaciones de
promedio, como el rendimiento es muy importante para una aplicación cuya
entrada aumenta con el tiempo.
Una vez que haya finalizado el algoritmo, se traduce en una función o un
procedimiento que es específico de un lenguaje de programación. Teóricamente,
independientemente de un lenguaje de programación, un algoritmo debe producir
repetidamente misma salida. Pero, esto no sucede en la realidad, ya que cada
lenguaje de programación tiene sus propias ventajas y desventajas. Las
características de un lenguaje de programación determinan la eficiencia de un
algoritmo debido a problemas como la incapacidad para asignar recursos en
tiempo de ejecución o tener fugas de memoria silenciosa puede ralentizar un
programa y puede llevar a mal funcionamiento de un algoritmo especialmente
cuando aumenta la entrada.
Factores que influyen en el diseño de una función algorítmica
Si un algoritmo hace uso de dividir y conquistar el enfoque o la programación
dinámica, el lenguaje de programación que se utiliza para codificar una función
algorítmica debe tener soporte para realizar llamadas recursivas anidados. Casi
todos los lenguajes de programación modernos tienen soporte para realizar
llamadas recursivas pero programas escritos en lenguajes antiguos como
FORTRAN no tenga soporte para realizar llamadas anidadas. En el caso de
recursividad, un lenguaje de programación se encarga de varias ejecuciones de
una función de anidación y hacer nuevas copias de las variables en cada llamada.
Para lograrlo, la mayoría de lenguajes de programación almacenan detalles sobre
las llamadas de función anidada en una pila.
13. Aunque todos los lenguajes de programación proporcionan apoyo para realizar
llamadas de función anidada, existe una actuación aérea en almacenar y
recuperar los parámetros y variables locales, en recuperar direcciones relativas de
cada llamada a una función anidada y en ajusta el puntero de pila. Esta sobrecarga
a su vez aumenta el tiempo de ejecución como el número de aumentos de
llamadas recursivas.
Casi todos los lenguajes de programación orientada a objetos producen
excepciones cuando la entrada no es válida o cuando encuentra un error. Sin
embargo, otra alternativa, que se puede considerar al diseñar la función
algorítmica es devolver un código de error. Este enfoque puede ser útil en
lenguajes que no proporcionan ningún apoyo para el manejo de errores. Un código
de error normalmente da la descripción sobre el tipo de error que se ha encontrado
una función.
A pesar de que un algoritmo establece claramente la esperada entrada y salida
junto con los Estados intermedios, la aplicación real de la función algorítmica
podría variar de un lenguaje de programación a otro. Una función algorítmica
diseñada aumenta la legibilidad de un programa, aumenta la calidad del código,
reduce errores de hard to find y ayuda a mantener grandes programas fácilmente.
La programación modular permite la descomposición de un problema en un
conjunto de subproblemas independientes entre sí, más sencillos de resolver y
que pueden ser tratados separadamente unos de otros.
Módulo
Uno de los elementos principales de programación utilizados en la
representación de cada módulo es la subrutina. Una subrutina es
un conjunto de instrucciones de cómputo que realizan una tarea.
Un programa principal llama a estos módulos a medida que se
necesitan. Un módulo es un segmento, rutina, subrutina,
subalgoritmo, procedimiento o función, que puede definirse dentro
de un algoritmo con el fin de ejecutar una tarea específica y puede
ser llamada o invocada desde principal invoca al subprograma, el
subprograma ejecuta la tarea y luego devuelve el control al
programa.
Un subprograma puede llamar a su vez a sus propios subprogramas
14. Funciones
La función es una estructura autónoma similar a los módulos. La diferencia radica
en que la función se usa para devolver un solo valor de un tipo de dato simple a
su punto de referencia. La función se relaciona especificando su nombre en una
expresión, como si fuera una variable ordinaria de tipo simple. Las funciones se
dividen en estándares y definidas por el usuario.
Estándar: Son funciones proporcionadas por cualquier lenguaje de programación
de alto nivel, y se dividen en aritméticas y alfabéticas.
Definidas por el usuario: son funciones que puede definirlas el programador con
el propósito de ejecutar alguna función específica, y que por lo general se usan
cuando se trata de hacer algún cálculo que será requerido en varias ocasiones en
la parte principal del algoritmo.
Declaración de funciones
Consta de una cabecera, seguido de la palabra (función) y del nombre del
argumento de la función después ira el cuerpo que es una serie de acciones cuya
ejecución hará que se asigne un valor al nombre de la función, esto determina el
resultado que ha de devolver al programa.
Invocación de las funciones.
Una función puede ser llamada de la siguiente forma:
Nombre_funcion: función que llama
Lista de parámetros actuales: constantes variable , expresiones.
Cada vez que se llama a una función desde el algoritmo principal se establece una
correspondencia entre los parámetros formales y los parámetros actuales.
15. Una llamada a la función implica los siguientes pasos:
1. A cada parámetro formal se le asigna el valor real de su correspondiente
parámetro actual.
2. Se ejecuta el cuerpo de acciones de la función.
3. Se devuelve el valor de la función y se retorna al punto de llamada.
Ámbito:
• Variables locales y
• Globales
Según el lugar donde son declaradas puede haber dos tipos de variables:
Globales: las variables permanecen activas durante todo el programa. Se crean
al iniciarse éste y se destruyen de la memoria al finalizar. Pueden ser utilizadas en
cualquier procedimiento o función.
Locales: las variables son creadas cuando el programa llega a la función o
procedimiento en la que están definidas. Al finalizar la función o el procedimiento,
desaparecen de la memoria. Si dos variables, una global y una local, tienen el
mismo nombre, la local prevalecerá sobre la global dentro del módulo en que ha
sido declarada. Dos variables locales pueden tener el mismo nombre siempre que
estén declaradas en funciones o procedimientos diferentes.
Comunicación con subprogramas:
Parámetros por Valor
Son los parámetros que pueden recibir valores pero que no pueden devolverlos.
Es una variable global que se conecta con una variable local mediante el envío de
su valor, después de lo cual ya no hay relación. Lo que le sucede a la variable
local no afectará a la global. Cuando un parámetro actual se pasa por valor, el
subprograma hace una copia del valor de éste en una posición de memoria
idéntica en tamaño pero distinta en ubicación a la del parámetro actual y la asigna
al parámetro formal correspondiente. Como el subprograma trabaja a partir de sus
parámetros formales, si durante la ejecución se modifica el valor de un parámetro
formal correspondiente a un paso por valor, el contenido de la posición de memoria
del parámetro actual no se verá alterado.
16. Parámetros por Variable
Son los que pueden recibir y devolver valores. Son variables globales que se
conectan con una local a través de su contenido; al establecerse dicha conexión
las variables se convierten en sinónimos, lo que afecte a la variable local le
sucederá a la variable global.