42
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

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;