TEMA 0: Nociones de Algoritmos 

0.1 Visión Histórica.
 
        Un algoritmo es el  conjunto de operaciones y procedimientos
que deben seguirse para resolver un problema. La palabra "algoritmo"
deriva del  nombre latinizado del gran  matemático árabe Mohamed Ibn
Moussa Al Kow Rizmi, el cual escribió sobre entre los años 800 y 825
su obra Quitab  Al Jabr Al Mugabala, donde se  recogía el sistema de
numeración  hindú y  el concepto   del cero.  Fue Fibonacci,  el que
tradujo su  obra al latín  y la inició  con las palabras:  Algoritmi
dicit.

0.2 Diferencia entre el lenguaje algorítmico y el informático.

        El  lenguaje  algorítmico  es  aquel  por  medio del cual se
realiza un  análisis previo del  problema a resolver  y encontrar un
método que permita resolverlo. El  conjunto de todas las operaciones
a realizar, y  el orden en el  que deben efectuarse, se  le denomina
algoritmo.

        El lenguaje  informático es aquel  por medio del  cual dicho
algoritmo se codifica  a un sistema comprensible por  el ordenador o
computadora. Este tipo  de lenguaje es más cercano  a la máquina que
al ser humano y podemos distinguir distintos tipos dependiendo de la
proximidad a  la maquina. Se  denomina lenguaje de  alto nivel aquel
que es más cercano a la  comprensión humana y lenguaje de bajo nivel
a aquellos que  son más comprensibles  por la máquina.  En concreto,
nosotros vamos a estudiar un lenguaje  en la frontera de uno de bajo
nivel. Es  por ello que  el 'C'  es  tan potente y  rápido, pues las
funciones  principales  representan  las  funciones  más básicas del
ordenador.

0.3 Planteamientos de Problemas.

        Lo que  pretende un algoritmo es  sintetizar de alguna forma
una tarea, cálculo o mecanismo antes de ser transcrito al ordenador.
Los pasos que hay que seguir son los siguientes:

        -       Análisis previo del problema.
        -       Primera visión del método de resolución.
        -       Descomposición en módulos.
        -       (Programación estructurada).
        -       Búsqueda de soluciones parciales.
        -       Ensamblaje de soluciones finales.

Ejemplo:  Calcular las posibles raíces  para una ecuación de segundo
grado:  ax^2+bx+c=0

+-Algoritmo raíces
|
|   Variables reales a,b,c,x,y
|
|   Escribir  "Introduzca los coeficientes de mayor a menor grado."
|   Leer  a,b,c
|
| +-Si sqr(b)>= 4*a*c entonces
| |   x=(-b+sqrt(b^2-4*a*c))/2a
| +-Sino
| |   Escribir "No existen raíces reales."
| +-Finsi
|
+-Final


0.4 Organigramas.

        Un organigrama  o diagrama de  flujos es una  representación
semigráfica del  algoritmo en cuestión. Esto  nos facilita la visión
descriptiva de la ejecución del  programa, así como la generación de
la  traza del  algoritmo. Se  denomina traza  de un  algoritmo a  la
ejecución  manual  de  un  programa  obteniendo  para  cada  paso un
resultado.

        Símbolos generales:

        * Inicio y fin de un programa.
        * Operaciones de I/O , aritméticas y lógico-aritméticas.
        * Decisiones lógicas.
        * Flujo de la ejecución.


0.5 Traza de un Algoritmo.

        La traza de un Algoritmo  se puede definir como la ejecución
manual de forma  secuencial de las sentencias que  lo componen. Así,
la traza del  siguiente algoritmo es el valor  que van adoptando las
variables a medida que se va ejecutando un programa.

+-Algoritmo Suma
|
|   Variable entera a,b
|
|   Escribir "Indique el primer sumando"
|   Leer a
|   Escribir "Indique el segundo sumando"
|   Leer b
|   c=a+b
|   Escribir "El resultado es: ";c
|
+-Final

       +----------------------------+ 
       |        T R A Z A           | 
       +------------+---------------+ 
       | Comentario |   Valores     | 
       +------------+---------------+ 
       | Leemos a:  | a <- 4        | 
       | Leemos b:  | b <- 5        | 
       | Calcula c: | c <- a+b <- 9 | 
       | Escribe c: | c <- 9        | 
       +------------+---------------+ 

        La  función  principal  que  posee  realizar  la traza de un
algoritmo es la de comprobar  que éste funciona correctamente o para
realizar  la  etapa  de  depuración  en  la  que se intenta corregir
errores,  simplificar  el  algoritmo  al  máximo  e  incrementar  su
eficacia y velocidad.