manual de algoritmos

82
Algoritmos computacionales - Que es programación. - Que es un lenguaje de programación. - Que es la lógica computacional. - Clasificación de los lenguajes de programación, (Ejemplos en cada clasificación o categoría) - Que es un algoritmo (Ejemplos), como se clasifican. - Que es un pseudocódigo (Ejemplos). - Que es un diagrama de flujo de datos, (como se clasifican). - Que son las variables (ejemplos). - Que son las constantes (ejemplos). - Tipos de datos. - Operadores (tipos). - Operaciones básicas (algoritmos) Sumas. Restas. Multiplicación. Divisiones. - Símbolos de diagramas de flujo. (Operaciones básicas) If If anidados Switch Switch anidados - Ciclos repetitivos For While Do While - Vectores. - Matrices.

Upload: morphius099

Post on 26-Jun-2015

5.528 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Manual de Algoritmos

Algoritmos computacionales

- Que es programación.- Que es un lenguaje de programación.- Que es la lógica computacional.- Clasificación de los lenguajes de programación, (Ejemplos en

cada clasificación o categoría)- Que es un algoritmo (Ejemplos), como se clasifican.- Que es un pseudocódigo (Ejemplos).- Que es un diagrama de flujo de datos, (como se clasifican).- Que son las variables (ejemplos).- Que son las constantes (ejemplos).- Tipos de datos.- Operadores (tipos).- Operaciones básicas (algoritmos)

Sumas. Restas. Multiplicación. Divisiones.

- Símbolos de diagramas de flujo.

(Operaciones básicas)

If

If anidados

Switch

Switch anidados

- Ciclos repetitivos

For

While

Do While

- Vectores.- Matrices.

¿Qué es programación?

Page 2: Manual de Algoritmos

La programación es el proceso de diseñar, escribir, probar, depurar y mantener el código fuente de programas computacionales. El código fuente es escrito en un lenguaje de programación. El propósito de la programación es crear un programa que exhiba un comportamiento deseado. El proceso de escribir código requiere frecuentemente conocimientos en muchas áreas distintas, como el dominio de la aplicación, algoritmos especializados y lógica formal.

Historia

Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas interminables de números 1 y 0. (Sistema de números Binario)

Para facilitar el trabajo, los primeros operadores de computadoras decidieron reemplazar los 1 y 0 por palabras o letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). En realidad escribir en lenguaje ensamblador es básicamente igual que hacerlo en lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.

A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más adecuado para programarlas. Entonces, se crearon los lenguajes de alto nivel. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una.

Una vez que se termina de escribir un programa en ensamblador o en un lenguaje de alto nivel es necesario compilarlo, es decir, traducirlo a lenguaje máquina.

Lenguaje de programación

Captura de la microcomputadora Commodore PET-32 mostrando un programa en el lenguaje de programación BASIC, bajo el emulador VICE en una distribución GNU/Linux.

Un lenguaje de programación es un idioma artificial diseñado para expresar computaciones que pueden ser llevadas a cabo por máquinas

Page 3: Manual de Algoritmos

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.[1] 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 (codificación del programa).

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 (lenguaje para el marcado de páginas web que no es propiamente un lenguaje de programación, sino un conjunto de instrucciones que permiten diseñar el contenido de los documentos).

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.

Historia

Código Fortran en una tarjeta perforada, mostrando el uso especializado de las columnas 1-5, 6 y 73-80.

Para que la computadora entienda nuestras instrucciones debe usarse un lenguaje específico conocido como código máquina, el cual la máquina comprende fácilmente, pero que lo hace excesivamente complicado para las personas. De hecho sólo consiste en cadenas extensas de números 0 y 1.

Page 4: Manual de Algoritmos

Para facilitar el trabajo, los primeros operadores de computadoras decidieron hacer un traductor para reemplazar los 0 y 1 por palabras o abstracción de palabras y letras provenientes del inglés; éste se conoce como lenguaje ensamblador. Por ejemplo, para sumar se usa la letra A de la palabra inglesa add (sumar). El lenguaje ensamblador sigue la misma estructura del lenguaje máquina, pero las letras y palabras son más fáciles de recordar y entender que los números.

La necesidad de recordar secuencias de programación para las acciones usuales llevó a denominarlas con nombres fáciles de memorizar y asociar: ADD (sumar), SUB (restar), MUL (multiplicar), CALL (ejecutar subrutina), etc. A esta secuencia de posiciones se le denominó "instrucciones", y a este conjunto de instrucciones se le llamó lenguaje ensamblador. Posteriormente aparecieron diferentes lenguajes de programación, los cuales reciben su denominación porque tienen una estructura sintáctica similar a los lenguajes escritos por los humanos, denominados también lenguajes de alto nivel.

La primera programadora de computadora conocida fue Ada Lovelace, hija de Anabella Milbanke Byron y Lord Byron. Anabella introdujo en las matemáticas a Ada quien, después de conocer a Charles Babbage, tradujo y amplió una descripción de su máquina analítica. Incluso aunque Babbage nunca completó la construcción de cualquiera de sus máquinas, el trabajo que Ada realizó con éstas le hizo ganarse el título de primera programadora de computadoras del mundo. El nombre del lenguaje de programación Ada fue escogido como homenaje a esta programadora.

A finales de 1953, John Backus sometió una propuesta a sus superiores en IBM para desarrollar una alternativa más práctica al lenguaje ensamblador para programar la computadora central IBM 704. El histórico equipo Fortran de Backus consistió en los programadores Richard Goldberg, Sheldon F. Best, Harlan Herrick, Peter Sheridan, Roy Nutt, Robert Nelson, Irving Ziller, Lois Haibt y David Sayre.

El primer manual para el lenguaje Fortran apareció en octubre de 1956, con el primer compilador Fortran entregado en abril de 1957. Esto era un compilador optimizado, porque los clientes eran reacios a usar un lenguaje de alto nivel a menos que su compilador pudiera generar código cuyo desempeño fuera comparable al de un código hecho a mano en lenguaje ensamblador.

En 1960, se creó COBOL, uno de los lenguajes usados aún en 2010 en informática de gestión.

A medida que la complejidad de las tareas que realizaban las computadoras aumentaba, se hizo necesario disponer de un método más eficiente para programarlas. Entonces, se crearon los lenguajes de alto nivel, como lo fue BASIC en las versiones introducidas en los microordenadores de la década de 1980. Mientras que una tarea tan sencilla como sumar dos números puede necesitar varias instrucciones en lenguaje ensamblador, en un lenguaje de alto nivel bastará con solo una.

Page 5: Manual de Algoritmos

Elementos

Todos los lenguajes de programación tienen algunos elementos de formación primitivos para la descripción de los datos y de los procesos o transformaciones aplicadas a estos datos (tal como la suma de dos números o la selección de un elemento que forma parte de una colección). Estos elementos primitivos son definidos por reglas sintácticas y semánticas que describen su estructura y significado respectivamente.

Sintaxis

Con frecuencia se resaltan los elementos de la sintaxis con colores diferentes para facilitar su lectura. Este ejemplo está escrito en Python.

A la forma visible de un lenguaje de programación se le conoce como sintaxis. La mayoría de los lenguajes de programación son puramente textuales, es decir, utilizan secuencias de texto que incluyen palabras, números y puntuación, de manera similar a los lenguajes naturales escritos. Por otra parte, hay algunos lenguajes de programación que son más gráficos en su naturaleza, utilizando relaciones visuales entre símbolos para especificar un programa.

La sintaxis de un lenguaje de programación describe las combinaciones posibles de los símbolos que forman un programa sintácticamente correcto. El significado que se le da a una combinación de símbolos es manejado por su semántica (ya sea formal o como parte del código duro de la referencia de implementación). Dado que la mayoría de los lenguajes son textuales, este artículo trata de la sintaxis textual.

La sintaxis de los lenguajes de programación es definida generalmente utilizando una combinación de expresiones regulares (para la estructura léxica) y la Notación de Backus-Naur (para la estructura gramática). Este es un ejemplo de una gramática simple, tomada de Lisp:

Expresión ::= átomo | listaÁtomo ::= número | símboloNúmero ::= [+-]?['0'-'9']+Símbolo ::= ['A'-'Z'<nowiki>'</nowiki>a'-'z'].*Lista ::= '(' expresión* ')'

Con esta gramática se especifica lo siguiente:

Page 6: Manual de Algoritmos

una expresión puede ser un átomo o una lista; un átomo puede ser un número o un símbolo; un número es una secuencia continua de uno o más dígitos

decimales, precedido opcionalmente por un signo más o un signo menos;

un símbolo es una letra seguida de cero o más caracteres (excluyendo espacios); y

una lista es un par de paréntesis que abren y cierran, con cero o más expresiones en medio.

Algunos ejemplos de secuencias bien formadas de acuerdo a esta gramática:

'12345', '()', '(a b c232 (1))'

No todos los programas sintácticamente correctos son semánticamente correctos. Muchos programas sintácticamente correctos tienen inconsistencias con las reglas del lenguaje; y pueden (dependiendo de la especificación del lenguaje y la solidez de la implementación) resultar en un error de traducción o ejecución. En algunos casos, tales programas pueden exhibir un comportamiento indefinido. Además, incluso cuando un programa está bien definido dentro de un lenguaje, todavía puede tener un significado que no es el que la persona que lo escribió estaba tratando de construir.

Usando el lenguaje natural, por ejemplo, puede no ser posible asignarle significado a una oración gramáticamente válida o la oración puede ser falsa:

"Las ideas verdes y descoloridas duermen furiosamente" es una oración bien formada gramáticamente pero no tiene significado comúnmente aceptado.

"Juan es un soltero casado" también está bien formada gramáticamente pero expresa un significado que no puede ser verdadero.

El siguiente fragmento en el lenguaje C es sintácticamente correcto, pero ejecuta una operación que no está definida semánticamente (dado que p es un apuntador nulo, las operaciones p->real y p->im no tienen ningún significado):

complex *p = NULL;complex abs_p = sqrt (p->real * p->real + p->im * p->im);

Si la declaración de tipo de la primera línea fuera omitida, el programa dispararía un error de compilación, pues la variable "p" no estaría definida. Pero el programa sería sintácticamente correcto todavía, dado que las declaraciones de tipo proveen información semántica solamente.

La gramática necesaria para especificar un lenguaje de programación puede ser clasificada por su posición en la Jerarquía de Chomsky. La sintaxis de la mayoría de los lenguajes de programación puede ser especificada utilizando una gramática Tipo-2, es decir, son gramáticas libres de contexto. Algunos lenguajes, incluyendo a Perl y a Lisp, contienen construcciones que

Page 7: Manual de Algoritmos

permiten la ejecución durante la fase de análisis. Los lenguajes que permiten construcciones que permiten al programador alterar el comportamiento de un analizador hacen del análisis de la sintaxis un problema sin decisión única, y generalmente oscurecen la separación entre análisis y ejecución. En contraste con el sistema de macros de Lisp y los bloques BEGIN de Perl, que pueden tener cálculos generales, las macros de C son meros reemplazos de cadenas, y no requieren ejecución de código.

Semántica estática

La semántica estática define las restricciones sobre la estructura de los textos válidos que resulta imposible o muy difícil expresar mediante formalismos sintácticos estándar. Para los lenguajes compilados, la semántica estática básicamente incluye las reglas semánticas que se pueden verificar en el momento de compilar. Por ejemplo el chequeo de que cada identificador sea declarado antes de ser usado (en lenguajes que requieren tales declaraciones) o que las etiquetas en cada brazo de una estructura case sean distintas. Muchas restricciones importantes de este tipo, como la validación de que los identificadores sean usados en los contextos apropiados (por ejemplo no sumar un entero al nombre de una función), o que las llamadas a subrutinas tengan el número y tipo de parámetros adecuado, puede ser implementadas definiéndolas como reglas en una lógica conocida como sistema de tipos. Otras formas de análisis estáticos, como los análisis de flujo de datos, también pueden ser parte de la semántica estática. Nuevos lenguajes de programación como Java y C# tienen un análisis definido de asignaciones, una forma de análisis de flujo de datos, como parte de su semántica estática.

