algoritmos - funciones c++

8
Curso: Algoritmos I Profesor: Ing. Erick Núñez FACULTAD DE INGENIERÍA INDUSTRIAL Y DE SISTEMAS Carrera Profesional de Ingeniería de Sistemas Razones válidas para crear un subprograma Reducir la complejidad del programa (“divide y vencerás”). Eliminar código duplicado. Limitar los efectos de los cambios (aislar aspectos concretos). Ocultar detalles de implementación (p.ej. algoritmos complejos). Promover la reutilización de código (p.ej. familias de productos). Mejorar la legibilidad del código. Facilitar la portabilidad del código. Pasos para escribir un subprograma 1. Definir el problema que el subprograma ha de resolver. 2. Darle un nombre no ambiguo al subprograma. 3. Decidir cómo se puede probar el funcionamiento del subprograma. 4. Escribir la declaración del subprograma (cabecera de la función). 5. Buscar el algoritmo más adecuado para resolver el problema. 6. Escribir los pasos principales del algoritmo como comentarios. 7. Rellenar el código correspondiente a cada comentario. 8. Revisar mentalmente cada fragmento de código. 9. Repetir los pasos anteriores hasta quedar completamente satisfecho. Los parámetros de un subprograma Orden: (por valor, por referencia) == (entrada, entrada/salida, salida) Si varias rutinas utilizan los mismos parámetros, éstos han de ponerse en el mismo orden (algo que la biblioteca estándar de C no hace). De acuerdo con la primera norma, las variables de estado o error se ponen al final. No es aconsejable utilizar los parámetros de una rutina como si fuesen variables locales de la rutina. Se han de documentar las suposiciones que se hagan acerca de los posibles valores de los parámetros. Sólo se deben incluir los parámetros que realmente necesite la rutina para efectuar su labor. Las dependencias existentes entre distintos módulos han de hacerse explícitas mediante el uso de parámetros.

Upload: ronal-palomino

Post on 26-Jul-2015

3.205 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

Razones válidas para crear un subprograma Reducir la complejidad del programa (“divide y vencerás”). Eliminar código duplicado. Limitar los efectos de los cambios (aislar aspectos concretos). Ocultar detalles de implementación (p.ej. algoritmos complejos). Promover la reutilización de código (p.ej. familias de productos). Mejorar la legibilidad del código. Facilitar la portabilidad del código.

Pasos para escribir un subprograma 1. Definir el problema que el subprograma ha de resolver. 2. Darle un nombre no ambiguo al subprograma. 3. Decidir cómo se puede probar el funcionamiento del subprograma. 4. Escribir la declaración del subprograma (cabecera de la función). 5. Buscar el algoritmo más adecuado para resolver el problema. 6. Escribir los pasos principales del algoritmo como comentarios. 7. Rellenar el código correspondiente a cada comentario. 8. Revisar mentalmente cada fragmento de código. 9. Repetir los pasos anteriores hasta quedar completamente satisfecho.

Los parámetros de un subprograma

Orden: (por valor, por referencia) == (entrada, entrada/salida, salida) Si varias rutinas utilizan los mismos parámetros, éstos han de ponerse en el mismo orden (algo que

la biblioteca estándar de C no hace). De acuerdo con la primera norma, las variables de estado o error se ponen al final. No es aconsejable utilizar los parámetros de una rutina como si fuesen variables locales de la rutina. Se han de documentar las suposiciones que se hagan acerca de los posibles valores de los

parámetros. Sólo se deben incluir los parámetros que realmente necesite la rutina para efectuar su labor. Las dependencias existentes entre distintos módulos han de hacerse explícitas mediante el uso de

parámetros.

Page 2: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

Paso de Parámetros por Valor void sub (int , int );

int main ()

{

int z,t;

z=5;

t=10;

printf("%d %d\n",z,t); // 5 10

sub(z,t);

printf("%d %d\n",z,t); // 5 10

sub(z,4);

printf("%d %d\n",z,t); // 5 10

sub(z,2*t+20);

printf("%d %d\n",z,t); // 5 10

sub(3,20);

printf("%d %d\n",z,t); // 5 10

sub(z+32,20);

printf("%d %d\n",z,t); // 5 10

} void sub (int x, int y)

{

x = x+y;

}

