Capítulo 6 funciones y procedimiento

23
Archivos Cabecera Librería Matemática Definición, Implementación y Uso Generación de Números Aleatorios Paso de Parámetros: Por Valor e Introducción por Referencia

Transcript of Capítulo 6 funciones y procedimiento

Page 1: Capítulo 6 funciones y procedimiento

• Archivos Cabecera • Librería Matemática • Definición, Implementación y Uso • Generación de Números Aleatorios • Paso de Parámetros: Por Valor e Introducción por Referencia

Page 2: Capítulo 6 funciones y procedimiento

Archivos Cabecera

• Los problemas que buscamos resolver por el computador usualmente son bastante complejos, siempre buscaremos dividir un problema grande en subproblemas. • Las funciones son la herramienta que nos ayudara en la técnica de “dividir y conquistar” • Cada función se encarga de resolver un problema mas pequeño. • Ya hemos utilizado funciones, pues existen funciones que ya han sido creadas y están incluidas en las librerías • Por ejemplo printf(), de la librería estandar stdio.h, para mostrar información en pantalla • De hecho, el programa principal es una función: main()

Page 3: Capítulo 6 funciones y procedimiento

Librería Matemática

• La librería math.h permite al programador efectuar cálculos matemáticos comunes

Prototipo Descripción Ejemplo

ceil(x) redondea x al entero mas pequeño no menor que x

ceil(9.2) es 10.0 ceil(-9.8) es –9.0

floor(x) redondea x al entero mas grande no mayor que x

floor(9.2) es 9.0 floor(-9.8) es –10.0

fabs(x) valor absoluto de x fabs(-9.5) es 9.5

fmod(x,y) residuo de x/y como numero de punto flotante fmod(13.657, 2.333) es 1.992

sqrt(x) raiz cuadrada de x sqrt(9.0) es 3.0

pow(x,y) x elevado a la potencia y pow(2,7) es 128

log(x) logaritmo natural de x(base e) log10(x)

log10(x) logaritmo de x(base 10) log(2.718282) es 1

exp(x) funcion exponencial exp(0.1) es 2.71828

sin(x) seno trigonometrico de x(en radianes) sin(0.0) es 0.0

cos(x) coseno trigonometrico de x(en radianes) cos(0.0) es 1

tan(x) tangente trigonometrico de x(en radianes) tan(0.0) es 0

Page 4: Capítulo 6 funciones y procedimiento

Grupo de sentencias bajo un mismo nombre que solucionan un problema especifico

• Llamar a una función es pedir que se ejecute para obtener su resultado

• Se escribe el nombre de la función, seguida por una lista de expresiones separadas por coma y encerradas entre paréntesis.

• Ejemplo

• printf(“%d”, a);

• e = abs(x-y)/ abs(x);

– Las funciones son utilizadas o creadas por un programador, y solo él

conoce cómo funciona

– Los programas son usados por un usuario externo, el cual no conoce

cómo trabajan las funciones

Definición de Funciones

Page 5: Capítulo 6 funciones y procedimiento

Para crear una nueva función se debe seguir los pasos: • Declaración

– Luego de las líneas de #include, y antes del programa principal • Argumentos

– Para lograr resolver un problema necesita que le entreguen datos de entrada

– Existen funciones que no necesitan argumentos • Implementación

– Se especifica los pasos de la función, y cómo ésta llevará a cabo su tarea

• Retorno – Al llamar a una función, esperamos que regrese con un resultado – Al regresar y entregar el resultado se dice que

• La función ha “retornado” al punto de llamada

Implementación de Funciones

Page 6: Capítulo 6 funciones y procedimiento

• Al escribir una nueva función, debe ser declarada, igual como declaramos una variable

• La declaración de una función, debe incluir: – El tipo de dato del valor que va a retornar – El nombre de la función – El tipo de dato de cada argumento, y un nombre

para cada uno.

• El prototipo se refiere a la declaración de una función

double sqrt(double x);

Declaración y Prototipos

Page 7: Capítulo 6 funciones y procedimiento

• Los datos de entrada de una función son obtenidos por el programa principal, ya sea por teclado o de alguna otra forma. La función solo debe recibirlos, no obtenerlos

• El resultado que genera una función es obtenido por ella y retornado al programa donde fue llamada.

• No es deber de la función imprimir datos por pantalla, eso lo decidirá el programa principal

void main()

{

double x, y;

printf(“Ingrese un real:”);

scanf(“%f”, &x);

y = sin(x);

printf(“El seno de x es: %.2f”, y);

}

E/S de datos permiten a un programa comunicarse con su usuario externo

Argumentos y retorno permiten a una función comunicarse con el programa que la llama

Uso de Funciones

Page 8: Capítulo 6 funciones y procedimiento

• Un programa principal es similar a un jefe, y una función a un empleado en una oficina

– Si el jefe necesita resolver un cierto problema, lo divide en varias tareas y llama a sus empleados, para que cada uno resuelva una tarea

– Dependiendo de la tarea, el jefe entrega al empleado los datos que este necesita para resolverla. Estos son equivalentes a los argumentos para una función