Sistema de tipos

Un sistema de tipos define la manera en la cual un lenguaje de programación clasifica los valores y expresiones en tipos, como pueden ser manipulados dichos tipos y cómo interactúan. El objetivo de un sistema de tipos es verificar y normalmente poner en vigor un cierto nivel de exactitud en programas escritos en el lenguaje en cuestión, detectando ciertas operaciones inválidas. Cualquier sistema de tipos decidible tiene sus ventajas y desventajas: mientras por un lado rechaza muchos programas incorrectos, también prohíbe algunos programas correctos aunque poco comunes. Para poder minimizar esta desventaja, algunos lenguajes incluyen lagunas de tipos, conversiones explícitas no checadas que pueden ser usadas por el programador para permitir explícitamente una operación normalmente no permitida entre diferentes tipos. En la mayoría de los lenguajes con tipos, el sistema de tipos es usado solamente para checar los tipos de los programas, pero varios lenguajes, generalmente funcionales, llevan a cabo lo que se conoce como inferencia de tipos, que le quita al programador la tarea de especificar los tipos. Al diseño y estudio formal de los sistemas de tipos se le conoce como teoría de tipos.

Léxico y programación

Programar es más sencillo que aprender una lengua. La programación se rige por unas reglas que se asemejan con ciertas diferencias, a las de una

Page 8: Manual de Algoritmos

lengua natural. La particularidad estriba en que las reglas de programación tienen menor ambigüedad.

En los lenguajes de programación de alto nivel se distinguen diversos elementos entre los que se incluyen el léxico propio del lenguaje y las reglas semánticas y sintácticas.

Programas y algoritmos

Un algoritmo es una secuencia no ambigua, finita y ordenada de instrucciones que han de seguirse para resolver un problema. Un programa normalmente implementa (traduce a un lenguaje de programación concreto) un algoritmo. Nótese que es la secuencia de instrucciones en sí (la ejecución) la que debe ser finita, con el número de pasos realizados.

Los programas suelen subdividirse en partes menores (módulos), de modo que la complejidad algorítmica de cada una de las partes sea menor que la del programa completo, lo cual ayuda al desarrollo del programa.

Según Niklaus Wirth, un programa está formado por algoritmos y estructura de datos.

Se han propuesto diversas técnicas de programación cuyo objetivo es mejorar tanto el proceso de creación de software como su mantenimiento. Entre ellas, se pueden mencionar las siguientes:

programación estructurada programación modular programación orientada a objetos (POO) programación declarativa

Compilación

El programa escrito en un lenguaje de programación (comprensible por el ser humano, aunque se suelen corresponder con lenguajes formales descritos por gramáticas independientes del contexto) no puede ejecutarlo directamente una computadora. La opción más común es compilar el programa obteniendo un módulo objeto, aunque también puede ejecutarse a través de un intérprete informático.

El código fuente del programa se debe someter a un proceso de traducción para convertirse en lenguaje máquina, interpretable por el procesador. A este proceso se le llama compilación.

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

Page 9: Manual de Algoritmos

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.

Programación e ingeniería del software

Existe una tendencia a identificar el proceso de creación de un programa informático con la programación, que es cierta cuando se trata de programas pequeños para uso personal, y que dista de la realidad cuando se trata de grandes proyectos.

El proceso de creación de software, desde el punto de vista de la ingeniería, incluye los siguientes pasos:

1. Reconocer la necesidad de un programa para solucionar un problema o identificar la posibilidad de automatización de una tarea.

2. Recoger los requisitos del programa. Debe quedar claro qué es lo que debe hacer el programa y para qué se necesita.

3. Realizar el análisis de los requisitos del programa. Debe quedar claro cómo debe realizar el programa las cosas que debe hacer. Las pruebas que comprueben la validez del programa se pueden especificar en esta fase.

4. Diseñar la arquitectura del programa. Se debe descomponer el programa en partes de complejidad abordable.

5. Implementar el programa. Consiste en realizar un diseño detallado, especificando completamente todo el funcionamiento del programa, tras lo cual la codificación debería resultar inmediata.

6. Implantar (instalar) el programa. Consiste en poner el programa en funcionamiento junto con los componentes que pueda necesitar (bases de datos, redes de comunicaciones, etc.).

La ingeniería del software se centra en los pasos de planificación y diseño del programa, mientras que antiguamente (programación artesanal) la realización de un programa consistía únicamente en escribir el código.

Lenguajes con tipo versus lenguajes sin tipo

Se dice que un lenguaje tiene tipos si la especificación de cada operación define tipos de datos para los cuales la operación es aplicable, con la implicación de que no es aplicable a otros tipos. Por ejemplo, "this text between the quotes" es una cadena. En la mayoría de los lenguajes de programación, dividir un número por una cadena no tiene ningún significado. Por tanto, la mayoría de los lenguajes de programación modernos rechazaran cualquier intento de ejecutar dicha operación por parte de algún programa. En algunos lenguajes, estas operaciones sin

Page 10: Manual de Algoritmos

significado son detectadas cuando el programa es compilado (validación de tipos "estática") y son rechazadas por el compilador, mientras en otros son detectadas cuando el programa es ejecutado (validación de tipos "dinámica") y se genera una excepción en tiempo de ejecución.

Un caso especial de lenguajes de tipo son los lenguajes de tipo sencillo. Estos son con frecuencia lenguajes de marcado o de scripts, como REXX o SGML, y solamente cuentan con un tipo de datos; comúnmente cadenas de caracteres que luego son usadas tanto para datos numéricos como simbólicos.

En contraste, un lenguaje sin tipos, como la mayoría de los lenguajes ensambladores, permiten que cualquier operación se aplique a cualquier dato, que por lo general se consideran secuencias de bits de varias longitudes. Lenguajes de alto nivel sin datos incluyen BCPL y algunas variedades de Forth.

En la práctica, aunque pocos lenguajes son considerados con tipo desde el punto de vista de la teoría de tipos (es decir, que verifican o rechazan todas las operaciones), la mayoría de los lenguajes modernos ofrecen algún grado de manejo de tipos. Si bien muchos lenguajes de producción proveen medios para brincarse o subvertir el sistema de tipos.

Tipos estáticos versus tipos dinámicos

En lenguajes con tipos estáticos se determina el tipo de todas las expresiones antes de la ejecución del programa (típicamente al compilar). Por ejemplo, 1 y (2+2) son expresiones enteras; no pueden ser pasadas a una función que espera una cadena, ni pueden guardarse en una variable que está definida como fecha.

Los lenguajes con tipos estáticos pueden manejar tipos explícitos o tipos inferidos. En el primer caso, el programador debe escribir los tipos en determinadas posiciones textuales (por ejemplo al declarar variables). En el segundo caso, el compilador infiere los tipos de las expresiones y las declaraciones de acuerdo al contexto. La mayoría de los lenguajes populares con tipos estáticos, tales como C++, C# y Java, manejan tipos explícitos. Inferencia total de los tipos suele asociarse con lenguajes menos populares, tales como Haskell y ML. Sin embargo, muchos lenguajes de tipos explícitos permiten inferencias parciales de tipo; tanto Java y C#, por ejemplo, infieren tipos en un número limitado de casos.

Los lenguajes con tipos dinámicos determinan la validez de los tipos involucrados en las operaciones durante la ejecución del programa. En otras palabras, los tipos están asociados con valores en ejecución en lugar de expresiones textuales. Como en el caso de lenguajes con tipos inferidos, los lenguajes con tipos dinámicos no requieren que el programador escriba los tipos de las expresiones. Entre otras cosas, esto permite que una misma variable se pueda asociar con valores de tipos distintos en diferentes momentos de la ejecución de un programa. Sin embargo, los errores de tipo no pueden ser detectados automáticamente hasta que se ejecuta el código, dificultando la depuración de los programas. Ruby, Lisp, JavaScript y Python son lenguajes con tipos dinámicos.

Page 11: Manual de Algoritmos

Tipos débiles y tipos fuertes

Los tipos débiles permiten que un valor de un tipo pueda ser tratado como de otro tipo, por ejemplo una cadena puede ser operada como un número. Esto puede ser útil a veces, pero también puede permitir ciertos tipos de fallas que no pueden ser detectadas durante la compilación o a veces ni siquiera durante la ejecución.

Los tipos fuertes evitan que paso lo anterior. Cualquier intento de llevar a cabo una operación sobre el tipo equivocado dispara un error. A los lenguajes con tipos fuertes se les suele llamar de tipos seguros.

Lenguajes con tipos débiles como Perl y JavaScript permiten un gran número de conversiones de tipo implícitas. Por ejemplo en JavaScript la expresión 2 * x convierte implícitamente x a un número, y esta conversión es exitosa inclusive cuando x es null, undefined, un Array o una cadena de letras. Estas conversiones implícitas son útíles con frecuencia, pero también pueden ocultar errores de programación.

Las características de estáticos y fuertes son ahora generalmente consideradas conceptos ortogonales, pero su trato en diferentes textos varia. Algunos utilizan el término de tipos fuertes para referirse a tipos fuertemente estáticos o, para aumentar la confusión, simplemente como equivalencia de tipos estáticos. De tal manera que C ha sido llamado tanto lenguaje de tipos fuertes como lenguaje de tipos estáticos débiles.

Implementación

Código fuente de un programa escrito en el lenguaje de programación Java.

Page 12: Manual de Algoritmos

La implementación de un lenguaje es la que provee una manera de que se ejecute un programa para una determinada combinación de software y hardware. Existen básicamente dos maneras de implementar un lenguaje: compilación e interpretación.

Compilación: es el proceso 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 interpretar. Los programas traductores que pueden realizar esta operación se llaman compiladores. Éstos, como los programas ensambladores avanzados, pueden generar muchas líneas de código de máquina por cada proposición del programa fuente.

Interpretación: es una asignación de significados a las fórmulas bien formadas de un lenguaje formal. Como los lenguajes formales pueden definirse en términos puramente sintácticos, sus fórmulas bien formadas pueden no ser más que cadenas de símbolos sin ningún significado. Una interpretación otorga significado a esas fórmulas.

Se puede también utilizar una alternativa para traducir lenguajes de alto nivel. En lugar de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la compilación para utilizarlo en una ejecución futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo necesario durante el procesamiento de los datos. El código objeto no se graba para utilizarlo posteriormente.

La siguiente vez que se utilice una instrucción, se la deberá interpretar otra vez y traducir a lenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo o bucle, cada instrucción del bucle tendrá que volver a ser interpretada en cada ejecución repetida del ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar una compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una ejecución del código.

La mayoría de lenguajes de alto nivel permiten la programación multipropósito, sin embargo, muchos de ellos fueron diseñados para permitir programación dedicada, como lo fue el Pascal con las matemáticas en su comienzo. También se han implementado lenguajes educativos infantiles como Logo que mediante una serie de simples instrucciones. En el ámbito de infraestructura de internet, cabe destacar a Perl con un poderoso sistema de procesamiento de texto y una enorme colección de módulos.

Page 13: Manual de Algoritmos

Paradigmas

Los programas se pueden clasificar por el paradigma del lenguaje que se use para producirlos. Los principales paradigmas son: imperativos, declarativos y orientación a objetos.

Los programas que usan un lenguaje imperativo especifican un algoritmo, usan declaraciones, expresiones y sentencias.[3] Una declaración asocia un nombre de variable con un tipo de dato, por ejemplo: var x: integer;. Una expresión contiene un valor, por ejemplo: 2 + 2 contiene el valor 4. Finalmente, una sentencia debe asignar una expresión a una variable o usar el valor de una variable para alterar el flujo de un programa, por ejemplo: x := 2 + 2; if x == 4 then haz_algo();. Una crítica común en los lenguajes imperativos es el efecto de las sentencias de asignación sobre una clase de variables llamadas "no locales".[4]

