Está en la página 1de 17

Funciones

Contenido
INTRODUCCIN ........................................................................................................................ 2
Declaracin de una funcin........................................................................................................... 3
Definicin de una funcin............................................................................................................. 4
FUNCION MAIN ......................................................................................................................... 5
Llamada a una funcin .................................................................................................................. 6
Variables Locales .......................................................................................................................... 6
Variables Globales ........................................................................................................................ 7
Paso por valor y Referencia .......................................................................................................... 8
Funciones para el manejo de cadenas.11
Ejercicios Resueltos .................................................................................................................. 133
Ejercicios Propuestos ................................................................................................................ 177

INTRODUCCIN
Una funcin es un fragmento de cdigo que realiza una tarea bien definida. Por ejemplo, la
funcin printf imprime por la salida estndar los parmetros que le pasamos. Al igual que esta
funcin, existen otras funciones que realizan diversas tareas ya definidas en el estndar ANSY
C y que pueden ser utilizadas por el programador. Este tipo de funciones predefinidas son
denominadas funciones de biblioteca. Sin embargo, cada programador define sus propias
funciones de acuerdos a sus necesidades. Las funciones que define el programador son
conocidas como funciones de usuario.
La utilizacin de funciones nos permite dividir un programa extenso en pequeos segmentos
que realizan tareas concretas. Probablemente, dentro de un mismo programa se realicen las
mismas tareas varias veces, lo que se facilita mediante la utilizacin de funciones. Sin embargo,
es probable que ciertas funciones no sean reutilizables, pero al usarlas se mejora la legibilidad
del programa.
Con el propsito de permitir un manejo eficiente de los datos, las funciones en C no se pueden anidar. En
otras palabras, una funcin no se puede declarar dentro de otra funcin, por lo que todas las funciones son
globales o externas, lo que hace que puedan llamarse desde cualquier parte de un programa.

Las funciones son los bloque constructores en C, y el lugar donde se centra toda la actividad del
programa siendo una de las caractersticas principales de C.
El bloque es el cuerpo de la funcin y el nombre del bloque es el nombre de la funcin, cuando
se declara una funcin adems del cuerpo y el nombre de la misma tambin hay que especificar
los parmetros o argumento y el tipo de resultado que retornara.
Un argumento es el valor que se le pasa a una funcin cuando estas es llamada, dicho valor ser
almacenado en el parmetro correspondiente de la funcin.
Ej:
Tipo_Retorno Nombre_funcion(Lista_de_parametros)
{
//Cuerpo_de_la_Funcion
//Valor retornado
}
Donde:
tipo_de_retorno: es el tipo del valor devuelto por la funcin, o, en caso de que la
funcin no devuelva valor alguno, la palabra reservada void.
Nombre_funcin: es el nombre o identificador asignado a la funcin.
Lista_de_parmetros: es la lista de declaracin de los parmetros que son pasados
a la funcin. stos se separan por comas. Debemos tener en cuenta que pueden
existir funciones que no utilicen parmetros.
Cuerpo_de_la_funcin: est compuesto por un conjunto de sentencias que llevan
2

a cabo la tarea especfica para la cual ha sido creada la funcin.


Valor Retornado: mediante la palabra reservada return, se devuelve el valor de la
funcin, en este caso representado por expresin.

Declaracin de una funcin


La declaracin de una funcin o tambin conocida como prototipo de la funcin indica adems
del nombre de la funcin, cuantos parmetros tiene y de qu tipo son, as como el valor
especificado.
En general el prototipo de la funcin o declaracin de la funcin permite conocer las
caractersticas de la misma antes que defina la tarea que realizara.
Ej:
float convertir(int g);
La sentencia anterior indica que cuando sea invocada la funcin convertir hay que
pasarle un argumento entero y que dicha funcin retornara una valor real.

Una funcin tambin puede ser declarada implcitamente o explcitamente. La declaracin


