Búsqueda personalizada
Curso de lenguaje C
 Principal
 Inicio
 Libros
 Librerías
 Mapa Web
 
 Recursos
 Artículos
 Cursos
 Ejercicios
 Guías de uso
 Mini Diccionario 
  
 Sintaxis
 ANSI C
 Ordinogramas
 Pascal
 Pseudocódigo 
  
 Acerca de
 Carlos Pes
 Mi Blog 
  
 Sitios Amigos
 Casas Rurales
 Directorio Web

 
[más enlaces] 
  
 Contenidos > 1.9.2.1 Especificadores de formato

Especificadores de formato

En la fución 
scanf, por cada argumento (variable) que se le pase, se debe escribir un especificador de formato, que establecerá el formato de entrada por teclado del argumento. La forma más sencilla de escribir un especificador de formato en la función scanf es con el carácter tanto por ciento (%) seguido de un carácter de conversión que indique el tipo de dato del argumento. De momento, no es necesario conocer todos los especificadores de formato que se pueden usar en la función scanf, pero sí, los más usados, que son los mismos que en la función printf:

Especificadores de formato en la función scanf

Figura. Especificadores de formato más utilizados en la función scanf.

Ejemplo 1: (ejemplo_11_40.c del libro) Dado el programa

#include <stdio.h>

int main()
{
   int numero;

   printf( "\n   Introduzca un numero entero: " );
   scanf( "%d", &numero );

   return 0;
}

En la memoria se reservará espacio para la variable numero
. Y si el usuario teclea, por ejemplo, un 5, en pantalla se verá


   Introduzca un numero entero: 5

 

Puesto que la variable numero
es de tipo entero, en la cadena de control se tiene que escribir el especificador de formato asociado a la entrada de un número entero (%d). Por otro lado, la variable numero se ha escrito precedida del carácter ampersand (&). Se trata de un nuevo operador, el operador dirección. El operador dirección (&) siempre actúa sobre un operando (normalmente una variable) y, de su evaluación, se obtiene la dirección de memoria de dicha variable.

Es sabido que, una variable representa a un espacio de memoria en el cual se puede almacenar un dato. Pues bien, en realidad, a la función 
scanf no se le pasa una lista de variables, sino, las direcciones de memoria de los espacios de memoria a los que representan dichas variables.

Para todas las variables declaradas en un programa se reservan espacios de memoria en donde se almacenarán datos. La memoria del computador está dividida en celdas numeradas de forma consecutiva, por lo que, cada una de ellas tiene una dirección (un número). Un dato puede necesitar una o más celdas de memoria. Así pues, en el 
ejemplo_11_40, la expresión &numero hace referencia a la primera celda donde se va a almacenar el valor 5 introducido por el usuario. La dirección de memoria de la variable numero podría ser, por ejemplo, 0012FF88. En informática, las direcciones de memoria suelen representarse con números hexadecimales. Gráficamente, se puede representar de la siguiente manera:

Ejemplo: dirección de memoria de la variable número

El operador dirección (
&) entra dentro de la categoría de operadores monarios y, siguiendo con el ejemplo, de la evaluación de la expresión

   &numero

se obtiene el valor
0012FF88, que es la dirección de memoria de la variable numero. Esa dirección la necesita conocer la función scanf para localizar la primera celda del espacio de memoria en donde se va a almacenar el 5 introducido por el usuario.

La dirección de memoria de la variable numero
se puede visualizar en pantalla escribiendo

   printf ( "%p", &numero );

Puesto que, de la expresión &numero
se obtiene una dirección de memoria, en la cadena de control de la función printf se tiene que escribir el especificador de formato asociado a la salida de una dirección de memoria, (%p).

Obsérvese que, en la cadena de control de 
printf, se ha eludido escribir con tilde la palabra numero, ya que, de haberlo hecho, por pantalla hubiesemos visto algo parecido a:


   Introduzca un n·mero entero: 5

 

Para visualizar el carácter 'ú', podemos escribir:

   printf( "\n Introduzca un n%cmero entero: ", 163 );

Fíjese que, 163 es el número decimal que corresponde al carácter 'ú' en ASCII.

Ejemplo 2: (ejemplo_11_41.c del libro) Ahora, estudiemos el siguiente programa:

#include <math.h>
#include <stdio.h>

#define PI 3.141592

int main()
{
   float area, radio;

   printf( "\n   Introduzca radio: " );
   scanf( "%f", &radio );
   area = PI * pow( radio, 2 );
   printf( "\n   El area de la circunferencia es: %f", area );

   return 0;
}

Inicialmente, en la memoria se reservará espacio para las dos variables del programa.

Ejemplo: direcciones de memoria de las variables area y radio

Si el usuario teclea, por ejemplo, el valor 3.8 para el radio, en pantalla se visualizará:


   Introduzca radio: 3.8

   El area de la circunferencia es: 45.364588

 

La variable 
radio es de tipo real y, por tanto, en la cadena de control de la función scanf se tiene que escribir el especificador de formato asociado a la entrada de un número real, (%f). Y, puesto que, en la función printf, el resultado de evaluar la expresión area también es de tipo real, en su cadena de control hay que escribir, de igual forma, el especificador de formato asociado a la salida de un número real, (%f).

Para que el área se muestre sólo con dos cifras decimales, es decir, 45.36 en vez de 45.364588, en la cadena de control de la función 
printf se debe escribir %.2f en vez de %f.

 printf( "\n   El area de la circunferencia es: %.2f", area );

En pantalla se verá


   Introduzca radio: 3.8

   El area de la circunferencia es: 45.36

 

Aunque sólo se muestren dos cifras decimales, en memoria el area seguirá valiendo 
45.364588.

Por otra parte, hemos dicho que, para conocer la dirección de memoria de una variable, se puede utilizar el operador dirección (
&). Pero, esta regla no es general. Por ejemplo, no es aplicable a las variables (arrays) de tipo cadena.

Ejemplo 3: (ejemplo_11_42.c del libro) Si se desea desarrollar un programa para leer un nombre de persona


   Introduzca nombre: Elsa

 

se puede escribir

#include <stdio.h>

int main()
{
   char nombre[5];

   printf( "\n   Introduzca nombre: " );
   scanf( "%s", nombre );

   return 0;
}

Obsérvese que, a la función 
scanf se le "pasa" nombre en vez de &nombre. Esto es así, ya que, para las variables de tipo cadena (arrays de caracteres), su propio identificador (nombre, en este caso) ya hace referencia a la dirección de memoria donde se va a almacenar el dato. Más concretamente, hace referencia al espacio reservado en memoria para guardar el primer carácter de la cadena. Para el resto de caracteres de la cadena, el sistema habrá reservado, en memoria, espacios contiguos al primero.

Ejemplo: dirección de memoria del array nombre

Nótese que, la variable 
nombre ha sido declarada con un tamaño de cinco caracteres. Por consiguiente, con este programa sólo se podrá almacenar en memoria un nombre de persona de hasta cuatro caracteres, ya que, en el quinto debe guardarse el carácter nulo (\0).


Ejercicios Recomendados:
 Más información
Texto extraído del apartado:

   11.8.2.1 Especificadores de formato

del libro 
EMPEZAR DE CERO A PROGRAMAR EN LENGUAJE C, (páginas 291-295).
 Contenidos > Apartado siguiente
1.10 Comentarios
Búsqueda personalizada
Cursos de Carlos Pes: Ejercicios de Carlos Pes: Libros de Carlos Pes: Enlaces Recomendados:
Curso Diseño de Algoritmos
Curso Informática Básica
Curso Ingeniería del Software
Curso Lenguaje C
Curso Turbo Pascal
Curso Representación Datos
Ejercicios de Algoritmos
Ejercicios de Lenguaje C
Ejercicios de Ordinogramas
Ejercicios de Pascal
Empezar de cero a programar en lenguaje C
Domine la programación en lenguaje C
Empezar de cero a programar en Pascal
Tutoriales y Cursos
Gane dinero con su web
Comprar dominio
Programación Informática
100% Adsense
Inicio | Libros | Librerías | Mapa Web | Artículos | Cursos | Ejercicios | Guías | MiniDiccionario | Enlaces | Carlos Pes | Mi Blog
© Carlos Javier Pes Rivas, 2006-2008
Política de privacidad - Contactar