Los programas que usan un lenguaje declarativo especifican las propiedades que la salida debe conocer y no especifica cualquier detalle de implementación. Dos amplias categorías de lenguajes declarativos son los lenguajes funcionales y los lenguajes lógicos. Los lenguajes funcionales no permiten asignaciones de variables no locales, así, se hacen más fácil, por ejemplo, programas como funciones matemáticas.[4] El principio detrás de los lenguajes lógicos es definir el problema que se quiere resolver (el objetivo) y dejar los detalles de la solución al sistema.[5] El objetivo es definido dando una lista de sub-objetivos. Cada sub-objetivo también se define dando una lista de sus sub-objetivos, etc. Si al tratar de buscar una solución, una ruta de sub-objetivos falla, entonces tal sub-objetivo se descarta y sistemáticamente se prueba otra ruta.

La forma en la cual se programa puede ser por medio de texto o de forma visual. En la programación visual los elementos son manipulados gráficamente en vez de especificarse por medio de texto.

CLASIFICACION DE LOS LENGUAJES DE PROGRAMACIÓN

LENGUAJE MÁQUINA:

El lenguaje máquina es el único que entiende directamente la computadora, ya que está escrito en lenguajes directamente inteligibles por la máquina (computadora), utiliza el alfabeto binario, que consta de los dos únicos símbolos 0 y 1, denominados bits (abreviatura inglesa de dígitos binarios). Sus instrucciones son cadenas binarias (cadenas o series de caracteres de dígitos 0 y 1) que especifican una operación y, las posiciones (dirección) de memoria implicadas en la operación se denominan instrucciones de máquina o código maquina. Fue el primer lenguaje utilizado en la programación de computadoras, pero dejo de utilizarse por su dificultad y complicación, siendo sustituido por otros lenguajes más fáciles de aprender y utilizar, que además reducen la posibilidad de cometer errores. El lenguaje máquina es el conocido código binario. Generalmente, en la codificación de

Page 14: Manual de Algoritmos

los programas se empleaba el sistema hexadecimal para simplificar el trabajo de escritura. Todas las instrucciones preparadas en cualquier lenguaje máquina tienen por lo menos dos partes. La primera es el comando u operación, que dice a las computadoras cual es la función que va a realizar. Todas las computadoras tienen un código de operación para cada una de las funciones. La segunda parte de la instrucción es el operando, que indica a la computadora donde hallar o almacenar los datos y otras instrucciones que se van a manipular, el número de operándoos de una instrucción varia en distintas computadoras.

Ventajas del lenguaje máquina: posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de programación.

Desventajas del lenguaje máquina: dificultad y lentitud en la codificación. Poca fiabilidad. Gran dificultad para verificar y poner a punto los programas. Los programas solo son ejecutables en el mismo procesador (CPU). En la actualidad, las desventajas superan a las ventajas, lo que hace prácticamente no recomendables a los lenguajes máquina.

EJEMPLOS

Es la lengua nativa de la CPU.

Cada diseño de CPU tiene su propio lenguaje de máquina. Este es el juego de instrucciones que usa el chip para sí mismo. Está hecho de ceros y unos (números binarios) y resulta muy difícil para el trabajo de la gente.

10 23 11 FF 12 12 13 10 14 50 15 23 16 30 17 40 18 C0 19 00

El lenguaje de máquina parece compuesto de números solamente. En el segmento de un programa que vemos a la izquierda, la primer columna le dice a la computadora dónde llenar su memoria y en la segunda columna sobre una base hexadecimal (base 16) figuran los valores que debe poner en dichas locaciones de las memorias.

Para más información sobre números hexadecimal, vea  Aritmética de Base.

Otro ejemplo de lenguaje de máquina es el siguiente:

El segmento de código en lenguaje Java es:

int counter = 0; counter = counter + 1;

podría ser trasladado en lenguaje de máquina como 

0001010001000100010001000010001010101111100000011101010001111100001000100000101

Page 15: Manual de Algoritmos

01010

LENGUAJES DE BAJO NIVEL:

Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. El lenguaje ensamblador es el primer intento de sustituir el lenguaje maquina por otro más similar a los utilizados por las personas. Este intenta desflexibilizar la representación de los diferentes campos. Esa flexibilidad se consigue no escribiendo los campos en binario y aproximando la escritura al lenguaje. A principios de la década de los 50 y con el fin de facilitar la labor de los programadores, se desarrollaron códigos mnemotécnicos para las operaciones y direcciones simbólicas. Los códigos mnemotécnicas son los símbolos alfabéticos del lenguaje maquina. La computadora sigue utilizando el lenguaje máquina para procesar los datos, pero los programas ensambladores traducen antes los símbolos de código de operación especificados a sus equivalentes en el lenguaje maquina. En la actualidad los programadores no asignan números de dirección reales a los datos simbólicos, simplemente especifican donde quieren que se coloque la primera localidad del programa y el programa ensamblador se encarga de lo demás, asigna localidades tanto para las instrucciones como los datos. Estos programas de ensamble o ensambladores también permiten a la computadora convertir las instrucciones en lenguaje ensamblador del programador en su propio código maquina. Un programa de instrucciones escrito en lenguaje ensamblador por un programador se llama programa fuente. Después de que el ensamblador convierte el programa fuente en código maquina a este se le denomina programa objeto. Para los programadores es más fácil escribir instrucciones en un lenguaje ensamblador que en código de lenguaje maquina pero es posible que se requieran dos corridas de computadora antes de que se puedan utilizar las instrucciones del programa fuente para producir las salidas deseadas.

El lenguaje de bajo nivel es el lenguaje de programación que el ordenador puede entender a la hora de ejecutar programas, lo que aumenta su velocidad de ejecución, pues no necesita un intérprete que traduzca cada línea de instrucciones.

Visto a muy bajo nivel, los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador.

Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son, a menudo, difíciles de aprender. Más importante es el hecho de

Page 16: Manual de Algoritmos

que los programas escritos en un bajo nivel sean altamente específicos de cada procesador. Si se lleva el programa a otra máquina se debe reescribir el programa desde el principio.

Ventajas del lenguaje ensamblador frente al lenguaje máquina: mayor facilidad de codificación y, en general, su velocidad de cálculo, ahorran tiempo y requieren menos atención a detalles. Se incurren en menos errores y los que se cometen son más fáciles de localizar. Tanto el lenguaje maquina como el ensamblador gozan de la ventaja de mínima ocupación de memoria y mínimo tiempo de ejecución en comparación con el resultado de la compilación del programa equivalente escrito en otros lenguajes. Los programas en lenguaje ensamblador son más fáciles de modificar que los programas en lenguaje máquina.

Desventajas del lenguaje ensamblador: dependencia total de la maquina lo que impide la transportabilidad de los programas (posibilidad de ejecutar un programa en diferentes máquinas). El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Machintosh. La formación de los programadores es más compleja que la correspondiente a los programadores de alto nivel, ya que exige no solo las técnicas de programación, sino también el conocimiento del interior de la maquina El programador ha de conocer perfectamente el hardware del equipo, ya que maneja directamente las posiciones de memoria, registros del procesador y demás elementos físicos. Todas las instrucciones son elementales, es decir, en el programa se deben describir con el máximo detalle todas las operaciones que se han de efectuar en la máquina para la realización de cualquier proceso.

Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se centran básicamente en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos.

Vistos a muy bajo nivel, los microprocesadores procesan exclusivamente señales electrónicas binarias. Dar una instrucción a un microprocesador supone en realidad enviar series de unos y ceros espaciadas en el tiempo de una forma determinada. Esta secuencia de señales se denomina código máquina. El código representa normalmente datos y números e instrucciones para manipularlos. Un modo más fácil de comprender el código máquina es dando a cada instrucción un mnemónico, como por ejemplo STORE, ADD o JUMP. Esta abstracción da como resultado el ensamblador, un lenguaje de muy bajo nivel que es específico de cada microprocesador.

Los lenguajes de bajo nivel permiten crear programas muy rápidos, pero que son a menudo difíciles de aprender. Más importante es el hecho de que los programas escritos en un bajo nivel sean altamente específicos de cada procesador. Si se lleva el programa a otra máquina se debe reescribir el programa desde el principio.

Lenguaje ensamblador (le):

Este intenta deflexibilizar la representación de los diferentes campos, esa flexibilidad se consigue no escribiendo los campos en binario y aproximando la escritura al lenguaje

Page 17: Manual de Algoritmos

LENGUAJES DE ALTO NIVEL:

Estos lenguajes son los más utilizados por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y ensamblador. Un programa escrito en lenguaje de alto nivel es independiente de la máquina (las instrucciones no dependen del diseño del hardware o de una computadora en particular), por lo que estos programas son portables o transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificación en diferentes tipos de computadoras. Son lenguajes de programación en los que las instrucciones enviadas para que el ordenador ejecute ciertas órdenes son similares al lenguaje humano. Dado que el ordenador no es capaz de reconocer estas órdenes, es necesario el uso de un intérprete que traduzca el lenguaje de alto nivel a un lenguaje de bajo nivel que el sistema pueda entender.

Por lo general se piensa que los ordenadores son máquinas que realizan tareas de cálculos o procesamiento de texto. La descripción anterior es sólo una forma muy esquemática de ver una computadora. Hay un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. Existe también una relación compleja entre los lenguajes de alto nivel y el código máquina.

Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como “IF CONTADOR=10 THEN STOP” pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a diez. Por desgracia para muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una forma rígida y sistemática.

Los lenguajes de alto nivel, también denominados lenguajes evolucionados, surgen con posterioridad a los anteriores (lenguaje máquina, lenguajes de bajo nivel o ensamblador) con los siguientes objetivos, entre otros:

Lograr independencia de la maquina, pudiendo utilizar un mismo programa en diferentes equipos con la única condición de disponer de un programa traductor o compilador, que es suministrado por el fabricante, para obtener el programa ejecutable en lenguaje binario de la maquina que se trate. Además, no se necesita conocer el hardware especifico de dicha maquina. Aproximarse al lenguaje natural, para que el programa se pueda escribir y leer de una forma más sencilla, eliminando muchas de las posibilidades de cometer errores que se daban en el lenguaje maquina, ya que se utilizan palabras (en inglés) en lugar de cadenas de símbolos sin ningún significado aparente.

Incluir rutinas de uso frecuente, como las de entrada / salida, funciones matemáticas, manejo de tablas, etc., que figuran en una especie de librería del lenguaje, de manera que se puedan utilizar siempre que se quiera sin necesidad de programarlas cada vez.

Page 18: Manual de Algoritmos

Ventajas de los lenguajes de alto nivel: el tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes. La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos, nombres de las instrucciones tales como READ, WRITE, PRINT, OPEN, etc. Las modificaciones y puestas a punto de los programas son más fáciles. Reducción del costo de los programas. Transportabilidad. Permiten tener una mejor documentación. Son más fáciles de mantener.

Por lo general se piensa que los ordenadores son máquinas que realizan tareas de cálculos o procesamiento de textos. La descripción anterior es sólo una forma muy esquemática de ver una computadora. Hay un alto nivel de abstracción entre lo que se pide a la computadora y lo que realmente comprende. Existe también una relación compleja entre los lenguajes de alto nivel y el código máquina.

Los lenguajes de alto nivel son normalmente fáciles de aprender porque están formados por elementos de lenguajes naturales, como el inglés. En BASIC, el lenguaje de alto nivel más conocido, los comandos como "IF CONTADOR = 10 THEN STOP" pueden utilizarse para pedir a la computadora que pare si CONTADOR es igual a 10. Por desgracia para muchas personas esta forma de trabajar es un poco frustrante, dado que a pesar de que las computadoras parecen comprender un lenguaje natural, lo hacen en realidad de una forma rígida y sistemática.

Desventajas de los lenguajes de alto nivel: incremento del tiempo de puesta a punto al necesitarse diferentes traducciones del programa fuente para conseguir el programa definitivo. No se aprovechan los recursos internos de la maquina que se explotan mucho mejor en lenguajes máquina y ensambladores. Aumento de la ocupación de memoria. El tiempo de ejecución de los programas es mucho mayor.

Se puede decir que el principal problema que presentan los lenguajes de alto nivel es la gran cantidad de ellos que existen actualmente en uso, además de las diferentes versiones o dialectos que se han desarrollado de algunos de ellos. Es difícil establecer una clasificación general de los mismos, ya que en cualquiera que se realice habrá lenguajes que pertenezcan a más de uno de los grupos establecidos.

