Este documento contiene información sobre subprogramas y funciones en C++. Explica las razones para crear subprogramas, como dividir la complejidad del código y promover la reutilización. También describe los pasos para escribir un subprograma, como definir el problema, darle un nombre y decidir cómo probarlo. Además, cubre temas como los parámetros, el paso de parámetros, el ámbito de variables y la recursividad. Finalmente, incluye ejercicios prácticos sobre el uso de subprogramas.
Se da una introducción a la manipulación y caracteres y cadenas en el lenguaje de programación C. Se muestran algunas funciones de librerías estándar de C con ejemplos de su uso. Se muestra el uso de punteros para manejar cadenas. Finalmente se muestra la conversión entre tipos de datos en C.
Se da una introducción a la manipulación y caracteres y cadenas en el lenguaje de programación C. Se muestran algunas funciones de librerías estándar de C con ejemplos de su uso. Se muestra el uso de punteros para manejar cadenas. Finalmente se muestra la conversión entre tipos de datos en C.
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
Esta presentación es parte del contenido del curso de Estructuras de Datos I impartido en la Universidad Rafael Landívar durante el año 2017.
Creado por Ing. Alvaro Enrique Ruano
La refactorización (del inglés refactoring) es una técnica de la ingeniería de software para reestructurar un código fuente, alterando su estructura interna sin cambiar su comportamiento externo.
1. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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.
2. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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 %dn",z,t); // 5 10
sub(z,t);
printf("%d %dn",z,t); // 5 10
sub(z,4);
printf("%d %dn",z,t); // 5 10
sub(z,2*t+20);
printf("%d %dn",z,t); // 5 10
sub(3,20);
printf("%d %dn",z,t); // 5 10
sub(z+32,20);
printf("%d %dn",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 %dn",z,t); // 5 10
sub(&z,t);
printf("%d %dn",z,t); // 15 10
sub(&z,4);
printf("%d %dn",z,t); // 19 10
sub(&z,2*t+20);
printf("%d %dn",z,t); // 59 10
sub(&3,20); // ERROR
3. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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;
}
4. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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:
5. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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
6. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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);}
}
7. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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
8. Curso: Algoritmos I
Profesor: Ing. Erick NúñezFACULTAD 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