Introducción
El desarrollo de algoritmos es un tema fundamental en el diseño de programas o soluciones. Por lo cual, el alumno debe tener buenas bases que le sirvan para poder crear de manera fácil y rápida sus programas.
En el mismo podremos encontrar los conceptos de algoritmo y algunos de sus componentes, análisis y diseño. También veremos los diferentes tipos de formas y tamaños o medidas en que se pueden almacenar y representar los datos y estructuras en un algoritmo o programa.
Que es un Algoritmo
La palabra algoritmo se deriva de la traducción al latín de la palabra árabe alkhowarizmi, 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.
El algoritmo es un conjunto de pasos,
instrucciones o acciones que se deben seguir para resolver un problema. Existen
una gran cantidad de algoritmos, hay que coger el más efectivo.
Características
- Tiene que ser preciso.
- Tiene que estar bien definido.
- Tiene que ser finito.
- La programación es adaptar el algoritmo al ordenador.
- El algoritmo es independiente según donde lo implemente.
Es un esquema para representar gráficamente un algoritmo. Se basan en la utilización de diversos símbolos para representar operaciones específicas, es decir, es la representación gráfica de las distintas operaciones que se tienen que realizar para resolver un problema, con indicación expresa el orden lógico en que deben realizarse.
Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de operación. Para hacer comprensibles los diagramas a todas las personas, los símbolos se someten a una normalización; es decir, se hicieron símbolos casi universales, ya que, en un principio cada usuario podría tener sus propios símbolos para representar sus procesos en forma de Diagrama de flujo. Esto trajo como consecuencia que sólo aquel que conocía sus símbolos, los podía interpretar. La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a un patrón definido previamente.
El diagrama de flujo representa la forma más tradicional y duradera para especificar los detalles algorítmicos de un proceso. Se utiliza principalmente en programación, economía y procesos industriales.
Importancia de los Diagrama de Flujos
Los diagramas de flujo son importantes porque nos facilita la manera de representar visualmente el flujo de datos por medio de un sistema de tratamiento de información, en este realizamos un análisis de los procesos o procedimientos que requerimos para realizar un programa o un objetivo.
Por ejemplo: si nosotros queremos realizar una pizza, primero necesitamos los ingredientes, este ya sería un proceso, luego de haber conseguido los ingredientes necesitamos realizar la masa, este sería otro proceso, luego realizamos la salsa, este sería otro procesos y finalmente unimos todo lo que hemos hecho y agregamos los complemento como el jamón, el queso, etc. Para la realización de esta pizza ya contamos con 4 procesos los cual podemos desarrollar en un diagrama de flujo y unirlos en el mismo. Para así obtener un producto final que sería nuestra pizza.
Lenguaje de Programación
Un lenguaje de programación es un lenguaje formal diseñado para expresar procesos que pueden ser llevados a cabo por máquinas como las computadoras.
Pueden usarse para crear programas que controlen el comportamiento físico y lógico de una máquina, para expresar algoritmos con precisión, o como modo de comunicación humana.
Está formado por un conjunto de símbolos y reglas sintácticas y semánticas que definen su estructura y el significado de sus elementos y expresiones. Al proceso por el cual se escribe, se prueba, se depura, se compila y se mantiene el código fuente de un programa informático se le llama programación.
También la palabra programación se define como el proceso de creación de un programa de computadora, mediante la aplicación de procedimientos lógicos, a través de los siguientes pasos:
· El desarrollo lógico del programa para resolver un problema en particular.
· Escritura de la lógica del programa empleando un lenguaje de programación específico.
· Ensamblaje o compilación del programa hasta convertirlo en lenguaje de máquina.
· Prueba y depuración del programa.
· Desarrollo de la documentación.
Existe un error común que trata por sinónimos los términos 'lenguaje de programación' y 'lenguaje informático. Los lenguajes informáticos engloban a los lenguajes de programación y a otros más, como por ejemplo HTML.
Permite especificar de manera precisa sobre qué datos debe operar una computadora, cómo deben ser almacenados o transmitidos y qué acciones debe tomar bajo una variada gama de circunstancias. Todo esto, a través de un lenguaje que intenta estar relativamente próximo al lenguaje humano o natural. Una característica relevante de los lenguajes de programación es precisamente que más de un programador pueda usar un conjunto común de instrucciones que sean comprendidas entre ellos para realizar la construcción de un programa de forma colaborativa.
Compiladores
Un compilador es un programa informático que traduce un programa escrito en un lenguaje de programación a otro lenguaje de programación, generando un programa equivalente que la máquina será capaz de interpretar. Usualmente el segundo lenguaje es lenguaje de máquina, pero también puede ser un código intermedio (bytecode), o simplemente texto. Este proceso de traducción se conoce como compilación.
Un compilador es un programa que permite traducir el código fuente de un programa en lenguaje de alto nivel, a otro lenguaje de nivel inferior (típicamente lenguaje de máquina). De esta manera un programador puede diseñar un programa en un lenguaje mucho más cercano a cómo piensa un ser humano, para luego compilarlo a un programa más manejable por una computadora.
Como parte importante de este proceso de traducción, el compilador informa a su usuario de la presencia de errores en el programa fuente.
Partes de un Compilador
La construcción de un compilador involucra la división del proceso en una serie de fases que variará con su complejidad. Generalmente estas fases se agrupan en dos tareas: el análisis del programa fuente y la síntesis del programa objeto.
- Análisis: Se trata de la comprobación de la corrección del programa fuente, e incluye las fases correspondientes al Análisis léxico (que consiste en la descomposición del programa fuente en componentes léxicos), Análisis sintáctico (agrupación de los componentes léxicos en frases gramaticales ) y Análisis semántico (comprobación de la validez semántica de las sentencias aceptadas en la fase de Análisis Sintáctico).
- Síntesis: Su objetivo es la generación de la salida expresada en el lenguaje objeto y suele estar formado por una o varias combinaciones de fases de Generación de Código (normalmente se trata de código intermedio o de código objeto) y de Optimización de Código (en las que se busca obtener un código lo más eficiente posible).
Alternativamente, las fases
descritas para las tareas de análisis y síntesis se pueden agrupar en Front-end
y Back-end:
· Front-end: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar, y está compuesta por las fases comprendidas entre el Análisis Léxico y la Generación de Código Intermedio.
·
Back-end: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.
Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para generar código máquina en varias plataformas distintas. Suele incluir la generación y optimización del código dependiente de la máquina.
El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker)
Tipos de Compiladores
- Compiladores cruzados
- Compiladores optimizadores
- Compiladores de una sola pasada
- Compiladores de varias pasadas
- Compiladores JIT (Just In Time)
- Compiladores cruzados: generan código para un sistema distinto del que están funcionando.
Es un compilador capaz de crear código ejecutable para otra plataforma distinta a aquélla en la que el compilador se ejecuta. Esta herramienta es útil cuando quiere compilarse código para una plataforma a la que no se tiene acceso, o cuando es incómodo o imposible compilar en dicha plataforma (como en el caso de los sistemas embebidos).
Uso.- el uso fundamental de un compilador cruzado es compilar para un entorno diferente en el que se ejecuta el compilador. Esto es muy utilizado en las siguientes situaciones:
Sistemas empotrados, donde los recursos son extremadamente limitados.
Compilación para múltiples máquinas.
- Compilador optimizador: es un compilador que trata de minimizar ciertos atributos de un programa informático con el fin de aumentar la eficiencia y rendimiento. Las optimizaciones del compilador se aplican generalmente mediante una secuencia de transformaciones de optimización, algoritmos que transforman un programa para producir otro con una salida semánticamente equivalente pero optimizado.
Generalmente hay varios aspectos que se desean optimizar:
Optimización temporal: Reducir el tiempo de ejecución del programa.
Optimización espacial: Reducir la cantidad de espacio en memoria que ocupa el programa en ejecución.
Reducir el tamaño del programa.
Minimizar la potencia consumida por un programa (debido a las computadoras portátiles).
- Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.
- Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.
- Compiladores JIT (Just In Time): es una técnica para mejorar el rendimiento de sistemas de programación que compilan a bytecode, consistente en traducir el bytecode a código máquina nativo en tiempo de ejecución. La compilación en tiempo de ejecución se construye a partir de dos ideas anteriores relacionadas con los entornos de ejecución: la compilación a bytecode y la compilación dinámica. Forman parte de un intérprete y compilan partes del código según se necesitan.
Proceso de Compilación
Es el proceso por el cual se traducen las instrucciones escritas en un determinado lenguaje de programación a lenguaje máquina. Además de un traductor, se pueden necesitar otros programas para crear un programa objeto ejecutable. Un programa fuente se puede dividir en módulos almacenados en archivos distintos. La tarea de reunir el programa fuente a menudo se confía a un programa distinto, llamado preprocesador. El preprocesador también puede expandir abreviaturas, llamadas a macros, a proposiciones del lenguaje fuente.
Normalmente la creación de un programa ejecutable (un típico.exe para Microsoft Windows o DOS) conlleva dos pasos. El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto, no directamente a lenguaje máquina). El segundo paso se llama enlazado en el cual se enlaza el código de bajo nivel generado de todos los ficheros y subprogramas que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse directamente con el sistema operativo, traduciendo así finalmente el código objeto a código máquina, y generando un módulo ejecutable.
Estos dos pasos se pueden hacer por separado, almacenando el resultado de la fase de compilación en archivos objetos (un típico.obj para Microsoft Windows, DOS o para Unix); para enlazarlos en fases posteriores, o crear directamente el ejecutable; con lo que la fase de compilación se almacena sólo temporalmente. Un programa podría tener partes escritas en varios lenguajes (por ejemplo C, C++ y Asm), que se podrían compilar de forma independiente y luego enlazar juntas para formar un único módulo ejecutable.
Tipos de Algoritmos
Hay dos tipos de algoritmos que son los cualitativos y cuantitativos
- Cualitativos: Son aquellos en los que se describen los pasos utilizando palabras. Son todos aquellos pasos o instrucciones descritos por medio de palabras que sirven para llegar a la obtención de una respuesta o solución de un problema cualquier.
- Cuantitativos: Son aquellos en los que se utilizan cálculos numéricos para definir los pasos del proceso. Son aquellos pasos o instrucciones que involucran cálculos numéricos para llegar a un resultado satisfactorio
Análisis del Problema
El problema tiene que estar definido y comprendido claramente
Una vez comprendido el problema se debe desarrollar el algoritmo
Procedimiento paso a paso de la solución del problema.
Por ultimo para resolver el problema mediante una computadora se necesita codificar el algoritmo en un lenguaje de programación,
BASIC, PASCAL, CABOL, FORTRAIN, ETC.
Es decir convertir el algoritmo a programa y comprobar que el programa soluciona verdadera mente el problema.
El propósito del análisis del problema sirve al programador para llegar a la comprensión de la naturaleza del problema.
El problema tiene que estar bien definido si se quiere llegar a una solución satisfactoria del problema.
Para poder definir con precisión el problema se requiere que las especificaciones de entrada y salida sean descritas con detalle.
Estos son los requisitos mas importantes.
Representació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:
1. 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.
2. Descripción formal. Se usa pseudocódigo para describir la secuencia de pasos que encuentran la solución.
3. 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.
Diseño del Algoritmo
Algoritmos Estáticos: son los que funcionan siempre igual, independientemente del tipo de problema tratado.- Algoritmos Adaptativos: algoritmos con cierta capacidad de aprendizaje
- Algoritmos Probabilísticos: son algoritmos que no utilizan valores de verdad booleanos sino continuos. Existen varios tipos de algoritmos probabilísticos dependiendo de su funcionamiento, pudiéndose distinguir:
- Algoritmos numéricos: que proporcionan una solución aproximada del problema.
- Algoritmos de Montecarlo: que pueden dar la respuesta correcta o respuesta erróneas (con probabilidad baja).
- Algoritmos de Las Vegas: que nunca dan una respuesta incorrecta: o bien dan la respuesta correcta o informan del fallo.
- Algoritmo Cotidiano: es la serie de pasos que realizamos en nuestra vida diaria para realizar las diferentes tareas y actividades comunes, desde los pasos al levantarnos, así como ir de compras, etc.
- Algoritmo Voraz: un algoritmo voraz es aquel que, para resolver un determinado problema, sigue una meta heurística consistente en elegir la opción óptima en cada paso local con la esperanzade llegar a una solución general óptima.
- Algoritmo Determinista: es un algoritmo que, en términos informales, es completamente predictivo si se conocen sus entradas.
- Algoritmo Heurístico: es un algoritmo que abandona uno o ambos objetivos; por ejemplo, normalmente encuentran buenas soluciones, aunque no hay pruebas de que la solución no pueda ser arbitrariamente errónea en algunos casos; o se ejecuta razonablemente rápido, aunque no existe tampoco prueba de que siempre será así. Las heurísticas generalmente son usadas cuando no existe una solución óptima bajo las restricciones dadas (tiempo, espacio, etc.), o cuando no existe del todo.
- Algoritmo de escalada: la idea básica consiste en comenzar con una mala solución a un determinado problema y, repetidamente, aplicar optimizaciones a la misma hasta que esta sea óptima o satisfaga algún otro requisito.
Ejercicios de Aplicación
1. Cambiar la rueda pinchada de un automóvil teniendo un gato mecánico en buen estado, una rueda de reemplazo y una llave inglesa.Inicio
PASO 1. Aflojar los tornillos de la rueda pinchada con la llave inglesa.
PASO 2. Ubicar el gato mecánico en su sitio.
PASO 3. Levantar el gato hasta que la rueda pinchada pueda girar libremente.
PASO 4. Quitar los tornillos y la rueda pinchada.
PASO 5. Poner rueda de repuesto y los tornillos.
PASO 6. Bajar el gato hasta que se pueda liberar.
PASO 7. Sacar el gato de su sitio.
PASO 8. Apretar los tornillos con la llave inglesa.
Fin
2. Un estudiante se encuentra en su casa (durmiendo) y debe ir a la universidad, ¿qué debe haga el estudiante?
Inicio
Dormir
haga 1 hasta que suene el despertador (o lo llame la mamá).
Mirar la hora.
¿Hay tiempo suficiente?
Si hay, entonces
Bañarse.
Vestirse.
Desayunar.
Sino,
Vestirse.
Cepillarse los dientes.
Despedirse de la mamá y el papá.
¿Hay tiempo suficiente?
Si, Caminar al paradero.
Sino, Correr al paradero.
Hasta que pase un bus para la universidad haga :
Esperar el bus
Ver a las demás personas que esperan un bus.
Tomar el bus.
Mientras no llegue a la universidad haga :
Seguir en el bus.
Pelear mentalmente con el conductor. Timbrar.
Bajarse.
Entrar a la universidad.
Fin
Control de Flujo
Controlar el flujo es
determinar el orden en el que se ejecutarán las instrucciones en nuestros
programas. Si no existiesen las sentencias de control entonces los programas se
ejecutarían de forma secuencial, empezarían por la primera instrucción e irían
una a una hasta llegar a la última.
Pero, obviamente este panorama sería muy malo para
el programador. Para estos dos problemas tenemos dos soluciones: las sentencias
de control alternativas y las repetitivas. Estos dos conjuntos de sentencias
forman en Pascal el grupo de
las sentencias estructuradas. Y
se les llama estructuradas porque a diferencia de las simples pueden contener
en su cuerpo otras sentencias.
Las sentencias alternativas también son conocidas como sentencias selectivas
porque permiten seleccionar uno
de entre varios caminos por donde seguirá la ejecución del programa. En algunos
casos esta selección viene determinada por la evaluación de una expresión
lógica. Este tipo de sentencias se dividen en dos:
- La sentencia if
- La sentencia case
A las sentencias repetitivas se les conoce también como sentencias iterativas ya
que permiten realizar algo varias veces (repetir, iterar). Dentro de ellas distinguimos tres:
- La sentencia for
- La sentencia while
- La sentencia repeat
Estructuras Secuenciales
Se refiere a la
ejecución de instrucciones una tras otra, es decir de una línea, a la siguiente
sin saltarse ninguna, es en dónde la salida de una es la entrada de otra. El
flujo secuencial es casi inexistente, ya que en muchos programas se hacen
llamadas a funciones y esto hace que no sea secuencial.
Función
Cuando se llama
a una función se hace un salto ya sea condicional o incondicional, se
ejecuta el "bloque de código" determinado, y cuando finaliza el
bloque se regresa a la dirección que se guardado en la memoria antes de
realizar el salto, la función hace que se regrese a esa dirección con la
instrucción "volver". Esto es a lo que podemos llamar función,
subrutinas o subprogramas.
Las estructuras
de repetición más usuales en los lenguajes de programación suelen ser WHILE,
REPEAT y FOR.
Las
instrucciones se siguen en una secuencia fija que normalmente viene dada por el
número de renglón. Es decir que las instrucciones se ejecutan de arriba hacia
abajo. Las instrucciones se ejecutan dependiendo de la condición dada dentro
del algoritmo.
Instrucción
1;
Instrucción
2;
Instrucción
3;
...
Instrucción
n;
La estructura
secuencial es la más sencilla de todas, simplemente indica al procesador
que debe ejecutar de forma consecutiva una lista de acciones (que pueden ser,
a su vez, otras estructuras de control); para construir una secuencia de
acciones basta con escribir cada acción en una línea diferente. A
continuación se muestra una composición secuencial de acciones en notación
algorítmica y su equivalente FORTRAN.
1.-leer
a
2.-leer
b
3.-c=a
+ b
4.-escribir
c
PARA MATLAB
a=input('a=')
b=input('b=')
c
= a + b
fprintf('el
valor de c es:%f\n'c)
Existe una forma
alternativa de expresar una estructura secuencial escribiendo
varias acciones en la misma línea pero utilizando el punto y coma, ; ,
como separador. Sin embargo, esta última notación es des
aconsejable puesto que puede llegar a hacer el código
bastante difícil de leer.
1.-leer a
2.-leer b
3.-c=a + b
4.-escribir c
PARA MATLAB utilizando
punto y coma
a=input('a=');
b=input('b=');
c
= a + b;
fprintf('el
valor de c es:%f\n'c);
Por último, es
necesario señalar un aspecto importante de la composición secuencial y es
que no es conmutativa.
Punto de
entrada-Acción 1-Acción 2-Acción n-...-Punto de salida
Estructuras Selectivas
Se utiliza
cuando para realizar algún programa se tienen diferentes casos y que los
podemos identificar con algún valor, este valor nos va a ayudar a saber si es
cierto caso a que bloque de código se debe de brincar. Es como tener un tipo directorio
en el que tenemos registrado el identificador del caso que puede ser un valor
"x" con el correspondiente bloque de código que debe ejecutar.
Cuando se tienen
muchos diferentes casos es más ventajoso utilizar el flujo selectivo que el
flujo alternativo ya en el flujo alternativo seria ir checando si determinado
valor coincide con cada uno de los bloques de código.
La estructura
selectiva permite bifurcar el “flujo” del programa en función de una expresión
lógica; disponemos de tres estructuras alternativas diferentes:
alternativa simple, alternativa doble y alternativa múltiple.
- Estructura selectiva simple
Si
expresión lógica entonces
acciones
fin_si
If
(expresión lógica) then
acciones
End if
- Estructura selectiva doble
Si
expresión lógica entonces
acciones
Si no
acciones
fin_si
|
If
(expresión lógica) then
acciones
else
acciones
End if
|
- Estructura selectiva múltiple
Según expresión
caso valor1:
acción 1
caso valor2:
acción 2
...
caso valor N:
acción n
otro caso:
acción
Fin según
Select case (expresión) case (valor1)
acción 1
case (valor2)
acción 2
...
case (valorn)
acción n
case default
acción
End select
Estructura Repetitiva
Bucle para
Ventajas:
Formato vertical: En él, el flujo y la secuencia de las operaciones, va de arriba hacia abajo. Es una lista ordenada de las operaciones de un proceso con toda la información que se considere necesaria, según su propósito.
Las principales características del Lenguaje C son:
case (valor2)
acción 2
...
case (valorn)
acción n
case default
acción
End select
Estructuras Iterativas
Es cada una de las diferentes pasadas o ejecuciones
de todas las instrucciones contenidas en el bucle.
Fases de un Programa
Cíclico:
1. Entrada de datos e instrucciones previas
2. Lazo o bucle
3. Instrucciones finales o resto del proceso
4. Salida de resultado
- Bucle infinito:
En el flujograma anterior, observa que la flecha
que se regresa hacia arriba nos está indicando que hay que volver a evaluar la
expresión. En ese caso como el bucle es infinito, no se tiene una condición
para terminar y se estará haciendo siempre.
- Bucle finito:
En el siguiente ejemplo, ya se agregó una
condición, la cual nos permitirá finalizar la ejecución del bucle en el caso en
que la condición se cumpla.
- Bucles Repetitivos:
En los bucles cruzados, los cuales no son
convenientes de utilizar, se tiene que iniciamos un bucle y no se ha terminado
cuando empezamos otro, luego utilizamos estructuras goto (saltos) para pasar al
bucle externo y se quedan entrelazados.
Esto puede ocasionar que el programa pierda el
control de cuál proceso se está ejecutando y podamos obtener resultados
erróneos. Veamos gráficamente el diseño de estas tres formas cíclicas:
En programación,
tipo de estructura de control. También llamada estructura de decisión.
En una
estructura de selección/decisión, el algoritmo al ser ejecutado toma una
decisión, ejecutar o no ciertas instrucciones si se cumplen o no ciertas
condiciones. Las condiciones devuelven un valor, verdadero o falso, determinado
así la secuencia a seguir.
Por lo general
los lenguajes de programación disponen de dos estructuras de este tipo:
estructura de decisión simple (if), y estructura de decisión múltiple (CASE,
SWITCH).
Bucle mientras
El bucle se repite mientras la condición sea
cierta, si al llegar por primera vez al bucle mientras la condición es falsa,
el cuerpo del bucle no se ejecuta ninguna vez.
MIENTRAS condición HACER
Instrucción;
FIN MIENTRAS.
Bucle para
Una estructura de control muy común es el
ciclo para, la cual se usa cuando se desea iterar un número
conocido de veces, empleando como índice una variable que se incrementa (o
decrementa) la cual se define como:
i < x
MIENTRAS i <= n HACER
i < x
MIENTRAS i <= n HACER
Instrucción;
i < i +z
FIN MIENTRAS.
La estructura repetitiva o iterativa permite, como
su propio nombre indica, repetir una acción; dicha repetición puede llevarse a
cabo un número prefijado de veces o depender de la evaluación de una expresión
lógica. Existen dos tipos de estructuras repetitivas: desde-hasta y mientras.
Estructura desde-hasta
Esta estructura permite repetir la ejecución de una
acción o de un grupo de acciones un número determinado de veces; la
sintáxis es la siguiente:
desde
indice_inicio hasta fin [con paso valor] hacer
acción
fin desde
do
indice=inicio, fin, paso
acción
end do
El funcionamiento de la
estructura es el siguiente:
• En primer lugar, se asigna a la variable índice
el valor de inicio.
• El bucle se ejecuta mientras índice no alcance el
valor de fin.
• En cada iteración el valor de índice es
incrementado según el paso indicado y se ejecuta la acción o grupo de acciones
encerrados en el bucle.
• En caso de que no se indique ningún paso el que
se empleará sera +1.
A continuación se muestran algunos ejemplos:
desde n_1
hasta 10 hacer
escribir n
fin desde
do n=1,
10
print *, n
end do
El bucle anterior imprime por pantalla los números
del 1 al 10.
desde n!10 hasta 1 hacer
escribir n
fin desde
do n=10, 1
fprintf *, n
end do
El bucle anterior no se ejecuta nunca puesto que no
se puede alcanzar 1 comenzando en 10 y avanzando con paso +1; ¡atención!
Un error frecuente es pensar que el bucle se ejecuta de forma infinita.
Desde n!10 hasta 1 con paso –2 hacer
Escribir n
Fin desde
Do n=10, 1, -2
fprintf *, n
End do
Este bucle escribe los números pares de 10 a 2 en
orden inverso.
Ejercicios de Aplicación
Ejemplos
de Estructuras Secuenciales
Ejemplos
de Estructuras Selectivas
Ejemplos
de Estructuras Iterativas
Ejemplo
de Estructura Repetitiva
Ventajas y Desventajas de los Diagramas de Flujos
Ventajas:
- Es bastante sencillo y el más utilizado por su fácil comprensión y programación.
- En un código reducido se realiza el ordenamiento.
- Eficaz.
- Favorecen la compresión del proceso al mostrarlo como un dibujo.
- Permiten identificar los problemas y las oportunidades de mejorar el proceso.
- Análisis efectivo en los diferentes secciones del programa.
- Un buen diagrama de flujo reemplaza varias paginas de texto
- Son una excelente herramienta para capacitar a los nuevos empleados
- Permite obtener una lógica correcta.
Desventajas:
- No existen normas fijas para la elaboración de los diagramas de flujo que permitan incluir todos los detalles que el usuario desee introducir.
- Es el más ineficiente de todos los métodos.
- Requiere de muchas lecturas/escrituras en memoria.
Tipos de Diagrama de Flujo
Formato vertical: En él, el flujo y la secuencia de las operaciones, va de arriba hacia abajo. Es una lista ordenada de las operaciones de un proceso con toda la información que se considere necesaria, según su propósito.
Formato horizontal: En él, el flujo o la secuencia de las operaciones, va de izquierda a derecha.
Formato panorámico: El proceso entero está representado en una sola carta y puede apreciarse de una sola mirada mucho más rápido que leyendo el texto, lo que facilita su comprensión, aun para personas no familiarizadas. Registra no solo en línea vertical, sino también horizontal, distintas acciones simultáneas y la participación de más de un puesto o departamento que el formato vertical no registra.
Formato Arquitectónico: Describe el itinerario de ruta de una forma o persona sobre el plano arquitectónico del área de trabajo. El primero de los flujogramas es eminentemente descriptivo, mientras que los utilizados son fundamentalmente representativos.
Simbologia y Significado de un Diagrama de
Flujo
Este se utiliza para representar el inicio o el fin de un algoritmo. También puede representar una parada o una interrupción programada que sea necesaria realizar en un programa.
Este se utiliza para un proceso determinado, es el que se utiliza comúnmente para representar una instrucción, o cualquier tipo de operación que origine un cambio de valor.
Este símbolo es utilizado para representar una entrada o salida de información, que sea procesada o registrada por medio de un periférico.
Este es utilizado para la toma de decisiones, ramificaciones, para la indicación de operaciones lógicas o de comparación entre datos.
Este es utilizado para enlazar dos partes cualesquiera de un diagrama a través de un conector de salida y un conector de entrada. Esta forma un enlace en la misma página del diagrama.
Este es utilizado para enlazar dos partes de un diagrama pero que no se encuentren en la misma página.
Expresa operación cíclica repetitiva.
Representa datos grabados en una cinta magnética.
Construcción de diagramas de flujo
- El diagrama de flujo debe ser construido de arriba hacia abajo y de izquierda a derecha.
- La notación utilizada en el diagrama de flujo debe ser independiente del lenguaje de programación. La solución presentada en el diagrama puede escribirse posteriormente y fácilmente en diferentes lenguajes de programación.
- Es conveniente cuando realizamos una tarea compleja poner comentarios que expresen o ayuden a en tender lo que hicimos.
- Si el diagrama de flujo requiriera mas de una hoja para su construcción, debemos utilizar los conectores adecuados y enumerar las páginas convenientemente.
- No puede llegar mas de una linea a un símbolo
Características del Lenguaje de Programación C++
C++ es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup. La intención de su creación fue el extender al exitoso lenguaje de programación C con mecanismos que permitan la manipulación de objetos. En ese sentido, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Posteriormente se añadieron facilidades de programación genérica, que se sumó a los otros dos paradigmas que yaestaban admitidos (programación estructurada y laprogramación orientada a objetos). Por esto se suele decir que el C++ es un lenguaje de programaciónmultiparadigma.
Actualmente existe un estándar, denominado ISO C++, al que se han adherido la mayoría de los fabricantes de compiladores más modernos. Existen también algunos intérpretes, tales como ROOT.
Una particularidad del C++ es la posibilidad de redefinir los operadores (sobrecarga de operadores), y de poder crearnuevos tipos que se comporten como tipos fundamentales.
El nombre C++ fue propuesto por Rick Mascitti en el año 1983, cuando el lenguaje fue utilizado por primera vez fuera de un laboratorio científico. Antes se había usado el nombre "C con clases". En C++, la expresión "C++" significa "incremento de C" y se refiere a que C++ es una extensión de C.
- C++ es un lenguaje de programación orientado a objetos. Se suele decir que es un lenguaje híbrido, ya que permite la programación estructurada.
- Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
- Es un lenguaje muy flexible que permite programar con múltiples estilos.
- Un sistema de tipos que impide operaciones sin sentido.
Propiedades C++
Un núcleo del lenguaje simple, con funcionalidades añadidas importantes, como funciones matemáticas y de manejo de archivos, proporcionadas por bibliotecas.
Es un lenguaje muy flexible que permite programar con múltiples estilos. Uno de los más empleados es el estructurado "no llevado al extremo" (permitiendo ciertas licencias de ruptura).
Un sistema de tipos que impide operaciones sin sentido.
Usa un lenguaje de preprocesado, el preprocesador de C, para tareas como definir macros e incluir múltiples archivos de código fuente.
Acceso a memoria de bajo nivel mediante el uso de punteros.
Interrupciones al procesador con uniones.
Un conjunto reducido de palabras clave.
Por defecto, el paso de parámetros a una función se realiza por valor. El paso por referencia se consigue pasando explícitamente a las funciones las direcciones de memoria de dichos parámetros.
Punteros a funciones y variables estáticas, que permiten una forma rudimentaria de encapsulado y polimorfismo.
Cuales son las principales características del C++ y que librerías utiliza
C++ es un lenguaje de programación orientado a objetos. Se suele decir que es un lenguaje híbrido, ya que permite la programación estructurada.
La política del diseño de C++ heredó de C el siguiente axioma: "el programador sabe lo que hace". Con esto se deja en claro que el programador tiene el control total de lo que está haciendo, permitiendo una máxima eficiencia al no incorporar verificación de errores en tiempo de ejecución.
Otro axioma es "lo que no se conoce no hace daño". Con esto se apunta a que el código generado por los compiladores del lenguaje no deben incluir una sobrecarga de recursos computacionales, minimizando la implementación de recursos tales como el polimorfismo y la expansión de patrones.
Es un lenguaje de nivel intermedio, pudiéndose utilizar tanto para escribir software de bajo nivel, como drivers y componentes de sistemas operativos, como para el desarrollo rápido de aplicaciones, según el marco de trabajo con el que se disponga, como VCL de Borland C++ Builder.
Los compiladores de C++ generan código nativo con un alto grado de optimización en memoria y velocidad, lo que lo convierte en uno de los lenguajes más eficientes.
A través de los patrones de clase y de funciones, los templates, el lenguaje apoya el desarrollo de clases genéricas con parámetros de tipo y de tamaño. Este recurso es la base de la Bibilioteca de Patrones Estándar, STL, que contiene una gran cantidad de patrones de clase contenedor, como mapas, conjuntos, pilas y colas, y una amplia variedad de algoritmos que pueden especializarse para tipos de datos provistos por el usuario. STL es parte del estándar C++.
Una de las características más interesantes del lenguaje es la sobrecarga de operadores. Esto significa que a los operadores intrínsecos del lenguaje se les puede redefinir la semántica: se pueden escribir funciones que en vez de tener un nombre, se asocian a un operador, que debe tener por lo menos un parámetro de tipo clase.
Es fundamental utilizar las clases de STL, entre las que se encuentra string, la clase que encapsula la clásica cadena de caracteres terminada en cero heredada de C. Esto posibilita manipular cadenas de caracteres de la misma forma en que se lo hace en otros lenguajes de programación que tienen un tipo de datos string integrado.
Las extensiones de C++ que incluye CodeGear en su IDE Borland C++ Builder incorporan al lenguaje el modelo de eventos y propiedades, lo que ayuda bastante a generar código más claro y elegante.
La libre utilización de punteros por parte de los programadores, por un lado aporta eficiencia, pero por otro es una fuente de errores de lógica. Por este motivo, lenguajes derivados de C++, como C# y Java, quitaron este recurso y solo permiten referencias a objetos.
Otra fuente de errores es la administración de la memoria. En C++ la asignación y liberación de memoria dinámica es responsabilidad del programador. Se pueden construir elegantes mecanismos y jerarquías de clase que controlen correctamente la creación y destrucción de objetos, como así también se pueden escribir programas que no lo hagan tan bien, dejando bloques de memoria perdidos. Esta característica tampoco fue adoptada por Java y por la plataforma .NET. Ambas tecnologías utilizan un recolector de basura en vez de la destrucción explícita de objetos.
Estructura Básica del Lenguaje
C++:
Es un lenguaje de programación diseñado a mediados de los años 1980 por Bjarne Stroustrup, un lenguaje de programación C con mecanismos que permiten la manipulación de objetos, desde el punto de vista de los lenguajes orientados a objetos, el C++ es un lenguaje híbrido.
Componente estructural básico; Funciones:
Directivas de preprocesador
Declaraciones globales (variables globales, funciones,…)
Función main()
{
Secuencia de declaraciones e instrucciones
}
función1 ()
{
Secuencia de declaraciones e instrucciones
}
...
Función ()
{
Secuencia de declaraciones e instrucciones
}
Directivas del preprocesador
Los compiladores de C++ proporcionan bibliotecas de funciones.
Cada biblioteca de funciones tiene asociado un archivo de definición que se denomina cabecera.
Para utilizar algo de una biblioteca en un programa, hay que colocar al principio del programa una directiva de preprocesamiento seguida de la cabecera de la biblioteca entre ángulos.
Instrucciones al compilador antes de que se compile el programa principal
Las directivas más usuales son:
# include
# define
# include <iostream.h>
Indica al compilador que lea las directivas antes de compilar la función principal
La función main()
Una función C++ es un subprograma que devuelve un valor, un conjunto de valores o realiza una tarea específica. Todo programa C++ tiene una única función main() que es el punto inicial de entrada al programa. Si se intenta declarar dos funciones main() dentro del programa se produce error.
Estructura de un programa C++
#include <iostream.h>
main()
{
…
...
}
Las sentencias escritas entre las llaves se denominan BLOQUE
#include <iostream.h>
int main()
{
entrada_datos();
proceso_datos();
return 0;
...
}
Llamadas a otras funciones.
Tipos de datos básicos en C++
El tipo de dato determina la naturaleza del valor que puede tomar una variable.Un tipo de dato define un dominio de valores y las operaciones que se pueden realizar con éstos valores.
C++ dispone de unos cuantos tipos de datos predefinidos (simples) y permite al programador crear otro tipo de datos.
Tipo de datos básicos
• int ( Números enteros )
• float ( Números reales )
• double ( Números reales más grandes que float )
• bool ( Valores lógicos )
• char ( Caracteres y cualquier cantidad de 8 bits )
• void ( Nada. Sirve para indicar que una función no devuelve valores)
Librerías y Funciones del Lenguaje
Hay un conjunto de bibliotecas (o librerías) muy especiales, que se incluyen con todos los compiladores de c y de c++. Son las librerías (o bibliotecas). Pero también las hay no estándar, y dentro de estas las hay públicas y comerciales. en esta sección sólo usaremos algunas bibliotecas (o librerías) ANSI.
¿Qué son exactamente las librerías?
En C++, se conoce como librerías (o bibliotecas) a cierto tipo de archivos que podemos importar o incluir en nuestro programa. Estos archivos contienen las especificaciones de diferentes funcionalidades ya construidas y utilizables que podremos agregar a nuestro programa, como por ejemplo leer del teclado o mostrar algo por pantalla entre muchas otras más. al poder incluir estas librerías con definiciones de diferentes funcionalidades podremos ahorrarnos gran cantidad de cosas, imaginemos por ejemplo que cada vez que necesitemos leer por teclado, debamos entonces crear una función que lo haga (algo realmente complejo), al poder contar con las librerías en C++, podremos hacer uso de una gran variedad de funciones que nos facilitaran la vida y aumentarán la modularidad de nuestros códigos. las librerías no son únicamente archivos externos creados por otros, también es posible crear nuestras propias librerías y utilizarlas en nuestros programas. Las librerías pueden tener varias extensiones diferentes, las más comunes son: .lib, .bpl, .a, .dll, .h y algunas más ya no tan comunes.
En conclusión, las librearías son archivos (no siempre externos) que nos permiten llevar a cabo diferentes tareas sin necesidad de preocuparnos por cómo se hacen sino simplemente entender como usarlas. Las librearías en c++ permiten hacer nuestros programas más modulares y reutilizables, facilitando además crear programas con funcionalidades bastante complejas en unas pocas líneas de código.
Sintaxis para declarar librerías en c++
La declaración de librerías, tanto en c como en c++, se debe hacer al principio de todo nuestro código, antes de la declaración de cualquier función o línea de código, debemos indicarle al compilador que librerías usar, para el saber que términos estarán correctos en la escritura de nuestro código y cuales no.
Algunas Librerías Estándar de C++
- Librería fstream: flujos hacia/desde ficheros. Permite la manipulación de archivos desde el programar, tanto leer como escribir en ellos.
- Librería iosfwd: contiene declaraciones adelantadas de todas las plantillas de flujos y sus typedefs estándar. Por ejemplo ostream.
- Librería iostream: parte del astl que contiene los algoritmos estándar, es quizá la mas usada e importante (aunque no indispensable).
- Librería list: parte de la stl relativa a contenedores tipo list; listas doblemente enlazadas
- Librería math: contiene los prototipos de las funciones y otras definiciones para el uso y manipulación de funciones matemáticas.
- Librería memory: utilidades relativas a la gestión de memoria, incluyendo asignadores y punteros inteligentes (auto_ptr).
- Librería new: manejo de memoria dinámica
- Librería numeric: parte de la librería numérica de la stl relativa a operaciones numéricas.
- Librería ostream: algoritmos estándar para los flujos de salida.
- Librería queue: parte de la stl relativa a contenedores tipo queue (colas de objetos).
- Librería stdio: contiene los prototipos de las funciones, macros, y tipos para manipular datos de entrada y salida.
- Librería stdlib: contiene los prototipos de las funciones, macros, y tipos para utilidades de uso general.
- Librería string: parte de la stl relativa a contenedores tipo string; una generalización de las cadenas alfanuméricas para albergar cadenas de objetos. muy útil para el fácil uso de las cadenas de caracteres, pues elimina muchas de las dificultades que generan los char
- Librería typeinfo: mecanismo de identificación de tipos en tiempo de ejecución
- Librería vector: parte de la stl relativa a los contenedores tipo vector; una generalización de las matrices unidimensionales c/c++TIPOS DE
Funciones e introducciones
Función: Toda función regresa un valor. Una función es análoga a un comando del lenguaje, pero definido por el programador
Programa: Conjunto de funciones, mínimo función main()
Librería: Conjunto de funciones sin función main()
Ventajas Funciones:
1. Elimina redundancia y ahorra espacio memoria (ventaja histórica)
2. Estructura y organiza código, i.e. herramienta conceptual, e.g. programación genérica
3. Facilita mantenimiento y localización de errores
4. Promueve reuso de código, e.g. librerías
5. División trabajo equipos desarrolladoresProgramación C: "Funciones y Librerías"
Declarar, Definir, Llamar
Función: es analoga a un comando del lenguaje, pero definido por el programador
Declaración: perfil informa existencia función posteriormente definida
Definición: implementación o código actual de la función
Invocación o Llamada: ejecuta una función previamente definida
Cabeza o Perfil: [resultado] [nombre-función]( [parámetros] )
Cuerpo o Bloque: { [decl-var] [sentencias] [resultado] }
Función: es analoga a un comando del lenguaje, pero definido por el programador
Declaración: perfil informa existencia función posteriormente definida
Definición: implementación o código actual de la función
Invocación o Llamada: ejecuta una función previamente definida
Cabeza o Perfil: [resultado] [nombre-función]( [parámetros] )
Cuerpo o Bloque: { [decl-var] [sentencias] [resultado] }
No hay comentarios:
Publicar un comentario