– Para resolver su tarea especifica, el empleado podría a su vez, delegar subtareas a otros empleados

– Una vez encargada la resolución de una tarea, el jefe solo espera que el empleado retorne con el resultado deseado. Esto es equivalente al valor de retorno de una función

– El jefe nunca se entera de los detalles de cómo el empleado resolvió la tarea

Definición de Funciones: Analogía

Page 9: Capítulo 6 funciones y procedimiento

Escribir un programa que muestre las respectivas conversiones de Celsius a Fahrenheit de las temperaturas de 0 a 100, de 5 en 5

Esto se logra con la fórmula:

Podríamos crear una función que solo se encargue de convertir de Celsius a Fahrenheit, y luego podremos usarla en el programa deseado

325

9 CF

Ejercicio de Ejemplo

Page 10: Capítulo 6 funciones y procedimiento

– Qué necesitamos que la función genere:

• La temperatura en Fahrenheit(real) – Qué necesita la función para resolver el problema:

• La temperatura en Celsius(real)

• La implementación se compone de dos partes:

– La cabecera es igual que el prototipo. El cuerpo es un bloque de sentencias, encerrado entre llaves. Si se van a necesitar variables, se declaran en el bloque.

double CelsiusAFahrenheit (double c);

Implementación: Prototipo

double CelsiusAFahrenheit(double c)

{ /*Cuerpo*/

}

Page 11: Capítulo 6 funciones y procedimiento

El retorno de la función especifica que debe terminar y

devolver el valor calculado.

return (expresión que se debe retornar);

Hay funciones que no retornan datos, se usa return pero sin

mencionar valor de retorno: return;

Una vez implementada, la función puede ser usada por

cualquier otro programa o función, es decir, puede ser

LLAMADA

Implementación: Retorno

double CelsiusAFahrenheit(double c)

{ return (9.0 / 5.0 * c + 32);

}

Page 12: Capítulo 6 funciones y procedimiento

#include <stdio.h> #define LIMITEINF 0 #define LIMITESUP 100 #define PASO 5 // Prototipos de Funciones double CelsiusAFahrenheit(double c); /* Programa Principal */ void main() { int c=0; printf(“Tabla de conversión de Celsius a Fahrenheit.\n”); printf(“C F\n”); for(c = LIMITEINF; c <= LIMITESUP; c = c + PASO) printf(“%3d %3f\n”, c, CelsiusAFahrenheit(c)); } /* Esta función retorna el equivalente en Fahrenheit del valor c en Celsius */ double CelsiusAFahrenheit(double c) { return (9.0 / 5.0 * c + 32); }

Llamada a la función

Page 13: Capítulo 6 funciones y procedimiento

Ejercicio

• Escribir la función Factorial en C que permita

calcular el factorial de un numero dado. – El factorial de 0 es 1

– El factorial de 1 es 1(1x1)

– El factorial de 2 es 2(1x2)

– El factorial de 3 es 6(1x2x3)

– El factorial de 4 es 24(1x2x3x4)

– El factorial de un número dado es la multiplicación de todos los

números desde el 1 hasta el mismo.

Page 14: Capítulo 6 funciones y procedimiento

int Factorial(int n) { int fact, i=0; fact = 1; if (n==0) return 1; for(i = 1; i <=n; i++) fact = fact * i; return (fact); }

Inicio

Fin

Recibir n

i >=n

fact = fact * i;

Retornar fact

i = i +1;

Fact = 1; i = 1;

Solución

Page 15: Capítulo 6 funciones y procedimiento

#include <stdio.h>

//Declaración de funciones int Factorial(int n); void main() { int i; for (i = 0; i < 10; i ++) printf(“%d\n”, Factorial(i)); }

int Factorial (int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) fact = fact * i; return (fact); }

Si vemos sólo la función, tiene sentido, pues se encarga de calcular el

factorial de la variable n

Si vemos sólo el programa principal, tiene sentido, pues se imprime el factorial de todos los números hasta el 10

Si vemos el programa principal y la función como un todo, puede resultar un tanto confuso: • Hay dos variables con nombre i • En el programa se usa la variable i como el número al que se le calcula el factorial. • En la función la variable a la que se le calcula el factorial se llama n

Paso de Parámetros a Funciones

Page 16: Capítulo 6 funciones y procedimiento

#include <stdio.h> int Factorial(int n); main() { int i; for (i = 0; i < 10; i ++) { printf(“%d\n”, Factorial(i)); } }

int Factorial(int n) { int fact, i; fact = 1; for(i = 1; i <=n; i++) { fact = fact * i; } return (fact); }

Factorial(0) n

0

n

1

n

2

Factorial(1) Factorial(2)

expr

1

expr

1

expr

2

Factorial(3) n

3

expr

6

1 1 2 6

• Se evalúan las expresiones enviadas como argumentos

• El valor de cada argumento es copiado en cada parámetro de la función llamada.

• Se ejecutan una a una las sentencias de la función hasta que aparece la sentencia return

• Se evalúa la expresión de la sentencia return.

• El programa que llamó a la función continúa, reemplazando en el lugar de la llamada, por el valor retornado