Una clasificación muy extendida, atendiendo a la forma de trabajar de los programas y a la filosofía con que fueron concebidos, es la siguiente:

Lenguajes imperativos. Utilizan instrucciones como unidad de trabajo de los programas (Cobol, Pascal, C, Ada).

Lenguajes declarativos. Los programas se construyen mediante descripciones de funciones o expresiones lógicas (Lisp, Prolog).

Lenguajes orientados a objetos. El diseño de los programas se basa más en los datos y su estructura. La unidad de proceso es el objeto y en el se incluyen los datos (variables) y las operaciones que actúan sobre ellos (Smalltalk, C++).

Page 19: Manual de Algoritmos

Lenguajes orientados al problema. Diseñados para problemas específicos, principalmente de gestión, suelen ser generadores de aplicaciones.(Fortran)

Lenguajes naturales. Están desarrollándose nuevos lenguajes con el principal objetivo de aproximar el diseño y construcción de programas al lenguaje de las personas.

Otra clasificación que se puede hacer es la de atendiendo al desarrollo de los lenguajes desde la aparición de las computadoras, que sigue un cierto paralelismo con las generaciones establecidas en la evolución de las mismas:

Primera generación. Lenguajes maquina y ensambladores.

Segunda generación. Primeros lenguajes de alto nivel imperativo (FROTRAN, COBOL).

Tercera generación. Lenguajes de alto nivel imperativo. Son los mas utilizados y siguen vigentes en la actualidad (ALGOL 8, PL/I, PASCAL, MODULA).

Cuarta generación. Orientados básicamente a las aplicaciones de gestión y al manejo de bases de datos (NATURAL, SQL).

Quinta generación. Orientados a la inteligencia artificial y al procesamiento de los lenguajes naturales (LISP, PROLOG).

ALGORITMO

¿Qué es un algoritmo?:Definición: Un algoritmo es un conjunto finito de pasos específicos y organizados para realizar una labor.Un algoritmo es una secuencia de pasos lógicos necesarios para llevar a cabo una tarea específica, como la solución de un problema. Los algoritmos son independientes tanto del lenguaje de programación en que se expresan como de la computadora que los ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programación y ejecutarse en una computadora distinta.Características de los algoritmosLas características fundamentales que debe cumplir todo algoritmo son:· Un algoritmo debe ser preciso e indicar el orden de realización de cada paso. · Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez. · Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea debe de tener un número finito de pasos.

LOS ALGORITMOS SE CLASIFICAN EN:

Page 20: Manual de Algoritmos

1.-Ordenamiento Burbuja.

Este es el algoritmo más sencillo probablemente. Ideal para empezar. Consiste en ciclar repetidamente a través de la lista, comparando elementos adyacentes de dos en dos. Si un elemento es mayor que el que está en la siguiente posición se intercambian.

Ventajas:

· Fácil implementación. · No requiere memoria adicional.

Desventajas:

· Muy lento. · Realiza numerosas comparaciones. · Realiza numerosos intercambios.

2.-Ordenamiento por Selección

Este algoritmo también es sencillo. Consiste en lo siguiente:

· Buscas el elemento más pequeño de la lista. · Lo intercambias con el elemento ubicado en la primera posición de la lista. · Buscas el segundo elemento más pequeño de la lista. · Lo intercambias con el elemento que ocupa la segunda posición en la lista.· Repites este proceso hasta que hayas ordenado toda la lista.

Ventajas: · Fácil implementación. · No requiere memoria adicional. · Realiza pocos intercambios. · Rendimiento constante: poca diferencia entre el peor y el mejor caso.

Desventajas:

· Lento. · Realiza numerosas comparaciones.

3.-Ordenamiento por Inserción

En este tipo de algoritmo los elementos que van a ser ordenados son considerados uno a la vez. Cada elemento es INSERTADO en la posición apropiada con respecto al resto de los elementos ya ordenados.

Ventajas: · Fácil implementación. · Requerimientos mínimos de memoria.

Desventajas: · Lento.

Page 21: Manual de Algoritmos

· Realiza numerosas comparaciones. Este también es un algoritmo lento, pero puede ser de utilidad para listas que están ordenadas o semiordenadas, porque en ese caso realiza muy pocos desplazamientos.

4.-Ordenamiento Rápido (Quicksort)

Esta es probablemente la técnica más rápida conocida. Fue desarrollada por C.A.R. Hoare en 1960. El algoritmo original es recursivo, pero se utilizan versiones iterativas para mejorar su rendimiento (los algoritmos recursivos son en general más lentos que los iterativos, y consumen más recursos). El algoritmo fundamental es el siguiente: · Eliges un elemento de la lista.· Buscas la posición que le corresponde en la lista ordenada.· Acomodas los elementos de la lista a cada lado del elemento de división, de manera que a un lado queden todos los menores que él y al otro los mayores . En este momento el elemento de división separa la lista en dos sublistas. · Realizas esto de forma recursiva para cada sublista mientras éstas tengan un largo mayor que 1. Una vez terminado este proceso todos los elementos estarán ordenados. Una idea preliminar para ubicar el elemento de división en su posición final sería contar la cantidad de elementos menores y colocarlo un lugar más arriba. Pero luego habría que mover todos estos elementos a la izquierda del elemento, para que se cumpla la condición y pueda aplicarse la recursividad. Reflexionando un poco más se obtiene un procedimiento mucho más efectivo. Se utilizan dos índices: i, al que llamaremos contador por la izquierda, y j, al que llamaremos contador por la derecha. El algoritmo es éste: · Recorres la lista simultáneamente con i y j: por la izquierda con i (desde el primer elemento), y por la derecha con j (desde el último elemento). · Cuando lista sea mayor que el elemento de división y lista[j] sea menor los intercambias. · Repites esto hasta que se crucen los índices.· El punto en que se cruzan los índices es la posición adecuada para colocar el elemento de división, porque sabemos que a un lado los elementos son todos menores y al otro son todos mayores (o habrían sido intercambiados).

Al finalizar este procedimiento el elemento de división queda en una posición en que todos los elementos a su izquierda son menores que él, y los que están a su derecha son mayores.

Ventajas: · Muy rápido· No requiere memoria adicional.

Desventajas: · Implementación un poco más complicada.· Recursividad (utiliza muchos recursos). · Mucha diferencia entre el peor y el mejor caso.

Page 22: Manual de Algoritmos

Los diagramas de flujo sirven para representar algoritmos de manera gráfica.

PSEUDOCODOGICO

El pseudocódigo (falso lenguaje) es comúnmente utilizado por los programadores para omitir secciones de código o para dar una explicación del paradigma que tomó el mismo programador para hacer sus códigos esto quiere decir que el pseudocódigo no es programable sino facilita la programación.

El principal objetivo del pseudocódigo es el de representar la solución a un algoritmo de la forma más detallada posible, y a su vez lo más parecida posible al lenguaje que posteriormente se utilizara para la codificación del mismo.

Características y partes

Las principales características de este lenguaje son:

1. Se puede ejecutar en un ordenador2. Es una forma de representación sencilla de utilizar y de manipular.3. Facilita el paso del programa al lenguaje de programación.4. Es independiente del lenguaje de programación que se vaya a utilizar.5. Es un método que facilita la programación y solución al algoritmo del

programa.

Todo documento en pseudocódigo debe permitir la descripción de:

Page 23: Manual de Algoritmos

1. Instrucciones primitivas.2. Instrucciones de proceso.3. Instrucciones de control.4. Instrucciones compuestas.5. Instrucciones de descripción.

Estructura a seguir en su realización:

1. Cabecera. 1. Programa.2. Modulo.3. Tipos de datos.4. Constantes.5. Variables.

2. Cuerpo. 1. Inicio.2. Instrucciones.3. Fin.

Definición de datos del pseudocódigo

La definición de datos se da por supuesta, sobre todo en las variables sencillas, si se emplea formaciones: pilas, colas, vectores o registros, se pueden definir en la cabecera del algoritmo, y naturalmente cuando empleemos el pseudocódigo para definir estructuras de datos, esta parte la desarrollaremos adecuadamente.

Funciones y operaciones

Cada autor usa su propio pseudocódigo con sus respectivas convenciones. Por ejemplo, la instrucción "reemplace el valor de la variable x por el valor de la variable y" puede ser representado como:

asigne a el valor de

Las operaciones aritméticas se representan de la forma usual en matemáticas.

Ejemplos de Pseudocódigo

 

Page 24: Manual de Algoritmos

Ejemplo: Realizar el pseudocódigo de un programa que

permita calcular el área de un rectángulo. Se debe

introducir la base y la altura para poder realizar el

cálculo..

Programa; áreaEntorno: BASE, ALTURA, AREA son número enterosAlgoritmo:            escribir �Introduzca la base y la altura�            leer BASE, ALTURA            calcular AREA = BASE * ALTURA            escribir �El área del rectángulo es �AREAFin programa

Ejemplo: Realizar el pseudocódigo que permita al usuario introducir por teclado dos notas, calculando la suma y el producto de las notas.

Programa: SumaProductoEntorno: NOTA1,NOTA2,SUMA,PRODUCTO son números enterosAlgoritmo:

escribir �Introduzca las notas�leer NOTA1,NOTA2calcular SUMA = NOTA1 + NOTA2calcular PRODUCTO = NOTA1 * NOTA2escribir �La suma de las dos notas es:� SUMAescribir �El producto de las dos notas es :�PRODUCTO

Finprograma 

Ejemplo: Realizar el pseudocódigo de un programa 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 NUMEROSI 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�          FINSIFINSI

Finprograma 

Page 25: Manual de Algoritmos

DIAGRAMA DE FLUJO DE DATOS

DIAGRAMA DE FLUJO

Es un grafico lógico del plan de trabajo que se ejecutara para la solución de un determinado problema. A través de él, se planifica la solución del problema independiente del lenguaje de computación a usar. De esta manera se separa loas instrucción es un lenguaje determinado con todas las reglas.

Las capacidades humanas necesarias para elaborar un diagrama de flujo correcto son: Lógico, Prácticas, y Atención.

El empleo de la maquina en las funciones del procediendo de datos han hecho necesario un flujo ordenado de la información. La secuencia en que deberán ejecutarse las operaciones tendrá que definirse claramente, y cuando se combine con los datos a los que debe aplicarse, esa secuencia creara el flujo de información.

No puede hacerse mucho hincapié en documentación, ósea el registro de Información .Sin Instrucciones escritas y sin representación grafica del flujo de trabajo seria muy difícil de llevar una tarea de procediendo de datos en forma apropiada. Hay varios métodos mas eficientes organizados y normalizados, es el de los diagramas de Flujo que el Futuro programador comprenda la necesidad de los diagrama de flujo.

OBJETIVOS DE UN DIAGRAMA DE FLUJO

a. Estructura la solución del problema independiente del lenguaje a utilizar.

b. Separar la solución lógica de programación de la parte de reglas y sintaxis de codificación con esta división del trabajo se obtiene mayor eficiencia.

c. Dar una visión completa del problema al programador ya que pierde en un programa ya codificado.

d. Permitir una compresión más rápida del programa a otros programadores.

TIPOS DE DIAGRAMA DE FLUJOS

Diagrama de flujo de sistemas: muestra en que forma se procesan los datos, entre as principales funciones o estaciones de trabajo .En este diagrama completo de computadora se presenta con un solo símbolo de procesamiento.

Ejemplo de Diagrama de Flujo de sistema:

Page 26: Manual de Algoritmos

DIAGRAMA DE FLUJOS DE PROGRAMACIÓN

Son las operaciones y decisiones en la secuencia en que las ejecutará una computadora de procesamiento de datos. Los símbolos representan esas operaciones e indican el orden en que se ejecutaran. Por lo tanto, un diagrama de flujo de programa proporciona una descripción grafica del programa.

Ejemplo de Diagrama e Flujo de Programa:

Partes: 1, 2

Page 27: Manual de Algoritmos

¿QUÉ ES UN DIAGRAMA DE FLUJO DE DATOS?