implcita es cuando la funcin es llamada y no existe una declaracin previa (Prototipo de la
funcin). La funcin main que hemos utilizado hasta ahora siempre se hace implcitamente y
no retorna ningn valor ya que en el programa no se hace ninguna llamada a ella misma.
La declaracin explicita especfica el nmero y el tipo de parmetros de la funcin as como el
valor retornado. Ej:
float sumar(int x, int y);
La lista de parmetros normalmente consiste en una lista de identificadores con sus tipos
separados por comas, en el caso del ejemplo anterior se pueden omitir los identificadores y
quedara de la siguiente forma:
float sumar(int, int); // Se le pasan 2 parmetros enteros y retorna un numero real.
Tambin hay que tener en cuenta que el nombre de los parmetros utilizados en la declaracin
de la funcin y los utilizados en la definicin de la funcin no necesariamente tienen que ser los
mismos.
Ej:
float sumar(int x, int y);

//Declaracin de la funcin

float sumar(int A, int B)

//Definicin de la funcin

{
//Cuerpo de la funcin
}
3

La lista de parmetros puede tambin estar vaca. Ej:


float sumar();
As cuando declaremos una funcin sin parmetros utilizaremos la palabra reservado void. Ej:
float sumar(void);

Definicin de una funcin


La definicin de una funcin consta de una cabecera de funcin y del cuerpo de la funcin
encerrado entre llaves.
Tipo Nombre_funcion(parametro1, parametro2, parmetro n)
{
//Declaracin de las variables locales
//Sentencias
[return()];
}

Las variables declaradas en el cuerpo de la funcin son locales y por definicin solamente son
accesibles dentro del mismo.
El Tipo especifica el tipo de datos retornados por la funcin, este puede ser cualquier tipo de
valor menos una matriz o una funcin, si no se especifica se supone que en int. Para indicar que
no devuelve nada se utiliza la palabra reservada void. Ej:
void sumar(int x,int y);

FUNCION MAIN
La filosofa en la que se base el diseo de C es el empleo de funciones. Por esta razn, un
programa en C contiene al menos una funcin, la funcin main. Esta funcin es particular dado
que la ejecucin del programa se inicia con las instrucciones contenidas en su interior. Una vez
iniciada la ejecucin del programa, desde la funcin main se puede llamar a otras funciones y,
posiblemente, desde estas funciones a otras. Otra particularidad de la funcin main es que se
llama directamente desde el sistema operativo y no desde ninguna otra funcin. De esta manera,
un programa en C slo puede contener una funcin main.
Su definicin es:
void main(void)
{
//Cuerpo de la funcin
}
EJ: El siguiente programa calcula el cubo de los nmeros del 1 al 5 utilizando una funcin definida por
el usuario.
#include <stdio.h>
int cubo(int base);
main()
{
int numero;
for(numero=1; numero<=5; numero++)
{
printf("El cubo del nmero %d es %d\n", numero, cubo(numero));
}
return 0;
}
int cubo(int base)
{
int potencia;
potencia = base * base * base;
return potencia;
}

La salida es:
El cubo del nmero 1 es 1
El cubo del nmero 2 es 8
El cubo del nmero 3 es 27
El cubo del nmero 4 es 64
El cubo del nmero 5 es 125

Llamada a una funcin


Llamar a una funcin es sinnimo de ejecutarla, la llamada debe realizarse desde otra funcin o
desde ella misma. Esta llamada debe estar formada por el nombre de la funcin seguido de una
lista de argumentos o parmetros encerrados en parntesis y separados por comas.
Ej: Se tiene la funcin int sumar(int x,int y);
//Llamada a la funcin sumar
X = sumar(a,b);
Los parmetros a y b son lgicamente variables enteras definidas anteriormente a la llamada de
la funcin las cuales almacenaran el dato que se desea pasar a la funcin, y como se menciono
anteriormente los nombres de los parmetros no necesariamente tienen que ser las misma.

Variables Locales
Las variables locales se crean en el momento en que se activa la funcin, y desaparecen en el
momento en que la funcin termina. Veamos un ejemplo.
#include <stdio.h>
#include <ctype.h>
int suma_d (int x)
{
int d, suma;
//Variables locales
suma=0;
d = x % 10;
while (x >0)
{
suma = suma + d;
x = x/10;
d = x%10;
}
return (suma);
}
void main ()
{
int a;
printf ("Escribe el numero:\n");
scanf ("%d",&a);
printf ("La suma de digitos es %d\n",suma_d(a));
}

