Upload
independent
View
0
Download
0
Embed Size (px)
Citation preview
Diseño e Interpretación de Algoritmos 2015
1 Telemática y comunicaciones Docente: Arlen Díaz Tercero
1
Solución de Problemas Según Polya (1957), cuando se resuelven problemas, intervienen cuatro operaciones
mentales:
1. Entender el problema
2. Trazar un plan
3. Ejecutar el plan (resolver)
4. Revisar
Es importante notar que estas son
flexibles.
Es necesario hacer énfasis en la naturaleza dinámica y cíclica de la solución de problemas.
En el intento de trazar un plan, los estudiantes pueden concluir que necesitan entender
mejor el problema y deben regresar a la etapa anterior; o cuando han trazado un plan y
tratan de ejecutarlo, no encuentran cómo hacerlo; entonces, la actividad siguiente puede
ser intentar con un nuevo plan o regresar y desarrollar una nueva comprensión del
problema (Wilson, Fernández & Hadaway, 1993; Guzdial, 2000).
Se pueden identificar las siguientes sugerencias propuestas a los estudiantes para llegar a
la solución de un problema:
1. COMPRENDER EL PROBLEMA.
Leer el problema varias veces
Establecer los datos del problema
Aclarar lo que se va a resolver (¿Cuál es la pregunta?)
Precisar el resultado que se desea lograr
Determinar la incógnita del problema
Organizar la información
Agrupar los datos en categorías
Trazar una figura o diagrama.
Diseño e Interpretación de Algoritmos 2015
2 Telemática y comunicaciones Docente: Arlen Díaz Tercero
2
2. HACER EL PLAN.
Escoger y decidir las operaciones a efectuar.
Eliminar los datos inútiles.
Descomponer el problema en otros más pequeños.
3. EJECUTAR EL PLAN (Resolver).
Ejecutar en detalle cada operación.
Simplificar antes de calcular.
Realizar un dibujo o diagrama
4. ANALIZAR LA SOLUCIÓN (Revisar).
Dar una respuesta completa
Hallar el mismo resultado de otra manera.
Verificar por apreciación que la respuesta es adecuada.
EJEMPLO
En un juego, el ganador obtiene una ficha roja; el segundo, una ficha azul; y
el tercero, una amarilla. Al final de varias rondas, el puntaje se calcula de la
siguiente manera: Al cubo de la cantidad de fichas rojas se adiciona el doble
de fichas azules y se descuenta el cuadrado de las fichas amarillas. Si
Andrés llegó 3 veces en primer lugar, 4 veces de último y 6 veces de
intermedio, ¿Qué puntaje obtuvo? (Adaptado de Melo (2001), página 30).
R/: COMPRENDE
Leer detenidamente el problema
¿Cuántos colores de fichas se reparten?
¿Cuántas fichas rojas, azules y amarillas obtuvo Andrés?
¿Qué pregunta el problema?
PLANEA
Para hallar el puntaje que obtiene Andrés por sus llegadas de
primero, calcular el cubo de la cantidad de fichas rojas.
Para hallar el puntaje por sus llegadas en segundo lugar, calcular el
doble de la cantidad de fichas azules.
Para hallar el puntaje que pierde por sus llegadas en último lugar,
calcular el cuadrado de la cantidad de fichas amarillas.
Para hallar el puntaje total, calcular la suma de los puntajes por las
fichas rojas y azules, restarle los puntos de las fichas amarillas.
Diseño e Interpretación de Algoritmos 2015
3 Telemática y comunicaciones Docente: Arlen Díaz Tercero
3
RESUELVE
Por tres fichas rojas: 33 = 27 puntos
Por seis fichas azules: 6 x 2 = 12 puntos
Por cuatro fichas amarillas: 42 = 16 puntos
• Para obtener el puntaje final de Andrés, sumar los puntos obtenidos con las fichas
rojas y azules (27 + 12 = 39 puntos) y de este resultado restar los puntos
representados por las fichas amarillas (39 – 16 = 23 puntos).
• El puntaje que obtuvo Andrés es 23 puntos.
Conceptos Básicos Variable:
Es un espacio en la memoria de la computadora que permite almacenar temporalmente
un dato durante la ejecución de un proceso, su contenido puede cambiar durante la
ejecución del programa.
Para poder reconocer una variable en la memoria de la computadora, es necesario darle
un nombre con el cual podamos identificarla dentro de un algoritmo (suelen denotarse
con letras – identificadores) y pueden tomar cualquier valor de un intervalo de valores
posible.
Ejemplo: área = pi * radio ^ 2
Las variables son: el radio, el área y la constate es pi
El valor de una Variable puede cambiar en algún paso del Algoritmo o permanecer
invariable; por lo tanto, el valor que contiene una variable es el del último dato asignado a
esta.
Clasificación de las variables
Por su contenido
Variables
Por su uso
Numéricas
Lógicas
Alfanuméricas
De trabajo
Contadores
Acumuladores
Diseño e Interpretación de Algoritmos 2015
4 Telemática y comunicaciones Docente: Arlen Díaz Tercero
4
Por su contenido
Variables Numéricas: Son aquellas en las cuales se almacenan valores numéricos,
positivos o negativos, es decir almacenan números del 0 al 9, signos (+ y -) y el punto
decimal.
Ejemplo: iva = 0.13 // pi = 3.1416 // costo = 2500.
Variables Lógicas: Son aquellas que solo pueden tener dos valores (cierto o falso) estos
representan el resultado de una comparación entre otros datos.
Variables Alfanuméricas: Está formada por caracteres alfanuméricos (letras, números y
caracteres especiales).
Ejemplo: letra = ’a’ // apellido = ’lopez’ // direccion = ’Av. Libertad #190’.
Por su uso
Variables de Trabajo: Variables que reciben el resultado de una operación matemática
completa y que se usan normalmente dentro de un programa.
Ejemplo: Suma = a + b /c
Contadores: Se utilizan para llevar el control del número de ocasiones en que se realiza
una operación o se cumple una condición. Con los incrementos generalmente de uno en
uno.
Acumuladores: Forma que toma una variable y que sirve para llevar la suma acumulativa
de una serie de valores que se van leyendo o calculando progresivamente.
Función:
Es un conjunto de pasos para realizar cálculos especificados y devolver siempre un
resultado, los pasos están almacenados bajo un nombre de función, la cual acepta ciertos
valores conocidos como argumentos para realizar cálculos con estos y devolver un
resultado. Hay funciones que carecen de argumentos, pero que de cualquier forma
devuelven un resultado.
Tanto el resultado de la función como los argumentos que recibe deben tener un tipo de
dato previamente definido como por ejemplo: entero, carácter, cadena fecha, booleano,
etc.
Una función puede invocar a otra función e inclusive tener la capacidad de invocarse a sí
misma como en el caso de las funciones recursivas.
La ventaja es que la función se puede implementar e invocar una y repetidas veces.
Diseño e Interpretación de Algoritmos 2015
5 Telemática y comunicaciones Docente: Arlen Díaz Tercero
5
Manejo de ecuaciones y graficación
Elaborar y explicar de forma detallada los siguientes ejercicios de ecuaciones:
2x=6
2x-3=6+x
2(2x-3)=6+x
Modelado matemático
Un modelo matemático describe teóricamente un objeto que existe fuera del campo de
las Matemáticas. Las previsiones del tiempo y los pronósticos económicos, por ejemplo,
Diseño e Interpretación de Algoritmos 2015
6 Telemática y comunicaciones Docente: Arlen Díaz Tercero
6
están basados en modelos matemáticos. Su éxito o fracaso depende de la precisión con la
que se construya esta representación numérica, la fidelidad con la que se concreticen
hechos y situaciones naturales en forma de variables relacionadas entre sí.
Básicamente, en un modelo matemático advertimos 3 fases:
la construcción, proceso en el que se convierte el objeto a lenguaje matemático; el análisis o estudio del modelo confeccionado; la interpretación de dicho análisis, donde se aplican los resultados del estudio al
objeto del cual se partió.
La utilidad de estos modelos radica en que ayudan a estudiar cómo se comportan las estructuras complejas frente a aquellas situaciones que no pueden verse con facilidad en el ámbito real.
Puede decirse que los modelos matemáticos son conjuntos con ciertas relaciones ya definidas, que posibilitan la satisfacción de proposiciones que derivan de los axiomas teóricos. Para ello, se sirven de diversas herramientas, como ser el álgebra lineal que, por ejemplo, facilita la fase de análisis, gracias a la representación gráfica de las distintas funciones.
Evaluación
La evaluación de un algoritmo tiene como propósito medir su desempeño, considerando
el tiempo de ejecución y los recursos empleados (memoria de la computadora) para
obtener una solución satisfactoria.
En muchas ocasiones, se les da mayor peso al tiempo que tarda un algoritmo en resolver
un problema.
Para medir el tiempo de ejecución el algoritmo se puede transformar a un programa de
computadora, y es aquí donde entran otros factores como el lenguaje de programación
elegido, el sistema operativo, la habilidad del programador, etc.
Pero existe otra forma, se puede medir el número de operaciones que realiza un
algoritmo considerando el tamaño de entradas al mismo (N). Entre más grande es la
entrada, mayor será su tiempo de ejecución,
También se debe tomar en cuenta cómo está el conjunto de datos de entrada con el que
se trabajará el algoritmo, como en los algoritmos de ordenación, en donde el peor caso es
que las entradas se encuentren totalmente desordenadas, el mejor de los casos es que se
encuentren totalmente ordenadas y en el caso promedio están parcialmente ordenadas.
La depuración es el proceso de identificación y corrección de errores de programación.
Diseño e Interpretación de Algoritmos 2015
7 Telemática y comunicaciones Docente: Arlen Díaz Tercero
7
El término en inglés es debugging y para depurar el código fuente, el programador se vale
de herramientas que le facilitan la localización y depuración de errores como por ejemplo
los compiladores.
Se dice que un programa está depurado cuando está libre de errores. Cuando se depura
un programa se hace un seguimiento de su funcionamiento y se van analizando los valores
de sus distintas variables, así como de los resultados obtenidos de los cálculos del
programa.
Una vez depurado el programa, se solucionan los posibles errores encontrados y se
procede a depurar otra vez. Estas acciones se repiten hasta que el programa no contiene
ningún tipo de error, tanto en tiempo de programación como en tiempo de ejecución.
Los errores más sencillos de detectar son errores de sintaxis, que se presentan cuando
alguna instrucción está mal escrita o se omitió alguna puntuación necesaria para el
programa. Existen también los errores lógicos, en los que, aunque el programa no
contenga errores de sintaxis, no realiza el objetivo por el que fue desarrollado. Pueden
presentarse errores en los valores de las variables, ejecuciones de programas que no
terminan, errores de cálculos, etc.
Estos últimos son los más difíciles de detectar, por lo que se debe realizar un seguimiento
puntual del programa.
Prueba de programas
El propósito de las pruebas es asegurar que el programa produce los resultados definidos
en las especificaciones funcionales. El programador a cargo utilizará los datos de prueba
para comprobar que el programa produce; o sea que se produzca la acción correcta en el
caso de datos correctos o el mensaje de error, y una acción correcta en el caso de datos
incorrectos.
Una vez terminada la programación, el analista concentrará su atención en la interacción
correcta entre los diferentes programas y el funcionamiento completo del sistema. Se
verificarán:
Todos los registros que se incluye en los datos de prueba.
Todos los cálculos efectuados por el programa.
Todos los campos del registro cuyo valor determine una acción a seguir dentro de
la lógica del programa.
Todos los campos que el programa actualice.
Los casos en que haya comparación contra otro archivo.
Todas las condiciones especiales del programa.
Diseño e Interpretación de Algoritmos 2015
8 Telemática y comunicaciones Docente: Arlen Díaz Tercero
8
Se cotejará la lógica del programa.
Entidades primitivas
Tipos de datos
Cuando se habla de información almacenada en una variable o constante se debe tener en
cuenta de que tipo es, de manera que se defina el tipo de dato adecuado para que pueda
ser almacenado en una variable o constante determinada. Los tipos de datos se clasifican
en:
Numéricos: Son datos cuyo contenido es una serie de dígitos (0-9) que proporcionan un
valor numérico, el cual puede ser positivo (+) o negativo (-). Con ellos se puede realizar
operaciones aritméticas o de conteo.
Ejemplo: 253, 45, 3, -32, 5, -1, 8
Enteros: Subconjunto finito de
los números enteros.
Expresión Resultado
de la
expresión
Tipo
de
Dato
Multiplicación 254*30 7260 Entero
Reales: subconjunto de
números reales limitado no
sólo en cuanto al tamaño, sino
también en cuanto a su
precisión.
Promedio 4,5÷6,3÷2,5
/3
4,433 Real
Los tipos de datos numéricos pueden ser enteros o reales.
Alfanuméricos: son todos aquellos datos cuyo contenido son letras, números o caracteres
especiales, o bien una combinación de ellos.
Carácter: Es un conjunto de símbolos
(letras, números y signos) que el
computador reconoce.
Ejemplos:
‘A’ ‘a’ ‘1’ ‘9’ ‘#’ ‘@’ ‘+’ ‘?’
Cadena: Una cadena es una secuencia de
caracteres que tiene una longitud máxima
definida.
‘Universidad’ ‘12653’
‘02/05/2008’ ‘Cr.1d-5’ ‘H2O’
Diseño e Interpretación de Algoritmos 2015
9 Telemática y comunicaciones Docente: Arlen Díaz Tercero
9
Los tipos de datos alfanuméricos pueden ser caracteres o cadenas.
Lógicos: Conjunto formado por valores de verdadero y falso (V y F). Se utiliza para
comprobar condiciones.
Ejemplo: 10>5 (Verdadero), 4=3 (Falso), 5<>15 (Verdadero), 3<0 (Falso
Expresiones
Las expresiones son combinaciones de constantes, variables, símbolos de operación,
paréntesis y nombres de funciones especiales.
Por ejemplo: a + (b + 3) / c
Cada expresión toma un valor que se determina tomando los valores de las variables y
constantes implicadas y la ejecución de las operaciones indicadas.
Una expresión consta de operadores y operandos. Según sea el tipo de datos que
manipulan, se clasifican las expresiones en:
Aritméticas
Relacionales
Lógicas
Operadores y Operandos
Operadores: Son elementos que relacionan de forma diferente, los valores de una
o más variables y/o constantes. Es decir, los operadores nos permiten
manipular valores.
Operadores Aritméticos: Los operadores aritméticos permiten la realización de
operaciones matemáticas con los valores (variables y constantes). Los operadores
aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos
son enteros, el resultado es entero; si alguno de ellos es real, el resultado es
real.
Tipos de
operadores
- Aritméticos
-Relacionales
-Lógicos
Operando (Operador) Operando
Valor
(constante o variable)
Diseño e Interpretación de Algoritmos 2015
10 Telemática y comunicaciones Docente: Arlen Díaz Tercero
10
Operadores Relaciónales:
Se utilizan para establecer una relación entre dos valores.
Compara estos valores entre si y esta comparación produce un resultado de
certeza o falsedad (verdadero o falso).
Los operadores relaciónales comparan valores del mismo tipo (numéricos o
cadenas)
Tienen el mismo nivel de prioridad en su evaluación.
Los operadores relaciónales tiene menor prioridad que los aritméticos.
Operadores Lógicos:
Estos operadores se utilizan para establecer relaciones entre valores lógicos.
Estos valores pueden ser resultado de una expresión relacional.
Identificadores
Los identificadores son nombres que se dan a los elementos utilizados para resolver un
problema y poder diferenciar unos de otros. Al asignar nombres (identificadores) a
variables, constantes y procedimientos se deben tener en cuenta algunas reglas:
• Los nombres pueden estar formados por una combinación de letras y números
(saldoMes, salario, fecha2, baseTriángulo, etc).
• El primer carácter de un nombre debe ser una letra.
• La mayoría de los lenguajes de programación diferencian las mayúsculas de las
minúsculas.
• Los nombres deben ser nemotécnicos, con solo leerlos se puede entender lo que
contienen. Deben ser muy descriptivos; no utilizar abreviaturas, a menos que se justifique
plenamente.
• Es conveniente utilizar una sola palabra para nombrar páginas, controles, variables, etc.
• No utilizar caracteres reservados (%, +, /, >, etc).
Se debe tener en cuenta que algunos lenguajes de programación no admiten las tildes.
• No utilizar palabras reservadas por los lenguajes de programación.
• Para cumplir con convenciones ampliamente utilizadas (Jiménez, 2002), los nombres de
procedimientos, variables y constantes deben empezar con minúscula. Ejemplo, fecha,
suma, etc.
Diseño e Interpretación de Algoritmos 2015
11 Telemática y comunicaciones Docente: Arlen Díaz Tercero
11
Si es un nombre compuesto por varias palabras, cada una de las palabras (con excepción
de la primera) debe empezar con mayúscula. Ejemplo: fechaInicial, baseTriángulo, etc.
El tipo de nombre –identificadores- que se asigne a variables, constantes y procedimientos
es muy importante. Cuando los estudiantes dejan de trabajar en un proyecto por varios
días, es más fácil para ellos retomar la actividad si los identificadores describen muy bien
el contenido de variables, constantes y procedimientos.
Algoritmo Es un método para resolver un problema.
En esencia, la solución de un problema se puede expresar mediante un algoritmo.
Los pasos para la resolución de un problema son:
1. Diseño del algoritmo, que describe la secuencia ordenada de pasos —sin
ambigüedades— que conducen a la solución de un problema dado. (Análisis del problema
y desarrollo del algoritmo.)
2. Expresar el algoritmo como un programa en un lenguaje de programación adecuado.
(Fase de codificación.)
3. Ejecución y validación del programa por la computadora.
Los algoritmos son independientes tanto del lenguaje de programación en que se
expresan como de la computadora que los ejecuta. En cada problema el algoritmo se
puede expresar en un lenguaje diferente de programación y ejecutarse en una
computadora distinta; sin embargo, el algoritmo será siempre el mismo.
Ejemplo:
En una analogía con la vida diaria, una receta de un plato de cocina se puede expresar en
español, inglés o francés, pero cualquiera que sea el lenguaje, los pasos para la
elaboración del plato se realizarán sin importar el idioma del cocinero.
En la ciencia de la computación y en la programación, los algoritmos son más importantes
que los lenguajes de programación o las computadoras. Un lenguaje de programación es
tan sólo un medio para expresar un algoritmo y una computadora es sólo un procesador
para ejecutarlo. Tanto el lenguaje de programación como la computadora son los medios
Problema Diseño de
algoritmo
Programa de
computadora
Diseño e Interpretación de Algoritmos 2015
12 Telemática y comunicaciones Docente: Arlen Díaz Tercero
12
para obtener un fin: conseguir que el algoritmo se ejecute y se efectúe el proceso
correspondiente.
Características fundamentales que debe cumplir todo algoritmo:
• Debe ser preciso e indicar el orden de realización de cada paso.
• Debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo
resultado cada vez.
• Debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento; o sea,
debe tener un número finito de pasos.
La definición de un algoritmo debe describir tres partes: Entrada, Proceso y Salida. En el
algoritmo de receta de cocina citado anteriormente se tendrá:
Entrada: ingredientes y utensilios empleados.
Proceso: elaboración de la receta en la cocina.
Salida: terminación del plato (por ejemplo, cordero).
Ejemplo 1:
Un cliente ejecuta un pedido a una fábrica. La fábrica examina en su banco de dato la ficha
del cliente; si es solvente entonces la empresa acepta el pedido; en caso contrario,
rechazará el pedido. Redactar el algoritmo correspondiente:
Los pasos del algoritmo son:
1. Inicio.
2. Leer el pedido.
3. Examinar la ficha del cliente.
4. Si el cliente es solvente, aceptar pedido; en caso contrario, rechazar
pedido.
5. Fin.
Ejemplo 2:
Se desea diseñar un algoritmo para saber si un numero es primo o no.
Un numero es primo si sólo puede dividirse por sí mismo y por la unidad (es decir, no tiene
más divisores que él mismo y la unidad). Por ejemplo: 9,8,6,4,12,16,20, etc., no son
primos ya que son divisibles por números distintos a ellos y a la unidd. Así 9 es divisible
por 3, 8 lo es por 2, etc.
Diseño e Interpretación de Algoritmos 2015
13 Telemática y comunicaciones Docente: Arlen Díaz Tercero
13
El algoritmo de resolución del problema pasa por dividir sucesivamente el número por
2,3,4, etc.
1. Inicio
2. Poner x igual a 2 (x=2, x variable que representa a los divisores del número
que se busca N).
3. Dividir N por X (N/X)
4. Si el resultado del N/X es entero, entonces N es un número primo y bifurcar
al punto 7; en caso contrario, continuar el proceso.
5. Suma 1 a X (X X + 1)
6. Si X es igual a N, entonces N es un número primo; en caso contrario,
bifurcar al punto 3.
7. Fin.
Por ejemplo, si N es 131, los pasos anteriores sería:
1. Inicio
2. X=2
3. y 4. 131/X. como el resultado no es entero, se continúa el proceso.
5. X2+1, luego X=3.
6. Como X no es 131, se bifurca al punto 3.
3. y 4. 131/X resultado no es entero.
5. X3+1, X=4;
6. Como X no es 131 bifurca al punto 3.
3. y 4. 131/X…, etc.
7. Fin.
Ejemplo 3:
Realizar la suma de todos los números pares entre 2 y 1000.
El problema consiste en sumar 2 + 4 + 6 +8…+1000. Utilizaremos las palabras SUMA y
NUMERO (Variables) para representar las sumas sucesivas (2+4), (2+4+6), (2+4+6+8), etc,
la solución se puede escribir con el siguiente algoritmo:
1. Inicio.
2. Establecer SUMA=0.
3. Establecer NUMERO a 2.
4. Sumar NUMERO a SUMA. El resultado será el nuevo valor de la suma (SUMA).
5. Incrementar NUMERO en 2 unidades.
6. Si NUMERO =<1000 bifurcar al paso 4;
7. En caso contrario, escribir el último valor de SUMA y terminar el proceso.
Diseño e Interpretación de Algoritmos 2015
14 Telemática y comunicaciones Docente: Arlen Díaz Tercero
14
8. Fin.
La construcción de algoritmos se basa en la abstracción de las características del
problema.
Técnicas de diseño:
Existen dos enfoques que se refieren a la forma en que se diseña un algoritmo, los cuales
son refinamiento progresivo y procesamiento regresivo.
Refinamiento progresivo
Es una técnica de análisis y diseño de algoritmos que se basa en la división del problema
principal en problemas más simples. Partiendo de problemas más simples se logra dar una
solución más efectiva, ya que el número de variables y casos asociados a un problema
simple es más fácil de manejar que el problema completo.
Está técnica se conoce como Top-Dowm, y es aplicable a la optimización del desempeño y
a la simplificación de un algoritmo.
Top Dowm (arriba-abajo) La técnica top down, o diseño descendente como también se le conoce, consiste en
establecer una serie de niveles de mayor a menor complejidad (arriba-abajo), que den
solución al algoritmo. Consiste en efectuar una relación entre las etapas de la
estructuración, de forma que una etapa jerárquica y su inmediato inferior se relacionen
mediante entradas y salidas de dato. Este diseño consiste en una serie de
descomposiciones sucesivas del problema inicial, que recibe el refinamiento progresivo
del repertorio de instrucciones que van a formar parte del programa.
La utilización de esta técnica tiene los siguientes objetivos:
Simplificación del algoritmo y de los subalgoritmos de cada descomposición.
Las diferentes partes del problema pueden ser detalladas de modo independiente e
incluso por diferentes personas (división del trabajo)
El programa final queda estructurado en forma de bloque o módulos, lo que hace
más sencilla su lectura y mantenimiento (integración).
Se alcanza el objetivo principal del diseño, ya que se parte de éste y se va
descomponiendo el diseño en parte más pequeñas, pero siempre teniendo en
mente dicho objetivo.
Un ejemplo de un diseño descendente está representado en este sistema de nómina:
Diseño e Interpretación de Algoritmos 2015
15 Telemática y comunicaciones Docente: Arlen Díaz Tercero
15
Como se puede observar, el diseño descendiente es jerárquico, el módulo 0 de Nómina
contendrá el menú principal que integrará al sistema, controlando desde éste los
submenús del siguiente nivel.
El módulo 1 de empleados contendrá un submenú con las opciones de altas, bajas
y los cambios de los empleados.
En el módulo 2 se capturarán los movimientos quincenales de la nómina como los
días trabajados, horas extras, faltas, incapacidades, etcétera, de los empleados.
En el módulo 3 se realizarán los cálculos de las percepciones, deducciones y el total
de la nómina, individualizado por trabajador y, por último, el menú de reportes
con el número 4, que contendrá los subprogramas para consultar en pantalla e
imprimir los recibos de nómina, la nómina misma y un catálogo de empleados,
aunque no es limitativo, puesto que se le pueden incluir más reportes o informes
al sistema.
El objetivo es gestionar los movimientos de la nómina por trabajador e imprimir los
reportes correspondientes. Teniéndolo en mente se fue descomponiendo en los distintos
módulos y submódulos que conforman al sistema.
Procesamiento regresivo
Ésta es otra técnica de análisis y diseños de algoritmos, que parte de la existencia de
múltiples problemas y se enfoca en la asociación e identificación de características
comunes entre ellos, para diseñar un modelo que represente la solución para todos los
casos, de acuerdo con ciertas características específicas de las entradas. Esta técnica
también es conocida como Botton-Up, aunque suele pasar que no alcance la integración
óptima y eficiente de las soluciones de los diversos problemas.
0.NOMINA
1.EMPLEADOS
1.1 ALTAS
1.2 BAJAS
1.3 CAMBIOS
2.MOVIMIENTOS 3.CALCULO 4.REPORTES
4.1 Recibo de nómina
4.2 Listado de nómina
4.3 Catálogo de empleados
Diseño e Interpretación de Algoritmos 2015
16 Telemática y comunicaciones Docente: Arlen Díaz Tercero
16
Botton Up (abajo-arriba) Es el diseño ascendente que se refiere a la identificación de aquellos subalgoritmos que
necesitan computarizarse conforma vayan apareciendo, su análisis y su codificación, para
satisfacer el problema inmediato.
Cuando la programación se realiza internamente y haciendo un enfoque ascendente, es
difícil llegar a integrar los subalgoritmos al grado tal que el desempeño global sea fluido.
Los problemas de integración entre los subalgoritmos no se solucionan hasta que la
programación alcanza la fecha límite para la integración total del programa.
Aunque cada subalgoritmo parece ofrecer lo que se requiere, cuando se contempla el
programa final, éste adolece de ciertas limitaciones por haber tomado un enfoque
ascendente:
Hay duplicidad de esfuerzos al introducir los datos.
Se introducen al sistema muchos datos carentes de valor.
El objetivo del algoritmo no fue completamente considerado y, en
consecuencia, no satisface plenamente.
A diferencia del diseño descendente, en donde si se alcanza la integración más
óptima de todos los módulos del sistema que lo conforman, en el diseño
ascendente no se alcanza este grado de integración, por lo que muchas tareas
tendrán que llevarse a cabo fuera del sistema con el siguiente retraso de
tiempo, redundancia de información, mayor posibilidad de errores, etcétera.
La ventaja del diseño ascendente es que su desarrollo es mucho más económico que el
diseño descendente, pero habría que ponderar la bondad de esta ventaja comparada con
la eficiencia en la obtención de los resultados que ofrezca el sistema ya terminado.
Técnicas para la formulación de algoritmos
Diagramas de flujo Son la representación gráfica de los algoritmos.
Elaborarlo implca diseñar un diagrama de bloque que contenga un bosquejo general del
algoritmo y basándose en este proceder a elaborar el diagrama de flujo con todos los
detalles necesarios.
Reglas de elaboración de diagramas de flujo:
Diseño e Interpretación de Algoritmos 2015
17 Telemática y comunicaciones Docente: Arlen Díaz Tercero
17
1. Debe diagramarse de arriba hacia abajo y de izquierda a derecha. Es una buena
costumbre en la diagramación que el conjunto de gráficos tenga un orden.
2. El diagrama sólo tendrá un punto de inicio y uno final. Aunque en el flujo lógico se
tomen varios caminos, siempre debe existir una sola salida.
3. Usar notaciones sencillas dentro de los gráficos y si se requiere notas adicionales
colocarlas en el gráficos de anotaciones a su lado.
4. Se deben de inicializar todas las variables al principio del diagrama. Esto es muy
recomendable, ya que nos ayuda a recordar todas las variables, constantes y
arreglos que van a ser utilizados en la ejecución del programa. Además, nunca
sabemos cuándo otra persona, modifique posteriormente el diagrama y necesite
saber de estos datos.
5. Procurar no cargar demasiado una página con gráficos, si es necesario utilizar más
hojas, emplear conectores. Cuando los algoritmos son muy grandes, se pueden
utilizar varias hojas para su graficación, en donde se utilizarán conectores de hoja
para cada punto en donde se bifurque a otra hoja.
6. Todos los gráficos deben estar conectados con flechas de flujo. Jamás debe dejarse
un gráfico sin que tenga alguna salida, a excepción del gráfico que marque el final
del diagrama.
Ventajas:
a. Programas bien documentados.
b. Cada gráfico se codificará como una instrucción de un programa, realizando
una conversión sencilla y eficaz.
c. Facilita su análisis al facilitar la comprensión de las interrelaciones.
Desventajas:
a. Su elaboración requiere de varias pruebas en borrador.
b. Los programas muy grandes requieren diagramas laboriosos y complejos.
c. Falta de normatividad en su elaboración, lo que complica su desarrollo.
Algunos de los gráficos usados en los diagramas son los siguientes:
SÍMBOLO DESCRIPCIÓN
Terminal. Indica el inicio y el final del diagrama de
flujo.
Entrada/Salida. Indica la entrada y salida de datos.
Diseño e Interpretación de Algoritmos 2015
18 Telemática y comunicaciones Docente: Arlen Díaz Tercero
18
INICIO
N=1
FACT=1
FACT=N*FACT
N, FACT
N=10
FINAL
N= N + 1
Si
No
Proceso. Indica la asignación de un valor en la
memoria y/o la ejecución de una operación
aritmética.
Decisión. Indica la realización de una comparación
de valores.
Proceso Predefinido. Representa los
subprogramas.
Conector de página. Representa la continuidad del
diagrama dentro de la misma página.
A continuación se presenta un ejemplo de diagrama de flujo.
Algoritmo: Imprimir los factoriales para los números del 1 al 10.
Pseudocódigo Es una serie de normas léxicas y gramaticales parecidas a la mayoría de los lenguajes de
programación, pero sin llegar a la rigidez de sintaxis de éstos ni a la fluidez del lenguaje
coloquial.
Cabe mencionar, que puede haber
varias soluciones y alguna ser la más
óptima.
Diseño e Interpretación de Algoritmos 2015
19 Telemática y comunicaciones Docente: Arlen Díaz Tercero
19
Es la técnica más usada para elaborar algoritmos; pseudo significa imitación, de modo que
pseudocódigo es una imitación de código, al igual que el diagrama de flujo, éste va
describiendo la secuencia lógica de pasos mediante enunciados que deben comenzar con
un verbo que indique la acción a seguir, seguida de una breve descripción del paso en
cuestión.
Se emplea, dentro de la programación estructurada, para realizar el diseño de un
programa. Se puede definir como un lenguaje de especificaciones de algoritmos.
Es la representación narrativa de los pasos que debe seguir un algoritmo para dar solución
a un problema determinado ya que utiliza palabras que indican el proceso a realizar.
En caso de usar decisiones se utilizan sentencias como:
si condición (relación booleana)
Entonces instrucciones
si no instrucciones
finsi
y si es necesario una bifurcación (cambio de flujo a otro punto del algoritmo) se utilizan
etiquetas tales como:
suma 2 y 5
ir al final
(instrucciones)
(instrucciones)
Final (etiqueta)
Ventajas de utilizar un Pseudocódigo a un Diagrama de Flujo
Ocupa menos espacio en una hoja de papel
Permite representar en forma fácil operaciones repetitivas complejas
Es muy fácil pasar de Pseudocódigo a un programa en algún lenguaje de programación.
Si se siguen las reglas se puede observar claramente los niveles que tiene cada
operación.
Por conservar la sencillez, se debe utilizar un lenguaje llano y natural. Cada frase será
después que se codifique, una línea de comando del programa.
Las órdenes más usadas son hacer-mientras, hacer hasta, si-entonces-sino, repite-mientras,
un ejemplo sería:
Diseño e Interpretación de Algoritmos 2015
20 Telemática y comunicaciones Docente: Arlen Díaz Tercero
20
Algoritmo: Obtener la suma de los números del 1 al 100.
El siguiente paso es la comprobación y luego la codificación a
un programa escrito en un lenguaje de programación.
Diagramas Estructurados Diagramas estructurados (Nassi-Schneiderman)
El diagrama estructurado N-S también conocido como diagrama de chapin es como un
diagrama de flujo en el que se omiten las flechas de unión y las cajas son contiguas. Las
acciones sucesivas se pueden escribir en cajas sucesivas y como en los diagramas de flujo, se
pueden escribir diferentes acciones en una caja. Un algoritmo se represente en la siguiente
forma:
Como ejemplo tenemos el siguiente ejemplo:
Algoritmo: Cálculo del salario neto a partir de las horas laboradas, el costo por hora y la
tasa de impuesto del 16% sobre el salario.
Inicio
asigna a=0
asigna suma=0
mientras a <= 100
asigna a = a+1
asigna suma = suma + a
fin-mientras
imprime “La suma es:”
suma
fin
Inicio
Acción1
Acción2
…
Fin
Diseño e Interpretación de Algoritmos 2015
21 Telemática y comunicaciones Docente: Arlen Díaz Tercero
21
Estructuras Algorítmicas Las estructuras de operación de programas son un grupo de formas de trabajo, que
permiten, mediante la manipulación de variables, realizar ciertos procesos específicos que
nos lleven a la solución de problemas. Estas estructuras se clasifican de acuerdo con su
complejidad en:
Inicio
Leer
Nombre, Hrs, Precio
Calcular
Salario = Hrs * Precio
Calcular
Imp = Salario * 0.16
Calcular
Neto = Salario + Imp
Escribir
Nombre, Imp, SNeto
Fin
Estructuras
Algorítmicas
Secuenciales
Condicionales
Cíclicas
-Asignación
-Entrada
-Salida
-Simples
-Dobles
-Múltiples
-Para
-Mientras que
-Repita hasta
Diseño e Interpretación de Algoritmos 2015
22 Telemática y comunicaciones Docente: Arlen Díaz Tercero
22
Estructuras Secuenciales:
Son aquellas en que una acción sigue a otra en secuencia. Sus
componentes son:
Asignación: es el paso de valores o resultados a una zona de la
memoria, esta zona será reconocida con el nombre de la variable
que recibe el valor.
Entrada: consiste en recibir un valor o un dato, por medio de algún
dispositivo de entrada.
Salida: se manda el resultado o mensaje, por medio de algún
dispositivo de salida del computador.
Estructuras Condicionales:
Son aquellas que permiten comparar una variable contra otro valor, se utilizan para tomar
decisiones lógicas, existen tres tipos:
Simples: Se ejecuta una determinada acción cuando se cumple determinada
condición.
Ejemplo:
si (condición) entonces
(acción)
fin si
Dobles: Son aquellas que permiten elegir entre dos opciones o alternativas
posibles.
Ejemplo:
Si < condición > entonces
< acción uno >
si_no
<acción dos>
fin_si
Múltiples: Son aquellas que permiten elegir cuando hay más de dos elecciones o
alternativas posibles.
Ejemplo:
si <condición> entonces
<instrucción>
INICIO
L1, L2
Hipotenusa=0
Hipotenusa=sqr(L1^2+L2^2)
Hipotenusa
FINAL
Diseño e Interpretación de Algoritmos 2015
23 Telemática y comunicaciones Docente: Arlen Díaz Tercero
23
MQ Condición
Cierre
Fin
Inicio
sino
si <condición2>entonces
<instrucción>
sino
.
.
fin si
Estructuras Cíclicas: Son aquellos tipos de estructura que repiten una secuencia de instrucciones un número
determinado de veces, para encontrar la solución a un problema, estas son denominadas
bucles, entre los cuales encontramos:
para: en esta se conoce el número de iteraciones o veces que se repite la acción, antes de
iniciar la ejecución del ciclo.
mientras que: este se repite un número determinado de veces, para esto la instrucción se
acompaña de una condición, la cual debe cumplirse para seguir la ejecución del ciclo, de lo
contrario este se termina.
repita- hasta: este repite un proceso una cantidad de veces,
determinada por un condicional, que lo ejecuta hasta que la
condicional se cumpla. Una característica importante de esta estructura es que permite
realizar el proceso cuando menos una vez, ya que la condición se evalúa al final del
proceso.
Para Var Ini, Fin, 1
Bloque de
Objetos
Cierre
Variable Incremento
Valor
Inicial
Valor final
Diseño e Interpretación de Algoritmos 2015
24 Telemática y comunicaciones Docente: Arlen Díaz Tercero
24
Arreglos
Vectores:
Es un conjunto finito y ordenado de elementos homogéneos. La propiedad ordenado
significa que el primer elemento, el segundo, el tercero,..., el enésimo puede ser
identificado. La homogeneidad implica que todos los elementos del arreglo son datos del
mismo tipo.
Es un modo de manejar una gran cantidad de datos del mismo tipo bajo un mismo nombre o
identificador. Por ejemplo, mediante la sentencia: double a[10];
se reserva espacio para 10 variables de tipo doublé. Las 10 variables se llaman a y se accede a una
u otra por medio de un subíndice, que es una expresión entera escrita a continuación del nombre
entre corchetes [...]. La forma general de la declaración de un vector es la siguiente:
tipo nombre[numero_elementos];
F
INICIO
Proceso
Repetir
Hasta <condición>
FIN
V
0
1 2 3 4 5 6
Diseño e Interpretación de Algoritmos 2015
25 Telemática y comunicaciones Docente: Arlen Díaz Tercero
25
Los elementos se numeran desde 0 hasta (numero_elementos-1). El tamaño de un vector puede
definirse con cualquier expresión constante entera. Para definir tamaños son particularmente
útiles las constantes simbólicas.
En C++ no se puede operar con todo un vector o toda una matriz como una única entidad, sino
que hay que tratar sus elementos uno a uno. Los vectores (mejor dicho, los elementos de un
vector) se utilizan en las expresiones de C++ como cualquier otra variable. Ejemplos de uso de
vectores son los siguientes:
a[5] = 0.8;
a[9] = 30. * a[5];
a[0] = 3. * a[9] - a[5]/a[9];
a[3] = (a[0] + a[9])/a[3];
Una cadena de caracteres no es sino un vector de tipo char, con alguna particularidad que
conviene resaltar. Las cadenas suelen contener texto (nombres, frases, etc.), y éste se almacena
en la parte inicial de la cadena (a partir de la posición cero del vector). Para separar la parte que
contiene texto de la parte no utilizada, se utiliza un carácter fin de texto que es el carácter nulo
('\0') según el código ASCII. Este carácter se introduce automáticamente al leer o inicializar las
cadenas de caracteres, como en el siguiente ejemplo:
char ciudad[20] = "San Sebastián";
Donde a los 13 caracteres del nombre de esta ciudad se añade un decimocuarto: el '\0'. El resto
del espacio reservado –hasta la posición ciudad [19] – no se utiliza. De modo análogo, una cadena
constante tal como "mar" ocupa 4 bytes (para las 3 letras y el '\0').
Matriz:
Es una estructura de datos, o más técnicamente, un espacio de memoria que permite
almacenar una colección de elementos, todos del mismo tipo. La diferencia con los
arreglos está en que, en las matrices, los elementos no están organizados linealmente sino
que su organización es bidimensional, es decir, en filas y columnas. Conviene imaginar una
matriz como una organización de celdas de memoria, o casillas, en cada una de las cuales
se puede guardar un elemento de la colección. Además, es usual dibujarla como se ilustra
a continuación:
0 1 2 3 4 5
0
1
2
3
Diseño e Interpretación de Algoritmos 2015
26 Telemática y comunicaciones Docente: Arlen Díaz Tercero
26
Esta figura representa un matriz de cuatro filas (numeradas verticalmente de 0 a 3) y seis
columnas (numeradas horizontalmente de 0 a 5). En cada una de las 24 celdas o casillas se
puede guardar un dato. La dimensión o tamaño de una matriz es el número filas por el
número de columnas. Debe ser claro entonces que la figura anterior es la gráfica de una
matriz de dimensión 4x6.
Las matrices se declaran de forma análoga, con corchetes independientes para cada subíndice. La
forma general de la declaración es:
tipo nombre[numero_filas][numero_columnas];
donde tanto las filas como las columnas se numeran también a partir de 0. La forma de acceder a
los elementos de la matriz es utilizando su nombre, seguido de las expresiones enteras
correspondientes a los dos subíndices, entre corchetes. En C++ tanto los vectores como las
matrices admiten los tipos de las variables escalares ( char, int,long, float, double, etc.).
Módulos
Definición, Función y manipulación
Behrouz, en su libro titulado “Introducción a la ciencia de la computación” afirma que la
modularidad significa la división de un proyecto grande en partes más pequeñas que
pueden entenderse y manejarse más fácilmente, es decir la división de un
programa grande en partes más pequeñas que pueden comunicarse entre sí.
Badenas Carpio, ratifica que la modularidad posibilita la descomposición de un problema
complejo en módulos más simples (análisis descendente). Además, proporciona la
posibilidad de componer varios módulos ya escritos para otros fines permite construir
nuevo software, de forma similar a como se utilizan funciones de bibliotecas en un
lenguaje procedural.
Un problema se puede dividir en subproblemas más sencillos. Estos subproblemas se
conocen como módulos.
Dentro de los programas se les conoce como subprogramas, y de estos hay dos tipos: los
procedimientos y las funciones. Ambos reciben datos del programa que los invoca, donde
los primeros devuelven una tarea específica y las funciones un resultado.
MÓDULO Subproblema 1
Procedimiento Devuelve una tarea
específica
Subproblema 2
Funciones Devuelve un
resultado
Diseño e Interpretación de Algoritmos 2015
27 Telemática y comunicaciones Docente: Arlen Díaz Tercero
27
Parte esencial del correcto diseño de un programa de ordenador es su modularidad, esto
es subdivisión en partes más pequeñas de finalidad muy concreta, que en C++ reciben el
nombre de funciones. Las funciones facilitan el desarrollo y mantenimiento de los
programas, evitan errores, y ahorran memoria y trabajo innecesario. Una misma función
puede ser utilizada por diferentes programas, y por tanto no es necesario reescribirla.
Además, una función es una parte de código independiente del programa principal y de
otras funciones, manteniendo una gran independencia entre las variables respectivas, y
evitando errores y otros efectos colaterales de las modificaciones que se introduzcan.
Mediante el uso de funciones se consigue un código limpio, claro y elegante. La adecuada
división de un programa en funciones constituye un aspecto fundamental en el desarrollo
de programas de cualquier tipo.
Introducción al lenguaje C++
Programa
El algoritmo es una secuencia lógica y detallada de pasos para solucionar un problema.
Una vez diseñada la solución, se debe implementar mediante la utilización de un
programa de computadora.
El algoritmo debe transformarse, línea por línea, a la sintaxis utilizada por un lenguaje de
programación (el lenguaje que seleccione el programador).
Una vez que se produce el archivo ejecutable, el programa se hace independiente del
lenguaje de programación que se utilizó para generarlo, por lo que permite su
portabilidad a otro sistema de cómputo.
El programa es la expresión computable del algoritmo ya implementado, y puede
utilizarse repetidamente en el área en donde se generó el problema.
Función
Conjunto de pasos para realizar cálculos especificados y devolver siempre un resultado,
los pasos están almacenados bajo un nombre de función, la cual acepta ciertos valores
conocidos como argumentos para realizar cálculos con estos y devolver un resultado. Hay
funciones que carecen de argumentos, pero que de cualquier forma devuelven un
resultado.
Tanto el resultado de la función como los argumentos que recibe deben tener un tipo de
dato previamente definido como por ejemplo: entero, carácter, cadena, fecha, booleano,
etcétera.
Diseño e Interpretación de Algoritmos 2015
28 Telemática y comunicaciones Docente: Arlen Díaz Tercero
28
Una función puede invocar a otra función e inclusive tener la capacidad de invocarse a sí
misma (funciones recursivas).
Ejemplo de una función: Recibe un valor n y calcula su factorial
Definición de una función
La definición de una función consiste en la definición del código necesario para que ésta
realice las tareas para las que ha sido prevista. La definición de una función se debe
realizar en alguno delos ficheros que forman parte del programa. La forma general de la
definición de una función es la siguiente:
tipo_valor_de_retorno nombre_funcion (lista de parámetros)
{declaración de variables y/o de otras funciones
codigo ejecutable
return (expresión); /* optativo */
}
La primera línea recibe el nombre de encabezamiento (header) y el resto de la definición –
encerrado entre llaves– es el cuerpo de la función. Cada función puede disponer de sus
propias variables, declaradas al comienzo de su código. Estas variables, por defecto, son
de tipo auto, es decir, sólo son visibles dentro del bloque en el que han sido definidas y
permanecen ocultas para el resto del programa. También pueden hacerse visibles a la
función variables globales definidas en otro fichero (o en el mismo fichero, si la definición
está por debajo de donde se utilizan), declarándolas con la palabra clave extern.
El código ejecutable es el conjunto de instrucciones que deben ejecutarse cada vez que la
función es llamada. La lista de parámetros, también llamados argumentos formales, es
una lista de declaraciones de variables, precedidas por su tipo correspondiente y
separadas por comas (,).
Los argumentos formales son la forma más natural y directa para que la función reciba
valores desde el programa que la llama, correspondiéndose en número y tipo con otra
Entero función factorial (entero n)
Inicio
Si (n=0) entonces
Factorial=1;
Sino
Factorial=n*factorial(n-1);
Fin si
Retorna factorial
Fin función
Diseño e Interpretación de Algoritmos 2015
29 Telemática y comunicaciones Docente: Arlen Díaz Tercero
29
lista de argumentos – los argumentos actuales - en el programa que realiza la llamada a la
función. Los argumentos formales son declarados en el encabezamiento de la función,
pero no pueden ser inicializados en él.
Cuando una función es ejecutada, puede devolver al programa que la ha llamado un valor
(el valor de retorno), cuyo tipo debe ser especificado en el encabezamiento de la función
(si no se especifica, se supone por defecto el tipo int). Si no se desea que la función
devuelva ningún valor, el tipo del valor de retorno deberá ser void.
La sentencia return permite devolver el control al programa que llama. Puede haber varias
sentencias return en una misma función. Si no hay ningún return, el control se devuelve
cuando se llega al final del cuerpo de la función. La palabra clave return puede ir seguida
de una expresión, en cuyo caso ésta es evaluada y el valor resultante devuelto al programa
que llama como valor de retorno (si hace falta, con una conversión previa al tipo declarado
en el encabezamiento). Los paréntesis que engloban a la expresión que sigue a return son
optativos. El valor de retorno es un valor único: no puede ser un vector o una matriz,
aunque sí un puntero a un vector o a una matriz. Sin embargo, el valor de retorno sí puede
ser una estructura, que a su vez puede contener vectores y matrices como elementos
miembros.
Como ejemplo supóngase que se va a calcular a menudo el valor absoluto de variables de
tipo double. Una solución es definir una función que reciba como argumento el valor de la
variable y devuelva ese valor absoluto como valor de retorno. La definición de esta
función podría ser como sigue:
double valor_abs(double x)
{
if (x < 0.0)return -x;
else
return x;
}
Declaración de una función
En C++ toda función debe ser declarada antes de ser utilizada en la función o programa
que realiza la llamada. La declaración de una función se puede hacer de dos maneras:
a) Mediante una definición previa de la función. Esta práctica es segura si la definición
precede a la llamada, pero tiene el inconveniente de que si la definición se cambia de
lugar el programa no funcionará.
Diseño e Interpretación de Algoritmos 2015
30 Telemática y comunicaciones Docente: Arlen Díaz Tercero
30
b) Mediante una declaración explícita, previa a la llamada. Esta es la práctica más segura y
la que hay que tratar de seguir siempre. La declaración de la función se hace mediante el
prototipo de la función, bien fuera de cualquier bloque, bien en la parte de declaraciones
de un bloque.
La forma general del prototipo de una función es la siguiente:
tipo_valor_de_retorno nombre_funcion (lista_de_tipos_de_parámetros);
Llamar a una función
La llamada a una función se hace incluyendo su nombre, seguido de una lista de
argumentos separados por comas y encerrados entre paréntesis, en una expresión o
sentencia del programa principal o de otra función. A los argumentos incluidos en la
llamada se les llama argumentos actuales, y pueden ser no sólo variables y/o constantes,
sino también expresiones. Cuando el programa que llama encuentra el nombre de la
función, evalúa los argumentos actuales contenidos en la llamada, los convierte si es
necesario al tipo de los argumentos formales, y pasa copias de dichos valores a la función
junto con el control de la ejecución.
En general el número de argumentos actuales en la llamada a una función debe coincidir
con el número de argumentos formales en la definición y en la declaración, aunque hay
dos excepciones:
a) Existe la posibilidad de definir funciones con un número variable o indeterminado de
argumentos. Para definir estas funciones se utilizan los puntos suspensivos (...), que
representan los argumentos desconocidos que puede haber. Un ejemplo de función de
este tipo es el siguiente: void mi_funcion(int i, double a, ...);
donde los argumentos i y a tendrían que estar siempre presentes.
b) En C++ se pueden definir valores por defecto para todos o algunos de los argumentos
formales. Después, en la llamada, en el caso de que algún argumento esté ausente de la
lista de argumentos actuales, se toma el valor asignado por defecto a ese argumento. Por
ejemplo, la función modulo() podía haberse declarado del siguiente modo:
double modulo(double x[], int n=3);
La función modulo() puede ser llamada en C++ de las formas siguientes:
v = modulo(x, n);
v = modulo(x);
En el segundo caso se utiliza el valor por defecto n=3 incluido en la declaración.
Diseño e Interpretación de Algoritmos 2015
31 Telemática y comunicaciones Docente: Arlen Díaz Tercero
31
Cuando se llama a una función, después de realizar la conversión de los argumentos
actuales, se ejecuta el código correspondiente a la función hasta que se llega a una
sentencia return o al final del cuerpo de la función, y entonces se devuelve el control al
programa que realizó la llamada, junto con el valor de retorno si es que existe (convertido
previamente al tipo especificado en el prototipo, si es necesario). Recuérdese que el valor
de retorno puede ser un valor numérico, una dirección (un puntero), o una estructura,
pero no una matriz o un vector.
Paso de argumentos por valor y por referencia
Los cambios que la función realiza en los argumentos formales no se trasmiten a las
variables del programa que la ha llamado, precisamente porque lo que la función ha
recibido son copias. El modificar una copia no repercute en el original. A este mecanismo
de paso de argumentos a una función se le llama paso por valor.
Considérese la siguiente función para permutar el valor de sus dos argumentos x e y:
void permutar(double x, double y) /*funcion incorrecta */
{
double temp;
temp = x;
x = y;
y = temp;
}
La función anterior podría ser llamada y comprobada de la siguiente forma:
#include <iostream.h>
void main(void)
{
double a=1.0,
b=2.0;
void permutar(double, double);
cout << a << “,” << b << endl;
permutar(a, b);
cout << a << “,” << b << endl;
}
Diseño e Interpretación de Algoritmos 2015
32 Telemática y comunicaciones Docente: Arlen Díaz Tercero
32
Compilando y ejecutando este programa se ve que a y b siguen teniendo los mismos
valores antes y después de la llamada a permutar (), a pesar de que en el interior de la
función los valores sí se han permutado (es fácil de comprobar introduciendo en la función
los cout correspondientes). La razón está en que se han permutado los valores de las
copias de a y b, pero no los valores de las propias variables. Las variables podrían ser
permutadas si se recibieran sus direcciones (o copias de dichas direcciones). Las
direcciones deben recibirse en variables puntero, por lo que los argumentos formales de la
función deberán ser punteros. Una versión correcta de la función permutar () que pasa
direcciones en vez de valores sería como sigue:
void permutar(double *x, double *y)
{
double temp;
temp = *x;
*x = *y;
*y = temp;
}
que puede ser llamada y comprobada de la siguiente forma:
#include <iostream.h>
void main(void)
{
double a=1.0, b=2.0;
void permutar(double *, double *);
cout << a << “,” << b << endl;
permutar(&a, &b);
cout << a << “,” << b << endl;
}
Al mecanismo de paso de argumentos mediante direcciones en lugar de valores se le
llama paso por referencia, y deberá utilizarse siempre que la función deba devolver
argumentos modificados.
C++ ofrece otra forma de pasar argumentos por referencia a una función, que no obliga
utilizar –dentro de la función– el operador indirección (*) para acceder al valor de la
variable que se quiere modificar. Esto se hace por medio de un nuevo tipo de dato
llamado tipo referencia (reference).
Diseño e Interpretación de Algoritmos 2015
33 Telemática y comunicaciones Docente: Arlen Díaz Tercero
33
Las variables referencia se declaran por medio del carácter (&). Por lo demás, son
variables normales que contienen un valor numérico o alfanumérico. Antes de pasar a
explicarlas con más detenimiento, se presenta de nuevo el ejemplo de la función
permutar () utilizando variables referencia en lugar de punteros.
#include <iostream.h>
void main(void)
{
double a=1.0, b=2.0;
void permutar(double &, double &); /* los argumentos son referencias*/
cout << a << "," << b << endl;
permutar(a, b); /* en la llamada no se usa ni (*) ni (&) */
cout << a << "," << b << endl;
}
En este caso la definición de la función permutar () sería la siguiente:
void permutar(double &a, double &b) // los argumentos son referencias
{
double temp;
temp = a; // no hace falta utilizar
a = b; //el operador indirección (*)
b = temp;
}
Los dos programas dan idéntico resultado, sin embargo, el segundo tiene la ventaja de
que no hay que utilizar el operador indirección dentro de la función permutar().
C++ permite pasar argumentos por referencia sin más que anteponer el carácter (&) a los
argumentos correspondientes, tanto en el prototipo como en el encabezamiento de la
definición. En la llamada a la función los argumentos se ponen directamente, sin
anteponerles ningún carácter u operador.
En C++ existe realmente un tipo llamado referencia que va más allá del paso de
argumentos a funciones tal y como se acaba de explicar. Las variables de tipo referencia
se declaran con el operador (&) y deben ser inicializadas a otra variable o a un valor
numérico.
Diseño e Interpretación de Algoritmos 2015
34 Telemática y comunicaciones Docente: Arlen Díaz Tercero
34
Por ejemplo:
int i=2;
int& iref = i; // declaración de referencia válida
int& jref; // declaración de referencia no válida
La variable i es una variable normal tipo int. La variable iref es una variable referencia que
se asocia con i, en el sentido de que ambas variables comparten la misma posición de
memoria: si se modifica i se modifica iref, y viceversa. En este sentido, iref es un alias de i.
La diferencia con un puntero que apuntase a la dirección de i está en que, una vez que una
variable referencia ha sido declarada como alias de i no puede ser declarada como alias
de otra variable. Siempre se referirá a la misma posición de memoria. Es como un puntero
a una posición de memoria fija. En la función permutar () los argumentos formales, que
son referencias, se inicializan y se convierten en alias de los argumentos actuales, que
son variables ordinarias.
El principal uso de las variables referencia es como valor de retorno o argumentos de
funciones.
Palabras clave [reservadas]: (primitivas):
Palabras definidas por los lenguajes de programación para nombrar sus comandos,
instrucciones y funciones.
Identificadores
Los identificadores representan los datos de un programa (constantes, variables, tipos
de datos, funciones). Un identificador es una secuencia de caracteres que sirve para
identificar una posición en la memoria de la computadora, que nos permite accesar
a su contenido.
Ejemplo: Nombre Num_hrs Calif2
Reglas para formar un Identificador
Debe comenzar con una letra (A a Z, mayúsculas o minúsculas) y no deben
contener espacios en blanco.
Letras, dígitos y caracteres como la subraya ( _ ) están permitidos después
del primer carácter.
La longitud de identificadores puede ser de hasta 8 caracteres.
Diseño e Interpretación de Algoritmos 2015
35 Telemática y comunicaciones Docente: Arlen Díaz Tercero
35
Constantes Una constante es un dato numérico o alfanumérico que no cambia durante la ejecución
del programa.
Se crean de la misma forma que las variables y consisten en datos que, luego de ser
asignados, no cambian en ninguna instrucción del Algoritmo. Pueden contener constantes
matemáticas (pi) o generadas para guardar valores fijos (3.8, "Jorge", etc).
Ejemplo: pi = 3.1416
Operadores
Los operadores son signos especiales –a veces, conjuntos de dos caracteres– que indican
determinadas operaciones a realizar con las variables y/o constantes sobre las que actúan
en el programa. El lenguaje C++ es particularmente rico en distintos tipos de operadores:
Aritméticos ( +, -, *, /, %), de asignación ( =, +=, -=, ++, --, *=, /=), relacionales (==, <, >, <=,
>=, !=),lógicos(&&, ||, !) y otros.
Operadores Aritméticos
+ Suma
- Resta
* Multiplicación
/ División
Mod Modulo (residuo de la división entera)
Ejemplos:
Expresión Resultado
7 / 2 3,5
12 mod 7 5
4 + 2 * 5 14
Prioridad de los Operadores Aritméticos
Todas las expresiones entre paréntesis se evalúan primero. Las expresiones
con paréntesis anidados se evalúan de dentro a fuera, el paréntesis más interno se
evalúa primero.
Dentro de una misma expresión los operadores se evalúan en el siguiente orden.
Diseño e Interpretación de Algoritmos 2015
36 Telemática y comunicaciones Docente: Arlen Díaz Tercero
36
1.- ^ Exponenciación
2.- *, /, mod Multiplicación, división, modulo.
3.- +, - Suma y resta.
Los operadores en una misma expresión con igual nivel de prioridad se evalúan de
izquierda a derecha.
Ejemplos:
4 + 2 * 5 = 14
23 * 2 / 5 = 9.2 46 / 5 = 9.2
3 + 5 * (10 - (2 + 4)) = 23 3 + 5 * (10 - 6) = 3 + 5 * 4 = 3 + 20 = 23
3.5 + 5.09 - 14.0 / 40 = 5.09 3.5 + 5.09 - 3.5 = 8.59 - 3.5 = 5.09
2.1 * (1.5 + 3.0 * 4.1) = 28.98 2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98
Operadores Relaciónales
> Mayor que
< Menor que
> = Mayor o igual que
< = Menor o igual que
< > Diferente
== Igual
Ejemplos:
Si a =
10
b = 20 c = 30
a + b > c Falso
a - b < c Verdadero
a - b == c Falso
a * b < > c Verdadero
Diseño e Interpretación de Algoritmos 2015
37 Telemática y comunicaciones Docente: Arlen Díaz Tercero
37
Operadores Lógicos
Operador
Operador And
Operando1 Operador Operando2 Resultado
T AND T T
T F F
F T F
F F F
Operador Or
Operando1 Operador Operando2 Resultado
T OR T T
T F T
F T T
F F F
Operador Not
Operando Resultado
T F
F T
Ejemplos:
And Y
Or O
Not Negación
(a < b) and (b < c)
(10<20) and (20<30)
T and T
T
Diseño e Interpretación de Algoritmos 2015
38 Telemática y comunicaciones Docente: Arlen Díaz Tercero
38
Prioridad de los Operadores Lógicos
Not
And
OR
Prioridad de los Operadores en General
1 ( )
2 ^
3 *, /, Mod, Not
4 +, -, And
5 >, <, > =, < =, < >, ==, Or
Ejemplos:
a = 10 b = 12 c = 13 d =10
1.
2.
3.
((a < b) or (a < c)) and ((a == c) or (a >= b))
F T F F
T
F
F
((a >= b) or (a < d)) and ((a >= d) and (c > d))
F F T T
F
T
F
T
F
Not (a = c) and (c > b))
F T
T
T
T
Diseño e Interpretación de Algoritmos 2015
39 Telemática y comunicaciones Docente: Arlen Díaz Tercero
39
Separadores:
Los separadores –uno o varios espacios en blanco, tabuladores, caracteres de nueva línea,
denominados "espacios en blanco" en conjunto que se emplean para separar los demás tokens
(palabras clave, identificadores, constantes, cadenas de caracteres, operadores, separadores y
también los comentarios).
Comentarios Son líneas de texto que el compilador o el intérprete no consideran como parte del código, con lo cual no están sujetas a restricciones de sintaxis y sirven para aclarar partes de código en posteriores lecturas y, en general, para anotar cualquier cosa que el programador considere oportuno.
Los programadores profesionales tienen la buena costumbre de documentar sus programas con encabezados de texto (encabezados de comentarios) en donde describen la función que va a realizar dicho programa, la fecha de creación, el nombre del autor y en algunos casos las fechas de revisión y el nombre del revisor.
Por lo general algunos programas requieren hacer uso de llamadas a subprogramas dentro de una misma aplicación por lo que cada subprograma debería estar documentado, describiendo la función que realizan cada uno de estos subprogramas dentro de la aplicación.
Los caracteres (/*) se emplean para iniciar un comentario introducido entre el código del
programa; el comentario termina con los caracteres (*/). Todo texto introducido entre los
símbolos de comienzo (/*) y final (*/) de comentario son siempre ignorados por el compilador.
Por ejemplo:
/* Esto es un comentario simple. *//* Esto es un comentario más largo, distribuido en varias
líneas. El texto se suele alinear por la izquierda. */
Los comentarios pueden actuar también como separadores de otros comandos propios del
lenguaje C++. Una fuente frecuente de errores –no especialmente difíciles de detectar– al
programaren C++, es el olvidarse de cerrar un comentario que se ha abierto previamente. Además
se considera que son comentarios todo aquel texto que está desde dos barras consecutivas (//)
hasta el fin de la línea. Las dos barras marcan el comienzo del comentario y el fin dela línea, el
final. Si se desea poner comentarios de varias líneas, hay que colocar la doble barra al comienzo de
cada línea. Los ejemplos anteriores se podrían escribir del siguiente modo:
Ejemplo: // Esto es un comentario simple.
// Esto es un comentario más largo,
// distribuido en varias líneas. El
// texto se suele identar por la izquierda.
Diseño e Interpretación de Algoritmos 2015
40 Telemática y comunicaciones Docente: Arlen Díaz Tercero
40
Tipos de datos
Todos los tipos de datos tienen un tipo asociado con ellos. Un dato puede ser un simple
carácter, tal como “b”, un valor entero tal como 35. El tipo de dato determina la
naturaleza del conjunto de valores que puede tomar una variable.
Tipos de Datos Simples El C++, como cualquier otro lenguaje de programación, tiene posibilidad de trabajar con datos de
distinta naturaleza: texto formado por caracteres alfanuméricos, números enteros, números
reales con parte entera y parte fraccionaria, etc. Además, algunos de estos tipos de datos admiten
distintos números de cifras (rango y/o precisión), posibilidad de ser sólo positivos o de ser
positivos y negativos, etc. En este apartado se verán los tipos fundamentales de datos admitidos
por el C++.Más adelante se verá que hay otros tipos de datos, derivados de los fundamentales. Los
tipos de datos fundamentales del C++ se indican a continuación:
Tipos de datos fundamentales (notación completa)
Datos enteros Char signed char unsigned char Short int long unsigned short unsigned unsigned long int Datos reales Float double long double
La palabra char hace referencia a que se trata de un carácter (una letra mayúscula o minúscula, un
dígito, un carácter especial, ...). La palabra int indica que se trata de un número entero, mientras
que float se refiere a un número real (también llamado de punto o coma flotante).Los números
enteros pueden ser positivos o negativos (signed), o bien esencialmente no negativos (unsigned);
los caracteres tienen un tratamiento muy similar a los enteros y admiten estos mismos
cualificadores. En los datos enteros, las palabras short y long hacen referencia al número de cifras
o rango de dichos números. En los datos reales las palabras double y long apuntan en esta misma
dirección, aunque con un significado ligeramente diferente, como más adelante se verá.
Caracteres (tipo char).
Las variables carácter (tipo char) contienen un único carácter y se almacenan en un byte de
memoria (8 bits). En un bit se pueden almacenar dos valores (0 y 1); con dos bits se pueden
almacenar 22= 4 valores (00, 01, 10, 11 en binario; 0, 1, 2, 3 en decimal). Con 8 bits se podrán
Tipos de datos
Simples
Estructurados (Def.
por el usuario)
-Numéricos
-Lógicos
-Alfanuméricos (string)
-Arreglos (vectores, Matrices)
-Registros
-Archivos
-Apuntadores
Diseño e Interpretación de Algoritmos 2015
41 Telemática y comunicaciones Docente: Arlen Díaz Tercero
41
almacenar 28= 256 valores diferentes (normalmente entre 0 y 255; con ciertos compiladores entre
-128 y 127).
La declaración de variables tipo carácter puede tener la forma:
char nombre;
char nombre1, nombre2, nombre3;
Se puede declarar más de una variable de un tipo determinado en una sola sentencia. Se puede
también inicializar la variable en la declaración. Por ejemplo, para definir la variable carácter letra
y asignarle el valor a, se puede escribir:
char letra = 'a';
A partir de ese momento queda definida la variable letra con el valor correspondiente a la letra a.
Números enteros (tipo int)
De ordinario una variable tipo int se almacena en 4 bytes (32 bits).
Con 32 bits se pueden almacenar 232= 4294967296 números enteros diferentes: de 0 al
4294967296 para variables sin signo, y de -2147483648 al 2147483647 para variables que pueden
ser positivas y negativas, que es la opción por defecto. Este es el rango de las variables tipo int.
Una variable entera (tipo int) se declara, o se declara y se inicializa en la forma:
unsigned int numero;
int nota = 10;
En este caso numero podrá estar entre 0 y 4294967296, mientras que nota deberá estar
comprendida entre -2147483648 y 2147483647. Cuando a una variable int se le asigna en tiempo
de ejecución un valor que queda fuera del rango permitido (situación de overflow o valor
excesivo),se produce un error en el resultado de consecuencias tanto más imprevisibles cuanto
que de ordinario el programa no avisa al usuario de dicha circunstancia.
Números enteros (tipo long)
Aunque lo habitual es que una variable tipo int ocupe 4 bytes, en algunos compiladores no se le
asignan más que 2. Para evitar este problema se puede anteponer la palabra long, que asegura
que la variable alcance esos 4 bytes. De esta manera el rango de la variable será el
correspondiente al tipo int habitual.
Números enteros (tipo short)
Existe la posibilidad de utilizar enteros con un rango menor si se especifica como tipo short en su
declaración: short int numero_pequeño;
o, ya que la palabra clave int puede omitirse en este caso, short numero_pequeño;
El rango de un entero short puede variar según el computador o el compilador que se utilice, pero
de ordinario se utilizan 2 bytes (16 bits) para almacenarlos, por lo que se pueden representar216=
Diseño e Interpretación de Algoritmos 2015
42 Telemática y comunicaciones Docente: Arlen Díaz Tercero
42
65.536 números enteros diferentes. Si se utilizan números con signo, podrán representarse
números entre –32.768 y 32.767. También se pueden declarar enteros short que sean siempre
positivos con la palabra unsigned: unsigned short numero_positivo_mayor;
En algunos computadores una variable int ocupa 2 bytes (coincidiendo con short) y en otros 4
bytes (coincidiendo con long). Lo que se garantiza es que el rango de int no es menor que el
de short ni mayor que el de long.
Números reales (tipo float)
En muchas aplicaciones hacen falta variables reales, capaces de representar magnitudes que
contengan una parte entera y una parte fraccionaria. Estas variables se llaman también
de punto flotante.
Los computadores trabajan en base 2.
Las variables tipo float se declaran de la forma: float numero_real;
Las variables tipo float pueden ser inicializadas en el momento de la declaración, igual que las
variables tipo int.
Números reales (tipo double)
Las variables tipo float tienen un rango y –sobre todo– una precisión muy limitada, insuficiente
para la mayor parte de los cálculos técnicos y científicos. Este problema se soluciona con el tipo
double, que utiliza 8 bytes (64 bits) para almacenar una variable.
La precisión es en este caso, 2 52= 4.503.599.627.370.496 lo cual representa entre 15 y 16 cifras
decimales equivalentes.
Las variables tipo double se declaran de forma análoga a las anteriores: double real_grande;