Algoritmos - Funciones C++
-
Upload
ronal-palomino -
Category
Documents
-
view
3.205 -
download
2
Transcript of 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.
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
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;
}
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:
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
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);}
}
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
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