Variables Globales
A diferencia de las variables locales cuyo mbito estaba confinado a la funcin donde estaban
declaradas, el mbito de las variables globales se extiende desde el punto en el que se definen
hasta el final del programa. En otras palabras, si definimos una variable al principio del
programa, cualquier funcin que forme parte de ste podr utilizarla simplemente haciendo uso
de su nombre.
La utilizacin de variables globales proporciona un mecanismo de intercambio de informacin
entre funciones sin necesidad de utilizar argumentos. Por otra parte, las variables globales
mantienen el valor que se les ha asignado dentro de su mbito, incluso despus de finalizar las
funciones que modifican dicho valor. Debemos tener en cuenta que el uso de variables globales
para el intercambio de informaciones entre funciones puede resultar til en algunas situaciones
(como cuando se desea transferir ms de un valor desde una funcin), pero su utilizacin podra
llevarnos a programas de difcil interpretacin y complejos de depurar.
Ej: Utilizacin de variables globales como mecanismo de intercambio de informacin entre funciones.

#include<stdio.h>
void unaFuncion();
void otraFuncion();
int variable;
void main()
{
variable = 9;
printf("El valor de variable es: %d\n", variable);
unaFuncion();
otraFuncion();
printf("Ahora el valor de variable es: %d\n", variable);
return 0;
}
void unaFuncion()
{
printf("En la funcin unaFuncion, variable es: %d\n", variable);
}
void otraFuncion()
{
variable++;
printf("En la funcin otraFuncion, variable es: %d\n",variable);
}
La salida es:
El valor de variable es: 9
En la funcin unaFuncion, variable es: 9
En la funcin otraFuncion, variable es: 10
Ahora el valor de variable es: 10

Paso por valor y Referencia


En C todos los argumentos que se pasan a una funcin se pasan por valor. En otras palabras, se
pasa una copia del valor del argumento y no el argumento en s (por ello, este procedimiento se
conoce en algunas ocasiones como paso por copia). Al pasar una copia del argumento original
a la funcin, cualquier modificacin que se realice sobre esta copia no tendr efecto sobre el
argumento original utilizado en la llamada de la funcin. Se puede considerar un argumento
pasado por valor como una variable local de la funcin a la que se ha pasado, de tal modo que
los cambios que se realicen sobre sta tendrn efecto slo dentro de la funcin. Veamos un
ejemplo del paso por valor de argumentos a una funcin:
#include <stdio.h>
void modificar(int variable);
void main()
{
int i = 1;
printf("\ni=%d antes de llamar a la funcin modificar", i);
modificar(i);
printf("\ni=%d despus de llamar a la funcin modificar", i);
}
void modificar(int variable)
{
printf("\nvariable = %d dentro de modificar", variable);
variable = 9;
printf("\nvariable = %d dentro de modificar", variable);
}