Paso de Parámetros a Funciones

Page 17: Capítulo 6 funciones y procedimiento

Crearemos una funcion que reciba dos valores y los intercambie

Podríamos decir que el prototipo sería:

void Intercambiar(int a, int b);

Esta función no efectuará el cambio, como se espera. Al pasar parámetros, se efectúa una copia de los valores. Este tipo se conoce como PASO DE PARAMETROS POR VALOR.

x

main

y

3 4 Intercambiar

a b tmp

3 4 3 3 4

x

main

y

3 4

void main()

{

int x, y;

printf(“Ingrese x:”);

scanf(“%d”,&x);

printf(“Ingrese y:”);

scanf(“%d”,&y);

printf(“x = %d, y= %d”, x, y);

Intercambiar(x, y);

printf(“x = %d, y= %d”, x, y);

}

void Intercambiar(int a, int b)

{

int tmp;

tmp = a;

a = b;

b = tmp;

}

Paso de Parámetros Por Valor

Page 18: Capítulo 6 funciones y procedimiento

x y

main

• Para modificar directamente los datos que se reciben como parámetros, se usa la llamada POR REFERENCIA

• El prototipo sería:

• void Intercambiar(int *a, int *b);

void main()

{

int x, y;

printf(“Ingrese x:”);

scanf(“%d”,&x);

printf(“Ingrese y:”);

scanf(“%d”,&y);

printf(“x = %d, y= %d”, x, y);

Intercambiar(&x, &y);

printf(“x = %d, y= %d”, x, y);

}

void Intercambiar(int *a, int *b)

{

int tmp;

tmp = a;

a = b;

b = tmp;

}

3 4

Al retornar la función si habrá efectuado el cambio sobre las variables que se pasaron por referencia.

Intercambiar

a b tmp

4 3

3 4 3 3 4

Paso de Parámetros Por Referencia

Page 19: Capítulo 6 funciones y procedimiento

• Existen funciones que no retornan ningún valor:

printf (“Hola Mundo\n”);

• Una función que no retorna nada, y que se llama únicamente

para que ejecute su código, se llama procedimiento

• C trata de igual forma a las funciones y a los procedimientos

• Un procedimiento en C, es una función sin valor de

retorno

void DarInstrucciones(void);

• Los procedimientos pueden recibir tantos argumentos necesite

Procedimientos

Page 20: Capítulo 6 funciones y procedimiento

void ImprimirMenu (void)

{

printf (“1. Tabla de Sumar\n”);

printf (“2. Tabla de Restar\n”);

printf (“3. Tabla de Multiplicar\n”);

printf (“4. Tabla de Dividir\n”);

printf (“5. Salir\n”);

}

Implementación de un Procedimiento

Page 21: Capítulo 6 funciones y procedimiento

• Para introducir el factor “suerte” en los programas en C, tenemos la función rand() que genera números aleatorios.

• Los números obtenidos son enteros entre 0 y RAND_MAX (32767).

• Si ejecutamos varias veces el programa, la secuencia de números aleatorios se repite. Si un programa genera 3 números aleatorios entre 0 y 10. Lo ejecutamos una vez y obtenemos por ejemplo 4, 7 y 9. Lo ejecutamos por segunda vez y vuelve a salir 4, 7 y 9. Y siempre se repetirá este resultado.

• Esto sucede porque rand() "calcula" los números aleatorios partiendo de un número inicial llamado semilla.

• Si volvemos a ejecutar el programa desde el principio, el número inicial (la semilla) que usa rand() es el mismo, por lo tanto, la secuencia de números aleatorios se repetirá.

Generación de Números Aleatorios

Page 22: Capítulo 6 funciones y procedimiento

• aleatorio = rand(); // Aleatorio entre 0 y 32767

• La operación módulo (%) nos da el residuo de dividir rand() entre cualquier número. Este residuo puede ir de 0 a N-1.

aleatorio = rand () % N; // Aleatorio entre 0 y N-1

aleatorio = rand () % 6; // Aleatorio entre 0 y 5

aleatorio = rand () % N+1; // Aleatorio entre 1 y N

aleatorio = rand () % 7; // Aleatorio entre 1 y 6

aleatorio = N + rand() % (M-N+1) ; // Aleatorio entre N y M aleatorio = 20 + rand () % 11; // Aleatorio entre 20 y 30

Función rand()

Page 23: Capítulo 6 funciones y procedimiento

• Para evitar el problema de obtener siempre los mismos números aleatorios, tenemos la función srand()

• A esta función se le pasa un parámetro que se utilizará como número

semilla para el cálculo. No se debe poner un número fijo como

semilla, porque entonces se repite el problema.

• Podemos utiliza la fecha/hora del sistema, pues este valor cambia si ejecutamos el programa en distintos instantes de tiempo.

• En C se obtiene con la función time()

srand (time(NULL)); • A la función srand() sólo debemos llamarla una vez en nuestro

programa, antes de utilizar la función rand()

• Para utilizar las funciones se debe declarar las librerías:

#include <stdlib.h>

#include <time.h>

Función srand()