91539311 Fundamentos de Programacion Algoritmos JB
-
Upload
rudy-cesar-hg -
Category
Documents
-
view
111 -
download
3
Transcript of 91539311 Fundamentos de Programacion Algoritmos JB
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 1
FUNDAMENTOS DE PROGRAMACIÓN – ALGORITMOS
OBJETIVO.
Mostrar los fundamentos de la programación, de modo que al final del curso, el
estudiante será capaz de diseñar algoritmos mediante ejercicios prácticos
utilizados cotidianamente en el desarrollo de aplicaciones de software, con ayuda
de las diferentes técnicas algorítmicas, con la finalidad de formarse una
mentalidad de programador.
INTRODUCCIÓN.
Todos tenemos conciencia de que el éxito de una empresa depende de la rapidez,
calidad, control de los recursos, exactitud y otros muchos factores.
Hace tiempo, las empresas ya sean grandes o pequeñas, tenían que hacer sus
procesos manualmente o con ayuda de máquinas. Pero a raíz de la aparición de
las primeras computadoras, las grandes empresas obtuvieron unas de estas y
comenzaron a tener mayor ventaja sobre las demás organizaciones. Con el paso
del tiempo, se crearon computadoras más pequeñas, de menos costo, más
rápidas, lo cual ha provocado que cualquier persona o empresa pueda adquirir
una o más de estas computadoras.
En la actualidad, muchas empresas realizan sus operaciones por medio de
computadoras, por ejemplo en las fábricas ensambladoras de autos se utilizan
robots programados, los cuales se encargan de montar y soldar las partes que
forman el carro; en los supermercados, se utilizan las computadoras junto con un
programa para registrar rápidamente las compras de los clientes, además de que
les ayuda para llevar el control de su inventario y de sus ingresos entre otras
cosas; en los hospitales, se están utilizando pequeños robots programados, los
cuales se introducen en el cuerpo del paciente para realizar incisiones, cauterizar,
saturar, etc.; este manual, fue elaborado en un editor de textos llamado Microsoft
Word, el cual es un programa de aplicación diseñado específicamente para poder
crear y dar formato a documentos de texto. En fin, podríamos continuar
enumerando en donde se utilizan las computadoras y nunca terminaríamos, lo
cual da un amplio campo de trabajo para los programadores.
Este manual, tiene la finalidad de mostrarte los fundamentos de la programación y
formarte una mentalidad de programador, mediante la elaboración de algoritmos
utilizando diferentes técnicas algorítmicas y herramientas de software para escribir
y entender de manera más sencilla el fascinante mundo de la programación. Ya
que un programador es decir, la persona que diseña sistemas computacionales o
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 2
aplicaciones de software, antes de comenzar a interactuar con la computadora
tiene que tener una manera de pensar diferente a las demás personas para poder
analizar y resolver problemas mediante aplicaciones de software, los cuales
primero debe plasmarlos en papel o en alguna herramienta de software específica
para ello y luego en un lenguaje de programación.
ÍNDICE.
El ordenador.
El software.
Sistema binario y representación binaria de datos.
Algoritmos y elementos que lo conforman.
Conceptos básicos de programación.
Resolución de problemas con computadora – Desarrollo de Software
Tipos y Paradigmas de Programación.
Lenguajes de programación.
La lógica como aspecto fundamental de la programación.
Representación gráfica de los algoritmos.
Entorno de programación integrado (IDE).
Programación Estructurada.
Estructura de datos y Arreglos.
Modularidad.
Recursividad.
Estilos de Programación
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 3
1. EL ORDENADOR.
Un ordenador es una máquina programable. Las dos características principales de un ordenador son:
Responde a un sistema específico de instrucciones de una manera bien definida.
Puede ejecutar una lista de instrucciones pregrabadas (un programa).
Los ordenadores modernos son electrónicos y digitales. La maquinaria real, cables, transistores, y circuitos, se llaman hardware; las instrucciones y los datos se llaman software.
Todos los ordenadores de uso general requieren los siguientes componentes de hardware:
Dispositivos de Entrada: Como su nombre lo indica, sirven para introducir datos (información) en el ordenador para su proceso. Ejemplo: teclado, ratón, scanner, etc.
Dispositivos de Salida: Regresan los datos procesados que sirven de información al usuario. Los más comunes son el monitor y la impresora.
La Unidad Central de Procesamiento (CPU). Aunque generalmente al gabinete se le denomina CPU, el CPU es el microprocesador del ordenador y es el encargado de hacer todos los cálculos y operaciones (es cerebro del ordenador). El CPU a su vez se divide en las siguientes partes:
Unidad de Control: Coordina las actividades del ordenador y determina que operaciones se deben realizar y en qué orden; así mismo controla todo el proceso del ordenador.
Unidad Aritmética - Lógica: Realiza operaciones aritméticas y lógicas, tales como suma, resta, multiplicación, división y comparaciones.
La Memoria. Es una parte del ordenador en donde se almacenan los datos a procesar y la información resultante. Esta puede ser de dos tipos:
Memoria Primaria: Es el espacio en que se almacenan los datos a procesar o calcular en este momento.
Memoria Secundaria: Es el espacio en el que se almacena la información resultante para su futura consulta o manejo. Por ejemplo: discos duros, unidades de almacenamiento magnético (CD-DVD), etc.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 4
Además de estos componentes, muchos otros hacen posible que los componentes básicos trabajen juntos eficientemente. Por ejemplo, cada ordenador requiere un bus que transmita datos de una parte del ordenador a otra.
Generalmente, los ordenadores se pueden clasificar por tamaño y potencia de la siguiente forma, aunque hoy un solapamiento considerable:
Ordenador personal (personal computer): Un ordenador pequeño, para un sólo usuario basado en un microprocesador. Además del microprocesador, un ordenador personal tiene un teclado para introducir datos, un monitor para mostrar la información, y un dispositivo de almacenamiento para guardar datos.
Estación de trabajo (workstation): Una computadora de gran potencia para un sólo usuario. Una estación de trabajo es como un ordenador personal, pero tiene un microprocesador más potente y un monitor de mejor calidad.
Miniordenador (minicomputer): Un ordenador para varios usuarios capaz de soportar centenares de usuarios simultáneamente.
Chasis (mainframe): Una computadora multiusuario de gran potencia capaz de soportar miles de usuarios simultáneamente.
Superordenador (supercomputer): Un ordenador extremadamente rápido que puede realizar cientos de millones de instrucciones por segundo.
DISPOSITIVOS
DE ENTRADA
DISPOSITIVOS
DE SALIDA
UNIDAD DE
CONTROL
UNIDAD DE
ARITMÉTICA
Y LÓGICA
C.P.U.
MEMORIA
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 5
Nota: No se dará más detalle sobre los ordenadores pues nos tomaría todo el semestre y no es el objetivo del curso.
2. EL SOFTWARE.
Las operaciones que debe realizar el hardware son especificadas con una lista de
instrucciones, llamadas programas, o software. El software se divide en dos
grandes grupos:
Software del sistema, y Software de aplicaciones.
El software del sistema es el conjunto de programas indispensables para
que la máquina funcione. Estos programas son, básicamente, el Sistema
Operativo, los editores de texto (Word, Writer, etc), los compiladores de
lenguajes de programación y los utilitarios (Microsoft Office, OpenOffice,
antivirus, navegadores, correo electrónico, etc).
o El Sistema Operativo es el software básico de una computadora,
que provee una interfaz entre el resto de programas del ordenador,
los dispositivos de hardware y el usuario. Dirige las operaciones
globales de la computadora, instruye a la computadora para ejecutar
otros programas, administra los recursos de la máquina, coordina el
hardware y organiza archivos y directorios en dispositivos de
almacenamiento de una forma sencilla y transparente para el
usuario. Los principales sistemas operativos son: MS-DOS, Microsoft
Windows, Unix, Mac OS, Solaris, Linux, Android, iOS, etc.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 6
Los programas que realizan tareas concretas (por ejemplo facturación,
contabilidad, análisis estadístico, gestión de negocios, sistemas bancarios,
etc.) se denominan programas de aplicación o software de
aplicaciones.
3. SISTEMA BINARIO Y REPRESENTACIÓN BINARIA DE DATOS.
3.1. SISTEMAS DE NUMERACIÓN.
Sistema de Numeración es el conjunto de elementos o símbolos, operaciones y relaciones que, a través de reglas propias, permite establecer el papel de tales relaciones y operaciones. El más conocido y usado es el sistema de numeración decimal, no es el único y por el contrario los más utilizados en los circuitos digitales son el octal, el hexadecimal y sobre todo el binario. Las computadoras suelen efectuar las operaciones aritméticas utilizando una representación para los datos numéricos basada en el sistema de numeración de base dos conocido como binario natural o simplemente binario. Se utilizan los sistemas octal y hexadecimal (bases 8 y 16) respectivamente para obtener códigos intermedios. A nivel electrónico, utilizar códigos intermedios resulta más favorable que transformar directamente decimales en binarios y al revés.
3.2. El SISTEMA BINARIO.
El sistema de numeración binario es el conjunto de elementos {0, 1} con las operaciones aritméticas (suma, resta, multiplicación) y lógicas (OR, AND y NOT). Los elementos del conjunto o alfabeto binario se denominan cifras binarias o bits. El bit del extremo de la derecha es el bit menos significativo o de menor peso.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 7
El bit del extremo de la izquierda es el bit más significativo o de mayor peso. 3.2.1. TRANSFORMACIÓN DE BINARIO A DECIMAL (ENTEROS). Consiste en multiplicar cada uno de los términos por potencias crecientes de 2 a partir de la coma decimal y hacia la izquierda, y realizar la suma de las operaciones.
Ejemplo: convertir a decimal 101011102
3.2.2. TRANSFORMACIÓN DE DECIMAL (ENTEROS) A BINARIO. Se va dividiendo la cantidad decimal por 2, apuntando los restos, hasta obtener cociente cero. El último resto obtenido es el bit más significativo (MSB) y el primero es el bit menos significativo (LSB).
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 8
3.2.3. OPERACIONES BÁSICAS Y LÓGICAS. Las operaciones más básicas con el sistema binario son la suma, la resta, la multiplicación y la división. Estas operaciones son similares a las del sistema decimal, ya que el sistema binario también es un sistema posicional
Las operaciones binarias lógicas básicas son OR, XOR, AND y NOT, de aquí surgen otras como la NOR, la NAND, la XOR y la XNOR.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 9
La OR responde a la unión entre conjuntos, La AND a la intersección y la NOT al complemento. A continuación se muestra la tabla de verdad de las principales operaciones lógicas binarias.
3.3. REPRESENTACIÓN BINARIA DE DATOS.
El bit es la unidad mínima de almacenamiento empleado en informática, en
cualquier dispositivo digital o en la teoría de la información; con él podemos
represe4ntar dos valores (0 y 1), los ordenadores trabajan internamente con dos
niveles de voltaje: ―apagado‖ (0) y ―encendido‖ (1), por los que su sistema de
numeración natural es el sistema binario.
Cuando se almacena la información no se trabaja a nivel de bit, sino que se
trabaja a nivel de carácter (letras, caracteres especiales, números, etc), que ocupa
un byte, que se compone de 8 bits. El ordenador trabaja con agrupaciones de bits
fáciles de manipular y suelen ser múltiplos de 2, la base del sistema binario. Los
tamaños más comunes son:
Octeto, carácter o byte. Es la agrupación de 8 bits, es el tamaño más
común de información; con él se puede codificar un alfabeto completo
(ASCII estándar).
Palabra. Es el tamaño de información manejada en paralelo por los
componentes del sistema, como la memoria y los buses. Son comunes
palabras de 8, 32, 64, 128, 256 y 512 bits, es decir, 1 byte, 4, 8, 16, 32 y 64
bytes. A mayor tamaño de palabra, mayor es la precisión y la potencia de
cálculo del ordenador.
Lo normal es utilizar los múltiplos del byte: kilobyte (kb), megabyte (Mb), gigabyte
(Gb), etc.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 10
Cualquier información escrita, cualquier texto se puede representar por medio de caracteres. Los caracteres utilizados en informática se suelen clasificar en cinco categorías:
Caracteres alfabéticos: letras mayúsculas y minúsculas del alfabeto
Caracteres numéricos: constituidos por las diez cifras decimales.
Caracteres especiales: símbolos ortográficos y matemáticos no incluidos en los grupos anteriores.
Caracteres geométricos y gráficos: símbolos con los que se representan formas geométricas o iconos elementales:
Caracteres de control: representan órdenes de control, como salto de línea (NL), comienzo de línea (CR), sincronización de una transmisión (SYN), pitido (BEL), etc.
Cuando se introducen textos en un ordenador a través del periférico que corresponda, los caracteres se codifican con un código de entrada/salida, asociando a cada carácter una determinada combinación de n bits. Los elementos del conjunto de caracteres, así como su número m, dependerán del código de E/S utilizado por el programa que interprete el texto introducido así como del periférico que lo codifique. Si utilizamos n bits para codificar m símbolos, el número mínimo de bits necesarios para codificar un conjunto de símbolos depende del cardinal de este conjunto:
Con 2 bits (n=2) podemos hacer 2^2=4 combinaciones, es decir, se podrían codificar 4 símbolos distintos (m=4).
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 11
Con 3 bits (n=3) serían 2^3=8 combinaciones, 8 símbolos (m=8), y así sucesivamente.
Con n bits se podrían codificar m=2^n símbolos distintos.
Dicho de otra forma, para codificar m símbolos distintos se necesitan n bits,
siendo n el menor número natural que verifica:
Los principales códigos de E/S son:
El código ASCII (American Standard Code for Information Interchange)
básico utiliza 7 bits y es uno de los más utilizados actualmente. El código
ASCII extendido usa 8 bits por carácter por lo que se tienen 256 caracteres
diferentes. El problema es que los símbolos codificados son insuficientes
para representar caracteres especiales de idiomas de diversas culturas
como china, japonesa, coreana, etc.
Unicode es un código de E/S propuesto por un consorcio de empresas y entidades que trata de crear aplicaciones capaces de procesar texto de muy diferentes sistemas de escritura. Las características principales son:
o Está reconocido como estándar ISO/IEC 10646. o Cubre la mayoría de los lenguajes actuales. o A cada carácter se le asigna un único código. Todos los símbolos se
representan con un número fijo de bits, 16 concretamente. o Cada carácter está formado por una cadena de 16 bits, pudiendo
codificarse en total 216 = 65356 símbolos diferentes. o No contempla la codificación de caracteres de control. o Incluye caracteres combinados, símbolos como ä, ñ, etc. o No determina la forma o imagen concreta de cada carácter (fuente).
Se puede también representar también sonidos, imágenes, videos, etc., y
cualquier información que se almacene en un computador.
4. ALGORITMOS Y ELEMENTOS QUE LO CONFORMAN.
Un algoritmo es un método para resolver un problema mediante una serie de
pasos precisos, definidos y finitos. Es un conjunto de reglas para resolver
determinado problema describiendo de forma lógica su solución. Cada una de las
acciones de que consta un algoritmo es denominada sentencia (o instrucciones) y
éstas deben ser escritas en términos de cierto lenguaje comprensible para el
computador, que es el lenguaje de programación.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 12
4.1. CARACTERÍSTICAS DE LOS ALGORITMOS.
Los criterios que debe satisfacer un algoritmo (características) son:
o Entrada. Son cero o más parámetros (datos) los cuales son
externamente sustituidas.
o Salida. Al menos un dato es producido.
o Exactitud/precisión. Cada instrucción debe ser clara y sin ambigüedad
(hacen lo que deben hacer).
o Finito. Terminará después de un número finito de pasos.
o Eficiente. Cada instrucción puede ser verificada por una persona con
una prueba manual que satisfaga los requerimientos planteados por el
problema.
o Repetible. Dada una misma entrada, siempre debe dar la misma salida.
4.2. PARTES DE UN ALGORITMO.
Los algoritmos se construyen utilizando elementos simples para que el lenguaje se
parezca más a los lenguajes de programación de alto nivel. Entre ellos se tienen:
4.2.1. TIPOS DE DATOS.
Las diferencias piezas de información con las que un programa trabaja se conocen
colectivamente como “datos”. Todos los datos tienen un “tipo” asociado con
ellos, que determina la naturaleza del conjunto de valores que aquel puede tomar.
Por ejemplo, un dato puede ser un simple caracter, tal como ‗B‘, un valor entero
como 36, un número real como 5.75, una cadena de caracteres como ―Hola
Mundo‖, un valor de verdad como Verdadero o Falso, entre otros.
4.2.2. CONSTANTES Y VARIABLES.
Todos los programas necesitan almacenar datos temporalmente para poder
procesarlos y generar así la salida esperada. Estos datos, a grandes rasgos,
pueden clasificarse en dos grupos:
A un dato cuyo valor no puede cambiar (se mantiene constante) durante la
ejecución de un programa se lo denomina Constante. Las constantes
deben ser declaradas y asignadas un valor antes de su utilización.
Por su parte, los datos de un programa cuyo valor puede cambiar durante la
ejecución del mismo se conocen como Variables. Una variable es, en
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 13
realidad, una posición de memoria con nombre (Nombre de la Variable), y
que contiene un valor (Valor de la Variable). Las variables se asemejan a
cajas o buzones, donde cada una de las cuales tiene un número y contiene
un valor. Existen tantos tipos de variables como tipos de datos diferentes.
4.2.3. SENTENCIAS O INSTRUCCIONES.
Las sentencias describen acciones algorítmicas que pueden ser ejecutadas. En
general, las sentencias se clasifican en ejecutables (especifican, por ejemplo,
operaciones de cálculos aritméticos y entradas/salidas de datos) y no ejecutables
(no realizan acciones concretas ni afectan a la ejecución del programa, sino que
ayudan a su legibilidad) como la declaración de variables.
Las sentencias se clasifican, según su tipo y número, en:
Sentencias Simples: Son sentencias que no contiene ninguna otra
sentencia. El ejemplo más típico de sentencia simple es la sentencia de
asignación, la cual se utiliza para almacenar un valor en una variable. La
operación de asignación se suele representar en pseudocódigo con el
símbolo ‗‘, para denotar que el valor situado a su derecha se almacena en
la variable situada a la izquierda:
o variable Valor
o Ejemplo: suma0 (la asignación sólo será válida si el valor es
válido para el tipo de dato definido para la variable).
Otros ejemplos de sentencias simples son las de entrada/salida.
Sentencias estructuradas: Son sentencias compuestas de otras
sentencias que se ejecutan en secuencia, condicionalmente o
repetidamente.
4.2.4. OPERADORES Y EXPRESIONES.
Las variables y constantes se pueden procesar utilizando operaciones y funciones
adecuadas para sus tipos.
Se denomina expresión a un conjunto de variables y / o constantes unidas por
operadores.
Un operador es un símbolo o palabra que significa que se ha de realizar cierta
acción entre uno o dos valores que son llamados operandos.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 14
Si en una expresión existe más de una operación debe tenerse en cuenta que
existen una serie de reglas para definir la prioridad en la que éstas se realizarán.
Por este motivo es que se suelen utilizar los paréntesis para establecer la prioridad
de aplicación de los operandos.
Existen diversos tipos de operadores, por ejemplo:
Aritméticos: Son apropiados únicamente para tipos numéricos. Ejemplos
de operadores aritméticos son ― + ‖, ― - ‖, ― * ‖ y ― / ‖, etc., los cuales permiten
obtener el resultado de la suma, la resta, la multiplicación y la división de
dos datos respectivamente. Su resultado es un número.
De relación: Los operadores de relación (o relacionales) se utilizan para
expresar condiciones y describen una relación entre dos valores. Ejemplos
de operadores relacionales son ― < ‖ (Menor que), ― >‖ (Mayor que), ― = ‖
(Igual a) y ― <> ‖ (Distinto a), etc. Su resultado es un valor de verdad.
Los operadores aritméticos y los relacionales se utilizan de la siguiente
forma: variable o constante operador variable o constante. Por ejemplo: a +
b, c/d, a<b, c<>d, etc.
Lógicos: Estos operadores se utilizan con constantes lógicas de forma
similar al modo en que los operadores aritméticos se utilizan con las
constantes numéricas. Estos operadores trabajan con operandos que son
expresiones lógicas. La operación and (y) combina dos condiciones simples
y produce un resultado verdadero sólo si los dos operandos son
verdaderos. La operación or (o) es verdadera si uno de los dos operandos
es verdadero. La operación not (no) actúa sobre una sola condición simple
u operando y simplemente niega (o invierte) su valor. Su resultado en es
valor de verdad. Existen otros operadores lógicos además de los
mencionados.
Ejemplo de expresión: Cos (2*pi * X) + 7.69 * X
4.2.5. ESTRUCTURAS DE CONTROL.
El concepto de flujo de control a través de un algoritmo y luego del programa se
refiere al orden en que se ejecutan las acciones individuales del mismo. Aunque
un flujo normal de un programa estructurado es lineal, existen métodos que
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 15
permiten salir del flujo lineal a través del uso de las llamadas estructuras de
control.
Las estructuras de control de un lenguaje de programación son métodos para
especificar el orden en que las instrucciones de un algoritmo se ejecutarán. Estas
estructuras son, por consiguiente, fundamentales en los lenguajes de
programación y en los diseños de los algoritmos.
Las estructuras de control son:
Secuencia: Sucesión simple de dos o más operaciones (una tras otra).
De Selección/Condicionales: Bifurcación condicional de una o más
operaciones.
De Repetición o Iteración: Repetición de una operación mientras se
cumple una condición.
4.3. PASOS PARA CREAR UN ALGORITMO.
Para diseñar un algoritmo se debe comenzar por identificar las tareas más
importantes para resolver el problema y disponerlas en el orden en que han de ser
ejecutadas. Los pasos para crear un algoritmo son:
Análisis del problema. Para resolver cualquier problema, se debe
comprenderlo completamente.
Diseño del algoritmo. Se describen los pasos para resolver el problema. Es
mejor solucionar problemas pequeños.
Prueba del algoritmo. Se realiza las pruebas manuales necesarias para
comprobar que el algoritmo arroje los resultados deseados.
En general, los algoritmos reciben datos de entrada, los procesa y genera la
salida.
El proceso se refiere a los cálculos que se deben hacer para obtener la salida
deseada. A partir de los datos de entrada se consigue la salida.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 16
Los algoritmos generalmente se escriben en diagramas de flujo y pseudocódigo.
El primero trabaja con representaciones gráficas, el segundo con un lenguaje
especial (más adelante se describirá a detalle éstos conceptos).
5. CONCEPTOS BÁSICOS DE PROGRAMACIÓN.
Es un proceso para convertir especificaciones generales de un sistema en
instrucciones utilizables por la máquina, que produzcan los resultados deseados.
Se le conoce también como desarrollo de software.
5.1. PROGRAMA.
Es una lista de instrucciones que la computadora debe seguir para procesar datos
y convertirlos en información. Las instrucciones se componen de enunciados
usados en lenguajes de programación como Pascal, Java, C, C#, etc.
5.1.1. CARACTERÍSTICAS DEL PROGRAMA.
Debe ser confiable y funcional.
Advertir errores de entrada obvios y comunes.
Documentado adecuadamente.
Ser comprensible.
Codificado en el lenguaje apropiado.
5.2. APLICACIÓN INFORMÁTICA.
Es el conjunto de uno a varios programas.
5.3. SISTEMA INFORMÁTICO.
En el conjunto de elementos necesarios (computadora, terminales, impresoras,
etc.) para la realización y explotación de aplicaciones informáticas.
5.4. DATOS.
Son las características propias de cualquier entidad. Por ejemplo: los datos de una
persona como su edad, fecha de nacimiento, domicilio, número de teléfono, etc.
5.5. INFORMACIÓN.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 17
Es el conocimiento relevante producido como resultado del procesamiento de
datos y adquirido por la gente para realzar el entendimiento y cumplir ciertos
propósitos.
5.6. PROCESAMIENTO DE DATOS.
Consiste en la recolección de datos de entrada que son evaluados y ordenados
para ser colocados de manera que produzcan información útil.
5.6.1. ACTIVIDADES DEL PROCESAMIENTO DE DATOS.
Captura de datos de entrada
Manejo de los datos (incluye clasificación, ordenación, transformación,
cálculos, etc)
Administración de la salida resultante.
6. RESOLUCIÓN DE PROBLEMAS CON COMPUTADORA - DESARROLLO
DE SOFTWARE.
El proceso de resolución de un problema con una computadora conduce a la
escritura de un programa, y a su ejecución en la misma. Aunque el proceso de
diseñar programas es, esencialmente, un proceso creativo, se pueden considerar
una serie de fases o pasos comunes que generalmente deben seguir todos los
programadores. Las fases de resolución de un problema con computadoras son:
- Análisis del problema
- Diseño del algoritmo solución
- Codificación
- Compilación y Ejecución
- Verificación
- Depuración
- Documentación
- Mantenimiento
El proceso de crear y mantener programas de computación se denomina
Desarrollo de Software o Ciclo de Vida de Desarrollo de Software.
Las dos primeras fases conducen a un diseño detallado escrito en forma de
algoritmo. Como habíamos mencionado, un algoritmo es un método para resolver
un problema mediante una serie de pasos (instrucciones) precisos, definidos y
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 18
finitos. Durante la tercer etapa (codificación) se implementa (poner en
funcionamiento) el algoritmo en un código escrito en un lenguaje de programación,
reflejando las ideas desarrolladas en la fase de análisis y diseño.
La fase de compilación y ejecución traduce y ejecuta el programa. En las fases de
verificación y depuración el programador busca errores de las etapas anteriores y
los elimina. Cuanto más tiempo se invierta en la fase de análisis y diseño, menor
será el tiempo necesario para depurar el programa. Por último, debe realizarse la
documentación del mismo.
Los programas son mantenidos en el tiempo, pues se realizan mejoras o se
aumenta funcionalidad a los mismos.
6.1. PASOS DEL DESARROLLO DE SOFTWARE.
6.1.1. ANÁLISIS DEL PROBLEMA.
Se conoce también como especificación, definición o análisis del problema. En
este paso se determinan la información inicial para la elaboración del programa.
Es donde se determina qué es lo que debe resolverse con el computador, de qué
presupuestos se debe partir... en definitiva, el planteamiento del problema.
Se requieren de cinco tareas:
1. Determinación de objetivos del programa. Debe definirse claramente los
problemas particulares que deberán ser resueltos o las tareas que hay que
realizar, esto nos permitirá saber qué es lo que se pretende solucionar y nos
proporcionará información útil para el planeamiento de la solución.
2. Determinación de la salida deseada. Los datos seleccionados deben ser
arreglados en una forma ordenada para producir información. Esta salida
podría ser una salida de impresión, de presentación en el monitor, etc.
3. Determinación de los datos de entrada. Una vez identificada la salida que se
desea, se pueden determinar los datos de entrada y la fuente de estos datos.
Los datos deben ser recolectados y analizados.
4. Determinación de los requerimientos de procesamiento. Aquí se definen
las tareas de procesamiento que deben desempeñarse para que los datos de
entrada se conviertan en una salida.
5. Documentación de las especificaciones del programa. Es importante
disponer de documentación permanente. Deben registrarse todos los datos
necesarios para el procesamiento requerido. Esto conduce al siguiente paso
del diseño del programa.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 19
6.1.2. DISEÑO DEL ALGORITMO SOLUCIÓN.
Es diseñar cualquier sistema nuevo o las aplicaciones que se requieren para
satisfacer las necesidades. Esta actividad se debe dividir en:
Operaciones de entrada/salida.
Cálculos.
Lógica/ comparación.
Almacenamiento/ consulta.
En este paso se genera una solución con técnicas de programación como diseño
descendente de programas, pseudocódigos, diagramas de flujo y estructuras
lógicas.
6.1.3. CODIFICACIÓN DEL PROGRAMA.
Es la generación real del programa con un lenguaje de programación. En esta
etapa se hace uso de la lógica que desarrolló en el paso del diseño del programa
para efectivamente generar un programa. Se debe seleccionar el lenguaje
apropiado para resolver el problema.
6.1.4. COMPILACIÓN Y EJECUCIÓN.
En la fase de compilación y ejecución, el compilador comprueba la sintaxis y
semántica del programa, lo traduce y se ejecuta el programa.
6.1.5. PRUEBAS - VERIFICACIÓN.
Consiste en verificar la funcionalidad del programa a través de varios métodos
para detectar errores posibles.
Chequeo de Escritorio. El programador se sienta frente a un escritorio y
corrige una impresión del programa. Revisa el listado línea por línea en busca
de errores de sintaxis y lógica.
Prueba manual de datos de muestra. Se corre el programa en forma manual
aplicando datos tanto correctos como incorrectos para comprobar que funciona
correctamente.
Intento de Traducción. El programa corre en una computadora usando un
programa traductor para convertirlo a lenguaje de máquina. Para ello debe
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 20
estar ya libre de errores de sintaxis, de lo contrario serán identificados por el
programa de traducción.
Prueba de datos de muestra en la computadora. Después del intento de
traducción y corregidos los errores de sintaxis, se procede a buscar errores de
lógica utilizando diferentes datos de muestra.
Prueba por un grupo selecto de usuarios potenciales. Esto se conoce
como prueba beta. Se trata por lo general del paso final en la prueba de un
programa. Usuarios potenciales ponen a prueba el programa y ofrecen
retroalimentación.
6.1.6. DEPURACIÓN.
Depurar es correr el programa en una computadora y corregir las partes que no
funcionan. En esta fase se comprueba el funcionamiento de cada programa y esto
se hace con datos reales o ficticios. Cuando los programas están depurados, se
prueban. Cuando los programas se depuran, se pueden encontrar los siguientes
errores:
Errores de sintaxis o de compilación. Es una violación de las reglas del
lenguaje de programación. Son más fáciles de corregir, ya que son detectados
por el compilador (posible error de escritura), el cual dará información sobre el
lugar donde está y la naturaleza de cada uno de ellos mediante un mensaje de
error.
Errores de Ejecución. Se deben generalmente a operaciones no permitidas
como dividir por cero, leer un dato no numérico en una variable numérica,
exceder un rango de valores permitidos, etc. Se detectan porque se produce
una parada anormal del programa durante su ejecución.
Errores de Lógica. Corresponden a la obtención de resultados que no son
correctos y la única manera de detectarlos es realizando suficientes pruebas
del programa. Son los más difíciles de corregir, no sólo por la dificultad de
detectarlos, sino porque se deben a la propia concepción y diseño del
programa.
Errores de Especificación. Es el peor tipo de error y el más difícil de corregir.
Se deben a mal diseño del programa posiblemente por mala comunicación
usuario-programador y se detectan cuando ya se ha concluido el diseño e
incluso cuando el programa está en producción (funcionando), lo cual puede
implicar repetir gran parte del trabajo realizado.
6.1.7. DOCUMENTACIÓN DE PROGRAMA.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 21
Consiste en describir por escrito a nivel técnico los procedimientos relacionados
con el programa y su modo de uso. También se debe documentar el programa
para que sea más entendible.
¿Para quiénes es la documentación?
Los documentos que deben elaborarse son: Manual de Usuario y Manual Técnico.
A los usuarios se les elabora un manual de referencia o de usuario para que
aprendan a utilizar el programa. Esto se hace a través de capacitaciones y revisión
de la documentación del manual de usuario. El manual del usuario no está escrito
a nivel técnico sino al de los distintos usuarios previstos y explica en detalle cómo
usar el programa: descripción de las tareas que realiza el programa, instrucciones
necesarias para su instalación puesta en marcha y funcionamiento,
recomendaciones de uso, menús de opciones, método de entrada y salida de
datos, mensajes de error, recuperación de errores, etc.
A los operadores por si se presentan mensajes de error, sepan cómo responder a
ellos. Además que se encargan de darle soporte técnico al programa.
A los programadores a través del manual técnico para que recuerden aspectos
de la elaboración del programa o en caso que otras personas puedan actualizarlo
o modificarlo (darle mantenimiento) y no son necesariamente las personas que lo
diseñaron. Es por ello, que la documentación debe contener algoritmos y
diagramas de flujo de los diferentes módulos que lo constituyen y las relaciones
que se establecen entre ellos; listados del programa, corridas, descripción de
variables que se emplean en cada módulo, cuáles son comunes a diferentes
módulos y cuáles locales; descripción de los ficheros de cada módulo y todo lo
que sea de importancia para un programador. También se documenta
técnicamente mediante diagramas UML (Unified Modeling Language).
A los analistas de sistemas que son las personas que deberán proporcionar toda
la información al programador. Estos se encargan de hacer una investigación
previa de cómo realizar el programa y documentar con las herramientas
necesarias para que el programador pueda desarrollar el sistema en algún
lenguaje de programación adecuado.
6.1.8. MANTENIMIENTO DEL PROGRAMA.
Es el paso final del desarrollo del software. Alrededor del 75% del costo total del
ciclo de vida de un programa se destina al mantenimiento. El propósito del
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 22
mantenimiento es garantizar que los programas en uso estén libres de errores de
operación y sean eficientes y efectivos, además que los sistemas evolucionan en
el tiempo y su funcionalidad es aumentada o mejorada de acuerdo a las
necesidades de los usuarios.
7. TIPOS Y PARADIGMAS DE PROGRAMACIÓN.
Existen varios tipos o técnicas de programación, en la mayoría de casos, las
técnicas se centran en programación estructurada, modular y orientada a objetos.
A continuación, se presenta brevemente las principales técnicas de programación:
7.1. PROGRAMACIÓN ESTRUCTURADA.
Programación Estructurada es una técnica en la cual la estructura de un
programa, esto es, la interpelación de sus partes se realiza tan claramente como
es posible mediante el uso de tres estructuras de control:
Secuencia: Sucesión simple de dos o más operaciones (una tras otra).
Selección/Condicional: Bifurcación condicional de una o más
operaciones.
Repetición: Repetición de una operación mientras se cumple una
condición.
Estos tres tipos de estructuras lógicas de control pueden ser combinados para
producir programas que manejen cualquier tarea de procesamiento de
información.
Una característica importante en un programa estructurado es que puede ser leído
en secuencia, desde el comienzo hasta el final sin perder la continuidad de la
tarea que cumple el programa, de esta manera la comprensión y lectura de un
programa es muy sencilla y se torna fácil el encontrar errores.
7.2. PROGRAMACIÓN MODULAR.
La programación modular consta de varias secciones dividas de forma que
interactúan a través de llamadas a funciones o procedimientos, que integran el
programa en su totalidad.
En la programación modular, el programa principal coordina las llamadas a los
módulos secundarios (subprogramas) y pasa los datos necesarios en forma de
parámetros.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 23
A su vez, cada módulo puede contener sus propios datos y llamar a otros módulos
o funciones.
7.3. PROGRAMACIÓN FUNCIONAL.
Se caracteriza principalmente por permitir declarar y llamar a funciones dentro de
otras funciones.
7.4. PROGRAMACIÓN ORIENTADA A OBJETOS (POO).
La programación orientada a objetos o POO (OOP según sus siglas en inglés)
es un paradigma de programación que usa objetos y sus interacciones, para
diseñar aplicaciones y programas informáticos. Está basado en varias técnicas,
incluyendo herencia, abstracción, polimorfismo y encapsulamiento
Los objetos son entidades que tienen un determinado estado (atributos), comportamiento (método) e identidad:
El estado está compuesto de datos, será uno o varios atributos a los que se habrán asignado unos valores concretos (datos).
El comportamiento está definido por los métodos o mensajes a los que sabe responder dicho objeto, es decir, qué operaciones se pueden realizar con él.
La identidad es una propiedad de un objeto que lo diferencia del resto, dicho con otras palabras, es su identificador (concepto análogo al de identificador de una variable o una constante).
Un objeto contiene toda la información que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases e incluso frente a objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos. A su vez, los objetos disponen de mecanismos de interacción llamados métodos, que favorecen la comunicación entre ellos. Esta comunicación favorece a su vez el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separa el estado y el comportamiento.
Los métodos (comportamiento) y atributos (estado) están estrechamente relacionados por la propiedad de conjunto. Esta propiedad destaca que una clase requiere de métodos para poder tratar los atributos con los que cuenta. De esta manera se estaría realizando una programación estructurada camuflada en un lenguaje de programación orientado a objetos.
La POO difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 24
programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada solo se escriben funciones que procesan datos. Los programadores que emplean POO, en cambio, primero definen objetos para luego enviarles mensajes solicitándoles que realicen sus métodos por sí mismos.
7.5. PROGRAMACIÓN DIRIGIDA POR EVENTOS.
La programación dirigida por eventos es un paradigma de programación en el que tanto la estructura como la ejecución de los programas van determinados por los sucesos que ocurran en el sistema, definidos por el usuario o que ellos mismos provoquen.
Mientras en la programación estructurada (o secuencial) es el programador el que define cuál va a ser el flujo del programa, en la programación dirigida por eventos será el propio usuario —o lo que sea que esté accionando el programa— el que dirija el flujo del programa. Aunque en la programación secuencial puede haber intervención de un agente externo al programa, estas intervenciones ocurrirán cuando el programador lo haya determinado, y no en cualquier momento como puede ser en el caso de la programación dirigida por eventos.
El creador de un programa dirigido por eventos debe definir los eventos que manejarán su programa y las acciones que se realizarán al producirse cada uno de ellos, lo que se conoce como el administrador de evento.
En la programación dirigida por eventos, al ejecutarse el programa esperará hasta que se produzca algún evento. Cuando alguno de los eventos esperados por el programa tenga lugar, el programa pasará a ejecutar el código del correspondiente administrador de evento. Por ejemplo, si el evento consiste en que el usuario ha hecho click en el botón de play de un reproductor de películas, se ejecutará el código del administrador de evento, que será el que haga que la película se muestre por pantalla.
7.6. PROGRAMACIÓN DE SCRIPTS.
Un script es un programa que se escribe con una sintaxis particular generalmente
en un archivo de texto plano que permanece en su forma original, para que sea
interpretado comando por comando cada vez que se ejecuta por un intérprete o un
shell.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 25
Un script es básicamente un programa que llama a otros programas, con la
posibilidad de hacer algún tipo de procesamiento propio (como control de flujo,
operaciones matemáticas simples, etc).
7.7. PROGRAMACIÓN CONCURRENTE Y PARALELA.
La programación paralela es una técnica de programación en la que muchas
instrucciones se ejecutan simultáneamente. Se basa en el principio de que los
problemas grandes se pueden dividir en partes más pequeñas que pueden
resolverse de forma concurrente ("en paralelo").
Se suele utilizar para controlar los accesos de usuarios y programas a un recurso
de forma simultánea. Se trata de una programación más lenta y laboriosa.
La computación paralela emplea elementos de procesamiento múltiple
simultáneamente para resolver un problema. Esto se logra dividiendo el problema
en partes independientes de tal manera que cada elemento de procesamiento
pueda ejecutar su parte del algoritmo a la misma vez que los demás. Los
elementos de procesamiento pueden ser diversos e incluir recursos tales como un
único ordenador con muchos procesadores, varios ordenadores en red, hardware
especializado o una combinación de los anteriores.
7.8. PROGRAMACIÓN LÓGICA.
Se suele utilizar en la inteligencia artificial, principalmente en juegos y en sistemas
expertos. Se trata de una programación basada en el cálculo de predicados (una
teoría matemática que permite lograr que un ordenador basándose en hecho y
reglas lógicas, pueda dar soluciones inteligentes).
7.9. PROGRAMACIÓN DISTRIBUIDA.
La programación distribuida es un paradigma de programación enfocado en desarrollar sistemas distribuidos, abiertos, escalables, transparentes y tolerantes a fallos. Este paradigma es el resultado natural del uso de las computadoras y las redes.
Casi cualquier lenguaje de programación que tenga acceso al máximo al hardware del sistema puede manejar la programación distribuida, considerando una buena cantidad de tiempo y código.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 26
La programación distribuida típicamente cae en alguna de las varias arquitecturas básicas o arquitecturas: cliente-servidor, 3-tier, n-tier, objetos distribuidos, entre otras además.
7.10. PROGRAMACIÓN WEB.
La programación web permite la creación de sitios dinámicos en Internet. Esto se consigue generando los contenidos del sitio a través de una base de datos mediante lenguajes de script. Con la programación web podemos desarrollar sitios dinámicos como periódicos digitales o tiendas virtuales.
La programación web, parte de las siglas WWW, que significan World Wide Web o telaraña mundial.
Para realizar una página con la programación web, se deben tener claros, tres conceptos fundamentales:
El URL (Uniform Resource Locators), es un sistema con el cual se localiza un recurso dentro de la red, este recurso puede ser una página web, un servicio o cualquier otra cosa. En resumen, el URL no es más que un nombre, que identifica una computadora, dentro de esa computadora un archivo que indica el camino al recurso que se solicita.
HTTP (Hypertext Transfer Protocol), que es el protocolo encargado de llevar la información que contiene una página Web por toda la red de internet.
HTML (Hypertext Markup Language), es el lenguaje necesario cuya funcionalidad es la de representar cualquier clase de información que se encuentre almacenada en una página Web.
En la programación web, el HTML es el lenguaje que permite codificar o preparar documentos de hipertexto, que viene a ser el lenguaje común para la construcción de una página Web.
Las aplicaciones web residen en un servidor web como Apache, Internet Information Server (IIS), etc., en cambio el cliente es un navegador web como Internet Explorer, Google Chrome, Apple Safari, Mozilla Firefox, etc.
8. LENGUAJES DE PROGRAMACIÓN.
Es un conjunto de símbolos junto a un conjunto de reglas para combinar dichos
símbolos que se usan para escribir programas de computadoras que pueden ser
entendidos por ellas. Constan de un léxico, una sintaxis y una semántica.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 27
Léxico: Conjunto de símbolos permitidos o vocabulario.
Sintaxis: Reglas que indican cómo realizar las construcciones del lenguaje.
Semántica: Reglas que permiten determinar el significado de cualquier
construcción del lenguaje.
Éstos se clasifican en tres grandes categorías: máquina, bajo nivel (ensamblador,
o assembler) y alto nivel.
8.1. LENGUAJES DE MAQUINA.
Los lenguajes de máquina son aquellos cuyas instrucciones son directamente
entendibles por la computadora, y no necesitan traducción posterior para que el
CPU pueda comprender y ejecutar el programa. La programación en lenguaje de
máquina es difícil, ya que implica escribir directamente en un sistema binario
(ceros y unos), por eso se necesitan lenguajes que permitan simplificar ese
proceso.
8.2. LENGUAJES DE BAJO NIVEL.
Los lenguajes de bajo nivel fueron diseñados con ese fin. Éstos son dependientes
de la arquitectura física de la computadora y de un conjunto específico de
instrucciones para el CPU, y los programas escritos en ellos deben ser traducidos
a lenguaje máquina para poder ser ejecutados. Un lenguaje típico de bajo nivel es
el lenguaje ensamblador (Assembler).
8.3. LENGUAJES DE ALTO NIVEL.
Los lenguajes de programación de alto nivel son aquellos en los que las
instrucciones o sentencias a la computadora son escritas con palabras similares a
los lenguajes humanos – en general lenguaje inglés – lo que facilita la escritura y
comprensión por parte del programador. Una propiedad de los lenguajes de alto
nivel es que son independientes de la máquina, esto es, las sentencias del
programa no dependen del diseño de hardware de una computadora específica.
Los programas escritos en lenguajes de alto nivel, al igual que los escritos en
lenguajes de bajo nivel, no son entendibles directamente por la máquina, sino que
necesitan ser traducidos a instrucciones en lenguaje máquina que entiendan las
computadoras. Los programas escritos en un lenguaje de alto nivel se llaman
Programas Fuente.
Existen diversos tipos de lenguajes de programación de alto nivel, según su
evolución temporal y el uso que se les quiera dar. Algunos ejemplos de tipos de
lenguajes de alto nivel son:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 28
Estructurados - procedimentales: Basic, C, Pascal, Cobol, Fortran, etc.
Orientados a Objetos: SmallTalk, C#, Visual Basic.NET, C++, Java,
Objetive-C, etc.
Declarativos: Lisp, Prolog, etc.
Funcionales: AML, CAML, etc.
Dirigidos por eventos: Visual Basic, etc
De scripting:
o Lenguaje de control de tareas y shells: cmd.exe, csh, AppleScript,
sh, etc.
o GUI Scripting: AutoHotkey, AutoIt, Expect, Automator, etc.
o Lenguaje scripting de aplicaciones específicas: ActionScript en
Flash, MATLAB, mIRC, etc.
De programación web: Del lado del servidor se tiene ASP
(Active Server Pages), JSP (JavaServer Pages), etc., y del
lado del cliente lenguajes como JavaScript, JScript, VBScript,
etc.
o Lenguajes de procesamiento de textos: AWK, Perl, sed, XSLT.
o Lenguajes dinámicos de propósito general: Groovy, Lisp, Perl, PHP,
Python, Ruby, etc.
Multiparadigma: Java, C#, Visual Basic.NET, C++, Delphi, PHP, Visual
Basic, etc.
8.4. COMPILACIÓN, COMPILADORES E INTÉRPRETES.
Los compiladores son programas se encargan de traducir lo que haya escrito en
lenguaje de alto nivel (código o programa fuente) y lo convierten en un programa
llamado código o programa objeto (casi ejecutable). El proceso de traducción de
un programa fuente a un programa objeto se denomina Compilación.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 29
8.4.1. COMPILADOR E INTÉRPRETE.
Compilador un programa que traduce un programa escrito en un lenguaje de alto
nivel, por ejemplo C++, en un programa en lenguaje de máquina que la
computadora es capaz de entender y ejecutar directamente. Un compilador es un
tipo especial de programa, en cuanto a que sus entradas o datos son algún
programa y su salida es otro programa. Para evitar confusiones, solemos llamar
programa fuente o código fuente al programa de entrada, y programa objeto o
código objeto a la versión traducida que el compilador produce. Código se usa
frecuentemente para referirse a un programa o a una parte de él, sobre todo
cuando se habla de programas objeto.
El compilador, informa al usuario de la presencia de errores en el programa fuente,
pasándose a crear el programa objeto cuando está libre de errores. El código
objeto puede ser ejecutado posteriormente. Una vez traducido un programa, su
ejecución es independiente de su compilación. Involucra dos pasos en su
operación:
Convertir código fuente a objeto.
Ejecutar el código objeto.
Al tener el código objeto, el programa se ejecuta más rápido.
En cambio, un intérprete permite que un programa fuente escrito en un lenguaje
vaya traduciéndose y ejecutándose directamente sentencia a sentencia por la
computadora. Convierte uno por uno los enunciados del código fuente a código
objeto antes de ser ejecutados. Convierte y ejecuta el programa en línea al mismo
tiempo. Ejemplo: Basic estándar y JavaScript.
Las ventajas de los intérpretes son:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 30
Resulta más fácil localizar y corregir errores (depuración de programas)
Son más pedagógicos para aprender a programar.
El programa es más fácil de desarrollar.
Para cada una de las líneas se ejecuta el siguiente proceso:
Análisis de la instrucción de esa línea.
Traducción de esa línea (si ya está correcta) a código objeto.
Ejecución de esa línea.
Con el intérprete, cada vez que necesitamos ejecutar el programa tenemos que
volver a analizarlo porque no hay código objeto.
Con el compilador, aunque más lenta la traducción, sólo se realiza una vez.
9. LA LÓGICA COMO ASPECTO FUNDAMENTAL DE LA PROGRAMACIÓN.
Es la capacidad de pensar racionalmente acerca de soluciones alternativas y los
resultados de aplicarlas, y por lo tanto, de hacer elecciones inteligentes.
Es el estudio crítico del razonamiento y tiene un valor teórico y práctico.
Es el estudio de los métodos y principios usados al distinguir entre los
argumentos correctos (buenos) y los argumentos incorrectos (malos).
En un sentido amplio, es el estudio del correcto razonamiento.
La lógica se remonta a la época de Aristóteles en el siglo IV antes de Cristo. En
lógica, Aristóteles desarrolló reglas para establecer un razonamiento encadenado
que, si se respetaban, no producirían nunca falsas conclusiones si la reflexión
partía de premisas verdaderas (reglas de validez). En el ejemplo más famoso,
"Todos los humanos son mortales" y "Todos los griegos son humanos", se llega a
la conclusión válida de que "Todos los griegos son mortales"
9.1. ¿QUÉ ES LÓGICA?
Lógica Deductiva. Es la que se encarga de determinar la validez o invalidez
de los argumentos. Permite proporcionar la simbología que nos servirá para
facilitar el desarrollo de la capacidad de análisis de problemas, para obtener
una solución posible.
Argumentos. Cuando el razonamiento se expresa con palabras, recibe el
nombre de "argumento". Un argumento es un grupo cualquiera de
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 31
proposiciones o enunciados que forman premisas y conclusiones. Este puede
constar de varias premisas pero de una sola conclusión.
Premisas y Conclusión. Las premisas de un argumento son proposiciones
afirmadas como fundamento o razones para aceptar una conclusión. La
conclusión es la proposición afirmada que se basa en las otras proposiciones o
premisas. Una proposición puede ser premisa en un argumento y conclusión
en otro.
Por ejemplo: "Todos los hombres son mortales". Aparece como premisa en el
siguiente argumento:
"Todos los hombres son mortales"
"Sócrates es un hombre"
"Por lo tanto, Sócrates es mortal".
Y como conclusión en el siguiente argumento:
" Todos los animales son mortales"
"Todos los hombres son animales"
"Luego, todos los hombres son mortales"
Expresiones como "por tanto", "por lo cual", "de ello se deduce", sirven para
introducir la conclusión de un argumento, en tanto que "pues" y "porque" se
emplean para introducir las premisas.
Otro Ejemplo:
"Todos se aburren en la conferencia".
"Ninguno de los que se aburren presta atención".
"Por consiguiente, ninguno de los asistentes está prestando atención".
Hay dos condiciones que debe satisfacer un argumento para establecer la
verdad de su conclusión: Debe ser válido y todas sus premisas deben ser
verdaderas.
Enunciado Simple: Es el que no contiene otro enunciado como parte
componente. Ej. "Las rosas son rojas"
Enunciado compuesto. Es el que se compone de varios enunciados. Ej.
"Las rosas son rojas y las violetas son azules". Cuando los enunciados
se unen por la conjunción ―Y‖, se denominan Enunciados conyuntos.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 32
Cuando los enunciados se unen por el conector ―O‖, se denominan
Enunciados disyuntos. De aquí surgen las siguientes tablas de verdad:
Ejemplos de aplicación de estas tablas de verdad:
Si A y B son valores verdaderos y P y Q son falsos, cuál es el valor de
verdad de la siguiente expresión: not (A or B) and (P and not Q)
Solución: Evaluamos primero los paréntesis, comenzando con el primero.
En la tabla OR buscamos a qué equivalen Verdadero or Verdadero (porque
A y B son verdaderos según el enunciado). Obtenemos que es Verdadero.
Como la expresión está negada, su valor opuesto es Falso. Al evaluar el
segundo paréntesis, Q es falso y al negarlo nos queda verdadero. Luego, si
P es falso nos queda Falso and Verdadero, y esto es igual a Falso.
10. REPRESENTACIÓN GRÁFICA DE LOS ALGORITMOS.
10.1. DESCRIPCIÓN NARRADA.
Este algoritmo es caracterizado porque sigue un proceso de ejecución común y
lógico, describiendo textualmente paso a paso cada una de las actividades a
realizar dentro de una actividad determinada.
Ejemplo: Algoritmo para asistir a clases:
1. Levantarse
2. Bañarse
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 33
3. Vestirse
4. Desayunar
5. Cepillarse los dientes
6. Salir de casa
7. Tomar el autobús
8. Llegar a la Universidad
9. Buscar el aula
10. Ubicarse en un asiento
10.2. PSEUDOCÓDIGO.
Pseudo = falso. El pseudo código no es realmente un código sino una imitación y
una versión abreviada de instrucciones reales para las computadoras. Es una
técnica para diseño de programas que permite definir las estructuras de datos, las
operaciones que se aplicarán a los datos y la lógica que tendrá el programa de
computadora para solucionar un determinado problema. Utiliza un pseudolenguaje
muy parecido a nuestro idioma, pero que respeta las directrices y los elementos de
los lenguajes de programación. Se concibió para superar las dos principales
desventajas de los diagramas de flujo: lento de crear y difícil de modificar sin un
nuevo redibujo.
Ejemplo: Escribir un algoritmo que imprima en pantalla ―Hola Mundo‖.
Proceso HolaMundo
Escribir "Hola Mundo‖;
FinProceso
10.3. DIAGRAMAS DE FLUJO O FLUJOGRAMAS.
Son la representación gráfica de la solución algorítmica de un problema. Para
diseñarlos se utilizan determinados símbolos o figuras que representan una
acción dentro del procedimiento. Utilizan unos símbolos normalizados, con los
pasos del algoritmo escritos en el símbolo adecuado y los símbolos unidos con
flechas, denominadas líneas de flujo, que indican el orden en que los pasos deben
ser ejecutados.
Para su elaboración se sigue las siguientes reglas:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 34
1. Se escribe de arriba hacia abajo y de izquierda a derecha.
2. Siempre se usan flechas verticales u horizontales, jamás curvas.
3. Evitar cruce de flujos.
4. En cada paso expresar una acción concreta.
La secuencia de un flujo normal en una solución de un problema es:
1. Tiene un inicio.
2. Una lectura o entrada de datos.
3. El proceso de datos.
4. Una salida de información.
5. Un final
Ejemplo: Dibujar un diagrama de flujo que imprima en pantalla ―Hola Mundo‖.
Entre las ventajas de usar diagrama de flujos se tiene:
o Rápida comprensión de las relaciones.
o Análisis efectivo de las diferentes secciones del programa.
o Pueden usarse como modelos de trabajo en el diseño de nuevos
programas o sistemas.
o Comunicación con el usuario.
o Documentación adecuada de los programas.
o Codificación eficaz de los programas.
o Depuración y pruebas ordenadas de programas
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 35
Entre las desventajas podemos anotar:
o Diagramas complejos y detallados suelen ser laboriosos en su
planteamiento y diseño.
o Acciones a seguir tras la salida de un símbolo de decisión, pueden ser
difíciles de seguir si existen diferentes caminos.
o No existen normas fijas para la elaboración de los diagramas de flujo que
permitan incluir todos los detalles que el usuario desee introducir.
10.4. INTRODUCCIÒN A UML (Unified Modeling Language).
UML es el lenguaje de modelado de sistemas de software más conocido y utilizado en la actualidad; está respaldado por el OMG (Object Management Group). Es un lenguaje gráfico para visualizar, especificar, construir y documentar un sistema. UML ofrece un estándar para describir un "plano" del sistema (modelo), incluyendo aspectos conceptuales tales como procesos de negocio, funciones del sistema, y aspectos concretos como expresiones de lenguajes de programación, esquemas de bases de datos y componentes reutilizables.
Es importante resaltar que UML es un "lenguaje de modelado" para especificar o para describir métodos o procesos. Se utiliza para definir un sistema, para detallar los artefactos en el sistema y para documentar y construir. En otras palabras, es el lenguaje en el que está descrito el modelo.
Hay que tener en cuenta que el estándar UML no define un proceso de desarrollo específico, tan solo se trata de una notación, es decir, no es una metodología de desarrollo de software.
UML cuenta con varios tipos de diagramas, los cuales muestran diferentes aspectos de las entidades representadas. Estos diagramas son:
10.4.1. DIAGRAMAS UML.
Diagramas de comportamiento. Permiten exhibir comportamientos de un
sistema o de los procesos de las organizaciones.
o Diagrama de caso de uso.
o Diagrama de actividad.
o Diagrama de estado.
o Diagrama de interacción.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 36
Diagramas de Interacción. Es un subconjunto de los diagramas de
comportamiento que permiten enfatizar las interacciones entre los objetos.
o Diagrama de comunicaciones
o Diagrama de secuencia
o Diagrama de tiempo.
Diagramas de estructura. Muestran los elementos de una especificación que
sean independientes del tiempo.
o Diagrama de clases.
o Diagrama de estructura.
o Diagrama de componentes.
o Diagrama despliegue.
o Diagrama de objeto
o Diagrama de paquetes.
11. ENTORNO DE PROGRAMACIÓN INTEGRADO (IDE).
Un entorno de programación es un programa que contiene, además del
compilador, utilitarios y herramientas. Estos elementos están integrados, de modo
que pueden llamarse fácilmente uno a otros durante el proceso de programación.
Por este motivo, a los entornos de programación frecuentemente se los identifica
con la sigla IDE (en inglés, Integrated Development Environment, o Entorne de
programación integrado).
Un entorno de programación típico contiene:
Un editor, que proporciona el medio para introducir el texto y los símbolos que constituyen el código fuente
Un intérprete o un compilador, que convierte el código fuente en instrucciones que la computadora puede comprender y ejecutar.
Un depurador (o debugger), que ayuda a analizar y corregir errores en tiempo de ejecución.
Ayuda (manuales, tutoriales, ejemplos, etc.) integrada.
El proceso de diseño, codificación, depuración y ejecución de un programa es mucho más fácil y rápido cuando se utiliza un buen entorno de programación.
Ejemplos de entorno de programación son: Microsoft Visual Studio, Eclipse, NetBeans.
Nuestro objetivo ahora es escribir algoritmos en pseudocódigo y en diagramas de flujo, para ello usaremos las herramientas PSeInt y JTraductor aunque no son propiamente IDEs. PSeInt es una herramienta en donde se escribe algoritmos en
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 37
pseudocódigo, genera un diagrama de flujo y lo convierte en un programa C++, permite ejecutar el algoritmo paso a paso controlando la velocidad e inspeccionando expresiones, en cambio, JTraductor genera un programa Java. PSeInt es un software con varios años de creación, en cambio JTraductor se basa en PSeInt pero es de reciente creación. 12. PROGRAMACIÓN ESTRUCTURADA.
Recordemos que Programación Estructurada es una técnica en la cual la
estructura de un programa se lo realiza tan claramente como es posible mediante
el uso de tres estructuras de control:
Secuenciales: Sucesión simple de dos o más operaciones (una tras otra).
Selectivas o Condicionales: Bifurcación condicional de una o más
operaciones.
Repetitivas o Iterativas: Repetición de una operación mientras se cumple
una condición.
Escribiremos los algoritmos bajo el paradigma de la programación estructurada, para ello usaremos un pseudolenguaje cuyas características son:
Sintaxis sencilla (sin la complejidad de los lenguajes de programación). Manejo de las estructuras básicas de control. Sólo 3 tipos de datos básicos:
o Numérico: Números, tanto enteros como reales. Para separar decimales se utiliza el punto. Ejemplos: 12 23 0 -2.3 3.14
o Lógico: Sólo puede tomar dos valores: VERDADERO o FALSO.
o Caracter: Caracteres o cadenas de caracteres encerrados entre comillas (pueden ser dobles o simples). Ejemplos 'hola' "hola mundo" '123' 'FALSO' 'etc'. (generalmente se usa comillas simples para un carácter y dobles para cadena de caracteres o texto)
Estructuras de datos: Arreglos.
Todo algoritmo en pseudocógido tiene la siguiente estructura general:
Proceso <NombrePrograma>
<acción 1>;
<acción 2>;
. .
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 38
. <acción n>;
FinProceso
Se inicia con la palabra clave Proceso seguida del nombre del programa, luego le sigue una secuencia de instrucciones (acciones) y finaliza con la palabra FinProceso. Una secuencia de instrucciones es una lista de una o más instrucciones, cada una terminada en punto y coma. No puede haber instrucciones fuera del proceso, aunque si comentarios. Las acciones incluyen operaciones de entrada y salida, asignaciones de variables, condicionales si-entonces o de selección múltiple y/o lazos mientras, repetir o para. Se pueden introducir comentarios luego de una instrucción, o en líneas separadas, mediante el uso de la doble barra ( // ). Todo lo que precede a //, hasta el fin de la línea, no será tomado en cuenta al interpretar el algoritmo. No puede haber instrucciones fuera del programa, aunque si comentarios. Las estructuras no secuenciales pueden anidarse. Es decir, pueden contener otras adentro, pero la estructura contenida debe comenzar y finalizar dentro de la contenedora.
Constantes e identificadores. o Los identificadores deben constar sólo de letras y números,
comenzando siempre con una letra.
o Las constantes de tipo carácter se escriben entre comillas ( " ).
o En las constantes numéricas, el punto ( . ) es el separador decimal.
o Las constates lógicas son Verdadero y Falso.
Definición de variables. La instrucción Definir permite explicitar el tipo de una o más variables. Esta definición puede ser opcional u obligatoria, aunque la asignación de tipos a los datos tiene dos objetivos principales:
1- Detectar errores de operaciones en los programas durante la fase de codificación.
2- Determinar cómo se ejecutarán las operaciones entre datos.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 39
Una operación de suma no tiene sentido con caracteres de texto, sólo con
números. Por consiguiente, si el compilador detecta una operación de suma de
dos caracteres normalmente producirá un error. Incluso entre tipos numéricos
la operación de suma se almacena de modo distinto, ya que los números
enteros y los reales se almacenan de formas distintas en memoria. A menos
que el programa conozca los tipos de datos no puede ejecutar correctamente
la operación de suma.
A los lenguajes que exigen que todos los datos utilizados deban tener sus tipos declarados explícitamente se los conoce como “fuertemente tipados”.
El tipo de un dato puede ser convertido bajo ciertas condiciones a otro tipo. Este mecanismo explícito de conversión de tipos de datos se suele denominar “CAST”.
La sintaxis es:
Definir <var1> , <var2> , … , <varN> Como [Real/Entero/Logico/Caracter] ;
Una variable debe ser definida antes de ser utilizada por primera vez.
Ejemplo: Definir var Como Real; // se define la variable var como Real
Definir acumulador Como Entero; // acumulador es una variable Entero
Asignación.
La instrucción de asignación permite almacenar un valor en una variable.
<variable> <- <expresión> ;
Al ejecutarse la asignación, primero se evalúa la expresión de la derecha y luego se asigna el resultado a la variable de la izquierda. El tipo de la variable y el de la expresión deben coincidir.
Ejemplo:
var<-1.0; // asigna 1.0 a var acumulador<-acumulador +1; // incrementa en 1 el acumulador
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 40
Entradas.
La instrucción Leer permite ingresar información desde el ambiente.
Leer <variablel> , <variable2> , ... ,<variableN> ;
Esta instrucción lee N valores desde el ambiente (en este caso el teclado) y los asigna a las N variables mencionadas. Pueden incluirse una o más variables, por lo tanto el comando leerá uno o más valores.
Ejemplo:
Leer cantidad; Leer valor1, valor2, valor3;
Salidas.
La instrucción Escribir permite mostrar valores al ambiente.
Escribir <exprl> , <expr2> , ... , <exprN> ;
Esta instrucción imprime al ambiente (en este caso en la pantalla) los valores obtenidos de evaluar N expresiones. Dado que puede incluir una o más expresiones, mostrará uno o más valores.
Ejemplo:
Escribir ―Ingrese el nombre: ‖; Escribir ―El Resultado es: ‖ , resp*2 ;
Arreglos.
Los arreglos son estructuras de datos homogéneas (todos sus datos son del mismo tipo) que permiten almacenar un determinado número de datos bajo un mismo identificador, para luego referirse a los mismos utilizando uno o más subíndices.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 41
Para utilizar un arreglo, primero es obligatorio su dimensionamiento, es decir, definirlo declarando los rangos de sus subíndices, lo cual determina cuantos elementos se almacenarán y como se accederá a los mismos,
Dimensionamiento.
La instrucción Dimension permite definir un arreglo, indicando sus dimensiones.
Dimesion <identificador> (<max1>,...,<maxN>);
Esta instrucción define un arreglo con el nombre indicado en <indentificador> y N dimensiones. Los N parámetros indican la cantidad de dimensiones y el valor máximo de cada una de ellas. La cantidad de dimensiones puede ser una o más, y la máxima cantidad de elementos debe ser una expresión numérica positiva. Se pueden definir más de un arreglo en una misma instrucción, separándolos con una coma (,).
Dimension <ident1> (<max11>,..,<max1N>),..,<identM>(<maxM1>,..,<maxMN>);
Es importante notar que es necesario definir un arreglo antes de utilizarlo. Ejemplo:
Definir vector, matriz Como Entero; Dimension vector[100], matriz[10,20];
Operadores y Funciones.
Este pseudolenguaje dispone de un conjunto básico de operadores y funciones que pueden ser utilizados para la construcción de expresiones más o menos complejas. Las siguientes tablas exhiben la totalidad de los operadores de este lenguaje reducido:
Operador Significado Ejemplo
Relacionales
> Mayor que 3>2
< Menor que 'ABC'<'abc'
= Igual que 4=3
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 42
<> Diferente que 4<>3
<= Menor o igual que 'a'<='b'
>= Mayor o igual que 4>=5
Lógicos
& Conjunción (y / and). (7>4) & (2=1) //falso
| Disyunción (o / or). (1=1 | 2=1) //verdadero
~ Negación (no / not). ~(2<5) //falso
Algebraicos
+ Suma
* Multiplicación
/ División
^ Potenciación
La jerarquía de los operadores matemáticos es igual a la del álgebra, aunque puede alterarse mediante el uso de paréntesis.
A continuación se listan las funciones integradas disponibles:
Función Significado
RC(X) Raíz Cuadrada de X
ABS(X) Valor Absoluto de X
LN(X) Logaritmo Natural de X
EXP(X) Función Exponencial de X
SEN(X) Seno de X
COS(X) Coseno de X
ATAN(X) Arcotangente de X
TRUNC(X) Parte entera de X
REDON(X) Entero más cercano a X
Como habíamos mencionado anteriormente, un problema se puede dividir en
acciones elementales o instrucciones, usando un número limitado de estructuras
de control (básicas) y sus combinaciones que pueden servir para resolver dicho
problema
12.1. ESTRUCTURA SECUENCIAL.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 43
Se caracteriza porque una acción se ejecuta detrás de otra. El flujo del programa
coincide con el orden físico en el que se han ido poniendo las instrucciones.
Dentro de este tipo podemos encontrar operaciones de inicio/fin, inicialización de
variables, operaciones de asignación, cálculo, sumarización, etc. Este tipo de
estructura se basa en las 5 fases de que consta todo algoritmo o programa:
1. Definición de variables (Declaración)
2. Inicialización de variables.
3. Lectura de datos.
4. Cálculo.
5. Salida.
Ejemplo 1: Se desea encontrar la longitud y el área de un círculo de radio
ingresado por teclado.
Solución. El objetivo del ejercicio es encontrar la longitud y el área de un círculo
con un radio ingresado por teclado. Las salidas serán entonces la longitud y el
área. (Fase 5 del algoritmo) Sabemos que la longitud de un círculo viene dada por
la fórmula 2 * pi * radio y que el área viene dada por pi * radio al cuadrado. (Fase 4
del algoritmo) Si definimos las variables como: (fase 1 del algoritmo)
long = Longitud, area = área, radio = radio, pi = 3.1416, hagamos el
algoritmo:
Pseudocódigo:
Proceso Algoritmo1
//este algoritmo calcula el área y la longitud de un círculo de radio ingresado por teclado
Definir pi, radio, area, long Como Real; //definición de variables
pi <- 3.1416; //definición de un valor constante
Escribir "Ingrese el radio: "; //despliega en pantalla
Leer radio; //Ingresa por teclado el radio
area <- pi * radio ^ 2; //asignación del valor del área
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 44
long <- 2 * pi * radio ;//asignación del valor de la longitud
Escribir "Area: ", area, " Longitud: ", long; //salida del algoritmo
FinProceso
Diagrama de Flujo:
Ejemplo 2. Leer el sueldo de tres empleados y aplicarles un aumento del 10, 12 y
15% respectivamente. Desplegar el resultado.
Solución.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 45
Salidas: Sueldos finales.
Entradas: Salarios de los empleados.
Datos adicionales: aumentos del 10, 12 y 15%
Cálculos:
Sueldo final = sueldo inicial * (1+porcentaje/100)
Definición de variables:
sueldoFinal1, sueldoFinal2, sueldoFinal3 = los sueldos finales
sueldo1, sueldo2, sueldo3 = salarios de los empleados
Pseudocódigo:
Proceso Algoritmo2
//Leer el sueldo de tres empleados y aplica un aumento del 10, 12 y
//15% respectivamente
Definir sueldo1,sueldo2,sueldo3 Como Real; //definición de variables
Definir sueldoFinal1, sueldoFinal2, sueldoFinal3 Como Real;
sueldo1 <- 0; //inicializamos variables
sueldo2 <- 0;
sueldo3 <- 0;
sueldoFinal1 <- 0;
sueldoFinal2 <- 0;
sueldoFinal3 <- 0;
Escribir "Ingrese el sueldo de los 3 empleados";
Leer sueldo1,sueldo2,sueldo3; //lee los sueldos
sueldoFinal1 <- sueldo1 * 1.10; //incrementa el 10% al sueldo original //y lo asigna en sueldoFinal1
sueldoFinal2 <- sueldo2 * 1.12; //incrementa el 12% al sueldo original
//y lo asigna en sueldoFinal2
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 46
sueldoFinal3 <- sueldo3 * 1.15; //incrementa el 15% al sueldo original
//y lo asigna en sueldoFinal3
Escribir "Sueldos incrementados: ",sueldoFinal1," ",sueldoFinal2," ",sueldoFinal3;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 47
Otras Acciones Secuenciales.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 48
En PSeInt, La instrucción "Borrar Pantalla" (o "Limpiar Pantalla") permite, como su nombre lo indica, borrar la pantalla y colocar el cursor en la esquina superior izquierda.
Ejemplo:
Borrar Pantalla;
La instrucción "Esperar Tecla" detiene su algoritmo hasta que el usuario presione una tecla cualquiera de su teclado.
Ejemplo:
Esperar Tecla;
La instrucción "Esperar" también puede utilizarse para pausar el algoritmo durante un intervalo de tiempo predefinido, indicando a continuación de la palabra clave la longitud y unidad de dicho intervalo. Las unidades válidas son Segundos y Milisegundos.
Ejemplo:
Esperar 3 Segundos;
12.2. ESTRUCTURAS SELECTIVAS O CONDICIONALES.
Con frecuencia nos enfrentamos a situaciones en las que se deben proporcionar
instrucciones alternativas que pueden o no ejecutarse dependiendo de los datos
de entrada, reflejando el cumplimiento o no de una determinada condición. La
realización de acciones alternativas o decisiones se especifican utilizando
condiciones que son verdaderas o falsas. Estas condiciones se llaman
expresiones lógicas, o booleanas. Dado que las expresiones lógicas toman el
valor verdadero o falso, se necesita una sentencia de control que dirija a la
computadora a ejecutar una sentencia si la expresión es verdadera, y otra
sentencia en caso de que sea falsa.
12.2.1. ESTRUCTURA SELECTIVA “SI-ENTONCES” (“IF-THEN”).
La siguiente figura muestra el diagrama de flujo de la estructura ―Si-Entonces‖:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 49
EL pseudocódigo es:
Si <condición>
Entonces
<instrucciones>
Sino
<instrucciones>
FinSi
La estructura ―Si‖ funciona de la siguiente manera:
1. Se evalúa la expresión lógica.
2. Si la expresión toma el valor verdadero (true), se ejecutará la sentencia A y
el control pasará a la sentencia inmediatamente siguiente.
3. Si la expresión toma el valor falso (false), entonces sólo se ejecutará la sentencia B y el control pasa de nuevo inmediatamente a la siguiente sentencia del programa. La cláusula sino (else) es optativa, en ese caso, si la condición es falsa no se ejecuta ninguna instrucción y la ejecución del programa continúa con la instrucción siguiente.
.
Ejemplo 3. Construir un algoritmo que lea la calificación de un alumno en un
examen, escriba "Aprobado" en caso que esa calificación fuese mayor o igual
que 7.
Solución.
Salidas: Mensaje de aprobado si se cumple la condición.
Entradas: Calificación.
Datos adicionales: Un alumno aprueba si la calificación es mayor o igual
que 7.
Variables:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 50
Cal = calificación
Pseudocódigo:
Proceso Algoritmo3
//lee la calificación de un alumno y escribe "Aprobado" si es mayor o
//igual que 7
Definir cal Como Real; //declaro la variable
Escribir "Ingrese la calificación del alumno: ";
Leer cal;
Si cal>=7 Entonces
Escribir "Aprobado";
FinSi
FinProceso.
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 51
Ejemplo 4. Dada la calificación de un alumno en un examen, escriba "Aprobado"
si su calificación es mayor o igual que 7 y "Reprobado" en caso contrario.
Pseudocódigo:
Proceso Algoritmo3
//escribe "Aprobado" si es mayor o igual que 7 o "Reprobado" caso //contrario
Definir cal Como Real; //declaro la variable
Escribir "Ingrese la calificación del alumno: ";
Leer cal;
Si cal>=7 Entonces
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 52
Escribir "Aprobado";
Sino
Escribir "Reprobado";
FinSi
FinProceso
Diagrama de flujo:
Ejemplo 5. Dado como dato el sueldo de un trabajador, aplicar un aumento del
15% si su sueldo es inferior a $1000 y 12% en caso contrario, luego imprimir
el nuevo sueldo del trabajador.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 53
Pseudocódigo:
Proceso Algoritmo5
//aumento el 15% si su sueldo es inferior a $1000 y 12% en caso //contrario
Definir sueldo, nuevoSueldo Como Real; //declaro la variable
Escribir "Ingrese el sueldo del trabajador: ";
Leer sueldo;
Si sueldo<1000 Entonces
NuevoSueldo <- sueldo*1.15;
Sino
NuevoSueldo <- sueldo*1.12;
FinSi
Escribir "El nuevo sueldo es: ", nuevoSueldo;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 54
12.2.2. EXPRESIONES LÓGICAS.
Sirven para plantear alternativas o decisiones y dan como resultado un valor
booleano verdadero o falso, es decir, se cumple o no se cumple la condición. Se
pueden clasificar en simples y complejas. Las simples son las que usan
operadores relacionales y las complejas las que usan operadores lógicos.
Ejemplo 6: Operador lógico Y (―&‖): Una escuela aplica dos exámenes a sus
aspirantes, por lo que cada uno de ellos obtiene dos calificaciones denotadas
como calif1 y calif2. El aspirante que obtenga calificaciones mayores o iguales que
7 en ambos exámenes es aceptado; en caso contrario es rechazado.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 55
Pseudocódigo:
Proceso Algoritmo6
//escribe aceptado si las 2 calificaciones son >= que 7, caso contrario //es rechazado
Definir calif1, calif2 Como Real;
Escribir "Ingrese la nota 1: ";
Leer calif1;
Escribir "Ingrese la nota 2: ";
Leer calif2;
Si ((calif1>=7) & (calif2>=7)) Entonces
Escribir "Estudiante aceptado";
Sino
Escribir "Estudiante rechazado";
FinSi
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 56
En este ejemplo, nótese que también se usa operadores relacionales. Por lo
general cuando hay operadores lógicos, éstos van acompañados de operadores
relacionales.
Ejemplo 7: Operador lógico O (―|‖): Una escuela aplica dos exámenes a sus
aspirantes, por lo que cada uno de ellos obtiene dos calificaciones denotadas
como calif1 y calif2. El aspirante que obtenga una calificación mayor o igual que
9 en cualquiera de los exámenes es aceptado; en caso contrario es rechazado.
Pseudocódigo:
Proceso Algoritmo7
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 57
//escribe aceptado si una de las 2 calificaciones es >= que 9, caso //contrario es rechazado
Definir calif1, calif2 Como Real;
Escribir "Ingrese la nota 1: ";
Leer calif1;
Escribir "Ingrese la nota 2: ";
Leer calif2;
Si ((calif1>=9) | (calif2>=9)) Entonces
Escribir "Estudiante aceptado";
Sino
Escribir "Estudiante rechazado";
FinSi
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 58
La instrucción del ejemplo 7 equivale a OR ya que nos dice que puede ser en
cualquiera de los exámenes no necesariamente en los dos. En ejemplo 6 la
palabra ambos equivale a seleccionar la instrucción AND. Si la instrucción nos
dijera que obtenga una nota en cualquiera de los exámenes pero no en ambos,
nos estaría indicando una instrucción XOR que es un tipo de OR pero exclusivo.
Es decir, no puede considerarse el caso en que tenga la misma nota en los dos
exámenes, solo en uno de los dos.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 59
12.2.3. ESTRUCTURAS ANIDADAS.
Recordemos que las estructuras no secuenciales se pueden anidar, es decir,
pueden contener otras adentro, pero la estructura contenida debe comenzar y
finalizar dentro de la contenedora.
En la solución de problemas encontramos numerosos casos en los que luego de
tomar una decisión y marcar el camino correspondiente a seguir, es necesario
tomar otra decisión. Dicho proceso puede repetirse numerosas veces. En los
problemas en donde un bloque condicional incluye otro bloque condicional se
dice que un bloque está anidado dentro del otro.
Ejemplo 8. Determinar la cantidad de dinero que recibirá un trabajador por
concepto de las horas extras trabajadas en una empresa, sabiendo que cuando
las horas de trabajo exceden de 40, el resto se consideran horas extras y que
éstas se pagan al doble de una hora normal cuando no exceden de 8; si las
horas extras exceden de 8 se pagan las primeras 8 al doble de lo que se paga por
una hora normal y el resto al triple.
Solución. Lo primero que hay que determinar es si el trabajador trabajó horas
extras o no. Encontrar las horas extras de la siguiente forma:
Horas extras = horas trabajadas - 40
En caso que sí trabajó horas extras:
Si horas extras > 8 entonces a horas extras excedentes de 8 = horas extras -8
y pago por horas extras = pago por hora normal * 2 * 8 + pago por hora normal
* 3 * horas extras excedentes de 8
De otra forma (sólo horas al doble) pago por horas extras = pago por hora
normal * 2 * horas extras.
Finalmente, pago total que recibirá el trabajador será:
Pago = pago * hora normal * 40 + pago por horas extras.
Si no trabajó horas extras tendremos:
Pago = pago por hora normal * horas trabajadas.
Datos de salida: Pago.
Datos de entrada: número de horas trabajadas y pago por hora normal.
Definición de variables:
ht = horas trabajadas
het = horas extras que exceden de 8
ph = pago por hora normal
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 60
phe = pago por horas extras
he = horas extras
pt = pago que recibe el trabajador
Pseudocódigo:
Proceso Algoritmo8
Definir he, het, ht Como Entero; //variable de horas trabajadas
Definir ph, phe, pt Como Real; //variables para pago
Escribir "Ingrese las horas trabajadas: ";
Leer ht;
Escribir "Ingrese el valor por hora normal: ";
Leer ph;
Si ht > 40 entonces
//determinamos las horas extras
he <- ht - 40;
Si he > 8 entonces
//determinamos las horas a pagar al triple
het <- he - 8;
//las 8 se pagan al doble y el resto al triple
phe <- ph * 2 * 8 + ph * 3 * het;
Sino
//se pagan al doble
phe <- ph * 2 * he;
FinSi
//pago horas normales más horas extras
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 61
pt <- ph * 40 + phe;
Sino
//no hay horas extras
pt <- ph * ht;
FinSi
Escribir "El valor a pagar es: ", pt;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 62
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 63
Ejemplo 9. Dados los datos A, B y C que representan números enteros diferentes,
construir un algoritmo para escribir estos números en forma descendente. Este es
un ejemplo de los algoritmos conocidos como de Lógica Pura, ya que poseen
muchas decisiones y muchas bifurcaciones.
Observación: Para ordenar números no es un algoritmo eficiente, pero nos sirve
para ejemplarizar estructuras anidadas.
Solución:
Salida: A, B y C ordenados descendentemente.
Entradas: A, B y C.
La dinámica del problema es comparar dos números a la vez para conocer
cuál es el mayor.
Pseudocódigo:
Proceso Algoritmo9
//ordenar 3 números de mayor a menor
Definir a,b,c Como Entero;
Escribir "Ingrese 3 números: ";
Leer a,b,c;
Escribir "Los números ordenados descendentemente son: ";
Si a>b Entonces
Si a>c Entonces
Si b>c Entonces
Escribir a," ",b," ",c;
Sino
Escribir a," ",c," ",b;
FinSi
Sino
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 64
Escribir c," ",a," ",b;
FinSi
Sino
Si b>c Entonces
Si a>c Entonces
Escribir b," ",a," ",c;
Sino
Escribir b," ",c," ",a;
FinSi
Sino
Escribir c," ",b," ",a;
FinSi
FinSi
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 65
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 66
12.2.4. ESTRUCTURA DE SELECCIÓN MÚLTIPLE “SEGÚN” (“CASE”).
Con frecuencia es necesario que existan más de dos elecciones posibles. Este
problema se podría resolver por estructuras selectivas anidadas o en cascada,
pero si el número de alternativas es grande puede plantear serios problemas de
escritura y de legibilidad.
Usando la estructura de decisión múltiple se evaluará una expresión que podrá
tomar n valores distintos, 1, 2, 3,…,n y según que elija uno de estos valores en la
condición, se realizará una de las n acciones o lo que es igual, el flujo del
algoritmo seguirá sólo un determinado camino entre los n posibles.
Esta estructura se representa por un selector el cual si toma el valor 1 ejecutará la
acción A, si toma el valor 2 ejecutará la acción B, si toma el valor N realizará la
acción N.
La estructura de selección múltiple se implementa con la sentencia Según, cuyo
diagrama de flujo y pseudocódigo son:
Diagrama de flujo:
Pseudocódigo:
Segun <variable> Hacer
<número1>: <instrucciones>
<número2>,<número3>: <instrucciones>
<...>
De Otro Modo: <instrucciones>
FinSegun
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 67
Reglas:
Esta instrucción permite ejecutar opcionalmente varias acciones posibles
(distintas entre si), dependiendo del valor almacenado en una variable de tipo
numérico.
Al ejecutarse, se evalúa el contenido de la variable y se ejecuta la secuencia
de instrucciones asociada con dicho valor.
Cada opción está formada por uno o más números separados por comas, dos
puntos y una secuencia de instrucciones.
Si una opción incluye varios números, la secuencia de instrucciones asociada
se debe ejecutar cuando el valor de la variable es uno de esos números.
Opcionalmente, se puede agregar una opción final, denominada De Otro Modo,
cuya secuencia de instrucciones asociada se ejecutará sólo si el valor
almacenado en la variable no coincide con ninguna de las opciones anteriores.
Ejemplo 10: Escribir un algoritmo tal que si opc=1 realice la suma, si opc=2, el
producto, si opc=3, la división y 0 en cualquier otro caso, despliegue el resultado:
Pseudocódigo:
//Ejemplo de estructura Segun
Proceso Algoritmo10
Definir num1,num2, opc Como Entero;
Definir resp Como Real;
resp <-0;
Escribir "Ingrese una opción: 1 (Suma), 2 (Producto), 3 (División) :";
Leer opc;
Escribir "Ingrese los dos números a operar: ";
Leer num1,num2;
Segun opc Hacer
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 68
1:
resp <- num1+num2;
2:
resp <- num1*num2;
3:
Si num2=0 Entonces
Escribir "El denominador no puede ser 0";
Sino
resp <- num1/num2;
FinSi
De Otro Modo:
resp <- 0;
FinSegun
Escribir "El resultado es : ",resp;
FinProceso
Diagrama de Flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 69
Ejemplo 11. Dados como datos la categoría y el sueldo de un trabajador, calcule
el aumento correspondiente teniendo en cuenta la siguiente tabla. Imprimir la
categoría del trabajador y el nuevo sueldo.
Incrementos
Categoría Aumento
1 15%
2 10%
3 8%
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 70
4 7%
Pseudocódigo:
Proceso Algoritmo11
//ejemplo de estructura Segun
Definir cat Como Entero;
Definir sueldo, inc, nuevoSueldo Como Real;
Escribir "Ingrese la categoría : ";
Leer cat;
Escribir "Ingrese el sueldo : ";
Leer sueldo;
Segun cat Hacer
1:
inc <- sueldo*0.15;
2:
inc <- sueldo*0.1;
3:
inc <- sueldo*0.08;
4:
inc <- sueldo*0.07;
De Otro Modo:
inc<- 0;
FinSegun
nuevoSueldo <- sueldo + inc;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 71
Escribir "Categoría : ",cat,", nuevo sueldo: ",nuevoSueldo;
FinProceso
Diagrama de Flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 72
12.3. ESTRUCTURAS REPETITIVAS O ITERATIVAS.
Las computadoras están especialmente preparadas para ejecutar tareas
repetidamente. Los cálculos simples o la manipulación de pequeños conjuntos de
datos se pueden realizar fácilmente a mano, pero las tareas grandes o repetitivas
son realizadas con mayor eficiencia por una computadora. Las estructuras de
control repetitivas son aquellas en las que una sentencia o grupos de sentencias
se repiten muchas veces. Este conjunto de sentencias se denomina bucle, ciclo,
lazo, o loop. Las acciones que se repiten en un bucle constituyen el cuerpo del
bucle, y cada repetición del cuerpo del bucle se denomina iteración.
Las estructuras repetitivas básicas son:
Estructura Para.
Estructura Mientras.
Estructura Repetir.
12.3.1. ESTRUCTURA REPETITIVA “PARA” (“FOR”).
En numerosas ocasiones se puede necesitar un bucle que se ejecute un número
determinado de veces, y cuyo número se conozca por anticipado. Para
aplicaciones de este tipo se utiliza la sentencia Para (for). Esta sentencia requiere
que conozcamos por anticipado el número de veces que se ejecutarán las
sentencias del interior del bucle.
En la siguiente figura se muestra el diagrama de flujo de la estructura Para:
El pseudocódigo es:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 73
Para <variable> <- <inicial> Hasta <final> (Con Paso <paso>) Hacer
<instrucciones>
FinPara
Al ejecutarse la sentencia Para la primera vez, el valor <inicial> se asigna a la
variable <variable>, denominada variable de control, y a continuación se ejecuta
las sentencias de instrucciones que forman el cuerpo del bucle. Al llegar al final del
bucle (FinPara), se incrementa la variable <variable> en <paso> unidades y se
verifica si el valor almacenado en <variable> es mayor que el valor <final>; en
caso negativo se vuelve a ejecutar todas las sentencias del interior del bucle hasta
que la variable de control <variable> sea mayor que el valor final <final>. Algunos
lenguajes permiten definir lo que se llama paso, que es la cantidad de unidades en
las que se incrementará o decrementará la variable de control en cada iteración. Si
se omite la cláusula Con Paso <paso>, la variable <variable> se incrementará en
uno.
Es común usar en las estructuras repetitivas los contadores y acumuladores que los describimos a continuación: 12.3.1.1. CONTADOR.
Un contador es una variable cuyo valor se incrementa o decrementa en una
cantidad constante cada vez que se produce un determinado suceso o acción. Los
contadores se utilizan con la finalidad de contar sucesos o acciones internas de un
bucle; deben realizar una operación de inicialización y posteriormente las
sucesivas de incremento o decremento del mismo. La inicialización consiste en
asignarle al contador un valor. Se situará antes y fuera del bucle.
Representación:
<nombre del contador> <- <nombre del contador> + <valor constante>;
Si en vez de incremento es decremento se coloca un menos en lugar del más.
Ejemplo:
i <- i + 1;
12.3.1.2. ACUMULADOR O TOTALIZADOR.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 74
Es una variable que suma sobre sí misma un conjunto de valores para de esta
manera tener la suma de todos ellos en una sola variable. La diferencia entre un
contador y un acumulador es que mientras el primero va aumentando un valor
constante, el acumulador va aumentando en una cantidad variable.
Representación:
<Nombre del acumulador> <- <nombre del acumulador> + <valor variable>;
Ejemplo 12. Calcular la suma de los cuadrados de los primeros 100 enteros y
escribir el resultado. Se desea resolver el problema usando estructura Para.
Pseudocódigo:
Proceso Algoritmo12
//Ejemplo estructura Para
Definir i,suma Como Entero;
//inicializo el acumulador
suma <- 0;
Para i<-1 Hasta 100 Con Paso 1 Hacer
suma <- suma + i*i;
FinPara
Escribir "La suma de los 100 primeros enteros es: ",suma;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 75
Ejemplo 13. Calcular la promedio de N números enteros y escribir el resultado.
Pseudocódigo:
// Calcula el promedio de una lista de N datos
Proceso Algoritmo13
Definir i, numDatos Como Entero;
Definir acum, promedio, dato Como Real;
acum <- 0;
Escribir "Ingrese la cantidad de datos:";
Leer numDatos;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 76
Para i<-1 Hasta numDatos Hacer
Escribir "Ingrese el dato ",i,": ";
Leer dato;
acum <- acum + dato;
FinPara
promedio <- acum / numDatos;
Escribir "El promedio es: ",promedio;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 77
12.3.2. ESTRUCTURA ITERATIVA “MIENTRAS” (“WHILE”).
La estructura iterativa Mientras es aquella en la que el número de iteraciones no
se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una
determinada condición. Por esta razón, se lo conoce como bucle condicional.
El diagrama de flujo y pseudocódigo de la estructura iterativa mientras son:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 78
Diagrama de flujo:
Pseudocódigo:
Mientras <condición> Hacer
<instrucciones>
FinMientras
Cuando la sentencia mientras se ejecuta, lo primero que sucede es la evaluación
de la expresión lógica <condición>. Si se evalúa como falsa, ninguna acción se
realiza y el programa sigue en la siguiente sentencia después del bucle. Si la
expresión lógica se evalúa como verdadera, entonces se ejecuta el cuerpo del
bucle y se evalúa de nuevo la expresión lógica <condición>, es decir, se puede
ejecutar el bucle, cero o más veces. Este proceso se repite mientras la expresión
lógica sea verdadera. Después de cada iteración la expresión lógica se evalúa y
se verifica de nuevo; si cambia de verdadera a falsa la sentencia mientras finaliza.
Mientras que la condición sea verdadera el bucle se ejecutará. Esto significa que
el bucle se ejecutará indefinidamente a menos que algo en el interior del mismo
modifique la condición haciendo que su valor pase a falso. Si la expresión nunca
cambia de valor, entonces el bucle no termina nunca y se denomina bucle o loop
infinito (en general, esta situación no es deseable), a fin de evitarlo, las
instrucciones del cuerpo del bucle deben contener alguna instrucción que
modifique la o las variables involucradas en la expresión lógica <condición>, de
modo que sea falsa en algún momento y así finalice la ejecución del ciclo.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 79
Ejemplo 14. Calcular la suma de los cuadrados de los primeros 100 números
enteros y escribir el resultado.
Solución. Como recordarás, resolvimos este ejercicio en la lección anterior pero
utilizando la estructura Para. Ahora lo haremos con la estructura Mientras.
En este caso, se necesita un contador (un índice), para llevar la cuenta de las
veces que entramos al cuerpo del bucle. También es importante notar que esta
variable se debe inicializar antes de entrar al cuerpo del ciclo y dentro del cuerpo
se incrementará en uno cada vez que ingrese a él.
Esta variable además nos sirve para compararla con el valor dado en la condición,
cuando no se cumple la condición, se sale del ciclo.
Pseudocódigo:
//Ejemplo estructura Mientras
Proceso Algoritmo14
Definir i,suma Como Entero;
//inicializo el acumulador y el contador
suma <- 0;
i <- 1;
Mientras i<=100 Hacer
//sumo al acumulador
suma <- suma + i*i;
//incremento el contador
i <- i+1;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 80
FinMientras
Escribir "La suma de los 100 primeros enteros es: ",suma;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 81
En las estructuras cíclicas condicionales es común controlar los ciclos con
centinelas y banderas.
12.3.2.1. CENTINELAS.
En un bucle mientras controlado por tarea, la condición mientras especifica que el
cuerpo del bucle debe continuar ejecutándose mientras la tarea no haya sido
completada, esto puede ser controlado por centinelas.
Centinelas son variables que toman valores adecuados para suspender el ingreso
a un bucle.
Por ejemplo, si se tienen las calificaciones de un test (comprendida entre 0 y 100);
un valor centinela en esta lista puede ser -1, ya que nunca será una calificación
válida y cuando aparezca este valor se terminará de ejecutar el bucle. Si la lista
de datos son números positivos, un valor centinela puede ser un número negativo.
Ejemplo 15. Suponga que debemos obtener la suma de los gastos que hicimos en
nuestro último viaje, pero no sabemos exactamente cuántos fueron.
Solución: Si definimos gasto1, gasto2, gasto3, ...., -1 donde gastoi es el gasto
número i y sumaGasto es el acumulador de gastos efectuados. -1 es el centinela
de fin de datos.
Pseudocódigo:
//Ejemplo de centinelas
Proceso Algoritmo15
Definir gasto, sumaGasto Como Real;
sumaGasto <- 0;
Escribir "Ingrese -1 para salir";
Escribir "Ingrese el gasto realizado: ";
//leemos gasto fuera del bucle mientras
Leer gasto;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 82
Mientras gasto <> -1 Hacer
sumaGasto <- sumaGasto + gasto;
Escribir "Ingrese el gasto realizado: ";
Leer gasto;
FinMientras
Escribir "El gasto total es: ",sumaGasto;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 83
12.3.2.2. BANDERAS.
Conocidas también como interruptores, switch, flags o conmutadores, son
variables que pueden tomar solamente dos valores durante la ejecución del
programa, los cuales pueden ser 0 ó 1, o bien los valores booleanos True o False.
Se les suele llamar interruptores porque cuando toman los valores 0 ó 1 están
simulando un interruptor abierto/cerrado o encendido/apagado.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 84
Ejemplo 16: Leer un número entero N y calcular el resultado de la siguiente serie:
1 - 1/2+ 1/3 - 1/4+.... +/- 1/N.
Pseudocódigo:
//Ejemplo de banderas
Proceso Algoritmo16
Definir bandera Como Logico;
Definir serie Como Real;
Definir i, num Como Entero;
serie <- 0;
i <- 1;
Escribir "Ingrese el valor de N: ";
Leer num;
//inicializamos la bandera
bandera <- Verdadero;
Mientras i <= num Hacer
Si bandera = Verdadero Entonces
serie <- serie + 1/i;
bandera <- Falso;
Sino
serie <- serie - 1/i;
bandera <- Verdadero;
FinSi
i <- i+1;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 85
FinMientras
Escribir "La suma de la serie es: ",serie;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 86
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 87
12.3.3. ESTRUCTURA ITERATIVA “REPETIR” (“REPEAT”).
La estructura iterativa Repetir es una bucle condicional como lo es también la
estructura Mientras. Se usa cuando el número de iteraciones no se conoce por
anticipado (lo cual si se conoce en la estructura Para).
La diferencia entre ambas es que la condición se sitúa al inicio (Mientras) o al final
(Repetir) de la secuencia de instrucciones. Entonces, en el primero, el bucle
continúa mientras la condición es verdadera (la cual se comprueba antes de
ejecutar la acción, es decir se ejecuta cero o más veces) y en el segundo, el bucle
continúa hasta que la condición se hace verdadera (la condición se comprueba
después de ejecutar la acción, es decir, se ejecutará al menos una vez).
El diagrama de flujo de la estructura Repetir es el siguiente:
El pseudocódigo de la estructura Repetir es:
Repetir <instrucciones> Hasta Que <condición>
Al ejecutarse esta instrucción, la secuencia de instrucciones que forma el cuerpo del ciclo se ejecuta una vez y luego se evalúa la condición <condición>. Si la condición es falsa, el cuerpo del ciclo se ejecuta nuevamente y se vuelve a evaluar la condición. Esto se repite hasta que la condición sea verdadera. Note que, dado que la condición se evalúa al final, las instrucciones del cuerpo del ciclo serán ejecutadas al menos una vez. Además, a fin de evitar ciclos infinitos, el cuerpo del ciclo debe contener alguna instrucción que modifique la o las variables involucradas en la condición de modo
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 88
que en algún momento la condición sea verdadera y se finalice la ejecución del ciclo.
Un ciclo Repetir controlado por centinela, por ejemplo es cuando el usuario digita
una letra para salir como ‗S‘ o ‗N‘ para indicar si desea continuar o no. El bucle
debe repetirse hasta que la respuesta del usuario sea ‗n‘ o ‗N‘. (Observe que los
centinelas solamente pueden usarse con las estructuras Mientras y Repetir, no
con estructuras Para).
Ejemplo 17: Calcular la suma de los cuadrados de los primeros 100 números
enteros y escribir el resultado.
Solución. Nuevamente resolveremos el ejercicio de las dos lecciones anteriores,
ahora utilizando la estructura Repetir.
Como sabemos, en los bucles condicionales podemos usar una variable contador
que debe inicializarse antes del ciclo e incrementarse dentro del bucle para
controlar el número de veces que se ingresará al mismo. A diferencia de la
estructura Mientras, la condición ahora estará colocada al final del bucle para que
primero se ejecute la instrucción y luego se verifique si la condición se cumple.
Esto quiere decir, que en esta estructura el bucle se realizará por lo menos una
vez. También podrás observar que la condición está al revés, porque el bucle se
repite hasta que la condición se cumpla. En el bucle Mientras, la condición se
evaluaba mientras era verdadera.
Pseudocódigo:
//Ejemplo estructura Repetir
Proceso Algoritmo17
Definir i,suma Como Entero;
//inicializo el acumulador y el contador
suma <- 0;
i <- 1;
Repetir
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 89
//sumo al acumulador
suma <- suma + i*i;
//incremento el contador
i <- i+1;
Hasta Que i>100
Escribir "La suma de los 100 primeros enteros es: ",suma;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 90
Ejemplo 18. Se desea calcular la suma de N números ingresados por el usuario,
hasta que él decida no ingresar más números.
Pseudocódigo:
//Ejemplo estructura Repetir con centinelas
Proceso Algoritmo18
Definir suma, num Como Real;;
Definir resp Como Caracter;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 91
//inicializo acumulador
suma <- 0;
//inicializo la centinela
Repetir
Escribir "Ingrese un número: ";
Leer num;
//sumo al acumulador
suma <- suma + num;
//pregunto se desea continuar
Escribir "Desea ingresar otro número (S/N): ";
// leo la respuesta
Leer resp;
Hasta Que (resp='N' | resp='n')
Escribir "La suma es: ",suma;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 92
13. ESTRUCTURA DE DATOS Y ARREGLOS.
13.1. INTRODUCCIÓN.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 93
Todas las variables que se han considerado hasta ahora son de tipo simple. Una
variable de tipo simple consiste de una sola localidad o ―caja‖ de memoria y sólo
puede contener un valor a la vez. Una variable de tipo estructurado consiste en
toda una colección de casillas de memoria. Los tipos de datos estudiados: entero,
real, carácter, lógico son considerados como datos de tipo simple, puesto que una
variable que se define con alguno de estos tipos sólo puede almacenar un valor a
la vez, es decir, existe una relación de uno a uno entre la variable y el número de
elementos (valores) que es capaz de almacenar. En cambio un dato de tipo
estructurado, puede almacenar más de un elemento (valor) a la vez, con la
condición de que todos los elementos deben ser del mismo tipo, es decir, que se
puede tener un conjunto de datos enteros, reales, etc.
13.2. ESTRUCTURA DE DATOS.
Estructura de Datos es una colección de datos que se caracterizan por su
organización y las operaciones que se definen en ella. Las estructuras de datos
tienen en común que un identificador o nombre, puede representar a múltiples
datos individuales.
Los datos de tipo estándar pueden ser organizados en diferentes estructuras de
datos: estáticas y dinámicas.
Estructura de Datos Estáticas. Son aquellas en las que se asigna una
cantidad fija de memoria cuando se declara la variable y no puede ser
modificada durante la ejecución del programa. Corresponden a este tipo los
arreglos y registros.
Estructuras de Datos Dinámicas. Son aquellas en las que el espacio
ocupado en memoria puede ser modificado en tiempo de ejecución.
Corresponden a este tipo las listas, árboles y grafos. Estas estructuras no
son soportadas en todos los lenguajes. La elección de la estructura de
datos idónea dependerá de la naturaleza del problema a resolver y, en
menor medida, del lenguaje.
13.3. ARREGLOS.
Un arreglo (o array) es una estructura de datos en la que se almacena una
colección de datos del mismo tipo (por ejemplo, los sueldos de los empleados de
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 94
una empresa). Dicho de otra forma, un arreglo y es una lista de un número finito n
de elementos del mismo tipo que se caracteriza por:
- Almacenar sus elementos en posiciones de memoria contiguas
- Tener un único nombre de variable (por ejemplo salarios) que
representa a todos los elementos
- Permitir acceso directo o aleatorio a sus elementos individuales, para
ello se utiliza un índice que especifique la posición relativa en el
arreglo.
En resumen, un arreglo es una colección finita, homogénea y ordenada de
elementos.
Finita. Todo arreglo tiene un límite, es decir, debe determinarse cuál será el
número máximo de elementos que podrán formar parte del arreglo.
Homogénea. Todos los elementos del arreglo deben ser del mismo tipo.
Ordenada: Se puede determinar cuál es el primer elemento, el segundo, el
tercero,.... y el n-ésimo elemento.
Los arreglos se clasifican de acuerdo con el número de dimensiones que tienen.
Así se tienen los arreglos:
Unidimensionales (vectores).
Bidimensionales (tablas o matrices).
Multidimensionales (tres o más dimensiones).
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 95
Ejemplo.
Suponga que se desea desarrollar un programa para:
1. Leer una lista de calificaciones de un examen.
2. Encontrar su media.
3. Escribir una lista de las calificaciones mayores que la media.
4. Ordenar la lista de las calificaciones en orden ascendente.
Supongamos también que hay 100 calificaciones. Con lo estudiado hasta el
momento, deberíamos utilizar 100 variables diferentes nota1, nota2, ...., nota100,
de ese modo son 100 direcciones diferentes de memoria para almacenar las
calificaciones del examen. Se imagina declarar las 100 variables, ¿cuántas
instrucciones involucra?
Definir nota1, nota2, nota3,.........nota100 Como Entero;
(En la declaración real de un algoritmo en pseudocódigo no pueden usarse puntos
suspensivos, por lo tanto serán 100 veces). En la fase de lectura de datos, serán
también 100 veces las instrucciones para ir leyendo cada valor.
Leer nota1, nota2, nota3,........., nota100;
Para calcular la media:
media (nota1+nota2+.......+nota100)/100;
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 96
Para la lista de calificaciones mayores que la media, deberá también compararse
una por una:
Si nota1 > media Entonces
Escribir nota1;
FinSi
Si nota2 > media Entonces
Escribir nota2;
FinSi
…
Si nota100 > media Entonces
Escribir nota100;
FinSi
Y después de muchísimas líneas de código..... ¡Todavía falta ordenar la lista de
calificaciones en orden ascendente!
Los arreglos nos permiten ahorrar instrucciones, porque es fácil recorrer toda la
lista de notas con unas pocas instrucciones. En el caso anterior, cuando el acceso
a la información es secuencial, sólo se puede acceder a un elemento buscando
desde el principio de la lista, y esto es algo lento. Lo que se necesita es una
estructura de acceso directo que permita almacenar y recuperar los datos
directamente especificando su posición en la estructura, de esa manera se
requerirá el mismo tiempo para acceder al elemento de la posición 100 que el de
la posición 5.
Queremos también que esta estructura se almacene en memoria principal para
que su almacenaje y recuperación sea más rápida. Es por ello que existen los
arreglos, que están organizados en una secuencia de elementos, todos del mismo
tipo y se puede acceder a cada elemento directamente especificando su posición
en esta secuencia.
Para poder utilizar un arreglo, debemos indicar su tipo, un nombre único y su
dimensionamiento, es decir, declarar los rangos de sus índices, lo cual determina
cuantos elementos se almacenarán y como se accederá a los mismos. Al declarar
un arreglo, se debe inicializar sus elementos antes de utilizarlos
Definición y Dimensionamiento.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 97
La instrucción Dimension permite declarar un arreglo, indicando sus dimensiones.
Dimesion <identificador> (<max1>,...,<maxN>);
Esta instrucción define un arreglo con el nombre indicado en <indentificador> y N dimensiones. Los N parámetros indican la cantidad de dimensiones y el valor máximo de cada una de ellas. La cantidad de dimensiones puede ser una o más, y la máxima cantidad de elementos debe ser una expresión numérica positiva.
Se pueden definir más de un arreglo en una misma instrucción, separándolos con una coma (,).
Dimension <ident1> (<max11>,..,<max1N>),..,<identM>(<maxM1>,..,<maxMN>);
Es importante notar que es necesario definir un arreglo antes de utilizarlo.
Ejemplo:
Definir vector, matriz Como Entero; Dimension vector[100], matriz[10,20];
13.3.1. ARREGLO UNIDIMENSIONAL.
Un arreglo de una dimensión (también conocido como vector) es un tipo de datos
estructurado compuesto de un número de elementos finitos, tamaño fijo y
elementos homogéneos que se almacenan bajo un mismo nombre, y se
diferencian por la posición que tiene cada elemento dentro del arreglo de datos.
Finitos indica que hay un último elemento, tamaño fijo significa que el tamaño del
arreglo debe ser conocido en tiempo de compilación y homogéneo significa que
todos sus elementos son del mismo tipo.
Los elementos del arreglo se almacenan en posiciones contiguas de memoria, a
cada una de las cuales se puede acceder directamente mediante un número
entero denominado índice del arreglo, que identifica la posición del elemento
dentro del conjunto.
Generalmente los índices de los elementos de los arreglos inician en 0, es decir, si
declaramos un arreglo de 100 elementos, los índices de elementos válidos van de
0 a 99 (aunque existen lenguajes que inician los índices de los arreglos en 1).
vector[0]
vector[1]
vector[2]
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 98
………..
vector[97]
vector[98]
vector[99]
13.3.1.1. PARTES DE UN ARREGLO.
Los componentes. Hacen referencia a los elementos que forman el arreglo,
es decir, a los valores que se almacenan en cada una de las casillas del
mismo.
Los índices. Permiten hacer referencia a los componentes del arreglo en
forma individual, especifican cuántos elementos tendrá el arreglo y además, de
qué modo podrán accederse esos componentes.
valoro
valor1
valor2
………...
valor97
valor98
valor99
Definición y Dimensionamiento.
Ejemplo. Definir un arreglo llamado vector de 100 elementos de tipo Real.
Definir vector Como Real; Dimension vector[100];
13.3.1.2. OPERACIONES CON ARREGLOS.
Las operaciones que se pueden realizar con vectores durante el proceso de
resolución de un problema son:
Componentes
Índice
vector[0]
vector[1]
vector[2]
………..
vector[97]
vector[98]
vector[99]
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 99
Lectura/ Escritura,
Asignación.
Actualización (inserción, eliminación, modificación).
Recorrido (acceso secuencial).
Ordenación.
Búsqueda.
Lectura. El proceso de lectura de un arreglo consiste en leer y asignar un valor
a cada uno de sus elementos. Normalmente se realizan con estructuras
repetitivas. Usamos los índices para recorrer los elementos del arreglo.
Ejemplo:
Para i <- 0 Hasta 99 Con Paso 1 Hacer
Leer vector[i];
FinPara
Escritura. Es similar al caso de lectura, sólo que en lugar de leer el
componente del arreglo, lo escribimos.
Ejemplo:
Para i <- 0 Hasta 99 Con Paso 1 Hacer
Escribir vector[i];
FinPara
Asignación. No es posible asignar directamente un valor a todo el arreglo;
sino que se debe asignar el valor deseado en cada componente. Podemos
recorrer el arreglo con una estructura repetitiva y asignar un valor a todos los
elementos del arreglo.
Ejemplo:
vector[1] <- 5; //asigna el valor 5 a la posición 1 del arreglo vector
vector[10] <- vector[1] / 2; //asigna una operación al arreglo vector
//Se puede asignar un valor constante a todos los elementos del vector
Para i <- 0 Hasta 99 Con Paso 1 Hacer
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 100
vector[i] <- 10;
FinPara
Inicialización. Siempre es importante inicializar las variables y por lo tanto
también los arreglos. Por ejemplo, inicializar con 0 cada elemento del arreglo.
Ejemplo:
Para i <- 0 Hasta 99 Con Paso 1 Hacer
vector[i] <- 0;
FinPara
Acceso Secuencial. (Recorrido). El acceso a los elementos de un vector
puede ser para leer en él o para escribir (visualizar su contenido). Recorrido del
vector es la acción de efectuar una acción general sobre todos los elementos
de ese vector.
Actualización. Incluye añadir (insertar), borrar o modificar algunos de los ya
existentes. Se debe tener en cuenta si el arreglo está o no ordenado. Añadir
datos a un vector consiste en agregar un nuevo elemento al final del vector,
siempre que haya espacio en memoria (recordemos que el tamaño de un
arreglo es fijo).
Observación. Las partes de un arreglo unidimensional y las operaciones son las
mismas que en los arreglos multidimensionales (pueden extenderse), salvo que se
trata de varias dimensiones y no sólo de una.
Ejemplo19. Se desea ingresar una lista de 10 valores numéricos y calcular la
suma, el promedio, los números mayor y menor de dicha lista
Pseudocódigo:
//Ejemplo de arreglos
Proceso Algoritmo19
Definir lista, i, mayor, menor, suma, promedio Como Entero;
//defino el arreglo y su tamaño
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 101
Dimension lista[10];
//inicializo variables
suma <- 0;
//inicializo el arreglo
Para i <- 0 Hasta 9 Con Paso 1 Hacer
lista[i] <- 0;
FinPara
//leo los elementos del arreglo
Para i <- 0 Hasta 9 Con Paso 1 Hacer
Escribir "Ingrese el valor ",(i+1)," de la lista: ";
Leer lista[i];
FinPara
//inicializo los números mayor y menor con el primer
//elemento del arreglo
mayor <- lista[0];
menor <- mayor;
//calculo la suma recorriendo el arreglo
Para i <- 0 Hasta 9 Con Paso 1 Hacer
suma <- suma + lista[i];
FinPara
//calculo el promedio
promedio <- suma / 9;
//calculo los números mayor y menor de la lista
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 102
Para i <- 1 Hasta 9 Con Paso 1 Hacer
Si lista[i] > mayor Entonces
mayor <- lista[i];
FinSi
Si lista[i] < menor Entonces
menor <- lista[i];
FinSi
FinPara
//presento los resultados
Escribir "Suma: ", suma, ", Promedio: ", promedio;
Escribir "Número mayor: ", mayor, ", Número menor: ", menor;
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 103
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 104
Ejemplo 20. Ingresar una lista de nombres (la lista termina cuando se ingresa un nombre en blanco), no se permite ingresar nombres repetidos y luego ordenar y presentar la lista.
Pseudocódigo:
//Ordenamiento de un arreglo
Proceso Algoritmo20
Definir nombre,lista,aux Como Cadenas;
Definir seRepite Como Logico;
Definir cant,i,j,posMenor Como Enteros;
Dimension lista[200];
Escribir "Ingrese un nombre (enter en blanco para terminar):";
// leer la lista
cant <- 0;
Leer nombre;
Mientras nombre<>"" Hacer
Escribir "Ingrese un nombre: ";
lista[cant] <- nombre;
cant <- cant+1;
Repetir // leer un nombre y ver que no esté ya en la lista
Leer nombre;
seRepite <- Falso;
//no es "" el nombre no se necesita buscar un repetido
Si nombre<>"" Entonces
Para i <- 0 Hasta cant-1 Hacer
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 105
Si nombre=lista[i] Entonces
seRepite <- Verdadero;
//salgo del bucle pues es ya //repetido y no necesito seguir buscando
i <- cant;
Escribir "Nombre repetido";
Escribir "Ingrese un nombre: ";
FinSi
FinPara
FinSi
Hasta Que ~ seRepite
FinMientras
// ordenamos la lista
Para i <- 0 Hasta cant-2 Hacer
// busca el menor entre i y cant
posMenor <- i;
Para j <- i+1 Hasta cant-1 Hacer
Si lista[j] < lista[posMenor] Entonces
posMenor <- j;
FinSi
FinPara
// intercambia el que estaba en i con el menor que encontró
aux <- lista[i];
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 106
lista[i] <- lista[posMenor];
lista[posMenor] <- aux;
FinPara
// mostrar como queda la lista
Escribir "La lista ordenada en forma ascendente es:";
Para i <- 0 Hasta cant-1 Hacer
Escribir " ",lista[i];
FinPara
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 107
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 108
13.3.2. ARREGLO BIDIMENSIONAL.
Hasta ahora hemos visto como se puede manipular información con una sola
columna o lista de entrada con los llamados vectores, o arreglos de una
dimensión. Sin embargo, en numerosas ocasiones es necesario trabajar con datos
que tengan más de una dimensión (se representan por ejemplo como tablas de
doble entradas, cubos, etc.).
Un arreglo bidimensional (matriz o tabla) es un arreglo con dos índices. Para
localizar o almacenar un valor en el arreglo se deben especificar dos posiciones
(dos subíndices), uno para la fila y otro para la columna. Internamente en memoria
se reservan MxN posiciones consecutivas para almacenar todos los elementos del
arreglo.
Declaración de una matriz.
Ejemplo: Definir una arreglo bidimensional de 10 filas y 20 columnas de números
enteros llamado matriz.
Definir matriz Como Entero; Dimension matriz[10,20];
Una matriz se representa como una tabla, donde: 1<=I<=M y 1<=J<=N (observe
que al igual que en los vectores, las filas y columnas de las matrices inician en 0).
1 2
J N
1 matriz[0,0] matriz[0,1] ….. matriz[0,j] matriz[0,n-1]
2 matriz[1,0] matriz[1,1] ….. matriz[1,j] matriz[1,n-1]
…..
I matriz[i,0] matriz[i,1] ….. matriz[i,j] matriz[i,n-1]
M matriz[m-1,0] matriz[m-1,1] ….. matriz[m-1,j] matriz[m-1,n-1]
Ejemplo 21. Se desea realizar la suma de dos matrices, ingresar las dimensiones
por teclado.
Pseudocódigo:
//Ejemplo de matrices
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 109
Proceso Algoritmo21
Definir i, j, m, n, matriz1, matriz2, matriz3 Como Entero;
Escribir "Ingrese el número de filas: ";
Leer m;
Escribir "Ingrese el número de columnas: ";
Leer n;
//defino la dimension de las matrices
Dimension matriz1[m,n], matriz2[m,n], matriz3[m,n];
Limpiar Pantalla;
//ingreso la primera matriz
Escribir "Ingrese la matriz A:";
Para i <- 0 Hasta m-1 Con Paso 1 Hacer
Para j <- 0 Hasta n-1 Con Paso 1 Hacer
Escribir "Ingrese el valor A[",i+1,",",j+1,"]";
Leer matriz1[i,j];
FinPara
FinPara
Limpiar Pantalla;
//ingreso la segunda matriz
Escribir "Ingrese la matriz B:";
Para i <- 0 Hasta m-1 Con Paso 1 Hacer
Para j <- 0 Hasta n-1 Con Paso 1 Hacer
Escribir "Ingrese el valor B[",i+1,",",j+1,"]";
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 110
Leer matriz2[i,j];
FinPara
FinPara
Escribir "Presione enter...";
Esperar Tecla;
Limpiar Pantalla;
//sumo las matrices y las presento en pantalla
Escribir "La suma de A+B es:";
Para i <- 0 Hasta m-1 Con Paso 1 Hacer
Para j <- 0 Hasta n-1 Con Paso 1 Hacer
matriz3[i,j] <- matriz1[i,j] + matriz2[i,j];
Escribir "C[",i+1,",",j+1,"]=",matriz3[i,j];
FinPara
FinPara
FinProceso
Diagrama de flujo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 111
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 112
14. MODULARIDAD.
Una estrategia para la resolución de problemas complejos con computadoras es la
división o descomposición del problema en otros problemas más pequeños y
fáciles de resolver. Estos subproblemas se implementan mediante módulos o
subprogramas. Los subprogramas son una herramienta importante para el
desarrollo de algoritmos y programas, de modo que normalmente un proyecto de
programación se compone de un programa principal y un conjunto de
subprogramas, con las llamadas a los mismos dentro del programa principal. Un
subprograma realiza una tarea concreta que se describe con una serie de
instrucciones y que, idealmente, debería ser independiente de otros
subprogramas. El descomponer un programa en módulos independientes más
simples se conoce también como el método de "Divide y vencerás".
¿Cuándo es útil la modularización?
Este enfoque de segmentación o modularización es útil en dos casos:
1. Cuando existe un grupo de instrucciones o una tarea específica que
deba ejecutarse en más de una ocasión.
2. Cuando un problema es complejo o extenso, la solución se divide o
segmenta en módulos que ejecutan partes o tareas específicas.
Ventajas de la Programación Modular.
Las ventajas más sobresalientes de utilizar subprogramas o módulos son:
El uso de subprogramas facilita el diseño descendente y modular, que permite
descomponer un problema complejo en subproblemas hasta que éstos sean
concretos y fáciles de resolver.
Los procedimientos se pueden ejecutar más de una vez en un programa y en
diferentes programas, ahorrando en consecuencia tiempo de programación. Un
subprograma, en esencia, se puede ver como una caja negra
(encapsulamiento) que ejecuta una tarea en particular en un programa, acepta
entradas y produce ciertas salidas. Una vez que el módulo se ha escrito y
comprobado, se puede utilizar en otros programas eliminando la duplicación
innecesaria de código (reutilización de código).
Aumenta la facilidad de depuración y búsqueda de errores en un programa ya
que éstos se pueden aislar fácilmente depurándose sus errores
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 113
individualmente antes de su inclusión en bibliotecas independientes y de ser
llamados en el programa principal.
El uso de subprogramas facilita la división de tareas de programación entre un
equipo de programadores.
El uso de módulos facilita la proyección y la comprensión de la lógica
subyacente para el programador y el usuario.
14.1. PROCEDIMIENTOS Y FUNCIONES.
Los subprogramas en programación estructurada se clasifican en procedimientos
y funciones, que son unidades de programas diseñados para ejecutar una tarea
específica.
Las funciones normalmente devuelven un sólo valor a la unidad de programa
(programa principal u otro subprograma) que los referencia (que los llama o
invoca). Los procedimientos pueden devolver cero, uno o varios valores.
Las funciones se dividen en estándares y definidas por el usuario.
Estándar. Son funciones proporcionadas por lenguaje de programación.
Definidas por el usuario. Son funciones definidas el programador con el
propósito de ejecutar alguna función específica, y que por lo general se usan
cuando se trata de hacer algún cálculo que será requerido en varias ocasiones
en la parte principal del algoritmo.
Las funciones y procedimientos están compuestos por un grupo de sentencias a
las que se asigna un nombre (identificador) y constituyen una unidad de programa
a la que se puede invocar desde el programa principal u otra función o
procedimiento.
Una de las características importantes y diferenciadoras de los subprogramas es
la posibilidad de comunicación entre el programa principal y los subprogramas (o
entre dos subprogramas). Esta comunicación se realiza a través de una lista de
parámetros. Un parámetro es un medio para pasar información – valores a
variables – del programa principal a un subprograma y viceversa. No es obligatorio
que un subprograma utilice parámetros, ya que éstos no siempre son necesarios.
Un parámetro es, prácticamente, una variable cuyo valor debe ser o bien
proporcionado por el programa principal al subprogramas o ser devuelto desde el
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 114
subprogramas al programa principal. Por consiguiente, hay dos tipos de
parámetros: parámetros de entrada y parámetros de salida. Los de entrada son
aquellos cuyos valores deben ser proporcionados por el programa principal,
mientras que los de salida son aquellos cuyos valores se calcularán en el
subprograma y se deben devolver al programa principal para su proceso posterior.
Visibilidad de las variables.
Las variables que intervienen en un programa con subprogramas pueden ser de
dos tipos: variables locales y variables globales.
Una variable local es una variable que está declarada dentro de un subprograma,
y se dice que es local al subprograma. Una variable local sólo está disponible
durante el funcionamiento del mismo, y su valor se pierde una vez que el
subprograma termina. Dos variables locales pueden tener el mismo nombre
siempre que estén declaradas en funciones o procedimientos diferentes.
Las variables declaradas en el programa principal se denominan variables
globales. A diferencia de las variables locales, cuyos valores se pueden utilizar
sólo dentro del subprograma en el que están declaradas, las variables globales
pueden ser utilizadas en el programa principal y en todos los subprogramas,
permanecen activas durante toda la ejecución del programa.
Hay que tener especial precaución al trabajar con variables globales, ya que al ser
recursos compartidos todos los subprogramas pueden tener acceso simultáneo a
ellas y se pueden producir errores lógicos debidos a la concurrencia. Por lo
general, es una buena práctica evitar el uso de variables globales desde
subprogramas a menos que sea estrictamente necesario.
Las variables también pueden ser declaradas dentro de un bloque o estructura de
control, y se comportarán como variables locales únicamente dentro de dicho
bloque o estructura.
Si dos variables, una global y una local, tienen el mismo nombre, la local
prevalecerá sobre la global dentro del módulo en que ha sido declarada.
14.1.1. IMPLEMENTACIÓN DE PROCEDIMIENTOS Y FUNCIONES.
La implementación de procedimientos y funciones lo haremos en la herramienta
JTraductor, pues en PSeInt no es posible realizarlo (al momento de escribir estas
líneas), además que es muy común para un programador aprender varios
lenguajes de programación, si están muy claros del algoritmo, básicamente es
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 115
cuestión de aprender un nuevo léxico, sintaxis y semántica y saber las
semejanzas y diferencias entre un lenguaje y otro.
La siguiente tabla muestra un comparativo entre PSeInt (v20120418 ) y JTraductor
(v0.8.0).
PSeInt JTraductor
Inicio /Fin del Algoritmo
Proceso <NombrePrograma>
<acción 1>;
<acción 2>;
. .
.
<acción n>;
FinProceso
Proceso Principal
<acción 1>;
<acción 2>;
. .
.
<acción n>;
Fin
Comentarios
//esto es un comentario No existe forma de definir comentarios
Tipos de Variables
Real/Entero/Logico/Caracter Real/Entero/Logico/Cadena
Declaración de Variables
Definir <var1> , <var2> , … , <varN>
Como [Real/Entero/Logico/Caracter] ;
<Tipo variable> <variable> <- <valor>
Operadores
>, <, =, ,<>, >=, <=, &, |, ~, +, -, *, /, ^ >, <, =, !=, >=, <=, &&, ||, +, -, *, /
Asignación
<variable> <- <expresión> ; <variable> <- <expresión>
Lectura
Leer <var1> , <var2> , ... ,<varN> ; Leer <variable>
Escritura
Escribir <exprl> , <expr2> ,..., <exprN> ; Escribir <exprl> , <expr2> ,..., <exprN>
Estructura Si-Entonces
Si <condición> Entonces
<instrucciones>
Sino
Si <condición> Entonces
<instrucciones>
Sino
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 116
<instrucciones>
FinSi
<instrucciones>
FinSi
Estructura Según
Segun <variable> Hacer
<num>: <instrucciones>
<num>,<num>: <instrucciones>
<...>
De Otro Modo: <instrucciones>
FinSegun
No es soportado la estructura Según
Estructura Para
Para <variable> <- <inicial> Hasta
<final> (Con Paso <paso>) Hacer
<instrucciones>
FinPara
Para <Tipo Var> <variable> <- <inicial>
Hasta <final> Con Paso <paso> Hacer
<instrucciones>
FinPara
Estructura Mientras
Mientras <condición> Hacer
<instrucciones>
FinMientras
Mientras <condición> Hacer
<instrucciones>
FinMientras
Estructura Repetir
Repetir
<instrucciones>
Hasta Que <condición>
No es soportado la estructura repetir
Arreglos
Dimension <ident1>
(<max11>,..,<max1N>),..,<identM>(<m
axM1>,..,<maxMN>);
No es soportado los arreglos
Declaración de Funciones.
El pseudocódigo para declarar funciones es:
Funcion <Tipo Var> <nombreFuncion> (<TipoVar> <Var1>, <TipoVar> <Var2>,...)
<instrucciones>
Retornar <Variable/Valor>
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 117
FinFuncion
Las funciones siempre deben retornar una variable o valor <Variable/Valor> del
mismo tipo del que fue declarada la función <Tipo Var> a través de la palabra
reservada Retornar.
Pueden tener cero o más parámetros (<TipoVar> <VarN>) que deben ser pasados
al momento de llamar a la función, si no se tienen parámetros, debe ir el
paréntesis vacío.
El nombre de la función <nombreFuncion> debe iniciar con un carácter válido.
Ejemplo 21. Realizar una función que acepte dos números como parámetros y
devuelva la suma de dichos números.
Solución. Crearemos una función llamada sumarNumeros que será llamada en el
programa principal.
Pseudocódigo:
Funcion Real sumarNumeros (Real parametro1, Real parametro2)
Real suma
suma <- parametro1 + parametro2
Retornar suma
FinFuncion
Proceso principal
Real suma <- 0, num1, num2
Escribir "Ingrese el primer número"
Leer num1
Escribir "Ingrese el segundo número"
Leer num2
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 118
suma <- sumarNumeros(num1,num2)
Escribir "La suma es: ", suma
Fin
En este ejemplo vemos la definición (declaración) de una función en pseudocódigo
para calcular la suma de dos números reales, los cuales son pasados al
subprograma como parámetros de entrada. La función calcula la suma y la
devuelve como un parámetro de salida.
Esta función la podemos invocar desde el programa principal u otra función o
procedimiento. Nótese que los nombres de los parámetros en la definición
(parametro1 y parametro2) no necesariamente tienen que ser los mismos que los
utilizados en la invocación (num1 y num2). Nótese también que el compilador
chequeará previamente que el tipo de dato del parámetro de salida de la función
(en este caso un número real) pueda ser asignado a la variable suma según su
tipo.
Al nombre de la función junto con la lista ordenada de sus parámetros de entrada
se lo conoce como firma de la función. En general, no puede haber dentro del
mismo programa dos funciones con la misma firma.
A primera vista, los procedimientos parecen dificultar la escritura de un programa.
Sin embargo, no sólo no es así, sino que la organización de un programa en
funciones y/o procedimientos lo hace más fácil de escribir y depurar.
Declaración de Procedimientos.
El pseudocódigo para declarar procedimientos es:
Procedimiento <nomProcedimiento> (<TipoVar> <Var1>, <TipoVar> <Var2>,...) <instrucciones>
FinProcedimiento
Los procedimientos, a diferencia de las funciones no devuelven ningún valor.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 119
Pueden tener cero o más parámetros (<TipoVar> <VarN>) que deben ser pasados
al momento de llamar al procedimientos, si no se tienen parámetros, debe ir el
paréntesis vacío.
El nombre del procedimiento <nomProcedimiento> debe iniciar con un carácter
válido.
Ejemplo 22. Se desea crear un procedimiento que de la bienvenida al usuario que
ingresa al programa.
Procedimiento bienvenida (Cadena nombre)
Escribir "\n\t Bienvenido: ", nombre
FinProcedimiento
Proceso principal
Cadena nombre
Escribir "Ingrese su nombre: "
Leer nombre
bienvenida(nombre)
Fin
Al nombre de la función junto con la lista ordenada de sus parámetros de entrada
se lo conoce como firma del procedimiento. En general, no puede haber dentro
del mismo programa dos procedimientos con la misma firma.
A primera vista, los procedimientos parecen dificultar la escritura de un programa.
Sin embargo, no sólo no es así, sino que la organización de un programa en
funciones y/o procedimientos lo hace más fácil de escribir y depurar.
Ejemplo 23. Realizar un algoritmo que calcule las operaciones matemáticas
básicas (suma, resta, multiplicación y división) de dos números. Use funciones y
procedimientos.
Pseudocódigo:
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 120
Funcion Real sumar (Real num1, Real num2)
Retornar (num1 + num2)
FinFuncion
Funcion Real multiplicar (Real num1, Real num2)
Retornar (num1 * num2)
FinFuncion
Funcion Real restar (Real num1, Real num2)
Retornar (num1 - num2)
FinFuncion
Funcion Real dividir (Real num1, Real num2)
Retornar (num1 / num2)
FinFuncion
Procedimiento calculadora (Real num1, Real num2)
Escribir "El resultado de la suma es: ", sumar(num1,num2)
Escribir "El resultado de la resta es: ", restar(num1,num2)
Escribir "El resultado del producto es: ", multiplicar(num1,num2)
Si num2!=0 Entonces
Escribir "El resultado de la división es: ", dividir(num1,num2)
Sino
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 121
Escribir "El resultado de la división es: Denominador igual a 0"
FinSi
FinProcedimiento
Proceso principal
Real num1<-0,num2<-0
Escribir " \tCALCULADORA\n"
Escribir "Ingrese el primer número: "
Leer num1
Escribir "Ingrese el segundo número: "
Leer num2
calculadora(num1,num2)
Fin
Se puede observar que en programa principal se orquesta (invoca) al resto de
funciones o procedimientos, armando de esta manera el programa deseado; el
procedimiento calculadora imprime en pantalla el resultado de las operaciones
matemáticas básicas calculadas con funciones.
14.2. BIBLIOTECAS.
En la mayoría de los lenguajes de programación de alto nivel es posible guardar
un subprograma o un conjunto de subprogramas como un archivo independiente
al cual se denomina genéricamente biblioteca (del inglés library). Las bibliotecas
pueden luego ser referenciadas dentro de múltiples programas para que éstos
puedan hacer uso de los subprogramas incluidos en aquella.
Recordemos que la salida del proceso de compilación de un código fuente se
denomina Programa Objeto, que es ni más ni menos que el código de máquina
generado a partir del código fuente (SIN INCLUIR EL CODIGO DE LAS
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 122
BIBLIOTECAS UTILIZADAS). El Programa Objeto es luego utilizado como entrada
para que otro componente de software, llamado linker, lo asocie con los
subprogramas que se encuentran en las bibliotecas referenciadas y produzca el
llamado Programa Ejecutable. Este proceso se conoce comúnmente como Link-
Edición.
Observación. Tanto PSeInt como en JTraductor no es posible el uso de
bibliotecas.
15. RECURSIVIDAD.
Recursividad, es el proceso de resolver un problema reduciéndolo a uno o más subproblemas que son idénticos en su estructura al problema original y más simples de resolver.
Una vez que se ha subdividido el problema original, se utiliza la misma técnica de descomposición para subdividir cada uno de estos subproblemas en otros que son menos complejos, hasta que los subproblemas llegan a ser tan simples que se pueden resolver sin realizar más subdivisiones, y la solución general del problema se obtiene juntando todos los componentes resueltos. Se dice que un proceso es recursivo si forma parte de sí mismo, es decir, que se define en función de sí mismo. En otras palabras, un método es recursivo si contiene invocaciones a sí mismo.
La recursión aparece en la vida diaria, en problemas matemáticos, en estructuras de datos y en muchos otros problemas. Es un proceso extremadamente potente, por lo que hay que saber cuándo y cómo aplicarla. Es una poderosa herramienta de programación como alternativa a algoritmos iterativos (cuando es ―casi‖ imposible resolver con estructuras iterativas).
En resumen, la recursividad consiste en:
En el cuerpo de sentencias del subalgoritmo se invoca al propio subalgoritmo para resolver ―una versión más pequeña‖ del problema original.
Habrá un caso (o varios) tan simple que pueda resolverse directamente sin necesidad de hacer otra llamada recursiva.
En general el pseudocódigo de un algoritmo recursivo es el siguiente:
Funcion <Tipo Var> recursivo (<TipoVar> <Var1>, <TipoVar> <Var2>,...)
<Tipo Var> valor
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 123
<instrucciones>
valor <- recursivo(<Var1>, <Var2>,...)
<instrucciones>
Retornar valor
FinFuncion
Las condiciones que debe cumplir un algoritmo recursivo son:
Asegurar que existe una condición de salida, en la que no se producen llamadas recursivas (caso base).
Asegurar que se cubren todos los posibles casos entre el base y los no base.
Cada llamada, en el caso no base, conduce a problemas cada vez más pequeños que terminarán en el caso base.
Ejemplo 24. Calcular el factorial de un número entero usando un algoritmo recursivo. Solución. Recordemos la definición recursiva del factorial:
n! = n * (n-1)! , si n > 1 1! = 1
Por lo tanto, tenemos los casos:
Si n = 1 (caso base) Retornar 1 Si n > 1 Retornar n * factorial(n – 1)
Sea factorial(n) la función que calcula el factorial de un número entero n, sea n=4, entonces:
factorial (4) = 4 * factorial (3) = 4 * 6 = 24 factorial (3) = 3 * factorial (2) = 3 *2 = 6 factorial (2) = 2 * factorial (1) = 2 * 1 = 2 factorial (1) = 1
Pseudocódigo: Funcion Entero factorial (Entero n)
Entero temp
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 124
Si n>1 Entonces
temp <- n*factorial(n-1)
Sino
temp <- 1
FinSi
Retornar temp
FinFuncion
Proceso principal
Entero n<-0
Escribir "Factorial de un número entero\t\n"
Escribir "Ingrese en valor de n: "
Leer n
Escribir "El factorial de ",n," es ", factorial(n)
Fin
A veces, podemos encontrar una solución iterativa simple, que haga que el algoritmo sea más eficiente.
Ejemplo 25. Calcular el factorial de un número entero usando un algoritmo iterativo. Solución. Se define el factorial como:
n! = n * (n-1)! , si n > 1 1! = 1
De acuerdo con esta definición, se tiene que:
n! = n * (n-1)!, si n>1 (n-1)! = (n-1) * (n-2)! (n-2)! = (n-2) * (n-3)! ……. (2)! = (2) * (1)!
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 125
De donde: n!=n*(n-1)*(n-2)*…*1, que es la definición iterativa de factorial. Sea factorial(n) la función que calcula el factorial de un número entero n, sea n=4, entonces:
factorial (4) = 4*3*2*1 = 24
Pseudocódigo:
Funcion Entero factorial (Entero n)
Entero fact<-1
Para Entero i <- 1 Hasta n Con Paso 1 Hacer
fact <- fact*i
FinPara
Retornar fact
FinFuncion
Proceso principal
Entero n<-0
Escribir "Factorial de un número entero\t\n"
Escribir "Ingrese en valor de n: "
Leer n
Escribir "El factorial de ",n," es ", factorial(n)
Fin
Ventajas.
La principal ventaja es la simplicidad de comprensión y su gran potencia, favoreciendo la resolución de problemas complejos de manera natural, sencilla y elegante; y facilidad para comprobar y convencerse de que la solución del
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 126
problema es correcta. El valor de la recursividad reside en el hecho de que se puede usar para resolver problemas sin fácil solución iterativa.
Desventajas. El principal inconveniente es la ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso es necesario transformar el programa recursivo en otro iterativo, que utiliza bucles y pilas para almacenar las variables. Una simple llamada puede generar un gran número de llamadas recursivas. (factorial(n) genera n llamadas recursivas). Observación. La recursividad se debe usar cuando sea realmente necesaria, es decir, cuando no exista una solución iterativa simple.
16. ESTILO DE PROGRAMACIÓN.
El buen estilo de programación es, sin lugar a dudas, una de las características
más importantes que debe tener un buen programador. Un programa con buen
estilo es más fácil de leer, de corregir y de mantener. Aunque la experiencia
proporciona el estilo, existen una serie de reglas que se recomiendan seguir desde
el principio del aprendizaje de la programación.
Comentarios. La legibilidad de los programas aumenta considerablemente
utilizando comentarios. Un comentario es un texto explicativo más o menos
largo, situado en el programa e ignorado por el compilador. Los comentarios
son considerados parte del código fuente por más que sean ignorados en las
etapas de compilación y ejecución, y tienen importancia primordial en las fases
de análisis, puesta a punto y mantenimiento. Los comentarios son una parte
fundamental de la documentación de un programa, ya que ayudan al
programador y a otras personas a la comprensión del mismo. No es raro
encontrar programas en los cuales los comentarios ocupan más lugar, incluso,
que las propias instrucciones.
Elección de nombres significativos para variables, funciones y
procedimientos. Las variables, constantes, nombres de subprogramas y
nombres de programas deben ser significativos para orientar al usuario o a
otros programadores sobre lo que representan: X, Y, JJ no son identificadores
significativos.
Identación. Aunque no suele ser requerido por los compiladores de los
lenguajes de alto nivel, es una práctica habitual realizar una identación (o
tabulación) en cada uno de los bloques y unidades de programas
fundamentales para mejorar la legibilidad del código fuente.
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 127
Espacios y Líneas en Blanco. Con el mismo fin de mejorar le legibilidad y
comprensibilidad del programa es recomendado utilizar espacios en blanco
antes y después de un operador, así como también dejar una línea en blanco
entre partes importantes o que estén lógicamente separadas.
Validación. Los programas no pueden considerarse correctos hasta que han
sido validados utilizando un rango amplio de datos de prueba para contemplar
todas las posibles direcciones que el flujo de control puede tomar en tiempo de
ejecución.
17. BIBLIOGRAFÍA.
―Fundamentos de Informática‖
Luis A. Ureña y otros. 1999 Editorial Alfaomega ra-ma
―Fundamentos de Programación‖. Libro de Problemas
Luis Joyanes Aguilar, Rodríguez Baena y Fernández Azuela. 1996
―Fundamentos de Programación‖. Algoritmos y estructuras de datos. 2ª Edición
―Pascal y Turbo Pascal enfoque práctico‖. Luis Joyanes Aguilar 1996. Editorial Mc
Graw Hill
―Lógica Simbólica‖. Luis Joyanes Aguilar y Angel Hermoso. Editorial Mc Graw Hill
Irving M. Copi. Editorial C.E.C.S.A.
―Programación en Pascal‖. 4ª Edición
Sanford Leestma y Larry Nyhoff. Editorial Prentice Hall 1999
―Cómo programar en C/C++‖
Deitel/Deitel. Editorial Prentice Hall
―Introducción a la Ciencia de las Computadoras‖.
―Aprenda Visual C++ Ya‖.
Mark Andrews. Editorial Mc Graw Hill
―Visual C++ 6.0 Manual de Referencia‖.
Chris Pappas y William H. Murray. Editorial Mc Graw Hill
Fundamentos de Programación – Algoritmos Universidad Central del Ecuador
Ing. Jéfferson Beltrán M. Msc. 128
―Computación. Metodología, Lógica Computacional y Programación‖.
Ma. del Rosario Bores Rangel y Román Rosales Becerril. 1ª Edición Editorial Mc
Graw Hill 1993
―Programación en C‖. 1ª Edición
Byron S. Gottfried. Editorial Mc Graw Hill 1991
―Metodología de la Programación. Algoritmos, Diagramas de Flujo y programas‖
Tomos I y II. Osvaldo Cairó battistutti. 1a Edición
Editorial Alfaomega 1995
―Enciclopedia del Lenguaje C‖. 1ª Edición
Francisco Javier Ceballos. Editorial Alfaomega ra-ma 1999
http://pseint.sourceforge.net/
http://jtraductor.sourceforge.net/