Dado que lo que se pasa a la funcin modificar es una copia de la variable i, el valor de sta en
la funcin main no se ve alterado cuando dentro de la funcin modificar se cambia el valor de
variable. De ah, la salida del ejemplo anterior es la siguiente:
i=1 antes de llamar a la funcin modificar
variable = 1 dentro de modificar
variable = 9 dentro de modificar
i=1 despus de llamar a la funcin modificar
Como ya hemos visto, cuando se pasa un argumento por valor, realmente se pasa una copia de
ste, y si esta copia se modifica el argumento original no se ve alterado. Sin embargo, en
muchas ocasiones lo que queremos es que una funcin cambie los valores de los argumentos
que le pasamos. Para lograrlo se utiliza lo que se conoce como paso de argumentos por
referencia. En estos casos, no se pasa una copia del argumento, sino el argumento mismo.
Cuando realizamos un paso de argumentos por referencia en C, realmente lo que estamos
pasando son direcciones de memoria. En otras palabras, lo que le pasamos a la funcin son las
direcciones de memoria de los argumentos. Como hemos visto en la unidad anterior, esta
operacin se logra mediante la utilizacin de punteros. De este modo, cuando llamamos a una
funcin, lo que realmente le pasamos son punteros a los argumentos que deseamos modificar.
Veamos el ejemplo anterior utilizando el paso de argumentos por referencia:
#include <stdio.h>
void modificar(int *variable);
void main()
{
int i = 1;
printf("\ni=%d antes de llamar a la funcin modificar", i);
8

modificar(&i);
printf("\ni=%d despus de llamar a la funcin modificar", i);
return 0;
}
void modificar(int *variable)
{
printf("\nvariable = %d dentro de modificar", *variable);
*variable = 9;
printf("\nvariable = %d dentro de modificar", *variable);
}
La salida de este ejemplo sera:
i=1 antes de llamar a la funcin modificar
variable = 1 dentro de modificar
variable = 9 dentro de modificar
i=9 despus de llamar a la funcin modificar
Como se puede observar, el valor de i ha cambiado puesto que la funcin modificar ha utilizado
la direccin de memoria de esta variable en la sentencia de asignacin *variable = 9.
Analicemos detenidamente este ejemplo. Lo primero que tenemos que tener en cuenta es que la
premisa de que en C todos los argumentos se pasan por valor sigue siendo cierta. Lo que sucede
es que en este caso estamos pasando el valor de la direccin de memoria de la variable i y no el
valor de su contenido (1). Para pasar la direccin de memoria de una variable se utiliza el
operador &. Al finalizar la funcin, el valor de dicha direccin permanece igual y lo que se ha
modificado es el contenido de esa direccin de memoria. Dentro de la funcin se utilizan los
punteros para trabajar con las direcciones de memoria (*variable).
Dado que el paso de argumentos por referencia es comn en C, conviene que en este punto
ampliemos el concepto de puntero. Consideremos las siguientes declaraciones:
int dato;
int *puntero;
La primera de las declaraciones reserva memoria para almacenar una variable de tipo entero
(int) mientras que la segunda declaracin reserva memoria para almacenar una direccin. A
pesar de que apunta a una variable de tipo entero, lo que se va a almacenar es una direccin.
Como en el fondo un puntero puede apuntar a cualquier cosa, C permite la declaracin de
punteros tipo void. Supongamos que el compilador reserva la direccin en hexadecimal bffff120
para la variable dato y la direccin en hexadecimal 0012fed4 para puntero.
En la Figura 3.1 se muestra grficamente la representacin de la declaracin de las variables
Anteriores

Fig. 3.1. Declaracin de variables.


Si a continuacin asignamos un valor a la variable dato, ste se almacenara en la direccin de
memoria bffff120. En el caso de puntero, si le asignamos un contenido (la direccin de la
variable dato), la direccin en memoria de la variable dato se almacenara en la direccin
0012fed4. Supongamos que realizamos las siguientes asignaciones:

dato = 99;
puntero = &dato;
El resultado en la memoria se muestra en la Figura 3.2. Debemos recordar que mediante el
operador & obtenemos la direccin de una variable.

Fig. 3.2. Asignacin de valores.


Una vez realizada la asignacin anterior, disponemos de dos maneras de acceder al contenido de
la variable dato. La primera forma de acceder es mediante el nombre de la variable y la segunda
mediante el puntero que apunta a dicha variable. Para acceder a la variable dato mediante
puntero, se utiliza el operador *. Una utilidad del paso de argumentos por referencia se relaciona
con la devolucin de valores desde una funcin. Como ya sabemos, en C una funcin slo
puede devolver un nico valor. Sin embargo, a menudo se hace necesario que una funcin
devuelva ms de un valor, y es aqu donde podemos utilizar el paso de argumentos por
referencia.
Adems, la utilizacin del paso de argumentos por referencia nos permite ahorrar tiempo y
espacio. En el caso que deseramos pasar algo a una funcin cuyo tamao sea grande, por
ejemplo una estructura, sera conveniente pasarla por referencia, ya que si lo hacemos por valor,
se tiene que realizar una copia de la misma y colocarla en la pila, lo que implica consumo de
tiempo y espacio.