Es una descripción grafica de un procedimiento para la resolución de un problema. Son frecuentemente usados para descubrir algoritmos y programas de computador. Los diagramas de flujos están compuestos por figuras conectadas con flechas. Para ejecutar un proceso comienza por el Inicio y se siguen las acciones indicadas por cada figura: El tipo de figura indica el tipo de paso que representa.

Del Software, DFD es un software diseñado para contribuir y analizar algoritmos se puede crear diagramas de flujos de datos para la representación de algoritmos de programación estructurada a partir de las herramientas de edición que para este propósito suministra el programa .Después de hacer haber ingresado el representado por el diagrama, podrá, ejecutarlo analizarlo y depurarlo en un entorno interactivo diseñado para este fin. La interfaz grafica de DFD facilita en gran medida el trabajo con diagramas ya que simula la representación estándar de diagramas de flujo en hojas de papel.

LOS COMPONENTES DE UN DIAGRAMA DE FLUJO SON:

Proceso Flujo Almacén

Page 28: Manual de Algoritmos

Terminador

PROCESO:

El primer componente de diagrama de flujo de datos se conoce como Proceso. El proceso nuestra una parte del sistema que transforman Entradas y Salidas. Algunas analistas prefieren usar un ovalo o un rectángulo con esquinas redondeadas, otros prefieren usar un rectángulo. Las diferencias entre estas tres formas son puramente cosméticas, aunque obviamente es importante usar la misma forma de la manera consistente para representar todas las funciones de un sistema.

FLUJO:

Un flujo se representa gráficamente por medio de una flecha que entra y sale de proceso; el flujo se usa para describir el movimiento, de bloques o paquetes de información de una parte del sistema a otra.

Los flujos realmente representan Datos, es decir, Bits caracteres, mensajes, números, de puntos, flotante y los diversos tipos de información con los que las computadoras pueden tratar.

Los flujos también muestran la dirección: Una cabeza de flecha en cualquier extremo(o posiblemente ambos) del flujo indica si los datos (o el material) se está moviendo hacia adentro a hacia fuera por ejemplo indica claramente que el numero se está mandando hacia el proceso denominado validar numero telefónicos, y el flujo denominado honorarios de entrega de chóferes. Los datos que se mueven a dicho flujo viajaran ya sea de un proceso a otro.

Ejemplo:

Page 29: Manual de Algoritmos

ALMACÉN:

Se utiliza para modelar una colección de paquetes de datos en reposo. Se denota por dos líneas paralelas, de modo característico el nombre que se utiliza para identificar para los paquetes que entran y salen del almacén por medios de flujo.

PEDIDOS:

Para el analista con conocimiento de proceso de datos es tentador referirse a los almacenes como archivos o bases de datos; pro un almacén también pudiera consistir en datos almacenados también pudiera consistir en datos almacenados en tarjetas perforadas, microfilm, microfichas, discos ópticos, etc. y un almacén también puede ser en conjunto de fichas de papel en una caja de cartón , nombres de fichas de papel en un directorio, diversos archivos en un archivero, o varias formas no computarizadas.

Los almacenes se conectan por flujos a los procesos. Así el contexto en el que se muestra en un DFD (Diagrama de Flujo de Datos) es uno de los siguientes:

Un flujo desde un almacén. UN flujo hacia un almacén.

TERMINADOR:

Se representa como un rectángulo como los terminadores ser representa en entidades externas con las cuales el sistema se comunica, continuamente, puede ser una persona, o un grupo. Por ejemplo: una organización externa n o una agencia gubernamental, o un grupo o departamento que este dentro de la misma compañía u organización, pero fuera del control del sistema

Page 30: Manual de Algoritmos

que se esta modelando. En algunos casos, un terminador puede ser otro sistema, como algún otro sistema computacional con el cual se comunica este.

Existen tres cosas importantes que debemos recordar acerca de los terminadores.

Son externos al sistema que se esta modelando. Es evidente que ni el analista ni el diseñador del sistema están en

posibilidades de cambiar los contenidos de un terminador o la manera en que esta trabaja.

Las relaciones que existen entre lo terminadores no se muestran en el modelo DFD (Diagrama de Flujo de Datos).

REGLAS PARA LA CREACIÓN DE DIAGRAMAS

1. Los diagramas de flujo deben escribirse de arriba hacia abajo y/o de Izquierda a derecha.

2. Los símbolos se unen con líneas, las cuales tienen en la punta una flecha que indica su dirección que fluye la información procesos, se deben utilizar solamente líneas de flujo horizontal o vertical (nunca diagonales).

3. 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 sean estrictamente necesario.

4. No deben quedar líneas de flujo sin conectar.5. Todo texto escrito dentro de un símbolo debe ser legible, preciso,

evitando el uso de muchas palabras. 6. Todos los símbolos pueden tener mas de una línea de entrada, a

excepto del símbolo final. 7. Solo los símbolos de decisión pueden y deben tener mas de una línea

de flujo de salida.

Ejemplo de Diagrama de Flujo:

Page 31: Manual de Algoritmos

Diagrama de flujo que encuentra la suma de los primeros 50 números naturales.

El quinto bloque es un símbolo de suma de decisiones y ramificaciones lo q hay dentro del bloque es una pregunta que se le hace a las valores que actualmente incluyen 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á hacia la parte en donde se observa la palabra No. Tercer bloque, este le sumara1 (N=N+1) y vuelve a llegar a este bloque, donde preguntará ¿es N=50? No todavía es 2 ha pues regresa al tercer bloque y vuelve hacer lo mismo así la suma los primeros 50 números naturales.

Page 32: Manual de Algoritmos

Por ultimo indicaciones que le resultado será mostrado en la impresora.

EXPLICACIÓN DEL DIAGRAMA DE FLUJO

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 suman y N ha sido declarada previamente y las inicializa en o para comenzar al conteo y la suma de valores.

Tercer bloque, es también un símbolo de procesos.

En este paso se incrementa en 1 la variable N(N=N+1), por lo que en la primera pasada esta valdrá 1, ya que estaba inicializada en 0.

Cuarto bloque, es exactamente lo mismo que el anterior.

Page 33: Manual de Algoritmos

Pero en este, ya se agrega el valor de N a la variable que contendrá la suma (en el primer caso contendrá 1, ya que N=1).

VENTAJAS DEL ENFOQUE DE FLUJOS DE DATOS

El enfoque de flujo de datos tiene cuatro ventajas principales sobre la explicación narrativa de la forma en que se mueven los datos a trabes del sistema .Las ventajas son.

1. Libertad para realizar en forma muy temprana la implementación de técnicas de sistema.

2. Una mayor comprensión de las interrelaciones de los sistemas y subsistemas.

3. Comunicación del conocimiento del sistema actual a los usuarios por medio de diagramas de flujo de datos.

4. Análisis de un sistema propuesto para determinar si han sido definidas los datos y procesos necesarios.

SÍMBOLOS USADOS EN EL DIAGRAMA DE FLUJO DE DATOS

SIGNIFICADO DE LOS SÍMBOLOS DE FLUJO

Page 34: Manual de Algoritmos

El cuadrado doble es representado y usado para una actividad externa (otro departamento, un negocio, una persona, o una maquina) que puedan enviar datos y recibirlas del sistema. La entidad externa es llamada una fuente de destino de datos y es considerada externa al estudio, cada entidad externa es etiquetada con un nombre adecuado. La flecha muestra el movimiento de datos de un punto a otro , esta señalada hacia suceden simultáneamente pueden ser representadas simplemente mediante el uso de flechas paralelas, debido a que una flecha representada datos acerca de una persona lugar o casa, también :Debe ser descrita con un nombre.

Un rectángulo con esquinas redondeadas es usado para mostrar la aparición de un proceso de transformación. Los procesos siempre denotan un cambio o transformación de los datos.

USO DE DIAGRAMAS DE FLUJO DE DATOS

Los diagramas de flujo de datos son útiles a lo largo del proceso de análisis y diseños, .Existen compromisos para decidir que tanto deben ser explotados de los flujos de datos. Se desperdiciara tiempo y se sacrificara complusibilidad si los diagramas de flujo de datos son exclusivamente complejos. Por otro lado, si los diagramas de flujo de datos están muy poco explotados, pueden ocurrir errores u omisiones que pueden eventualmente afectar el sistema que esta en desarrollo. Por ultimo, recuerde que los diagramas del sistema de flujo pueden ser usados para documentar niveles altos o bajos del análisis y para ayudar a sustentar la lógica subyacente en los flujos de datos de la organización.

CARACTERÍSTICAS DE LOS DIAGRAMAS DE FLUJO DE DATOS

Muestran que debe hacer el sistema sin referencias. Son diagramas explícitos y comprensibles. Dan la posibilidad de representan el sistema a diferentes niveles de

complejidad, desde lo mas global a lo mas detallado solo requieren de 4 símbolos.

Son fácil de mantenimiento, pues los cambios afectan solo algunos de sus elementos y no al todo.

¿CUÁLES SO LAS VENTAJAS DE LOS DIAGRAMAS DE FLUJO DE DATOS?

Fácil lectura, con esto se constituye en un instrumento de mucha versatilidad.

Facilitan la interacción Usuario-Analista.

¿CUÁLES SON LAS LIMITACIONES DE LOS DIAGRAMAS DE FLUJO DE DATOS?

No permite recoger el comportamiento de sistema que deben responder a eventos en tiempos acotados. Para ello se usa el diagrama de transición de Estados.

No permite dar cuenta de la de las relaciones entre los datos que se precisan almacenar .Para ello se usan el diagrama Entidad-Relación.

Page 35: Manual de Algoritmos

No permite reflejar situaciones en las cuales es preciso dejar de manifiesto la necesaria concurrencia de dos o más flujo de datos para un subproceso pueda iniciar efectivamente su tarea. Para ello se utiliza la especificación de procesos.

No permite recoger el contenido de los flujos de datos ni el contenido de los archivos .Para ello se utiliza el diccionario de datos.

Variable (programación)

En programación, las variables son estructuras de datos que, como su nombre indica, pueden cambiar de contenido a lo largo de la ejecución de un programa. Una variable corresponde a un área reservada en la memoria principal del ordenador pudiendo ser de longitud:

Fija.- Cuando el tamaño de la misma no variará a lo largo de la ejecución del programa. Todas las variables, sean del tipo que sean tienen longitud fija, salvo algunas excepciones — como las colecciones de otras variables (arrays) o las cadenas.

Variable.- Cuando el tamaño de la misma puede variar a lo largo de la ejecución. Típicamente colecciones de datos.

Tipos de datos

Debido a que las variables contienen o apuntan a valores de tipos determinados, las operaciones sobre las mismas y el dominio de sus propios valores están determinadas por el tipo de datos en cuestión. Algunos tipos de datos usados:

Tipo de dato lógico. Tipo de dato entero. Tipo de dato de coma flotante (real, con decimales). Tipo de dato carácter. Tipo de dato cadena

Variables y paso de parámetros a subalgoritmos

Las variables pueden ser intercambiadas entre rutinas, por valor y por referencia:

Por valor.- Se copia el valor (el dato) de la variable en la zona de la pila de llamadas —de ámbito local— que corresponde a la nueva subrutina llamada. Por tanto, esta subrutina obtiene dicho valor pero no puede modificar la variable original. Esto significa que si la variable sufre alteraciones dentro de esta rutina, para poder acceder a dichas modificaciones al finalizar, deberá devolver el nuevo valor de la misma. Si no se realiza esta operación, el valor de la variable será exactamente el mismo que tenía antes de pasar por la función.

Por referencia.- No se pasa el valor directamente de la variable, si no una referencia o puntero a la misma —que contiene la dirección de la zona de memoria donde se aloja el contenido—, de tal modo que se

Page 36: Manual de Algoritmos

opera directamente sobre la zona de memoria que la contiene, lo cual implica que las modificaciones que sufra serán accesibles a posteriori.

Almacenamiento de variables en memoria

