Funciones
Funciones
Funciones
Comprender el desarrollo
de un programa utilizando
funciones
Conocer la clasificación
de las variables de acuerdo
a su ámbito y clase
de almacenamiento
3. Funciones en C
3.1 Introducción
3.1 Introducción
En la unidad 2 hemos visto que una función es un fragmento de código que realiza una
tarea bien definida. Por ejemplo, la función printf imprime por la salida estándar los
argumentos que le pasamos. Al igual que esta función, existen otras funciones que rea-
lizan diversas tareas ya definidas en el estándar ANSI C y que pueden ser utilizadas por
el programador. Este tipo de funciones predefinidas son denominadas funciones de
biblioteca. Sin embargo, cada programador puede definir sus propias funciones de
acuerdo a sus necesidades. Las funciones que define el programador son conocidas como
funciones de usuario.
Se puede acceder (llamar) a una determinada función desde cualquier parte de un pro-
grama. Cuando se llama a una función, se ejecutan las instrucciones que constituyen
dicha función. Una vez que se ejecutan las instrucciones de la función, se devuelve el
control del programa a la siguiente instrucción (si existe) inmediatamente después de
la que provocó la llamada a la función.
Cuando se accede a una función desde un determinado punto del programa, se le puede
pasar información mediante unos identificadores especiales conocidos como argumen-
tos (también denominados parámetros). Una vez que la función procesa esta informa-
ción, devuelve un valor mediante la instrucción return.
71
3. Funciones en C
3.1 Introducción
Donde:
Vamos a suponer que queremos crear un programa para calcular el precio de un producto
basándose en el precio base del mismo y el impuesto aplicable. A continuación mostra-
mos el código fuente de dicho programa:
#include <stdio.h>
main()
{
float importe = 2.5;
float tasa = 0.07;
Por otra parte, en la función main declaramos dos variables de tipo float que contie-
nen el precio base del producto y el impuesto aplicable. La siguiente sentencia dentro
de la función main es la llamada a la función de biblioteca printf, que recibe como pará-
metro una llamada a la función precio, que devuelve un valor de tipo float. De esta
manera, la función printf imprime por la salida estándar el valor devuelto por la fun-
ción precio. Es importante tener en cuenta que las variables importe y tasa (argumen-
tos) dentro de la función main tienen una correspondencia con las variables base e
impuesto (parámetros) dentro de la función precio respectivamente.
72
3. Funciones en C
3.2 Declaración de funciones
En el ejemplo anterior, justo antes de la función main, hemos declarado la función pre-
cio. La intención es que la función main sea capaz de reconocerla. Sin embargo, la defi-
nición de dicha función aparece después de la función main. Las definiciones de fun-
ción pueden aparecer en cualquier orden dentro de uno o más ficheros fuentes. Más
adelante, en esta unidad, veremos en detalle la declaración y definición de funciones.
Por otra parte, hemos añadido la sentencia return 0 al final de la función main, puesto
que se trata de una función como otra cualquiera y puede devolver un valor a quien le
ha llamado, en este caso el entorno en el que se ejecuta el programa. Generalmente, el
valor 0 implica un fin de ejecución normal, mientras que otro valor diferente implica un
final de ejecución inusual o erróneo.
Antes de empezar a utilizar una función debemos declararla. La declaración de una fun-
ción se conoce también como prototipo de la función. En el prototipo de una función
se tienen que especificar los parámetros de la función, así como el tipo de dato que
devuelve.
tipo_de_retorno nombre_de_la_función(lista_de_parámetros);
En este caso se declara la función cubo que recibe como parámetro una variable de tipo
entero (numero) y devuelve un valor del mismo tipo. En ningún momento estamos espe-
cificando qué se va a hacer con la variable numero, sólo declaramos las características
de la función cubo.
Cabe señalar que el nombre de los parámetros es opcional y se utiliza para mejorar la
comprensión del código fuente. De esta manera, el prototipo de la función cubo podría
expresarse de la siguiente manera:
int cubo(int);
Los prototipos de las funciones son utilizados por el compilador para verificar que se
accede a la función de la manera adecuada con respecto al número y tipo de parámetros,
y al tipo de valor de retorno de la misma. Veamos algunos ejemplos de prototipos de
funciones:
73
3. Funciones en C
3.3 Definición de funciones
Tras declarar una función, el siguiente paso es implementarla. Generalmente, este paso
se conoce como definición. Es precisamente en la definición de una función donde se
especifican las instrucciones que forman parte de la misma y que se utilizan para llevar
a cabo la tarea específica de la función. La definición de una función consta de dos par-
tes, el encabezado y el cuerpo de la función. En el encabezado de la función, al igual
que en el prototipo de la misma, se tienen que especificar los parámetros de la función,
si los utiliza y el tipo de datos que devuelve, mientras que el cuerpo se compone de las
instrucciones necesarias para realizar la tarea para la cual se crea la función. La sinta-
xis de la definición de una función es la siguiente:
tipo_de_retorno nombre_de_la_función(lista_de_parámetros)
{
sentencias;
}
El tipo_de_retorno representa el tipo de dato del valor que devuelve la función. Este
tipo debe ser uno de los tipos simples de C, un puntero a un tipo de C o bien un tipo
struct. De forma predeterminada, se considera que toda función devuelve un tipo entero
(int). En otras palabras, si en la declaración o en la definición de una función no se
especifica el tipo_de_retorno, el compilador asume que devuelve un valor de tipo int.
El nombre_de_la_función representa el nombre que se le asigna a la función.
Se recomienda que el nombre de la función esté relacionado con la tarea que lleva a
cabo. En caso de que la función utilice parámetros, éstos deben estar listados entre
paréntesis a continuación del nombre de la función, especificando el tipo de dato y el
nombre de cada parámetro. En caso de que una función no utilice parámetros, se pue-
den dejar los paréntesis vacíos o incluir la palabra void, que indica que la función no
utiliza parámetros. Después del encabezado de la función, debe aparecer, delimitado
por llaves ({ y }), el cuerpo de la función compuesto por las sentencias que llevan a
cabo la tarea específica de la función. Veamos la definición de la función cubo decla-
rada en el apartado anterior:
74
3. Funciones en C
3.3 Definición de funciones
Como ya hemos visto, a los argumentos que recibe la función también se les suele lla-
mar parámetros. Sin embargo, algunos autores consideran como parámetros a la lista
de variables entre paréntesis utilizada en la declaración o en la definición de la función,
y como argumentos los valores utilizados cuando se llama a la función. También se uti-
lizan los términos argumentos formales y argumentos reales, respectivamente, para
hacer esta distinción.
Cuando un programa utiliza un número elevado de funciones, se suelen separar las decla-
raciones de función de las definiciones de las mismas. Al igual que con las funciones de
biblioteca, las declaraciones pasan a formar parte de un fichero cabecera (extensión .h),
mientras que las definiciones se almacenan en un fichero con el mismo nombre que el
fichero .h, pero con la extensión .c. En algunas ocasiones, un programador no desea
divulgar el código fuente de sus funciones. En estos casos, se suele proporcionar al usua-
rio el fichero de cabecera, el fichero compilado de las definiciones (con extensión .o, de
objeto) y una documentación de las mismas. De esta manera, cuando el usuario desea
hacer uso de cualquiera de las funciones, sabe qué argumentos pasarle y qué tipo de
datos devuelve, pero no tiene acceso a la definición de las funciones.
Ejemplo práctico
1 El siguiente programa calcula el cubo de los números del 1 al 5 utilizando una función definida por el usuario.
#include <stdio.h>
main()
{
int numero;
for(numero=1; numero<=5; numero++){
printf("El cubo del número %d es %d\n", numero, cubo(numero));
}
return 0;
}
La salida es:
75
3. Funciones en C
3.5 Acceso a una función
Una función en C sólo puede devolver un valor. Para devolver dicho valor, se utiliza la
palabra reservada return cuya sintaxis es la siguiente:
return <expresión>;
Donde <expresión> puede ser cualquier tipo de dato salvo un array o una función. Ade-
más, el valor de la expresión debe coincidir con el tipo de dato declarado en el proto-
tipo de la función. Por otro lado, existe la posibilidad de devolver múltiples valores
mediante la utilización de punteros o estructuras. Dentro de una función pueden exis-
tir varios return dado que el programa devolverá el control a la sentencia que ha llamado
a la función en cuanto encuentre la primera sentencia return. Si no existen return, la
ejecución de la función continúa hasta la llave del final del cuerpo de la función (}).
Hay que tener en cuenta que existen funciones que no devuelven ningún valor. El tipo
de dato devuelto por estas funciones puede ser void, considerado como un tipo especial
de dato. En estos casos, la sentencia return se puede escribir como return o se puede
omitir directamente. Por ejemplo:
void imprime_cabecera();
{
printf("esta función sólo imprime esta línea");
return;
}
equivale a:
void imprime_cabecera();
{
printf("esta función sólo imprime esta línea");
}
Para que una función realice la tarea para la cual fue creada, debemos acceder o llamar
a la misma. Cuando se llama a una función dentro de una expresión, el control del pro-
grama se pasa a ésta y sólo regresa a la siguiente expresión de la que ha realizado la lla-
mada cuando encuentra una instrucción return o, en su defecto, la llave de cierre al final
de la función.
Generalmente, se suele llamar a las funciones desde la función main, lo que no implica
que dentro de una función se pueda acceder a otra función.
Cuando queremos acceder a una función, debemos hacerlo mediante su nombre seguido
de la lista de argumentos que utiliza dicha función encerrados entre paréntesis. En caso
76
3. Funciones en C
3.5 Acceso a una función
de que la función a la que se quiere acceder no utilice argumentos, se deben colocar los
paréntesis vacíos.
Cualquier expresión puede contener una llamada a una función. Esta llamada puede ser
parte de una expresión simple, como una asignación, o puede ser uno de los operandos
de una expresión más compleja. Por ejemplo:
a = cubo(2);
calculo = b + c / cubo(3);
Debemos recordar que los argumentos que utilizamos en la llamada a una función se
denominan argumentos reales. Estos argumentos deben coincidir en el número y tipo
con los argumentos formales o parámetros de la función. No olvidemos que los argu-
mentos formales son los que se utilizan en la definición y/o declaración de una función.
Los argumentos reales pueden ser variables, constantes o incluso expresiones más com-
plejas. El valor de cada argumento real en la llamada a una función se transfiere a dicha
función y se le asigna al argumento formal correspondiente.
Generalmente, cuando una función devuelve un valor, la llamada a la función suele estar
dentro de una expresión de asignación, como operando de una expresión compleja o
como argumento real de otra función. Sin embargo, cuando la función no devuelve nin-
gún valor, la llamada a la función suele aparecer sola. Veamos un ejemplo:
z = potencia( a, b);
imprime_valores (x, y, z);
Ejemplo práctico
#include <stdio.h>
void primera(void);
void segunda(void);
main()
{
printf("La primera función llamada, main\n");
primera();
segunda();
printf("Final de la función main\n");
return 0;
}
void primera(void)
{
printf("Llamada a la función primera\n");
return;
}
77
3. Funciones en C
3.7 Variables locales
void segunda(void)
{
printf("Llamada a la función segunda\n");
return;
}
La salida es:
Cuando declaramos variables dentro de la función principal del programa, es decir, den-
tro de la función main, están únicamente asociadas a esta función, en otras palabras,
son variables locales de la función main y no se puede acceder a ellas a través de nin-
guna otra función.
Al igual que sucede con las variables declaradas dentro de la función main, cualquier varia-
ble que declaremos dentro de una función, es local a esa función, es decir, su ámbito esta
confinado a dicha función. Esta situación permite que existan variables con el mismo nom-
bre en diferentes funciones y que no mantengan ninguna relación entre sí.
Debemos tener en cuenta que cualquier variable declarada dentro de una función se con-
sidera como una variable automática (auto) a menos que utilicemos algún modificador
78
3. Funciones en C
3.7 Variables locales
Todas las variables que hemos utilizado en los ejemplos vistos hasta ahora son varia-
bles automáticas. La utilización de la palabra reservada auto es opcional, aunque nor-
malmente no se utiliza, por ejemplo:
equivale a
int contador;
Ejemplo práctico
#include <stdio.h>
void imprimeValor();
main()
{
int contador = 0;
contador++;
printf("El valor de contador es: %d\n", contador);
imprimeValor();
printf("Ahora el valor de contador es: %d\n", contador);
return 0;
void imprimeValor()
{
int contador = 5;
printf("El valor de contador es: %d\n", contador);
}
La salida es:
79
3. Funciones en C
3.8. Variables globales
A diferencia de las variables locales cuyo ámbito estaba confinado a la función 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 función que forme parte de éste podrá utilizarla sim-
plemente haciendo uso de su nombre.
Ejemplo práctico
#include <stdio.h>
void unaFuncion();
void otraFuncion();
int variable;
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 función unaFuncion, variable es: %d\n", variable);
}
void otraFuncion()
{
variable++;
80
3. Funciones en C
3.8. Variables globales
La salida es:
Cuando trabajamos con variables globales debemos distinguir entre la definición de una
variable global y su declaración. Cuando definimos una variable global, lo hacemos de
la misma forma en que se declara una variable ordinaria. La definición de una variable
global se realiza fuera de cualquier función. Además, las definiciones de variables glo-
bales suelen aparecer antes de cualquier función que desee utilizar dicha variable. La
razón es que una variable global se identifica por la localización de su definición den-
tro del programa. Cuando se define una variable global automáticamente, se reserva
memoria para el almacenamiento de ésta. Además, podemos asignarle un valor inicial a
la misma.
Si una función desea utilizar una variable global previamente definida, basta con utili-
zar su nombre sin realizar ningún tipo de declaración especial dentro de la función. Sin
embargo, si la definición de la función aparece antes de la definición de la variable glo-
bal, se requiere incluir una declaración de la variable global dentro de la función.
Para declarar una variable global se utiliza la palabra reservada extern. Al utilizar extern,
le estamos diciendo al compilador que el espacio de memoria de esa variable está defi-
nido en otro lugar. Es más, en la declaración de una variable externa (extern) no se
puede incluir la asignación de un valor a dicha variable. Por otro lado, el nombre y el
tipo de dato utilizados en la declaración de una variable global debe coincidir con el
nombre y el tipo de dato de la variable global definida fuera de la función.
Debemos recordar que sólo se puede inicializar una variable global en su definición. El
valor inicial que se le asigne a la variable global debe expresarse como una constante y
no como una expresión. Es importante señalar que si no se asigna un valor inicial a la
variable global, automáticamente se le asigna el valor cero (0). De esta manera, las
variables globales siempre cuentan con un valor inicial.
Cabe señalar que la declaración de una variable global puede hacer referencia a una
variable que se encuentra definida en otro fichero. Por esta razón, podemos decir que el
especificador de tipo extern hace referencia a una variable que ha sido definida en un
lugar distinto al punto en el que se está declarando y donde se va a utilizar.
81
3. Funciones en C
3.9 Variables estáticas
Ejemplo práctico
#include <stdio.h>
void unaFuncion();
void otraFuncion();
main()
{
extern variable;
variable = 9;
printf("El valor de variable es: %d\n", variable);
unaFuncion();
printf("Ahora el valor de variable es: %d\n", variable);
return 0;
void unaFuncion()
{
extern variable;
printf("En la función unaFunción, variable es: %d\n", variable);
}
int variable;
Su salida es:
82
3. Funciones en C
3.9 Variables estáticas
#include <stdio.h>
void imprimeValor();
main()
{
imprimeValor();
imprimeValor();
imprimeValor();
imprimeValor();
return 0;
}
void imprimeValor()
{
static int contador = 0;
printf("El valor de contador es: %d\n", contador);
contador++;
}
La primera vez que se llama a la función imprimeValor se inicializa su valor a cero, y tras
imprimir su valor se incrementa éste. En las sucesivas llamadas, el valor de la variable
contador se mantiene y el resultado es el siguiente:
Como hemos visto, el valor de la variable contador se mantiene de una llamada a otra de
la función imprimeValor. Esto quiere decir que las variables locales estáticas proporcio-
nan un medio privado de almacenamiento permanente en una función.
Por otro lado, la aplicación del calificador static a variables globales hace que a éstas sólo
se pueda acceder desde el fichero fuente en el que se definieron y no desde ningún otro
fichero fuente. Por ejemplo, si definimos las variables globales tiempo y reloj en el
siguiente fichero fuente:
main()
{
...
}
void funcion1()
{
...
}
cualquier otra función que forme parte de la aplicación y que no forme parte de este
fichero fuente no podrá disponer de acceso a tiempo ni a reloj. Es más, se pueden utili-
zar los mismos nombres para definir variables en funciones en otros ficheros sin ningún
tipo de problema.
83
3. Funciones en C
3.10 Variables de registro
Al igual que las variables globales, las funciones son objetos externos cuyos nombres,
generalmente, se desea que se conozcan de manera global. Sin embargo, en algunas
situaciones resulta deseable limitar dicho acceso al fichero en el que se declara la fun-
ción. En estos casos, se utiliza la palabra reservada static y su mecanismo de aplicación
es similar al caso de las variables, como podemos apreciar en el siguiente ejemplo:
Cuando declaramos una variable como variable de registro, le estamos diciendo al com-
pilador que queremos que la variable se almacene en un lugar de rápido acceso, gene-
ralmente en los registros de la unidad central de procesamiento del ordenador. Para
declarar una variable como variable de registro, debemos colocar la palabra reservada
register antes de la declaración de la variable. Veamos algunos ejemplos:
Sólo se pueden declarar variables como register si son variables automáticas (locales) o
argumentos formales de una función. Veamos un ejemplo de la utilización de register en
los argumentos formales de una función:
Cuando se utiliza una variable de tipo register, no está garantizado que su valor se alma-
cene en un registro. Para que el valor de dicha variable se almacene en un registro, debe
haber alguno disponible, de lo contrario C ignora el calificador register y crea la varia-
ble localmente como ya hemos visto.
84
3. Funciones en C
3.11 Paso de argumentos y punteros
En C todos los argumentos que se pasan a una función 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 función, cualquier modificación que se realice
sobre esta copia no tendrá efecto sobre el argumento original utilizado en la llamada
de la función. Se puede considerar un argumento pasado por valor como una variable
local de la función a la que se ha pasado, de tal modo que los cambios que se realicen
sobre ésta tendrán efecto sólo dentro de la función.
#include <stdio.h>
Dado que lo que se pasa a la función modificar es una copia de la variable i, el valor de
ésta en la función main no se ve alterado cuando dentro de la función modificar se cam-
bia el valor de variable. De ahí, la salida del ejemplo anterior es la siguiente:
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 función 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.
85
3. Funciones en C
3.11 Paso de argumentos y punteros
ción son las direcciones de memoria de los argumentos. Como hemos visto en la unidad
anterior, esta operación se logra mediante la utilización de punteros. De este modo,
cuando llamamos a una función, lo que realmente le pasamos son punteros a los argu-
mentos que deseamos modificar. Veamos el ejemplo anterior utilizando el paso de argu-
mentos por referencia:
#include <stdio.h>
Dado que el paso de argumentos por referencia es común 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 declaración reserva memoria para almacenar una
86
3. Funciones en C
3.11 Paso de argumentos y punteros
dirección. A pesar de que apunta a una variable de tipo entero, lo que se va a almace-
nar es una dirección. Como en el fondo un puntero puede apuntar a cualquier cosa, C
permite la declaración de punteros tipo void. Supongamos que el compilador reserva la
dirección en hexadecimal bffff120 para la variable dato y la dirección en hexadecimal
0012fed4 para puntero.
dato = 99;
puntero = &dato;
Una vez realizada la asignación anterior, disponemos de dos maneras de acceder al con-
tenido 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 devolución
de valores desde una función. Como ya sabemos, en C una función sólo puede devol-
ver un único valor. Sin embargo, a menudo se hace necesario que una función
devuelva más de un valor, y es aquí donde podemos utilizar el paso de argumentos
por referencia.
Además, la utilización del paso de argumentos por referencia nos permite ahorrar tiempo
y espacio. En el caso que deseáramos pasar algo a una función cuyo tamaño sea grande,
87
3. Funciones en C
3.12 Recursividad
por ejemplo una estructura, sería conveniente pasarla por referencia, ya que si lo hace-
mos por valor, se tiene que realizar una copia de la misma y colocarla en la pila, lo que
implica consumo de tiempo y espacio.
3.12 Recursividad
Las funciones en C pueden ser recursivas, en otras palabras, pueden llamarse a sí mis-
mas directa o indirectamente. La recursividad directa es el proceso mediante el que una
función se llama a sí misma desde el propio cuerpo de la función, mientras que la recur-
sividad indirecta implica más de una función.
Un proceso recursivo tiene que tener una condición de finalización, ya que de lo con-
trario podría continuar infinitamente.
En principio, la solución a este problema podría realizarse sin tener que utilizar la recur-
sividad con el siguiente programa:
#include <stdio.h>
main()
{
int valor = 4;
int resultado;
resultado = factorial(valor);
printf("El factorial de %d es %d \n", valor, resultado);
return 0;
}
88
3. Funciones en C
3.12 Recursividad
Sin embargo, resulta más intuitivo dada la definición de número factorial utilizar una
función recursiva como la siguiente:
if(numero == 1)
return 1;
else
return (numero * factorial(numero-1));
Llamada # 1:
numero = 4
numero != 1 entonces ejecutamos la siguiente sentencia
return ( 4 * (realizamos la segunda llamada))
Llamada # 2:
numero = 3
numero != 1 entonces ejecutamos la siguiente sentencia
return ( 3 * (realizamos la tercera llamada))
Llamada # 3:
numero = 2
numero != 1 entonces ejecutamos la siguiente sentencia
return ( 2 * (realizamos la cuarta llamada))
Llamada # 4:
numero = 1
numero == 1 entonces se ejecuta la sentencia del if:
return 1
return ( 2 * 1)
return ( 3 * 2)
89
3. Funciones en C
3.12 Recursividad
return ( 4 * 6)
main()
valor =4
factorial(4)
Pila
numero factorial()
- 24
factorial()
factorial(3)
retorno 4 * 6
Pila
numero factorial()
4 6
factorial(4) factorial()
factorial(2)
retorno 3 * 2
Pila
numero factorial()
3 2
factorial(3)
factorial(4) factorial()
factorial(1)
retorno 2 * 1
Pila
numero factorial()
factorial(2) 2 1
factorial(3)
factorial(4) factorial()
retorno 1
numero factorial()
1 -
90
3. Funciones en C
3.13 Funciones de biblioteca
C ofrece un conjunto de funciones estándar que dan soporte a las operaciones que se
utilizan con más frecuencia. Estas funciones están agrupadas en bibliotecas. Para utili-
zar cualquiera de las funciones que forman parte de las bibliotecas estándar de C, sólo
hace falta realizar una llamada a dicha función.
Las funciones que forman parte de la biblioteca estándar de C, funciones estándar o pre-
definidas, están divididas en grupos. Todas las funciones que pertenecen a un mismo
grupo se definen en el mismo fichero de cabecera.
Los nombres de los ficheros cabeceras de C se muestran en la siguiente tabla:
• entrada/salida estándar
• matemáticas
• de conversión
• diagnóstico
• de manipulación de memoria
• control de proceso
• ordenación
• directorios
• fecha y hora
• búsqueda
• manipulación de cadenas
• gráficos
• etcétera
Podemos incluir tantos ficheros de cabecera como nos haga falta, incluyendo los fiche-
ros de cabecera que hemos creado y donde hemos definido nuestras funciones. En el
resto de este apartado veremos algunas de las funciones de la entrada/salida estándar
más utilizadas.
91
3. Funciones en C
3.14 Entrada/salida estándar
Hasta ahora hemos utilizado la función printf para escribir datos en la salida estándar
del ordenador (consola). Sin embargo, no es la única función para la salida de datos en
C. De la misma manera, al igual que existen funciones para la salida de datos, existen
funciones para la entrada de los mismos, entre las que se encuentra la función scanf.
La función printf es la salida genérica por consola que es utilizada por cualquier compi-
lador de C. Por otra parte, la entrada estándar, que generalmente es por teclado, se rea-
liza mediante la función scanf. Tanto la función printf como la función scanf permiten
especificar el formato en que se van a escribir o leer los datos. Esto se conoce como
entrada/salida formateada.
A. La función printf
Como ya hemos visto a lo largo de esta unidad y de unidades anteriores, la función
printf básicamente imprime una cadena de caracteres sobre la pantalla del ordenador.
Tanto esta función como otras funciones de entrada/salida están definidas en la
biblioteca stdio. Por esta razón, cada vez que deseamos hacer uso de la misma tene-
mos que incluir el fichero stdio.h mediante la directiva de precompilación #include
<stdio.h>.
%c Carácter
%d Decimal
%e Notación científica
%f Decimal en coma flotante
92
3. Funciones en C
3.14 Entrada/salida estándar
%o Octal
%s Cadena de caracteres
%i Entero
%x ó %X Hexadecimal
Cuando se llama a la función printf, lo primero que hace es analizar la cadena de con-
trol. Aquellos caracteres imprimibles que no estén precedidos por un símbolo de tanto
por ciento (%) se muestran por pantalla directamente. Cuando encuentra un especifi-
cador de formato dentro de la cadena de control, utiliza éste para determinar cómo se
muestra el argumento correspondiente. Debemos tener en cuenta que los especificado-
res de formato y los argumentos deben coincidir de izquierda a derecha. Por otra parte,
el número de especificadores en la cadena de control le indican a printf cuántos argu-
mentos debe esperar.
Por otra parte, es muy común la utilización de secuencias de escape dentro de la fun-
ción printf, por ejemplo, el salto de línea (\n). En la unidad anterior hemos visto las
secuencias de escape y su utilización en C.
B. La función scanf
Un programa puede recibir datos a través de diversas fuentes, por ejemplo el teclado o
ficheros almacenados en disco. En este apartado, vamos a considerar la entrada están-
dar por teclado. La función de entrada más utilizada es la función scanf ya que es ver-
sátil y permite una entrada con formato.
Al igual que la función printf, la función scanf está definida en el fichero de cabecera
93
3. Funciones en C
3.14 Entrada/salida estándar
A diferencia de la función printf que recibe los argumentos por valor, la función scanf
recibe los argumentos por referencia. De esta manera, puede rellenarlos con los valores
leídos. Por ejemplo, la siguiente sentencia devolverá en la variable dato el entero leído
del teclado:
scanf("%i", &dato);
Ejemplo práctico
6 Un programa que pide que se introduzcan dos cantidades, una entera y otra en coma flotante, y los escribe a continua-
ción dentro de una frase.
#include <stdio.h>
main ( )
{
int edad;
char sexo;
94
3. Funciones en C
3.14 Entrada/salida estándar
Por otra parte, la función putchar es la función simétrica a getchar. Esta función recibe
un único argumento que es el carácter que se imprimirá por la salida estándar. Su pro-
totipo es:
Ejemplo práctico
#include <stdio.h>
main ( )
{
char x;
printf("Introduzca un carácter:\n");
x = getchar( ) ;
printf("El carácter introducido es:\n");
putchar (x) ;
return 0;
}
La salida es:
Introduzca un carácter
6
El carácter introducido es:
6
95
3. Funciones en C
3.14 Entrada/salida estándar
Ejemplo práctico
8 El siguiente programa lee 10 caracteres por teclado y luego los imprime en una tabla en orden inverso acompañados
de sus respectivos códigos ASCII.
#include <stdio.h>
char caracteres[10];
int i;
main()
{
Suponiendo que introducimos las 10 primeras letras del alfabeto, la salida es:
***********************************
CARÁCTER CÓDIGO ASCII
j 106
i 105
h 104
g 103
f 102
e 101
d 100
c 99
b 98
a 97
96
3. Funciones en C
Ejercicios
Ejercicios
1 Escribe un programa en C que implemente y haga uso de una función que calcule el factorial de un número entero
para determinar los posibles podios que pueden darse en una carrera entre 8 corredores. Utiliza la fórmula de
variación:
2 Escribe un programa en C que permita calcular la probabilidad de que aparezcan las figuras al escoger tres cartas de
entre las de un palo de la baraja. Utiliza la fórmula de combinación:
3 Calcula el Máximo Común Divisor (MCD) de dos números leídos por teclado utilizando una función
sigprimo(num,comienzo) que devuelva el siguiente divisor primo de num mayor que comienzo.
4 Calcula el Mínimo Común Múltiplo (MCM) de dos números leídos por teclado utilizando una función
sigprimo(num,comienzo) que devuelva el siguiente divisor primo de num mayor que comienzo.
Ejemplo (problemas 3 y 4)
120=23x3x5
144=24x32
mcd= 23x3 = 24
mcm= 24x32x5= 720
5 Escribe un programa que implemente y utilice una función para determinar si un número es positivo o negativo. Lee
un número entero por teclado e imprime por pantalla si el número leído es positivo o negativo haciendo uso de la
función definida.
6 Realiza una función que, dada una cadena de caracteres y un carácter, devuelva el número de apariciones de dicho
carácter en la cadena. Realiza un programa que lea una cadena de caracteres por teclado y escriba por pantalla el
número de apariciones en la cadena de cada una de las vocales haciendo uso de la función definida.
97
3. Funciones en C
Evaluación
Evaluación
4 ¿La instrucción return sólo puede aparecer una vez dentro de una función?
5 ¿Podemos llamar a una función más de una vez desde distintas partes de un programa?
6 ¿Qué diferencia existe entre el paso de argumentos por valor y el paso de argumentos por referencia?
98
3. Funciones en C
Actividades prácticas
Actividades prácticas
1 Escribe un programa en C que simule una pequeña calculadora que implementa las siguientes operaciones:
• Multiplicación
• Suma
• Resta
• División
• Potencia
• Raíz
Todas las operaciones deben ser implementadas como funciones. La selección de la operación se realizará mediante
un pequeño menú desplegado por pantalla. Cada operación utilizará dos operandos.
2 Se tiene una matriz de temperaturas (valores reales positivos y negativos) en distintos puntos medidas en distin-
tos días (matriz n x m, siendo n, el número de puntos, y m el número de días). Calcula la media y la dispersión de
temperatura en cada uno de esos días. La dispersión es la raíz cuadrada de la varianza, y la varianza a su vez se cal-
cula de la siguiente forma:
n
1 2 2
n
∑ (x - x )
i=1
Desarrolla un programa en C que contenga una función que reciba como argumento un puntero a un vector que con-
tiene todas las temperatura tomadas en un día, o sea un vector de tamaño n, y que devuelva en otro vector de tamaño
2 la media y la dispersión. Para ello esta función se ayudará de otras dos funciones de tipo real que calcularán una
la media y la otra la varianza; la primera recibiendo un puntero al vector de temperaturas y la segunda un puntero
al vector de temperaturas y la media ya calculada. El programa principal deberá, utilizando sucesivas llamadas a la
función, mostrar por pantalla la media y la dispersión para cada uno de los días (m). Para el problema considera
cualquier valor para n y m que quieras, pero ten en cuenta que debe resultar fácil cambiarlos en el programa (uso
de constantes).
99