10

Funciones para el manejo de cadenas


Todas las funciones para el manejo de cadena su prototipo se encuentra en:#include<string.h>
Funcion
stpcpy
strcat
strchr
strcmp
strcmpi
strcpy
strcspn
strdup
_strerror
strerror
stricmp
strlen
strlwr
strncat
strncmp
strncmpi
strncpy
strnicmp
strnset
strpbrk
strrchr
strrev
strset
strspn
strstr
_strtime
strtod
strtol
strtoul
strupr

Descripcion
Copia una cadena de caracteres en otra.Se detiene cuando encuentra el
terminador nulo.
Aade una cadena de caracteres a otra.
Busca, en una cadena, un caracter dado.
Compara dos cadenas.
Macro que compara dos cadenas sin distinguir entre maysculas y minsculas
Copia una cadena.
Busca segmentos que no contienen un subconjunto de un conjunto especificado
de caracteres.
Copia una cadena a una nueva localidad.
Genera un mensaje de error definido por el programador.
Retorna el apuntador al mensaje asociado con el valor del error.
Compara dos cadenas sin diferenciar entre maysculas y minsculas
Determina la longitud de una cadena.
Convierte las maysculas de una cadena en minsculas.
Aade el contenido de una cadena al final de otra.
Compara parte de una cadena con parte de otra.
Compara parte de una cadena con parte de otra, sin distinguir entre maysculas y
minsculas.
Copia un un nmero de bytes dados, desde una cadena hacia otra.
Compara parte de una cadena con parte de otra, sin distinguir entre maysculas y
minsculas.
Hace que un grupo de elementos de una cadena tengan un valor dado.
Busca la primera aparicin, en una cadena, de cualquier caracter de un conjunto
dado.
Busca la ltima aparicin de un caracter en una cadena.
Invierte el orden de los caracteres de una cadena.
Hace que los elementos de una cadena tengan un valor dado.
Busca en una cadena el primer segmento que es un subconjunto de un conjunto
de caracteres dado
Busca en una cadena la aparicin de una subcadena dada.
Convierte la hora actual a una cadena.
Convierte una cadena a un valor double long double.
Convierte una cadena a un valor long.
Convierte una cadena a un valor unsigned long.
Convierte las minsculas de una cadena a maysculas.

11

EJEMPLOS DE LAS PRINCIPALES FUNCIONES PARA EL MANEJO DE CADENAS


Strlen()
n = strlen (cadena);

strcad(): Recuende que cadena1 es la cadena destino y cadena2 es la cadena origen


strcat (cadena1, cadena2) ;

strcmp()
Strcmp (cadena1, cadena2) ;

strcmpi()
strcpy (cadena1, cadena2);

strlwr()
strlwr (cadena);

strrev()
strrev (cadena);
/ * Programa de ejemplo para utilizar las funciones de cadena * /
# Include <stdio.h>
# Include <string.h>
void main ()
{
char s1 [20], s2 [20], s3 [20];
int X, L1, L2, L3;
printf ("Introduzca las cadenas");
scanf ("% s% s", s1, s2);
x = strcmp (s1, s2);
if (x! = 0)
{
printf ("\ nStrings no son iguales \ n");
strcat (s1, s2);
}
printf ("\ nStrings son iguales");
strcpy (s3, s1);
l1 = strlen (s1);
l2 = strlen (s2);
l3 = strlen (s3);
printf ("\ ns1% s = \ longitud t =% d caracteres \ n", s1, L1);
printf ("\ ns2% s = \ longitud t =% d caracteres \ n", s2, l2);
printf ("\ ns3% s = \ longitud t =% d caracteres \ n", s3, l3);
}

12

Ejercicios Resueltos
Realizar una funcin llamada par, que toma un nmero entero como parmetro, y
devuelve 1 si es par o devuelve 0 si es impar. NOTA: Para saber si un nmero entero es
par, al dividirlo entre 2 su resto debe ser 0.
#include<stdio.h>
int par(int); // o int par(int numero);
int main()
{
int numero, resultado;
printf(Introduzca un nmero:\n);
scanf(%i,&numero);
resultado=par(numero);
if (resultado==1)
printf(Es par.\n);
else
printf(Es impar.\n);
return(0);
}
/* Funcin par: Devuelve un valor indicando si un nmero entero es par o no. */
int par(int numero)
{
if((numero%2)==0)
return(1);
else
return(0);
}