Las variables se representan con identificadores que hacen referencia a un lugar de la memoria del programa en donde se almacena un dato. Una variable está asociada a un tipo de datos, el cual y en función del tamaño del mismo determina la cantidad de bytes que serán necesarios para almacenar la variable. En el caso de colecciones y al contrario que con el resto de tipo de datos, ya sean primitivos u objetos complejos, la memoria asignada a almacenar tales variables no se conoce de antemano, lo cual lleva a establecer políticas de reserva de memoria:

Reserva fija de memoria.- Implica predeterminar la cantidad de memoria que se asignará a la colección. Es una política extremadamente rígida, ya que llegados al final de la zona de memoria no se podrían almacenar nuevos elementos.

Reserva variable de memoria.- Se dedica una zona de memoria, pudiendo ser de un tamaño predeterminado o no, y en caso de sobrepasarse dicha zona de memoria se vuelve a asignar otra zona, contigua o no, para impedir la restricción mencionada arriba.

Ámbito

Respecto al ámbito de una variable, éste puede ser:

Local: Cuando la misma sólo es accesible desde un único procedimiento hijo, no pudiendo ser leída o modificada desde otro procedimiento hermano o desde el propio procedimiento padre. Es posible declarar variables en bloques de condición, bucles, etc de tal modo que sólo pueda accederse a ellas en el propio bloque.

Global: Cuando la misma es accesible tanto desde rutinas o macros de la aplicación, como en todos los procedimientos y funciones de la misma.

Si bien es cierto, que de una forma básica, se puede definir el ámbito de las variables de la forma expuesta más arriba, existen grados de globalidad de las mismas, pudiendo ser accesibles desde unos puntos u otros, o incluso pudiendo ser accesibles entre aplicaciones distintas, llegando al caso de la superglobalidad. Ejemplo del ámbito de una variable en el lenguaje de programación Java.

