2. Contenido
Concepto de función Funciones numéricas
Estructura de una función Funciones de fecha y hora
Prototipos de funciones
Funciones de utilidad
Parámetros de una función
Visibilidad de una función
bld d d f
Funciones en línea: macros
Compilación separada
Ámbito (alcance)
Clases d almacenamiento
Cl de l i Variable registro (register)
Concepto y uso de funciones de Recursividad
biblioteca Resumen
Funciones de carácter Ejercicios
3. Introducción
Una función es un mini programa dentro de un programa.
p g p g
Las funciones contienen varias sentencias bajo un solo
nombre, que un programa puede utilizar una o mas veces
para ejecutar dichas sentencias
Si se agrupan funciones en bibliotecas otros programas
pueden utilizar las funciones, por esta razón se puede
ahorrar tiempo de desarrollo. Y dado que las bibliotecas
contienen rutinas presumiblemente comprobadas, se
incrementa la f
fiabilidad del programa completo
4. Concepto de función
C fue diseñado como un lenguaje de programación
estructurado, también llamado programación modular.
El programa se divide en muchos módulos (rutinas
pequeñas denominadas funciones) que aíslan mejor los
funciones),
problemas y producen programas que son mucho mas
fácil de mantener
El medio para escribir un programa es escribir
funciones independientes para cada tarea que haga el
programa
5. Estructura de una función
Una función es sencillamente, un conjunto de sentencias que
j q
se pueden llamar desde cualquier parte de un programa.
Las funciones en C no se pueden anidar. Esto significa que
una f
función no se puede declarar dentro de otra ffunción. La
razón para esto es permitir un acceso muy eficiente a los
datos
En C todas las funciones son externas o globales, es decir
p
pueden ser llamadas desde cualquier punto del programa
q p p g
7. Ejemplo
int cuadrado(int n) float suma (int num_elementos)
{ {
int cuadrado=0, q=0;
int indice;
while (q <= 1000) /*el cuadrado ha de ser
menor de 1000 */ float total = 0.0;
{ printf("n t Introduce %d números
q = n*n; realesn",num_elementos);
printf("E1 cuadrado de: %d es %d n",n,q); for (indice = 0; indice < num_elementos;
n++ ;
++ indice++)
i di ++)
} {
return 0; float x;
}
scanf("%f",&x);
" "
total+=x;
}
8. Cont
Nombre de una función; un nombre de una función
comienza con una letra o subrayado(_) y puede
contener tantas letras números o subrayados como
letras,
desee
9. Cont
Tipo de dato de retorno.- si la función no devuelve un
valor int, se debe especificar el tipo de dato devuelto
por la función; cuando devuelve un valor int, se puede
omitir ya que C asume que todas las funciones son
enteras. El tipo debe ser uno de los tipos simples de C,
tales como int, char o float, o un tipo struct
10. Cont
Muchas funciones no devuelven resultados. La razón
es que se utilizan como subrutinas para realizar una
tarea concreta Una función que no devuelve
concreta.
resultados, a veces se denomina procedimiento.
Para indicar al compilador que una función no
devuelve resultados, se utiliza el tipo de retorno
void
11. Cont
Resultado de una función.- una función puede devolver un único
valor. El resultado se muestra con una sentencia return cuya sintaxis
l l d i i i
es;
Return(expresion)
Return;
El valor devuelto (expresión) puede ser cualquier tipo de dato
excepto una función o un array
p y
Si el tipo de retorno es void, la sentencia return se puede escribir
como return; sin ninguna expresión de retorno, o bien de modo
alternativo se puede omitir la sentencia return
12. Cont
Llamada a una función; las
funciones, para poder ser
ejecutadas, han de ser
llamadas o invocadas.
invocadas
Cualquier expresión puede
contener una llamada o una
función
f ió que redirija el control
di ij l l
del programa a la función
nombrada
14. Ejemplo
#include <stdio.h> int main()
{
#include <stdlib.h>
int m, n;
int max(int x, int y) do {
{ scanf ("%d %d", &m &n) ;
( %d %d &m,
printf("Maximo de %d,%d es %dn",m,n,max(m,
if (x < y) n)); /*llamada a max*/
return y; }
while (m != 0) ;
else system("PAUSE");
return x; return 0;
} }
15. Ejemplo
#include <stdio.h> int main()
{
#include <stdlib.h> double num1, num2, med;
printf("introducir dos números reales:");
double media(double scanf ("%lf %lf",&num1,&num2) ;
x1, double x2) med = media(num1, num2);
{ printf ("El valor medio es %.4lf n", med) ;
system("PAUSE");
return(x1 + x2)/2; return 0;
}
}
16. Prototipos de funciones
La declaración de una función se denomina
prototipo. Los prototipos de una función contienen la
cabecera de la función con la diferencia de que los
función,
prototipos terminan con un punto y coma.
Los
L prototipos d l ll
t ti de las llamadas en un programa se
d
incluyen en la cabecera del programa para que así
sean reconocidas en todo el programa
id d l
17. Sintaxis
Cua do u a e dad
Cuando una entidad se declara, se proporciona un nombre y se
dec a a, p opo c o a u o b e
listan sus características. Una definición indica que existe un lugar en
un programa donde existe realmente la entidad definida, mientras
que una declaración es solo una indicación de que algo existe en
alguna posición
18. Ejemplo
#include <stdio.h>
#include <stdlib.h> /* prototipos válidos */ /* devuelve número positivo */
float area_rectangulo(float b, float a);/* declaración */ float entrada ()
float entrada(); /* prototipo o declaración */ {
int main () float m;
{ do {
float b, h; scanf ("%f" & ) ;
f ("%f", &m)
printf ("n Base del rectangulo: " ) ; } while (m<=0.0) ;
b = entrada() ; return m;
printf ("n Altura del rectangulo: " ) ; }
h = entrada() ; /
/* calcula el area de un rectángulo */
g /
printf("n Area del rectangulo: %.2fn",area_rectangulo(b,h)); float area_rectangulo(float b, float a)
system("PAUSE"); {
return 0; return (b*a);
} }
19. Declaración de una función
Antes de que una función pueda ser invocada, debe ser
declarada
Una declaración de una función contiene solo la
cabecera d l f ió (ll
b de la función (llamado t bié prototipo)
d también t ti )
Tipo resultado nombre (tipo1 param1, tipo2 param2,…);
Los nombres de los parámetros se pueden omitir
Char* copiar (char*,int);
Char* copiar (char* buffer, int n);
p ( , );
20. Prototipos con un numero no especificado
de parámetros
Un formato especial de prototipo es aquel que tiene un
p p p q q
numero no especificado de argumentos, que se
representa por puntos suspensivos (…)
Int muestras (int a,….);
Int printf (const char *formato,…)
Para implementar una función con lista variable de
parámetros es necesario utilizar macros que están
definidas
d fi id en el archivo d cabecera < td
l hi de b <stdarg.h>
h>
21. Ejemplo
#include <stdio.h>
#include <stdlib.h> double mx,actual;
#include <stdarg.h> va_list puntero;
void maximo(int n, ... ) ; int i;
int main (void) va_start(puntero,n);
{ mx = actual = va_arg(puntero,double);
puts("ttPRIMERA BUSQUEDA DEL MAXIMOn"); printf("ttArgumento actual: %.2lfn",actual);
maximo(6,3.0,4.0,-12.5,1.2,4.5,6.4); for (i=2; i<=n; i++)
puts ("nttNUEVA BUSQUEDA DEL MAXIMOn") ; {
maximo(4,5.4,17.8,5.9,-17.99); actual = va_arg(puntero,double);
system("PAUSE"); printf("ttArgumento actual: %.2lfn",actual);
return 0; if (actual > mx)
} {
void maximo(int n, ... ) mx = actual;
{ }
printf("ttMáximo de la lista de %d números es %.2lfn",n,mx); }
va_end(puntero); printf("ttMáximo de la lista de %d números es %.2lfn",n,mx);
} va_end(puntero);
}
22. Parámetros de una función
C siempre utiliza el método de parámetros por valor para
p p p p
pasar variables a funciones. Para que una función devuelva
un valor a través de un argumento hay que pasar la
dirección de la variable y que el argumento
correspondiente de la función sea un puntero, es la forma
de conseguir en C un paso de parámetro por referencia
g p p p
El método por defecto de pasar parámetros es por valor, a
menos que se pasen arrays. Los arrays se pasan siempre
por dirección
23. Paso de parámetros
Por valor
Paso por valor (también llamado paso por copia significa que
cuando C compila la función y el código que llama a la función,
la función recibe una copia de los valores de los parámetros
Por referencia
Cuando una función debe modificar el valor del parámetro
pasado y devolver este valor modificando a la función
llamadora, se ha de utilizar el método de paso de parámetro
por referencia o dirección
24. Ejemplo
/*Muestra el paso de parámetros por valor
DemoLocal(n);
Se puede cambiar la variable del parámetro en
p ede ariable
la función printf("Despues de llamada a DemoLocal, n = %dn",n);
system("PAUSE");
pero su modificación no puede salir al exterior*/
return 0;
#include <stdio.h>
}
#include <stdlib.h>
void DemoLocal(int valor)
void DemoLocal(int valor); {
int main () printf ( "Dentro de DemoLocal, valor = %dn" , valor) ;
{ valor = 999;
int n = 10; printf ("Dentro de DemoLocal, valor = %dn" , valor) ;
printf("Antes de llamar a DemoLocal, n = }
%dn",n);
25. Diferencias entre paso de variables por
valor y por referencia
Las reglas que se han de seguir cuando se transmiten variable por
valor y por referencia son l siguientes;
l f i las i i
Los parámetros valor reciben copias de los valores de los argumentos
que se les pasan
La asignación a parámetros valor de una función nunca cambian el valor
del argumento original pasado a los parámetros
Los parámetros para el paso por referencia (declarados con *,
punteros) reciben l di
) ib la dirección d l argumentos pasados; a estos l
ió de los d les
debe de preceder el operador &, excepto los arrays;
En una función, las asignaciones a parámetros referencia (punteros)
cambia los valores de los argumentos originales
26. Parámetro const de una función
Con el objetivo de añadir seguridad adicional a las
funciones se puede añadir a una descripción de un
parámetro el especificador const que indica al
const,
compilador que solo es de lectura en el interior de
la función Si se intenta escribir en este parámetro
función.
se producirá un mensaje de error de compilación
27. Funciones en línea, Macros con argumento
línea
Las funciones en línea sirven para aumentar la
velocidad de su programa. Su uso es conveniente
cuando la función es una expresión, su código es
pequeño y se utiliza muchas veces en el programa
Para una macro con argumentos (funciones en línea), el
compilador inserta realmente el código en el punto en
p g p
que se llama, esta acción hace que el programa se
ejecute mas rápidamente, ya que no ah de ejecutar el
código asociado con la llamada a la función
28. sintaxis
#define NombreMacro (parámetros sin tipos)
expresion_texto
Regla; la definición de una macro solo puede ocupar una
línea.
línea Se puede prolongar la línea con el carácter al final
de la línea
29. Ejemplo
#include <stdio.h>
#include <stdlib.h>
#define Pi 3.141592
#define VOLCONO(radio,altura) ((Pi*(radio*radio)*altura)/3.0)
int main()
{
float radio, altura, volumen;
printf ("nIntroduzca radio del cono: " ) ;
scanf ( "%f", &radio) ;
printf ("Introduzca altura del cono: " ) ;
scanf ("%f",&altura);
( %f &altura);
volumen = VOLCONO(radio, altura);
printf("nEl volumen del cono es: %.2fn",volumen);
system("PAUSE");
return 0;
}
30. Ámbito (alcance)
El ámbito o alcance de una variable determina cuales
son las funciones que reconocen ciertas variables. Si una
función reconoce una variable, la variable es visible en
esa ffunción. El ámbito es la zona de un programa en la
que es visible una variable. Existen cuatro tipos de
ámbitos: programa archivo fuente función y bloque Se
programa, fuente, bloque.
puede designar una variable para que este asociada a
uno de estos ámbitos.
31. Ámbito del programa
Las variables que tienen ámbito de programa pueden ser
referenciadas por cualquier f ió en el programa completo; tales
f i d l i función l l l
variables se llaman variable globales. Para hacer una variable
global, declárela simplemente al principio de un programa, fuera
de cualquier función
Int g,h;
Main()()
{
..
}
32. Ámbito del archivo fuente
Una variable que se declara fuera de cualquier función y cuya
declaración contiene l palabra reservada static tiene á bi d
d l ió i la l b d i i ámbito de
archivo fuente. La variables con este ámbito se pueden referenciar
desde el punto del programa en que están declaradas hasta el
final del archivo fuente
Static int i;
Void func (void)
( )
{
…
}
33. Ámbito de una función
Una variable que tiene ámbito de una función se puede referenciar
desde
d d cualquier parte d l f ió L variables d l d
l i de la función. Las i bl declaradas
dentro del cuerpo de la función se dice que son locales a la función.
Las variables locales no se pueden utilizar fuera del ámbito de la
función en que están definidas
Void calculo (void)
{
Double x,r,t; /*ámbito de la función*/
…
}
34. Ámbito de bloque
Una variable declarada en un bloque tiene ámbito de bloque y puede ser
referenciada en cualquier parte del bloque desde el punto en que esta declarada
bloque,
hasta el final del bloque. Las variables locales declaradas dentro de una función
tienen ámbito de bloque de la función; no son visibles fuera del bloque
Void func1 (int x)
( )
{
Int i;
For(i x;
For(i=x; i<x10; i++)
Printf (“i=%dn”,i*i);
}
35. Clases de almacenamiento
Los especificadores de clases (tipos) de
almacenamiento permiten modificar el ámbito de
una variable Los especificadores pueden ser uno
variable.
de los siguientes auto, extern, register, static y
typedef
36. Cont…
Cont
Variables automáticas; las variables que se declaran dentro
de una función se dice que son automáticas (auto),
significando que se les asigna espacio en memoria
automáticamente a la entrada de la función
Variables externas; a veces se presenta el problema de que
una función necesita utilizar una variable que otra función
inicializa.
inicializa Una solución es declarar la variable local con la
palabra reservada extern. Cuando una variable se declara
externa, se indica al compilador que el espacio de la
variable esta d fi id en otro l
i bl definida lugar
37. Cont..
Cont
Variables de registro; otro tipo de variable C es la variable
registro. Precediendo a la declaración de una variable con
la palabra reservada register, se sugiere al compilador que
la variable se almacene en uno de los registros hardware
g
del microprocesador
Variables estáticas; las variables estáticas son opuestas en
su significado a las variables automáticas Las variables
automáticas.
estáticas no se borran cuando la función termina y en
consecuencia retienen sus valores entre llamadas a una
función
f ió
38. Ejemplo,
Ejemplo aplicación de una variable static
#include <stdio.h>
#include <stdlib.h>
#incl de <stdlib h> return 0;
long int fibonacci (); }
int main() long int fibonacci ()
{ {
int n,i;
static int x = 0;
printf ("nCuantos numeros de fibonacci ? : " ) ;
scanf ( "%d" , &n) ; static int y = 1;
printf ("nSecuencia de fibonacci : 0,1n") ; y=y+x;
for (i=2; i<n; i++) x = y - x;
printf ("%ldn",fibonacci()); return y;
system("PAUSE");
("PAUSE")
}
39. Concepto y uso de funciones de biblioteca
Todas las versiones de C ofrecen con una biblioteca
estándar de fusiones que proporcionan soporte
para operaciones utilizadas con mas frecuencia
Las funciones estándar o predefinidas se dividen en
grupos; t d
todas llas f i
funciones que pertenecen al
t l
mismo grupo se declaran en el mismo archivo de
cabecera
b
40. Cont..
Cont
Los nombres de los archivos de cabecera estándar
utilizados se muestran a continuación
41. Funciones de carácter
El archivo de
cabecera <CTYPE H>
b <CTYPE.H>
define un grupo de
funciones/macros de
p
manipulación de
caracteres
Todas las funciones
devuelven un resultado
de valor verdadero
(distinto de cero) o
falso (cero)
45. Funciones de conversión de caracteres
Existen funciones para cambiar caracteres
mayúsculas a minúsculas o viceversa
46. Ejemplo
#include <stdio.h>
case 'V':
#include <stdlib.h>
#incl de <stdlib h>
puts ("Es un enfermero") ;
#include <ctype.h> break;
int main() case 'H':
{ puts ("Es una maestra ) ;
( Es maestra")
char resp; /*respuesta del usuario */ break;
char c; default:
printf ("¿Es un varón o una hembra (V/H)?: " ) ; puts("No es ni enfermero ni maestra") ;
scanf ("%c",&resp) ; break;
}
resp=toupper(resp);
system("PAUSE");
switch (resp)
return 0;
{
}
47. Funciones numéricas
Virtualmente cualquier operación aritmética es posible
q p p
en un programa C. las funciones matemáticas
disponibles son las siguientes:
Matemáticas
Trigonométricas
Logarítmicas
Exponenciales
Aleatorias
Al i
51. Funciones aleatorias
Los números aleatorios son de gran utilidad en
numerosas aplicaciones y requieren un trato
especial en cualquier lenguaje de programación
programación.
Las funciones usuales de la biblioteca estándar C
son; rand randon randomize y srand estas
rand, randon, srand.estas
sunciones se encuentran en el archivo stdlib.h
52. Funciones de fecha y hora
Las funciones time,clock, _strdate y _strtime devuelven la
hora actual como el numero de segundos transcurrido desde
la medianoche del 1 de enero de 1970
Clock (void); la función clock determina el tiempo de
procesador
Time(hora); obtiene la hora actual
Local time (hora); convierte la fecha y hora en una
estructura de tipo tm
Mktime(t)
Mkti (t) convierte l f h en f
i t la fecha formato d calendario
t de l d i
53. Ejemplo
/*En este ejercicio se determind el tiempo del
procesddor para printf ( " Factorial de (3 <x< 15) : " ) ;
calcular el factorial de un número requerido, entre 3 y scanf ("%d",&x );
15.*/
}while (x<=3 || x>=15);
#include <time.h>
for (n=x,fact=1; x; x--)
#include <stdio.h>
fact *=x;
=x;
#include <stdlib.h>
fin = clock() ;
int main (void)
printf ("nF actorial de %d! = %ld",n,fact) ;
{
printf("n Unidades de tiempo de proceso: %f,t En
float inicio, fin; segundos: %fn",
%fn
int n, x; (fin-inicio), (fin-inicio) /CLK_TCK);
long int fact; system("PAUSE");
inicio = clock() ; return 0;
do { }
54. Funciones de utilidad
Abs (n), labs(n); devuelve el valor absoluto de n
Div(num,denom); calcula el cociente y el resto de num
dividido por denom y almacena el resultado en quor y
rem, miembros de int de la estructura div_t
Ldiv(num,denom);
Ldiv(num denom); calcula el cociente y el resto de num
dividido por denom, y almacena los resultados en quot
y rem miembros de long de la estructura ldiv t
ldiv_t
55. Visibilidad de una función
Existen dos tipos de clases de almacenamiento en C:
p
auto y static. Una variable auto es aquella que tiene
una duración automática. No existe cuando el
programa comienza la ejecución, se crea en algún
punto durante la ejecución y desaparece antes que el
programa termine la ejecución
Una variable static es aquella que tiene una duración
fija
56. Variables locales frente a variables globales
Una variable local es una
variable que se define
dentro de una función
Una variable global es
U i bl l b l
una variable que puede
ser utilizada por todas
p
las funciones de un
programa dado,
incluyendo main ()
57. Variables estáticas y automáticas
Las variables locales se denominan variables
automáticas (auto), significado que se pierde
cuando termina la función Se puede utilizar auto
función.
para declarar una variable
Las
L variables estáticas ( t ti ) mantienen su valor
i bl táti (static) ti l
después de que la función se a terminado
58. Resumen
Como regla general, son preferibles las variables
g g , p
locales a las globales. Si realmente es necesario o
deseable que alguna variable sea global, es preferible
hacerla estática, lo que significa que será <<local>>
f
en relación al archivo en que esta definida
Se
S puede h
d hacer una f ió i i ibl f
función invisible fuera d un
de
archivo fuente utilizando la palabra reservada static
con la cabecera y el prototipo de la función
59. Compilación separada
Los programas grandes
son mas fá il fáciles d de
gestionar si se dividen en
varios archivos fuente,
también llamados
módulos, cada uno de los
cuales puede contener
una o mas funciones Estos
funciones.
módulos se compilan y
enlazan posteriormente
con un enlazador
60. Variables registro (register)
Una variable registro(register) es similar a una variable
local, pero en lugar de ser almacenada en la pila, se
almacena directamente en un registro del procesador.
g p
para declarar una variable registro, se hace preceder
la misma con la palabra reservada register;
La ventaja de las variables registro es su mayor
rapidez de manipulación
61. Recursividad
La función recursiva es una función que se llama así
misma. La recursividad o recursión directa es el
proceso por el que una función se llama así misma
desde el propio cuerpo de la función. La
recursividad o recursión directa implica mas de una
función
62. Ejemplo
printf ( "El numero %d es impar. " , n) ;
system("PAUSE"); printf ( "El numero %d es impar. " , n) ;
return 0; system("PAUSE");
} return 0;
int par(int n) }
{ int par(int n)
if (n == 0) {
return 1; /* es par */ if (n == 0)
else return 1; /* es par */
return impar(n-1); else
} return impar(n-1);
int impar(int n) }
{ int impar(int n)
if (n == 0) {
return 0; /* es impar */ if (n == 0)
else return 0; /* es impar */
return par(n-1); else
} return par(n-1);
}
63. Ejercicios
Escriba una función que convierta una temperatura de
grados Celsius a grados Fahrenheit
Escribir una función de redondeo que acepte un valor
real C tid d y un valor entero d i l y d
l Cantidad l t decimales devuelva l
el valor cantidad redondeado al numero especificado
de decimales
Escribir una función que tenga un argumento de tipo
entero y devuelva una letra P si el numero es positivo y
la letra
l l t N si es cero o negativo
i ti
64. Problemas
Escribir un programa que utilice una función para convertir
coordenadas polares a rectangulares
Escribir una función que determine si una cadena de
caracteres es un palíndromo
Escribir un programa, mediante funciones, que visualice un
calendario (el usuario indica únicamente el mes y el año)
Dado el valor de un ángulo escribir una función que muestre
el valor de todas las funciones trigonométricas
correspondientes al mismo
65. Patrón de prueba de pantalla panorámica (16:9)
Prueba de la
relación de
aspecto
(Debe parecer circular)
4x3
16x9