13

Realizar una funcin llamada media2, que toma dos nmeros reales como parmetros, y
devuelve un nmero real que es la media de los dos nmeros pasados como parmetros.
NOTA: Para calcular la media de dos nmeros, se suman, y ese resultado se divide entre 2.
#include<stdio.h>
float media2(float,float);
//o float media2(float n1, float n2);
int main()
{
float n1, n2, resultado;
printf(Introduzca un nmero real:\n);
scanf(%f,&n1);
printf(Introduzca otro nmero real:\n);
scanf(%f,&n2);
resultado=media2(n1,n2);
printf(La media es: %f.\n,resultado);
return(0);
}
// Funcin media2: Devuelve la media de 2 nmeros.
float media2(float n1, float n2)
{
float resultado;
resultado=(n1+n2)/2;
return(resultado);
}

14

Realizar una funcin llamada media3, que toma tres nmeros reales como parmetros, y
no devuelve nada. Esa funcin debe calcular la media de los tres nmeros pasados como
parmetros y mostrar con un mensaje cul es la media calculada. NOTA: Para calcular la
media de tres nmeros, se suman, y ese resultado se ivide entre 3.
#include<stdio.h>
void media3(float,float,float);
//o void media3(float n1,float n2,float n3);
int main()
{
float n1, n2, n3;
printf(Introduzca un nmero real:\n);
scanf(%f,&n1);
printf(Introduzca otro nmero real:\n);
scanf(%f,&n2);
printf(Introduzca otro nmero real:\n);
scanf(%f,&n3);
media3(n1,n2,n3);
return(0);
}
// Funcin media3: Informa de la media de void media3(float n1, float n2, float n3)
3 nmeros.
{
float resultado;
resultado=(n1+n2+n3)/3;
printf(La media es:%f\n,resultado);
}

15

Realizar una funcin llamada negativo, que toma un nmero entero como parmetro, y
devuelve 1 si es negativo o 0 si no lo es.
#include<stdio.h>
int negativo(int numero);
int main()
{
int n,resultado;
printf(Introduzca un nmero:\n);
scanf(%i,&n);
resultado=negativo(n);
if (resultado==1)
printf(Es un nmero negativo.\n);
else
printf(No es negativo.\n);
return(0);
}
/* Funcin negativo: Devuelve 1 si es negativo el nmero entero pasado como parmetro, o 0 si
no lo es. */
int negativo(int numero)
{
int res;
if (numero<0)
res=1;
else
res=0;
return(res);
}

16

Ejercicios Propuestos
1. 1-Realice un programa en C que contenga una funcin llamada invertir que
reciba un parmetro de tipo char y que retorne la cadena invertida.
2. Disee un Programa en C que contenga una funcin llamada primo que reciba
como parmetro un numero entero positivo. Retorne 1 si en numero es primo de
los contrario retorne 0. Ojo, los nmeros primos slo son divisibles por el
mismo y por la unidad (1).
3. Disee un programa en C que contenga un funcin llamada factorial que reciba
como parmetro un numero entero positivo y muestre su facturial.
4. Disee un programa en C que contenga 4 funciones (sumar, restar, dividir,
multiplica), las cuales recibirn 2 parmetros de tipo entero y retorne el
resultado de la operacin. Haga uso del switch.
5. Disee un programa con una funcin llamada potencia, que dada una cifra entera
positiva, sea elevada a una potencia introducida por el usuario, la funcin
recibir 2 parmetros enteros y retornara el resultado de la operacin . (Ejemplo:
5^2=25).
6. Escribir una funcin reemplaza, la cual toma una cadena como parmetro, le
reemplaza todos los espacios en blanco de la cadena por un guin bajo, y
devuelve el nmero de espacios reemplazados.

17

También podría gustarte