public class A { public Integer numeroEntero = new Integer(); /* Variable Global a todos los Métodos */ public Integer metodo() { int num = 1; // Variable Local a metodo. Puede accederse dentro de este método en cualquier parte, pero no fuera del mismo. for (int i = 0;i<numeroEntero.intValue();i++) { // i es local al bucle for, sólo puede ser accedida dentro del mismo. num *= i; }

Page 37: Manual de Algoritmos

// i = 2; Esta línea provocaría error al no haber declarado la variable i. i fue definida localmente al bucle for. return Integer.valueOf(num); } public void otroMetodo() { int num = 1; // Variable local a otroMetodo. num aquí es una variable distinta a la variable num de metodo System.out.println("Variable local num: " + num); } }

Hay que tener en cuenta que en Java el caso de las variables globales a todos los métodos que se encuentran en una clase, es algo peculiar, ya que estas realmente son atributos que definen un objeto de una clase determinada, en este caso la clase A tiene un atributo llamado numeroEntero. El atributo es un concepto que define a un objeto de una clase determinada, mientras que una variable sirve de apoyo a los procedimientos y no define conceptualmente objetos.

Ejemplo

Una variable en programación es un espacio en memoria que permite almacenar información dentro de sí. Esa información puede ser un caracter, una cadena de caracteres, un número, un arreglo y, en general, cualquier otro tipo de datos.

En tanto una constante es también un espacio en memoria, pero que almacena una dato fijo, es decir, que no cambia nunca.

Por ejemplo:int a, ba := 1b := a + 2a := 5

Aquí tenemos dos variables, "a" y "b" que almacenan valores numéricos enteros (int). La variable "a" almacena primero el número 1, luego "b" almacena el numero que tiene "a" más 2, por lo tanto "b" almacena un 3. Finalmente el valor de "a" es reemplazado por un 3, por lo tanto las variables contendrán estos datos al final:a = 5b = 3

Constante

En programación, una constante es un valor que no puede ser alterado durante la ejecución de un programa.

Una constante corresponde a una longitud fija de un área reservada en la memoria principal del ordenador, donde el programa almacena valores fijos.

Page 38: Manual de Algoritmos

Por ejemplo:

El valor de pi = 3.1416

Por conveniencia, el nombre de las constantes suele escribirse en mayúsculas en la mayoría de lenguajes.

Ejemplo de una constante en C/C++ (#define)

En C o C++ las constantes se declaran con la directiva #define, esto significa que esa constante tendrá el mismo valor a lo largo de todo el programa. El identificador de una constante así definida será una cadena de caracteres que deberá cumplir los mismos requisitos que el de una variable (sin espacios en blanco, no empezar por un dígito numérico, etc).

Ejemplo:

#include <stdio.h> #define PI 3.1415926 int main() { printf("Pi vale %f", PI); return 0; }

Lo cual mostrará por pantalla:

Pi vale 3.1415926

Es decir, PI es una constante a la que le hemos asignado el valor 3.1415926 mediante la directiva #define.

La directiva #define también se puede utilizar para definir expresiones más elaboradas con operadores (suma, resta, multiplicación etc) y otras constantes que hayan sido definidas previamente, por ejemplo:

#define X 2.4 #define Y 9.2 #define Z X + Y

Tipo de dato

En los lenguajes de programación un tipo de dato es un atributo de una parte de los datos que indica al ordenador (y/o al programador) algo sobre la clase de datos sobre los que se va a procesar. Esto incluye imponer restricciones en los datos, como qué valores pueden tomar y qué operaciones se pueden realizar. Tipos de datos comunes son: enteros, números de coma flotante (decimales), cadenas alfanuméricas, fechas, horas, colores, coches o cualquier cosa que se nos ocurra. Por ejemplo, en

Page 39: Manual de Algoritmos

Java, el tipo "int" representa un conjunto de enteros de 32 bits cuyo rango va desde el -2.147.483.648 al 2.147.483.647, así como las operaciones que se pueden realizar con los enteros, como la suma, resta y multiplicación. Los colores, por otra parte, se representan como tres bytes denotando la cantidad de rojo, verde y azul, y una cadena de caracteres representando el nombre del color; las operaciones permitidas incluyen la adición y sustracción, pero no la multiplicación.

Éste es un concepto propio de la informática, más específicamente de los lenguajes de programación, aunque también se encuentra relacionado con nociones similares de las matemáticas y la lógica.

En un sentido amplio, un tipo de datos define un conjunto de valores y las operaciones sobre estos valores.[1] Casi todos los lenguajes de programación explícitamente incluyen la notación del tipo de datos, aunque lenguajes diferentes pueden usar terminología diferente. La mayor parte de los lenguajes de programación permiten al programador definir tipos de datos adicionales, normalmente combinando múltiples elementos de otros tipos y definiendo las operaciones del nuevo tipo de dato. Por ejemplo, un programador puede crear un nuevo tipo de dato llamado "Persona" que especifica que el dato interpretado como Persona incluirá un nombre y una fecha de nacimiento.

Un tipo de dato puede ser también visto como una limitación impuesta en la interpretación de los datos en un sistema de tipificación, describiendo la representación, interpretación y la estructura de los valores u objetos almacenados en la memoria del ordenador. El sistema de tipificación usa información de los tipos de datos para comprobar la verificación de los programas que acceden o manipulan los datos.

Tipos de datos máquina

Todos los datos en los ordenadores basados en la electrónica digital se representan como bits (valores 0 y 1) en el nivel más bajo. La más pequeña unidad direccionable de datos es un grupo de bits llamado un byte (normalmente un octeto, que son 8 bits). La unidad procesada por las instrucciones del código máquina se le llama una palabra (en 2006, normalmente 32 o 64 bits). La mayor parte de las instrucciones interpretan la palabra como un número binario, como por ejemplo una palabra de 32 bits puede representar valores enteros sin signo desde el 0 al 232 − 1 o valores enteros con signo desde − 231 al 231 − 1. Por medio del complemento a dos, la mayor parte del tiempo, el lenguaje máquina y la propia máquina no necesitan distinguir entre tipos de datos con o sin signo.

Existe un específico conjunto de instrucciones aritméticas que usa una diferente interpretación de los bits de una palabra como número en coma flotante.

Tipos de datos primitivo

Los tipos de datos hacen referencia al tipo de información que se trabaja, donde la unidad mínima de almacenamiento es el dato, también se puede

Page 40: Manual de Algoritmos

considerar como el rango de valores que puede tomar una variable durante la ejecución del programa.

DATOS PRIMITIVOS:

* CARACTER *NUMERICO *LOGICOS(BOOLEANOS)

CARÁCTER

El tipo de dato carácter es un digito individual el cual se puede representar como numéricos (0 al 9), letras (a-z) y símbolo ($,_). NOTA: En lenguaje java la codificación Unicode permite trabajar con todos los caracteres de distintos idiomas.

Tipo de dato Rango Tamaño de bits

char 0 a 65536 16 bits

NUMERICOS Este tipo de dato puede ser real o entero, dependiendo del tipo de dato que se vaya a utilizar.

Enteros: son los valores que no tienen punto decimal, pueden ser positivos o negativos y el cero.

tipo de dato: byte tamaño= 8 bits tipo de dato: short tamaño= 16 bits tipo de dato: int tamaño= 32 bits tipo de dato: long tamaño= 64 bits

Reales: estos caracteres almacenan numeros muy grandes que poseen parte entera y parte decimal.

tipo de dato: float= 32 bits tipo de dato: double= 64 bits

BOOLEANOS

Este tipo de dato se emplea para valores lógicos, los podemos definir como datos comparativos dicha comparación devuelve resultados lógicos.

tipo de dato: boolean Rango= true - false

Page 41: Manual de Algoritmos

Tipos simples

Artículo principal: Tipos simples

Tipo Ordinal o Tipos predefinidos

Tipo de dato entero Tipo de dato carácter Tipo de dato lógico

o Tipos definidos por el usuario Tipo de dato enumerado Tipo de dato subrango

Tipo No Ordinal o Tipo de dato realo Tipo de dato cronológicoo Tipo de dato puntero

Tipos compuestos

Artículo principal: Tipos compuestosArtículo principal: TuplaArtículo principal: Vector (programación)

Cadena de caracteres Estructura de datos

Operador

En matemáticas, un operador es un símbolo matemático que indica que debe ser llevada a cabo una operación especificada[1] sobre un cierto número de operandos (número, función, vector, etc.).

Por ejemplo: el operador derivada, , actúa sobre la función que se escribe a su derecha, produciendo una nueva función de :

En algunos casos un operador es una función que actúa sobre funciones para producir otras funciones.

Operadores bilineales o bivariantes

(Para definiciones más estrictas sobre linealidad y bilinealidad, véanse los temas relacionados)

Su nombre depende del autor, son los operadores que actúan sobre dos objetos (escritos, generalmente, a ambos lados del operador) produciendo un único resultado. Véanse los casos siguientes.

Tipos generales de operadores

Page 42: Manual de Algoritmos

Operadores de condición

Relacionan un término A con otro B estableciendo su igualdad, jerarquía o cualquier otra relación posible, como ejemplos tenemos:

A = B establece que A es igual que B.

En este caso hay que distinguir entre operador = de asignación y el operador = de comparación. El primero toma el valor de B y se lo asigna a A; el segundo solamente compara los valores de A y B sin modificarlos y devuelve un valor lógico o de verdad verdadero si ambos valores son iguales o falso si dichos valores no son iguales.

A ≠ B o desigualdad.

Este caso es justamente el opuesto al anterior, aunque aquí no podemos hablar de asignación, pero si de comparación. Ahora el resultado de esta operación será F si los valores A y B son iguales y V si son distintos.

Operadores de orden: establecen o verifican clasificaciones entre números (A < B, A > B, etc.) u otro tipo de valores (caracteres, cadenas, ...).

Todo tipo de dato susceptible de ser ordenado por cualquier criterio puede ser comparado con estos operadores; como los anteriores devuelven un valor de verdad en función del resultado que tenga la comparación en cada caso.

A > B Devuelve V si A es estrictamente mayor que B y F en caso contrario

A < B Devuelve V si A es estrictamente menor que B y F en caso contrario

A ≥ B Devuelve V si A es mayor o igual que B y F en caso contrario

A ≤ B Devuelve V si A es menor o igual que B y F en caso contrario

Otros operadores relacionales menos usuales son los llamados operadores geométricos: paralelismo (A || B), perpendicularidad y otros

Operadores lógicos

Los operadores lógicos producen un resultado booleano, y sus operandos son también valores lógicos o asimilables a ellos (los valores numéricos son asimilados a cierto o falso según su valor sea cero o distinto de cero). Por contra, recuerde que las operaciones entre bits producen valores arbitrarios.

Los operadores lógicos son tres; dos de ellos son binarios, el último (negación) es unario. Tienen una doble posibilidad de representación en el Estándar C++ actual: la representación tradicional que se indica a

Page 43: Manual de Algoritmos

continuación, y la natural introducida recientemente que se detalla más adelante .

Y lógico  &&             AND  O lógico  ||                OR   Negación lógica  !   NOT

Las expresiones conectadas con los operadores && y || se evalúan de izquierda a derecha, y la evaluación se detiene tan pronto como el resultado verdadero o falso es conocido (muchos programas tienen una lógica que se basa en este propiedad).

§2   &&    Operador Y lógico

También denominado por su nombre en inglés (generalmente en mayúsculas) AND lógico. Devuelve un valor lógico true si ambos operandos son ciertos. En caso contrario el resultado es false.

Sintaxis

expr-AND-logica && expresion-OR-inclusive

Comentario:

La operatoria es como sigue: El primer operando (de la izquierda) es convertido a bool. Para ello, si es una expresión, se evalúa para obtener el resultado (esta computación puede tener ciertos efectos laterales). A continuación, el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversión estándar. Si el resultado es false, el proceso se detiene y este es el resultado, sin que en este caso sea necesario evaluar la expresión de la derecha (recuérdese que en el diseño de C++ prima la velocidad).

Si el resultado del operando izquierdo es cierto, se continúa con la evaluación de la expresión de la derecha, que también es convertida a bool. Si el nuevo resultado es true, entonces el resultado del operador es true. En caso contrario el resultado es false.

Nota: la Norma informa que antes de ser evaluada la expresión derecha, han sucedido todos los posibles efectos laterales de la expresión izquierda, a excepción de la destrucción de los posibles objetos temporales que se hubiesen creado.

Ejemplo:

int m[3] = {0,1,2};int x = 0;if (m && x) cout << "Cierto.";else cout << "Falso.";

Salida:

Falso.

Page 44: Manual de Algoritmos

El valor m, que es interpretado como un puntero al primer elemento de la matriz, es transformado a un bool. Como es distinto de cero (no es un puntero nulo) el resultado es cierto. A continuación, el valor x es convertido también a bool. En este caso la conversión produce falso, con lo que este es el resultado del paréntesis de la sentencia if.

Ejemplo

#include <iostream.h>

bool alto = true, bajo = false, blanco = true, negro = false;

int main (void) {  if (alto && bajo) { cout << "Uno cierto" << endl; }  else cout << "Uno falso" << endl;  if (alto && blanco) { cout << "Dos cierto" << endl; }  else cout << "Dos falso" << endl;  if (bajo && negro) { cout << "Tres cierto" << endl; }  else cout << "Tres falso" << endl;}

Salida:

Uno falsoDos ciertoTres falso

§3   ||    Operador O lógico

Este operador binario devuelve true si alguno de los operandos es cierto.  En caso contrario devuelve false.

Sintaxis

expr-OR-logica || expresion-AND-logica

Comentario

Este operador sigue un funcionamiento análogo al anterior. El primer operando (izquierdo) es convertido a bool. Para ello, si es una expresión, se evalúa para obtener el resultado (esta computación puede tener ciertos efectos laterales). A continuación el valor obtenido es convertido a bool cierto/falso siguiendo las reglas de conversión estándar ( 3.2.1b). Si el resultado es true, el proceso se detiene y este es el resultado, sin que en este caso sea necesario evaluar la expresión de la derecha (recuérdese que en el diseño de C++ prima la velocidad).

Si el resultado del operando izquierdo es false, se continúa con la evaluación de la expresión de la derecha, que también es convertida a bool. Si el nuevo resultado es true, entonces el resultado del operador es true. En caso contrario el resultado es false.

Page 45: Manual de Algoritmos

Nota: el Estándar establece que antes de ser evaluada la expresión derecha, han sucedido todos los posibles efectos laterales de la expresión izquierda, a excepción de la destrucción de los posibles objetos temporales que se hubieran creado.

Ejemplo

#include <iostream.h>bool alto = true, bajo = false, blanco = true, negro = false;

int main (void) {  if (alto || bajo) { cout << "Uno cierto" << endl; }  else cout << "Uno falso" << endl;  if (alto || blanco) { cout << "Dos cierto" << endl; }  else cout << "Dos falso" << endl;  if (bajo || negro) { cout << "Tres cierto" << endl; }  else cout << "Tres falso" << endl;}

Salida

Uno ciertoDos ciertoTres falso

§4   !    Operador NO lógico:

Este operador es denominado también negación lógica y se representa en el texto escrito por la palabra inglesa NOT (otros lenguajes utilizan directamente esta palabra para representar el operador en el código).

Sintaxis

! expresion-cast

Comentario

El operando expresion-cast (que puede ser una expresión que se evalúa a un resultado es convertido a tipo bool, con lo que solo puede ser uno de los valores cierto/falso. A continuación el operador cambia su valor:  Si es cierto es convertido a falso y viceversa.

Resulta por tanto, que el resultado de este operador es siempre un tipo bool, aunque al existir una conversión estándar por la que un cero es convertido a false, y cualquier valor distinto de cero a true, coloquialmente se dice que este operador convierte un operando 0 en 1 y uno no-cero en 0. En otras palabras: este operador devuelve cierto (true) si la expresión se evalúa a distinto de cero, en caso contrario devuelve falso (false).

Ejemplo

#include <iostream.h>bool alto = true, bajo = false;

Page 46: Manual de Algoritmos

int main (void) {  if (alto) { cout << "Uno cierto" << endl; }  else cout << "Uno falso" << endl;  if (!alto) { cout << "Dos cierto" << endl; }  else cout << "Dos falso" << endl;  if (!bajo) { cout << "Tres cierto" << endl; }  else cout << "Tres falso" << endl;}

Salida:

Uno ciertoDos falsoTres cierto

OPERADORES ARITMÉTICOS

Tipos de Operadores Relaciónales

Lógicos

Operadores Aritméticos: Los operadores aritméticos permiten la realización de operacionesmatemáticas con los valores (variables y constantes).

•Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el resultado es entero; si alguno de ellos es real, el resultado es real.Operando (Operador).Valor

(constante o variable)Operadores Aritméticos+ Suma− Resta* Multiplicación/ DivisiónMod Modulo (residuo de la división entera)

Ejemplos:Expresión Resultado7 / 2 3.512 mod 7 5104 + 2 * 5 14

Page 47: Manual de Algoritmos

PRIORIDAD DE LOS OPERADORES ARITMÉTICOS

Todas las expresiones entre paréntesis se evalúan primero. Las expresiones con paréntesis anidados se evalúan de dentro a fuera, el paréntesis mas interno se evalúa primero. Dentro de una misma expresión los operadores se evalúan en el siguiente orden.

1.− ^ Exponenciación2.− *, /, mod Multiplicación, división, modulo.3.− +, − Suma y resta.Los operadores en una misma expresión con igual nivel de prioridad se evalúan de izquierda aderecha.

Ejemplos:4 + 2 * 5 = 1423 * 2 / 5 = 9.2 46 / 5 = 9.23 + 5 * (10 − (2 + 4)) = 23 3 + 5 * (10 − 6) = 3 + 5 * 4 = 3 + 20 = 233.5 + 5.09 − 14.0 / 40 = 5.09 3.5 + 5.09 − 3.5 = 8.59 − 3.5 = 5.092.1 * (1.5 + 3.0 * 4.1) = 28.98 2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98

SIMBOLOGÍA DE LOS DIAGRAMAS DE FLUJO

Las diversas organizaciones usan distintos símbolos, pero el comité sobre computadoras y procesadores de información de la Asociación Norteamericana de Normas ha hecho un gran esfuerzo para normalizar los símbolos de los diagramas de flujo. Esa normalización permite comprender cualquier diagrama de flujo que use los símbolos recomendados.

Cada símbolo normal de diagrama de flujo tiene un significado especial.

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.

Page 48: Manual de Algoritmos

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.

Page 49: Manual de Algoritmos

Este es utilizado para enlazar dos partes de un diagrama pero que no se encuentren en la misma pagina.

Este es utilizado para indicar la secuencia del diagrama de flujo, es decir, para indicar el sentido de las operaciones dentro del mismo.

Este es utilizado para representar la salida de información por medio de la impresora.

Este es utilizado para representar la salida o para mostrar la información por medio del monitor o la pantalla.

REGLAS PARA ESTRUCTURAR UN DIAGRAMA DE FLUJO

El sentido de un diagrama de flujo generalmente es de arriba hacia abajo.

Es un símbolo solo puede entrar una flecha de flujo si varias líneas se dirigen al mismo símbolo, se deben unir en una sola flecha.

Page 50: Manual de Algoritmos

Las líneas de flujo no deben cruzarse, para evitar los cruces se utilizan los conectores.

De un símbolo excepto el de decisión, solo puede salir una línea de flujo.

Los símbolos Terminal, Conector dentro de página y conector fuera de página solo pueden estar conectados al diagrama por una sola flecha, ya que por su naturaleza es imposible que tenga una entrada y una de salida.

Los émbolos de decisión tendrán siempre una sola flecha de entrada y dos o tres flechas de salida según la cantidad de alternativas que se presentan.

Un diagrama de flujo debe estar complemente cerrado, teniendo una continuidad de principio a fin, no pueden quedar flechas en el aire ni símbolos sin conexión al diagrama pues el flujo seria interrumpido.

CONSIDERACIONES SOBRE DIAGRAMA DE FLUJO

Un diagrama de flujo, puede tener tipos de errores diferentes:

DE FORMA: Se genera por no seguir las reglas establecidas, puede hacer el diagrama difícil interpretación, confundir el diagrama y hasta convertirlo en errado en cuanto ser lógica.

DE LÓGICA: Son errores de estructura del diagrama en cuanto al arden puede ser de distinta gravedad, desde dejar de mostrar el resultado. O falta un cálculo hasta un error que determine que un programa nunca llegue a su fin.

DE OBJETIVO: Es cuando un diagrama de flujo esta correcto en cuanto a su estructura y forma pero no soluciona el problema propuesto sino otro.

Una vez terminado e diagrama de flujo, es necesario asegurarse de que funcione correctamente cumpliendo el objetivo fundamental, las condiciones especificas y las excepciones del problema propuesto a esto se le llama generalmente "corrida en frió" prueba de escritorio.

Para ellos e selecciona algunos datos (creadas por el programador para fines de la prueba) que cubran todos los casos posibles en todas las condiciones. Tomando estos datos se recorre el diagrama de flujo símbolo a símbolo siguiendo la orden de cada uno de ellos, todo esto se hará a un lado del diagrama o en una hoja aparte dándole valores a variables y ejecutando operación que se indique .Ejemplo:

Page 51: Manual de Algoritmos

ESTRUCTURA DE CONTROL SELECTIVA (if)Existen tres tipos de estructuras de control selectivas, estas se basan en una condición o en una opción para decidir la parte del programa por el que pasará.

a. Simple b)Doble o compuesta c)MúltipleSelectiva simple.- evalúa una condición, si esta es verdadera ejecuta la acción o acciones especificadas, si es falsa no realiza ninguna acción.

Nota: Si existe sola una instrucción o sentencia dentro de la condición no es necesario marcarlos con inicio y fin, en caso contrario si, como se muestra en el diagrama anterior.

Page 52: Manual de Algoritmos

1. Determinar si 2 números son iguales o diferentes, si son diferentes determinar cuál de los 2 es el mayor.

2. Cambiar un Caucho desinflado de un Automóvil.

Page 53: Manual de Algoritmos

MÉTODO DE ORDENACIÓN POR BURBUJA

Selectiva doble o compuesta.- evalúa una condición, si esta es verdadera ejecuta la acción o acciones especificadas, si es falsa ejecuta otra acción o acciones.

Page 54: Manual de Algoritmos

Nota: Si existe sola una instrucción o sentencia dentro de la condición no es necesario marcarlos con inicio y fin como en este caso que la condición fue falsa, en caso contrario si, en este ejemplo cuando la condición fue verdadera.

Ejemplo: Imprimir si un número es positivo o negativo

Selectiva anidada La estructura selectiva anidada es una cadena de estructuras selectivas que se conectan de la parte else de la actual con la parte if de la siguiente.

Diagrama de flujo:

Page 55: Manual de Algoritmos

Sintaxis:if(condición1) Bloque 1 ;else if(condición2) Bloque 2 ;else Bloque 3;  Ejemplo: if(edad < = 2 ) Console.WriteLine("Bebé" ) ;else if(edad < 12) Console.WriteLine("Niño" ) ; else if( edad < 18)Console.WriteLine("Adolescente" ) ; else Console.WriteLine (" Adulto" ) ;

Selectiva múltiple

Page 56: Manual de Algoritmos

La estructura selectiva múltiple es similar a la selectiva anidada, salvo que las condiciones deben ser de alguno de los tipos enteros o de tipo carácter.

 

Diagrama de flujo:

Sintaxis:

switch(Expresión) { case Cte 1: Bloque 1 ; break; case Cte 2: Bloque 2 ; break; case Cte N: Bloque N ; break; default: Bloque X ; break;// Opcional.

ESTRUCTURAS REPETITIVAS O CICLOS REPETITIVOS

Page 57: Manual de Algoritmos

Las computadoras están diseñadas para aquellas aplicaciones en las cuales una operación o conjunto de ellas deben repetirse muchas veces. Un tipo muy importante de estructura es el algoritmo necesario para repetir una o varias acciones por un número determinado de veces, a esta estructura se la llama Estructura Repetitiva. Las estructuras repetitivas se utilizan cuando se desea que una instrucción o bloque de instrucciones se repita un número determinado de veces o hasta que una condición de terminación se cumpla. Las estructuras que repiten una secuencia de instrucciones un número determinado de veces se denominan bucles, y se llama iteración al hecho de repetir la ejecución de una secuencia de acciones. Iterar es repetir una vez el bucle. Se debe tener en cuenta lo siguiente para la construcción de una El cuerpo del bucle: Es el grupo de estructura repetitiva: instrucciones que se van a repetir. Dentro del cuerpo del bucle debe existir una instrucción que modifique la condición lógica de terminación. Las sentencias de inicialización. Son instrucciones que inicializan contadores y acumuladores. Las condiciones para la terminación del bucle: Expresiones lógicas que controlan la terminación del bucle.

A continuación se detallan tres estructuras repetitivas básicas: 1. 2. 3.

Estructura Repetitiva Desde / Para. (FOR) Estructura Repetitiva Hacer – Mientras. (DO WHILE) Estructura Repetitiva Mientras. (WHILE)

Para poder entender cómo funciona un proceso repetitivo, se necesita conocer el concepto de dos expresiones:

CONTADOR

En un proceso repetitivo cuya función es contar los sucesos o acciones internas del bucle, como pueden ser el número de iteraciones del bucle, la cantidad de elementos que tiene un archivo, un vector, una matriz, etc. Una forma de controlar un bucle es mediante un contador. Un contador es una variable cuyo valor se incrementa o decrementa en una cantidad constante o fija en cada iteración. La forma de representar un contador es: contador = contador + 1

La expresión anterior se debe interpretar como asignar a la variable contador el valor que tenía anteriormente más uno o menos uno, dependiendo del caso si se quiere incrementar o decrementar.

Nota: En todo contador es necesario que exista una instrucción que inicializa la variable que va a tener la función de contador y esta variable puede ser cualquier identificador. Ejemplo 1: Contador que incrementa de uno en uno. La variable contador va a tener la función de ser el contador. contador = contador = 1 contador + 1 1

Page 58: Manual de Algoritmos

ACUMULADOR

Un acumulador es una variable cuya misión es almacenar cantidades variables. Realiza la misma función que un contador pero con la diferencia de que el incremento o decremento es variable y no constante como en el contador. La forma de representar un acumulador es: S = S + valorVariable

Nota: En todo acumulador es necesario que exista una instrucción que inicializa la variable que va a tener la función de acumulador y esta variable puede ser cualquier identificador. Ejemplo 5: Calcular el promedio de notas de 10 alumnos, primero debemos utilizar una variable acumulador para ir sumando las 10 notas (cantidades variables) y luego dividir este valor entre diez. La variable S va a tener la función de ser el acumulador. Solución del ejemplo 5. S=0 leer(nota) S=S+nota Prom=S/10

Esto es la forma como trabaja un acumulador.

FOR

Estructura Repetitiva Desde/Para

En muchas ocasiones se conoce de antemano el número de veces que se desean ejecutar las acciones o instrucciones de un bucle. En estos casos en los que el número de iteraciones es fijo, se debe usar la estructura desde/para. Por ejemplo, ingresar 10 notas, 100 números, etc. La representación gráfica de la estructura repetitiva desde/para en un Diagrama de Flujo es el siguiente:

En su forma más típica y básica, esta estructura requiere una variable entera que cumple la función de un contador de vueltas. En la sección indicada como “inicialización”, se suele colocar el nombre de la variable que hará de contador, asignándole a dicha variable un valor

Inicialización, condición, modificación

Instrucciones

Page 59: Manual de Algoritmos

inicial. En la sección de “condición” se coloca la condición que deberá ser verdadera para que el ciclo continúe (en caso de falso el ciclo se detendrá). Y finalmente, en la sección “modificación” se coloca una instrucción que permite modificar el valor de la variable que hace de contador (para permitir que alguna vez sea falsa).

Ejemplo: Queremos que se repita 50 veces el bloque de instrucciones. Describiremos el siguiente ejemplo por etapas: Nota: El símbolo de la flecha apuntando a la izquierda ( ) significa = (igual)

1era Etapa (c=1): Cuando el ciclo comienza antes de dar la primera vuelta, la variable de inicialización toma el valor indicado en la sección de inicialización.

DO WHILE

Estructura Repetitiva Hacer - Mientras

Existen muchas situaciones en las que se desea que un bucle se ejecute al menos una vez antes de comprobar la condición de repetición, para ello se puede utilizar la estructura repetitiva Hacer - Mientras. Esta estructura repetitiva se utiliza cuando conocemos de antemano que por lo menos una vez se ejecutará el bloque repetitivo. Cuando una instrucción Hacer-Mientras se ejecuta, lo primero que sucede es la ejecución del bucle (todas las instrucciones) y a continuación se evalúa la expresión booleana de la condición. Si se evalúa como verdadera, el cuerpo del bucle se repite y se vuelve a evaluar la condición, si sigue siendo verdadera se seguirá repitiendo el bucle hasta que la condición sea falsa. Dentro del bucle existirá una instrucción que en un cierto momento hará que la condición sea falsa.

C = 1, C<=50, C = C + 1

Instrucciones

Page 60: Manual de Algoritmos

La representación gráfica de la estructura repetitiva Hacer-Mientras es la siguiente:

verdadero

falso

WHILE

Instrucciones (ES)

condicion

Page 61: Manual de Algoritmos

Estructura Repetitiva Mientras

El proceso de una estructura repetitiva Mientras es el siguiente: para que ingrese al cuerpo del bucle tiene que evaluarse una condición, si ésta es verdadera se ingresa y se realizan todas las instrucciones que están dentro del cuerpo del bucle; terminado la última instrucción se vuelve a comprobar la condición; se seguirá realizando el bucle mientras la condición siga siendo verdadera y si en un momento es falsa sale del bucle. Es decir, la estructura repetitiva Mientras es aquella en que el cuerpo del bucle se repite mientras se cumpla una determinada condición, y termina cuando ya no se cumple. Si al querer ingresar al cuerpo del bucle por primera vez y la condición es falsa, no ingresa al bucle, ninguna acción se realiza y el algoritmo prosigue en la siguiente instrucción fuera del bucle. La representación gráfica de la estructura repetitiva Mientras es la siguiente:

falso

Vectores.

Instrucciones (ES)

Condición

Page 62: Manual de Algoritmos

Un vector es un conjunto de elementos relacionados. En la mayoría de los lenguajes de computadora, todos los elementos de un vector(o arreglo unidimensional) son del mismo tipo. Para poder hacer referencia a los elementos de un vector es necesario que exista un nombre para el mismo. A cantidad máxima de elementos que podemos almacenar en un vector se le llama dimensión. No es posible acceder a todos los datos de un arreglo al mismo tiempo, en vez de ello se tiene que usar un nombre de arreglo y un número, llamado índice, que indica a qué elemento del vector se está haciendo referencia.

En la figura se muestra un arreglo de enteros llamado X que tiene una dimensión de 4. Si queremos hacer referencia al segundo elemento del arreglo X (el número 324) tendríamos que especificar X[2](se lee como X de 2), es decir, X[2]=324. Cada uno de estos elementos individuales puede ser tratado como cualquier variable.

Ejemplos y resolución de problemas relacionados con vectores.

Ejemplo: Hacer diagrama de flujo que lea e imprima un arreglo de N elementos.

Page 63: Manual de Algoritmos

Ejemplo: Hacer diagrama de flujo que lea un arreglo de N elementos y que imprima su media aritmética.

Page 64: Manual de Algoritmos

Ejemplo: Hacer diagrama de flujo que lea un vector numérico de N elementos y que indique cuántos de ellos son negativos.

Matrices.

Page 65: Manual de Algoritmos

Un matriz es un arreglo bidimensional, es decir, para hacer referencia a cualquiera de sus elementos son necesarios dos índices. Las matrices están organizadas en filas y columnas, por lo tanto la dimensión de las mismas será dada en la forma NxM, donde N representa la cantidad de renglones (llamados también filas) y M las columnas.

En la Figura 5.2 podemos observar la representación esquemática de una matriz de enteros llamada X, la cual tiene una dimensión 4x3. En la matriz X, el acceso a los elementos individuales debe hacerse en la forma X[i,i], donde i representa el número de renglón y j el número de columna, por lo tanto X[3,2] es 342.

Ejemplos y resolución de problemas relacionados con matrices.

Ejemplo: Hacer diagrama de flujo que lea una matriz de tres por dos (3 X 2).

Ejemplo: Hacer diagrama de flujo que lea e imprima una matriz de N X M elementos.

Page 66: Manual de Algoritmos
Page 67: Manual de Algoritmos

Ejemplo: Hacer diagrama de flujo que lea matriz de dimensión NxM y un escalar. El diagrama debe calcular e imprimir el producto escalar de ambos.

Page 68: Manual de Algoritmos

Ejercicios

1.- Hacer diagrama de flujo que lea un vector de N elementos y que indique cuántos de ellos son pares. 2.- Hacer diagrama de flujo que lea una matriz de N X 3. El diagrama debe calcular el promedio por fila e cual de tales promedios es el mayor. 3.- Hacer diagrama de flujo que lea un vector de N elementos y que indique cuántos de ellos múltiplos de tres y cuántos múltiplos de 5. 4.- Hacer un diagrama de flujo que lea un vector de dimensión N y que calcule la siguiente norma:

(X1-M)2+ (X1-M) 2+...+ (XN-M) 2

Norma = -----------------------------------------

N2

Donde M es la media aritmética del vector X. 5.- Hacer un diagrama de flujo que lea dos matrices y que calcule su producto. 6.- Hacer un diagrama de flujo que lea dos matrices y que calcule su suma. 7.- Hacer un diagrama de flujo que lea una matriz entera de dimensión NxM y que calcule su matriz transpuesta. 8.- Hacer un diagrama de flujo que lea una matriz entera de dimensión NxM y que calcule el promedio de sus elementos. 9.- Hacer una diagrama de flujo que lea una matriz de caracteres de dimensión NxM y que indique cuántos de los caracteres de tal matriz son letras “a”. 10.- Que lea dos vectores numéricos de dimensión N y que indique cuál de ellos tiene la mayor media aritmética de sus elementos.

ERIK APARICIO MARTINEZOLIDEL MARROQUIN TOVILLAFRANCISCO BAIL