El paso de atributos por referencia se puede simular si utilizamos punteros (pasamos como parámetros las direcciones en memoria de las variables que queremos modificar dentro del subprograma): void sub (int *x, int y); int main () { int z,t; z=5; t=10; printf("%d %d\n",z,t); // 5 10 sub(&z,t); printf("%d %d\n",z,t); // 15 10 sub(&z,4); printf("%d %d\n",z,t); // 19 10 sub(&z,2*t+20); printf("%d %d\n",z,t); // 59 10 sub(&3,20); // ERROR

Page 3: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

sub(&(z+32),20); // ERROR } void sub (int *x, int y) { *x = (*x) + y; }

Ámbito de Variables

#include <stdio.h>

int a,b; int main ()

{

a=3;

b=4;

MiSub1(a,&b);

printf(“%d %d”,a,b);

MiSub2(32);

printf(“%d %d”,a,b);

}

void MiSub1 (int x, int *y)

{

int h = x*4;

*y = h + x + 3 + a;

}

void MiSub2 (int x)

{

int b = 2*x;

a = b + 3;

}

Page 4: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

RECURSIVIDAD

Funciones Recursivas: El C++ es un lenguaje de programación que admite la Recursividad, esto es, funciones que pueden llamarse a sí mismas. Cuando una función es llamada por sí misma, se crea un nuevo juego de parámetros y variables locales, pero el código ejecutable es el mismo. Es muy importante definir las condiciones dentro de la función para que la recursividad finalice y no genere un bucle infinito. Veamos un ejemplo:

Page 5: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

Ejercicios Se pide Calcular el factorial de un número utilizando funciones El factorial de un numero es un proceso que se puede calcular utilizando la siguiente función

Se Pide Desarrollar el programa que la función Haga un programa que calcule el área de un círculo I.- Diseño del programa Entrada: radio y pi (constante) Salida: área del circulo Descripción del procedimiento por Tareas

1. Pedir Radio 2. Calculara área del Circulo 3. Mostrar área del Circulo

Díselo de los subprogramas 1 Pedir Radio procedimiento Entrada: radio Salida: radio (un parámetro por referencia) 2 Calcular el área del circulo Función. Entrada radio (parámetro por valor) y pi (constante) Salida: área (retorno por el nombre de la función) 3 Mostrar el área del círculo Entrada: área (parámetro por valor) Salida : área (mostrar en pantalla

Page 6: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

Se va a implementar una sencilla función que calcule el área de un triángulo. Para calcular

el área de un triángulo es necesario conocer la base y la altura. Estos dos datos se deben

pedir al usuario y luego calcular el área por medio de la función. Probar el siguiente código:

#include <iostream.h>

float AreaTriangulo( float , float );

void main(void)

{

float base,alt;

cout << "Escribe la base: " ;

cin >> base;

cout << "Escribe la altura: " ;

cin >> alt;

cout << "El area del triangulo es: " << AreaTriangulo(base,alt);

}

float AreaTriangulo( float b, float h)

{

float tmp = b*h/2.0;

return tmp;

}

En este ejercicio se va a hacer uso de algunas funciones definidas en el estándar del C++

para obtener los datos de fecha y hora del PC. Probar el código siguiente:

#include <iostream.h>

#include <time.h>

void ImprimeHora(void);

void Delay(double seg);

void main(void)

{

ImprimeHora();

Delay(2.5); //retardo de 2.5 seg.

ImprimeHora();

}

void ImprimeHora(void)

{

long t1;

tm *mihora; //estructura para time

time(&t1); //obtener los datos actuales (en long)

mihora = localtime(&t1); //convierte long a struct tm

cout << "Fecha: " << mihora->tm_mday << "/" ;

cout << mihora->tm_mon+1<<"/"<<mihora->tm_year+1900;

cout << " Hora: " << mihora->tm_hour << ":" ;

cout << mihora->tm_min << ":“ <<mihora->tm_sec << endl;

}

void Delay(double seg)

{

long start;

long end;

time(&start);

end = start;

while( difftime(end,start) < seg)

{time(&end);}

}

Page 7: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

Explicación:

1. Todas las funciones se encuentran definidas en el fichero time.h, el cual se debe incluir al comienzo del

programa.

2. La función time(long&) obtiene en una variable del tipo long un valor que representa la fecha y hora a

partir del 1 de enero de 1900. Se le debe pasar la dirección de la variable (&t1), ya que la función tiene que

escribir el dato.

3. El valor obtenido con time() se introduce como parámetro a la función localtime(), la cual se encarga de

convertir ese long en “algo más inteligible” La función devuelve un puntero a una estructura tm (por eso se

define tm *mihora) definida en el fichero time.h, que tiene los siguientes miembros: struct tm {

int tm_sec; /* seconds after the minute - [0,59] */

int tm_min; /* minutes after the hour - [0,59] */

int tm_hour; /* hours since midnight - [0,23] */

int tm_mday; /* day of the month - [1,31] */

int tm_mon; /* months since January - [0,11] */

int tm_year; /* years since 1900 */

int tm_wday; /* days since Sunday - [0,6] */

int tm_yday; /* days since January 1 - [0,365] */

int tm_isdst; /* daylight savings time flag */

};

4. Una vez que se tiene la estructura, se puede sacar la hora, minutos, segundos, día, etc., por medio de los

miembros de la estructura.

5. Existe también una función difftime(time1, time2) que obtiene la diferencia de dos tiempos, la cual se

utiliza para medir el tiempo que ha transcurrido entre una operación y otra. En el caso del ejemplo, se usa

para crear una función delay() que hace que el programa se quede en un bucle while un tiempo determinado,

dado como argumento a delay(double seg).

Ejercicios : 1. Escriba una función que decida si un número entero es capicúa. 2. Escriba una función que calcule la suma de los divisores de un número entero positivo, pudiendo excluir de dicha suma el propio número (será un parámetro adicional (valor 1 o 0) quien determinará si se suma o no). 3. Construya una función, llamada amigos, que apoyándose en la función anterior, permita ver si dos números son o no amigos (dos números A y B son amigos si la suma de los divisores de A (excluido él mismo) coincide con B y viceversa), Construya un programa que, apoyándose en la función anterior, permita obtener todas las parejas de números amigos comprendidos entre dos números facilitados por el usuario 4.Dada la longitud, ancho y profundidad (en pies) de una piscina, el volumen se calcula según la siguiente fórmula:

volumen = longitud*ancho*profundidad Dado que un pie cúbico de agua es equivalente a 7.8 galones, la capacidad de agua de la piscina viene dada por la fórmula:

capacidad = volumen * 7.8 Si la rata de flujo de agua en la piscina es de 20 galones por minuto, entonces el tiempo (en horas) que se requiere para llenar la piscina se calcula mediante la fórmula:

Tiempo = capacidad/20/60

Page 8: Algoritmos - Funciones C++

Curso: Algoritmos I

Profesor: Ing. Erick Núñez

FACULTAD DE INGENIERÍA INDUSTRIAL Y DE

SISTEMAS

Carrera Profesional de Ingeniería de Sistemas

PRACTICA V

1.-Hacer una ecuación de recursión Múltiple en la sucesión de Fibonacci

2. Escribe funciones recursivas para las siguiente operaciones entre 2 enteros:

a. Sumar: Dentro de la función sólo se podrán utilizar incrementos unitarios, por tanto, no se puede

utilizar el operador suma.

b. Multiplicar: En este caso sólo se podrá utilizar el operador suma, y no el de multiplicación.

c. La función exponencial, xy siendo x, y números enteros (xy = x * xy-1).

3.Diseñar un programa para jugar a adivinar un número entre 0 y 100. El juego tiene que dar pistas de si el

número introducido por el jugador está por encima o por debajo. El juego termina cuando se adivina el

número o se decide terminar de jugar (por ejemplo al teclear un número negativo).

5.- Realizar un programa mediante el uso de funciones que simule un cajero automático de monedas. Los

tipos de monedas que dispone el cajero son de 1,5,25,50,100 y 500 pesetas. Inicialmente el cajero tiene 100

monedas de cada tipo, que se van consumiendo para proporcionar las cantidades solicitadas. El cajero debe

obtener la cantidad solicitada con los tipos de moneda que tenga en cada momento, tratando siempre de

utilizar las monedas de mayor valor. El programa debe tener un menú con tres opciones: Pedir dinero al

cajero, Ver estado del cajero o Salir del programa. Observar que el cajero no puede dar más dinero del que

tiene.

Nota

1.- Entregar Practica en el aula en la siguiente clase

2.- El programa Tiene que funcionar y ser Explicado por el Alumno

3.-Se valorará la calidad del diseño realizado, no sólo si el programa funciona o no. Por ejemplo, se

tendrá muy en cuenta la modularización de los programas. 4.- Se le pedirá hacer una modificación en alguno de los ejercicios en clase

5.- No se admitirá ninguna práctica entregada fuera del plazo establecido.

6.- La elaboración de las prácticas es individual. Cualquier elaboración conjunta Supondrá el suspenso

automático de los alumnos involucrados.

La entrega de la práctica se realizará el día 24 de Agosto de 20011 en el aula de prácticas.

“El modo de dar una vez en el clavo es dar cien veces en la herradura.”

Miguel de Unamuno