1. Tema V. Fundamentos de
algoritmos
Objetivo: El alumno explicará la importancia
de llevar un método formal para resolver
problemas en la computadora; asimismo
aplicará dicho método en la resolución de
problemas matemáticos sencillos.
2. 5.1. La computabilidad y concepto
de algoritmo:
Máquina de Turing.
Partes de un programa
Todo programa esta constituido por un conjunto
de órdenes o instrucciones capaces de
manipular un conjunto de datos. Éstas órdenes o
instrucciones pueden ser divididas en tres
grandes bloques claramente diferenciados,
correspondientes cada uno de ellos a una parte
del diseño de un programa.
4. Es la parte de la
computación que estudia
los problemas de decisión
que pueden ser resueltos
con un algoritmo o
equivalentemente con una
máquina de Turing. Máquina ENIGMA
Segunda Guerra Mundial
5.1. La computabilidad y concepto
de algoritmo:
Máquina de Turing.
Teoría de la computabilidad
5. Máquina de Turing
Una máquina de Turing es un dispositivo que manipula
símbolos sobre una tira de cinta de acuerdo a una tabla
de reglas.
La Máquina de Turing se introdujo en 1936 por Alan M.
Turing para resolver problemas computables. Es la base
de las computadoras modernas.
5.1. La computabilidad y concepto
de algoritmo:
Máquina de Turing.
6. Máquina de Turing
Una máquina de Turing esta formada por
tres componentes: Una Cinta, Un
Controlador y Una Cabeza de
lectura/escritura.
5.1. La computabilidad y concepto
de algoritmo:
Máquina de Turing.
7. Cinta
Aun cuando las computadoras modernas utilizan un
dispositivo de acceso aleatorio con capacidad finita, la
memoria de la máquina de Turing es infinita. La
cinta, en cualquier momento mantiene una secuencia de
caracteres del conjunto de caracteres aceptado por la
máquina.
Cinta o Banda de Moebius
August Ferdinand Möbius y Johann Benedict Listing en 1858
5.1. La computabilidad y
concepto de algoritmo:
Máquina de Turing.
8. Cabeza de Lectura / Escritura
La cabeza de lectura/escritura en cualquier momento señala a un
símbolo en la cinta. Llamamos a este símbolo el símbolo actual. La
cabeza de lectura/escritura lee y escribe un símbolo a la vez
desde la cinta. Después de leer y escribir se mueve a la
izquierda, a la derecha o permanece en su lugar. La lectura, la
escritura y el desplazamiento, todos se realizan bajo instrucciones
del controlador.
5.1. La computabilidad y
concepto de algoritmo:
Máquina de Turing.
9. Controlador
El controlador es la contraparte teórica de la unidad central de proceso
(CPU) en las computadoras modernas. Es un autómata de estado
finito, una máquina que tiene un número finito predeterminado de
estados y se mueve de un estado a otro con base en la entrada. En
cualquier momento puede estar en uno de estos estados.
5.1. La computabilidad y concepto
de algoritmo:
Máquina de Turing.
11. Uno de los algoritmos más
antiguos conocidos es el
algoritmo de Euclides. El
término algoritmo proviene del
matemático Muhammad ibn
Musa al-Khwarizmi, que vivió
aproximadamente entre los
años 780 y 850 D.C. en la
actual nación iraní. Describió la
realización de operaciones
elementales en el sistema de
numeración decimal.
De al-Khwarizmi se obtuvo la
derivación algoritmo.
5.2 Elementos de los algoritmos
y tipos de datos
Fundamentos de Algoritmos
12. Fundamentos de Algoritmos
Un algoritmo se puede definir
como un conjunto
pasos, procedimientos o
acciones que nos permiten
alcanzar un resultado o resolver
un problema de un cierto tipo.
Por tanto debe ser:
Precisión
Determinismo
Finitud
5.2 Elementos de los algoritmos y
tipos de datos
13. Características de los algoritmos
Precisión:
Los pasos a seguir en el algoritmo deben ser precisados
claramente.
Determinismo:
El algoritmo, dado un conjunto de datos idénticos de
entrada, siempre debe arrojar los mismos resultados.
Finitud:
El algoritmo, independientemente de la complejidad del
mismo, siempre debe ser de longitud finita.
5.2 Elementos de los algoritmos
y tipos de datos
14. Características de los algoritmos
Conciso y Detallado:
Debe reflejar con el máximo detalle el orden de ejecución
de cada acción u operación que vaya a realizar la
computadora.
Claro y Sencillo:
Con el objetivo de facilitar su entendimiento y
compresión por parte del programador.
5.2 Elementos de los algoritmos y
tipos de datos
15. Módulos de un algoritmo
5.2 Elementos de los algoritmos y
tipos de datos
16. Tipos de algoritmos
Cualitativos
Son aquellos en los que se describen los pasos utilizando palabras.
Cuantitativos
Son aquellos en los que se utilizan cálculos numéricos para definir los
pasos del proceso.
No Gráficos
Representa en forma descriptiva las operaciones que debe realizar un
algoritmo (pseudocodigo).
Gráficos
Es la representación gráfica de las operaciones que realiza un algoritmo
(diagrama de flujo).
5.2 Elementos de los algoritmos y
tipos de datos
17. Pseudocódigo
Se puede definir como el lenguaje intermedio entre el lenguaje
natural y el lenguaje de programación seleccionado.
Esta notación se encuentra sujeta a unas determinadas reglas
que permiten y facilitan el diseño de algoritmos.
El pseudocódigo surge como método para la representación de
instrucciones en una metodología estructurada y nació como un
lenguaje similar al inglés, que utilizaba palabras reservadas de
este idioma (start, end, stop, while, repeat, for, if, if-
else, etc.) y que posteriormente se fue adaptando a otros
lenguajes de habla hispana.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
19. 5.3 Representación de los
algoritmos (diagrama de flujo
y pseudocódigo)
La estructura general de un algoritmo en pseudocódigo sería:
NOMBRE DEL PROGRAMA
DEFINICIÓN DE CADA MÓDULO
CUERPO DEL PROGRAMA
DATOS: parámetros, constantes, variables, ...
ALGORITMO
descripción detallada de las órdenes y acciones
que se deben ejecutar para resolver el problema
...
FIN DEL ALGORITMO
20. 5.3 Representación de los
algoritmos (diagrama de flujo
y pseudocódigo)
Un diagrama de flujo es la representación detallada en forma
gráfica de como deben realizarse los pasos en la computadora
para producir resultados.
Esta representación gráfica se da cuando varios símbolos (que
indican diferentes procesos en la computadora), se relacionan
entre si mediante líneas que indican el orden en que se deben
ejecutar los procesos.
Los símbolos utilizados han sido normalizados por el instituto
norteamericano de normalización (ANSI).
21. 5.3 Representación de los
algoritmos (diagrama de flujo
y pseudocódigo)
Todo diagrama debe tener un inicio y un fin.
Se deben se usar solamente líneas de flujo horizontales y/o
verticales.
Se debe evitar el cruce de líneas utilizando los conectores.
Se deben usar conectores solo cuando sea necesario.
No deben quedar líneas de flujo sin conectar.
Se deben trazar los símbolos de manera que se puedan leer de
arriba hacia abajo y de izquierda a derecha.
Todo texto escrito dentro de un símbolo deberá ser escrito
claramente, evitando el uso de muchas palabras.
Utilizar comentarios ya sea al margen o mediante el símbolo
grafico comentarios para que este sea entendible por cualquier
persona que lo consulte.
Si el diagrama abarca mas de una hoja es conveniente
enumerarlo e identificar de donde viene y a donde se dirige.
22. Diagrama de Flujo
Para el diseño de algoritmos se utilizan técnicas
de representación.
Una de estas técnicas son los denominados
Diagramas de Flujo, que se definen como la
representación gráfica que, mediante el uso de
símbolos estándar conectados o unidos
mediante líneas de flujo, muestran la
secuencia lógica de las operaciones o acciones
que deben realizar las computadoras, así como
la corriente o flujo de datos en la resolución de
un programa.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
23. Construcción de los Diagramas de Flujo
Su correcta construcción es sumamente importante porque a partir
del mismo se puede escribir un programa en algún lenguaje de
programación.
Es importante mantener un estándar para la realización de dichos
diagramas, esto con el fin de facilitar el intercambio de algoritmos
mediante su esquematización gráfica. Es por eso que a continuación
se muestran los símbolos a ocupar durante el curso.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
24. Símbolo utilizado para marcar el inicio o fin del
diagrama de flujo.
Símbolo utilizado para representar un proceso. En
su interior se expresan
asignaciones, operaciones aritméticas, cambios
de valor de celdas en memoria, etc.
Símbolo utilizado para representar una decisión. En
su interior se almacena una condición, y
dependiendo del resultado de la evaluación de
la misma se sigue por una de las ramas o
caminos alternativos.
Símbolo utilizado para introducir los datos de
entrada. Expresa lectura.
Símbolo utilizado para representar la impresión de
un resultado. Expresa escritura.
5.3 Representación de los algoritmos
(diagrama de flujo y pseudocódigo)
Símbolos para los Diagramas de Flujo
27. Reglas para la construcción de Diagramas de Flujo
1.Todo diagrama de flujo debe tener un inicio y un fin.
2. Las líneas utilizadas para indicar la dirección del flujo del
diagrama deben ser rectas, verticales y horizontales.
5.3 Representación de los algoritmos
(diagrama de flujo y pseudocódigo)
28. Reglas para la construcción de Diagramas de Flujo
3. Todas las líneas utilizadas para indicar la dirección del
flujo del diagrama deben estar conectadas. La conexión
puede ser a un símbolo que exprese
lectura, proceso, decisión, impresión, conexión o fin de
diagrama.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
29. Reglas para la construcción de Diagramas de Flujo
4. El diagrama de flujo debe ser construido de arriba hacia abajo y de
izquierda a derecha.
5. La notación utilizada en el diagrama de flujo debe ser independiente
del lenguaje de programación.
6. Es conveniente cuando realizamos una tarea compleja poner
comentarios que expresen o ayuden a entender lo que hicimos.
7. Si el diagrama de flujo requiriera más de una hoja para su
construcción, debemos utilizar los conectores adecuados y enumerar
las páginas convenientemente.
8. No puede llegar más de una línea a un símbolo.
5.3 Representación de los algoritmos
(diagrama de flujo y pseudocódigo)
30. Tipos de Instrucciones
Una instrucción puede ser considerada como un
hecho o suceso de duración limitada que genera
unos cambios previstos en la ejecución de un
programa, por lo que debe ser una acción
previamente estudiada y definida.
5.3 Representación de los
algoritmos (diagrama de flujo
y pseudocódigo)
31. Instrucciones de definición de datos
Son aquellas instrucciones utilizadas para informar al
procesador del espacio que debe reservar en
memoria, con la finalidad de almacenar un dato mediante
el uso de variables simples o estructuras de datos más
complejas como, por ejemplo, tablas.
La definición consiste en indicar un nombre a través del
cual haremos referencia al dato y un tipo a través del
cual informaremos al procesador de las características y
espacio que deberá reservar en memoria.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
32. Instrucciones primitivas
Se consideran como tal las instrucciones de asignación y las
instrucciones de entrada/salida.
Instrucciones de entrada
Son aquellas instrucciones encargadas de recoger el dato de
un dispositivo de entrada, y seguidamente almacenarlo en
memoria en una variable previamente definida, para la cual se
ha reservado suficiente espacio en memoria.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
33. Instrucciones de asignación
Son aquellas instrucciones cuyo cometido es almacenar un
dato o valor simple obtenido como resultado al evaluar una
expresión en una variable previamente definida y declarada.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
34. Instrucciones de salida
Son aquellas instrucciones encargadas de recoger los datos
procedentes de variables evaluadas y depositarlos en un
dispositivo de salida.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
35. Tipos de datos:
Los datos a procesar por una computadora pueden
clasificarse en:
Simples
Estructurados
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
36. Datos Simples
La principal característica es que solo ocupan sólo una casilla de
memoria, por lo tanto, una variable simple hace referencia a un único
valor a la vez. Dentro de este grupo se encuentran:
enteros, reales, caracteres, booleanos, enumerados y subrangos.
Datos Estructurados
Se caracterizan por el hecho de que con un nombre (identificador de
variable estructurada) se hace referencia a un grupo de casillas de
memoria. Es decir un dato estructurado tiene varios componentes.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
37. Dentro de los tipos de datos
numéricos encontramos los
enteros y los reales.
Los enteros son números que
pueden estar precedidos del
signo + ó -, y que no tienen
parte decimal.
Los reales son números que
pueden ser precedidos del
signo + ó -, y que tienen
una parte decimal.
5.3 Representación de los algoritmos
(diagrama de flujo y pseudocódigo)
Datos numéricos
38. Datos alfanuméricos
Dentro de este tipo de datos encontramos los de tipo carácter
(simple) y cadena de caracteres (estructurado). Son datos cuyo
contenido pueden ser letras del abecedario (a,b,c,…z), dígitos
(0,1,2,…9) o símbolos especiales (#, $, ^, *, %, …, etc).
Debemos remarcar que aunque este tipo de datos puede contener
números, no pueden ser utilizados para realizar operaciones
aritméticas. Un dato tipo cadena de caracteres contiene un
conjunto de caracteres, y se escribe entre comillas. La longitud de
una cadena depende de los lenguajes de programación.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
39. Datos lógicos
Dentro de este tipo de datos encontramos los
booleanos.
Son datos que sólo pueden tomar dos valores:
verdadero (true) y falso (false).
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
40. Variables
Las variables son objetos que pueden cambiar su
valor durante la ejecución de un programa. Al igual
que las constantes, pueden existir tipos de variables
como tipos de datos.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
41. Constantes
Las constantes son datos que no cambian
durante la ejecución de un programa. Para
nombrar las constantes utilizamos
identificadores. Existen tipos de constantes
como tipos de datos, por lo tanto, puede
haber constantes de tipo
entero, real, carácter, cadena de
caracteres, etc.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
42. Operaciones aritméticas
Los operadores son símbolos que sirven para conectar los
datos facilitando la realización de diversas clases de
operaciones.
5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
43.
44. Prueba de Escritorio
La prueba de escritorio es una herramienta útil para
entender que hace un determinado algoritmo, o para
verificar que un algoritmo cumple con la especificación sin
necesidad de ejecutarlo.
Básicamente, una prueba de escritorio es una ejecución „a
mano‟ del algoritmo, por lo tanto se debe llevar registro de
los valores que va tomando cada una de las variables
involucradas en el mismo.
Esta prueba consiste en que dar diferentes datos de entrada
al programa y seguir la secuencia indicada en el diagrama,
hasta obtener los resultados.
5.3 Representación de los algoritmos
(diagrama de flujo y pseudocódigo)
45. 5.3 Representación de los
algoritmos (diagrama de flujo y
pseudocódigo)
letra ‘Z’; letra>=’A’ ; letra - 1
letra
fin
inicio
47. Un algoritmo contiene instrucciones elementales seleccionadas
cuidadosamente que pueden ser realizadas por un robot ó un
procesador; el procesador recibe las órdenes y ejecuta lo que
indican, resulta obvio que la disposición de las instrucciones resulta
crucial al momento de llevarlas a cabo. Por tanto, el algoritmo debe
incluir instrucciones de control que modifiquen la ruta que debe
seguir el procesador, además de indicar que debe hacerse en cada
paso, así como el momento en el cual debe detenerse.
Se ha probado que para implementar cualquier algoritmo, son
suficientes tres construcciones básicas para control de flujo
secuencia, condicional y ciclos iterativos (repetitivos). A
continuación se describe cada una de ellas y se muestra su
representación tanto en pseudocódigo como en diagrama de flujo.
5.4 Estructuras básicas
(secuencia, condicional e iteración)
48. El control de la secuencia se consigue combinando varias
instrucciones, llamadas estructuras de control de flujo, o
simplemente estructuras de control.
Incluso la receta del pastel contiene algunas de ellas, por
ejemplo:
5.4.1. Estructuras de Control.
49. La estructura general de un algoritmo en pseudocódigo sería:
NOMBRE DEL PROGRAMA (Pastel de mantequilla con fresa y limón en capas)
DEFINICIÓN DE CADA MÓDULO (Necesitas, Procedimiento)
CUERPO DEL PROGRAMA
DATOS:
4 onzas (1/2 pqte. de 8 oz) de queso crema PHILADELPHIA Cream Cheese, ablandado
1/2 taza (1 barra) de mantequilla, ablandada
1-1/2 taza de azúcar
2-1/2 cucharadas de cáscara rallada de limón verde (lime), cantidad dividida
1 cucharadita de vainilla
3 huevos
1-1/2 taza de harina
1-1/2 taza de cobertura COOL WHIP Whipped Topping descongelada
2/3 taza de leche condensada azucarada
1/4 taza de jugo de limón verde (lime)
12 fresas medianas, cantidad dividida
3 tiras finas de cáscara de limón verde (lime)
50. ALGORITMO
PRECALIENTA el horno a 325ºF.
ROCÍA un molde para pastel redondo de 9 pulgs. con aceite en aerosol.
Revuelve bien el queso crema y la mantequilla en un tazón grande con una
batidora eléctrica a velocidad media. Agrega el azúcar; bate esto hasta que
quede liviano y esponjoso. Agrega 2 cdas. de la cáscara de limón rallada y la
vainilla; mézclalas bien. Agrega uno por uno los huevos, batiéndolos
individualmente antes de añadir más. Agrega poco a poco la harina, batiendo
bien cada tanto a velocidad baja antes de añadir más. Vierte el batido en el
molde que preparaste.
HORNEA el pastel durante 1 hora o hasta que al insertar un palillo de dientes en
el centro, éste salga limpio. Déjalo enfriar dentro el molde sobre una rejilla
metálica durante 15 min. Retira el pastel del molde; déjalo enfriar por completo.
COMBINA la cobertura, la leche condensada, el jugo de limón y la 1-1/2 cdta.
restante de la cáscara de limón rallada. Corta el pastel horizontalmente por la
mitad. Coloca el pedazo que servirá de parte inferior sobre el platón para
servir, úntale la mitad de la cobertura. Corta en rebanadas 9 de las fresas;
colócalas sobre la cobertura. Ponle encima el otro pedazo de pastel. Úntale el
resto de la cobertura. Corta las 3 fresas restantes en rebanadas y colócalas
sobre el pastel de modo que parezcan ser 3 flores. Ponle una tira de cáscara de
limón a cada una de las flores para formar los tallos. Guarda el pastel en el
refrigerador.
FIN DEL ALGORITMO
51. La ejecución secuencial consiste de
ejecutar una instrucción y al
terminar, realizar lo que indica el
siguiente paso del algoritmo.
5.4.1.1. Ejecución secuencial.
52. Consiste de ejecutar un grupo de
acciones A ó un grupo de acciones
B (pero no ambos) en función del
resultado de la evaluación de una
condición C (Verdadero ó Falso).
5.4.1.2. Ejecución condicional.
53. Un algoritmo que solo contiene las estructuras de control
anteriores funciona para tareas de longitud fija, dado que
cada instrucción se ejecuta solamente una vez. Sin
embargo, generalmente se requiere que algunas
instrucciones sean ejecutadas más de una vez (como en el
algoritmo de obtención del mcd); existen estructuras de
control que se encargan de la ejecución repetida de
bloques de instrucciones, se conocen de forma genérica
como estructuras iterativas o ciclos.
5.4.1.2. Ejecución condicional.
54. Sirve para ejecutar un grupo de
instrucciones A exactamente N
veces, donde N es un entero
positivo.
5.4.1.3. Iteración definida.
55. Es importante notar que en el caso de la iteración
definida existe una variable implícita llamada
contador, cont en el ejemplo, y sirve para tener un
registro del número de iteraciones realizadas hasta el
momento y para llegar a la condición de paro. Otra
variable muy utilizada cuando se trabaja con ciclos es
conocida como acumulador, y sirve para almacenar
resultados parciales de alguna operación importante
dentro del ciclo; además, al terminar el ciclo, almacena
el resultado final deseado.
5.4.1.3. Iteración definida.
56. Conocida también como iteración indefinida,
se utiliza para repetir un bloque de acciones A,
mientras una condición c sea verdadera, c es
una condición de paro.
5.4.1.4. Iteración condicional.
57. En este caso, a diferencia de la iteración definida, la condición de paro C
depende exclusivamente de las operaciones realizadas dentro del cuerpo
del ciclo.
Cuando en un algoritmo se utilizan iteraciones, es necesario tener cuidado
de no crear ciclos infinitos, esto se hace con operaciones dentro del
bloque de instrucciones que garanticen que la condición de paro se
cumplirá.
5.4.1.4. Iteración condicional.
58. CICLO ITERATIVO Se entiende por ciclo iterativo la unión de símbolos
gráficos que en su conjunto indica cómo repetir cierto proceso; las
estructuras básicas más comunes son:
5.4.1.5. CICLO ITERATIVO
59. Es conveniente realizar la
solución de problemas con la
computadora de manera
conversacional, es decir, que el
programa de computadora nos
vaya indicando mediante
mensajes las opciones y si se
desea repetir el proceso con
otros datos. El bosquejo general
de un diagrama de flujo
conversacional puede ser el
siguiente:
5.4 Estructuras básicas
(secuencia, condicional e iteración)
60.
61. Aplicaciones del Ciclo Iterativo
Calcular el valor de la
expresión y almacenar en la
variable indicada a la izquierda
del signo igual, se genera el
concepto de contador o
expresión que permite contar
(que consta de un ciclo
iterativo que ejecuta varias
veces la instrucción de
reemplazo: C=C+1):
5.4 Estructuras básicas
(secuencia, condicional e iteración)
62. Aplicaciones del Ciclo Iterativo
Otro de los conceptos de
programación de gran utilidad es
la estructura que nos permite
llevar a cabo sumatorias (en ellas
el proceso que se repite es la
acumulación de expresiones
similares, por ejemplo sumar n
dígitos o sumar una y otra vez el
valor de una variable X elevada a
un exponente que crece en cada
ocasión)
5.4 Estructuras básicas
(secuencia, condicional e iteración)
63. Otro elemento útil para el cálculo de fórmulas es el
que resulta de aplicar el concepto de reemplazo del
valor de la variable a lo que se llamará una
multiplicación reiterada, la cual permite obtener
factoriales de tipo descendente o ascendente.
5.4 Estructuras básicas
(secuencia, condicional e iteración)
64. Obténganse el factorial de: 5!
Se sabe que su factorial ascendente es: 1 x 2 x 3 x 4 x 5
De dicha multiplicación se observa la presencia del
elemento llamado contador, que multiplica su valor
por el de la variable del factorial obtenido en el paso
anterior, en efecto:
F = 1 Valor inicial de la variable del factorial
F = 1 x 2 Valor anterior de F multiplicado por 2, es decir, F = F x 2
F = 1 x 2 x 3 Valor anterior de F multiplicado por 3, es decir, F = F x 3
F = 1 x 2 x 3 x 4 Valor anterior de F multiplicado por 4, es decir, F = F x 4
F = 1 x 2 x 3 x 4 x 5 Valor anterior de F multiplicado por 5, es decir, F = F x 5
5.4 Estructuras básicas
(secuencia, condicional e iteración)
65.
66.
67.
68.
69.
70. Un algoritmo puede contener estructuras de
control de flujo combinadas de forma
compleja; secuencias, condicionales e
iteraciones pueden estar intercaladas y
anidadas.
5.4.2. Combinación de
estructuras de control.
71. Es importante mencionar que para realizar un
buen diseño de pseudocódigos y diagramas de
flujo es necesario realizar las tres fases
mencionadas en el desarrollo de algoritmos:
1. Analizar.
2. Diseñar.
3. Probar.
5.5. Resolución de problemas básicos
de ingeniería.
72. Ejemplo: Obtener las raíces de una ecuación
cuadrática.
Este ejemplo presenta el pseudocódigo y el diagrama
de flujo que utiliza la fórmula general para obtener
las raíces reales de una ecuación de cuadrática:
5.5.1. Ejemplos.
75. Aquí se presentan solo algunas de las numerosas historias relacionadas con
errores en el software, varias han terminado incluso con pérdida de vidas.
Es importante realizar siempre pruebas exhaustivas cuando se diseñan
algoritmos y programas, sin asumir de antemano que son correctos.
A principios de los años 60‟s, una nave espacial de la serie Mariner enviada
a Venus se perdió debido a un error en el programa del control de
vuelo, esto costó varios millones de dólares.
La importancia de las pruebas.
76. En una serie de incidentes entre 1986 y 1987, muchos pacientes
recibieron sobredosis masivas de radiación de un sistema de terapia de
radiación Therac-25; tres de ellos fallecieron a causa de
complicaciones relacionadas.
Un componente de hardware de seguridad que bloqueaba la radiación
fue sustituido por revisiones por software, pero debido a un error en el
programa no realizaba bien la tarea.
Hace algunos años una anciana danesa recibió, cercano a su
cumpleaños número 107, una carta computarizada de las autoridades
escolares locales con instrucciones sobre como realizar su inscripción a
primer grado de educación primaria. Resulta que el campo “año” en la
base de datos solo almacenaba dos dígitos.
La importancia de las pruebas.
77. En el cambio de milenio, los problemas de software se convirtieron en
noticia de primera plana con el llamado problema del año 2000, mejor
conocido como “Y2K bug”. El miedo era que el 1o de enero del año 2000
todo dejaría de funcionar, ya que las computadoras usaban sólo dos
dígitos para almacenar el año y por esto, asumirían que “00” era el año
1900 en lugar del 2000. Esto dio como resultado un gran (exitoso) y muy
costoso esfuerzo para corregir programas en todo el mundo.
Estos son solo algunos ejemplos de la importancia que tiene realizar
pruebas a los diseños de software elaborados.
La importancia de las pruebas.
78. 5.5.1. Ejemplos.
Diseña un algoritmo que lea un número natural distinto de 0
desde teclado y muestre por pantalla todos los divisores de dicho
número.
79. 5.5.1. Ejemplos.
algoritmo : Divisores
# Algoritmo que escribe los divisores de un número dado
{numero=X (X N) X>0}
# Declaración de variables
var numero, contador : entero fvar
# Cuerpo del algoritmo
escribe('Introduce un número natural no nulo : ');
lee(numero);
escribe(1);
contador := 2;
mientras (contador < numero) hacer
si (numero resto contador) = 0 entonces
escribe(contador)
fsi;
contador := contador + 1
fmientras;
escribelin(contador)
{numero=X contador=X}
falgoritmo.