Programación en C/Interacción con el usuario
En este capítulo veremos un poco más sobre como interactuar con el usuario de nuestros programas desde la consola, utilizando printf()
como vimos en el primer ejemplo "Hola mundo", así como scanf()
para la lectura del teclado.
Imprimir por pantalla
editarComo hemos visto hasta ahora en los ejemplos, hay una función que utilizamos para sacar por pantalla textos arbitrarios o el resultado de alguna operación: la función printf()
.
Si miramos (en la documentación) su definición, no nos aclarará demasiado:
int
printf (
const char
*TEMPLATE, ...)
...claro que por algo tiene una sección completa de la documentación para ella sola.
Veámosla poco a poco. Se trata de una función de la biblioteca estándar, lo que quiere decir que para utilizarla tenemos que incluir previamente su definición. La encontraremos en <stdio.h>
.
Lo primero que vemos en la definición es que es una función de tipo int
, lo que quiere decir que devuelve un entero. Ese entero es el número de caracteres impresos en la pantalla, o un número negativo en caso de que se produzca algún error.
Lo siguiente a notar es su primer argumento: const char
*TEMPLATE
. Se trata de una cadena de caracteres (char
*
) que no será modificada por la función (const
), con lo que puede ser una constante de cadena o una variable que contenga una cadena, pero siempre debe acabar con el carácter nulo \0
.
Y luego vienen esos extraños puntos suspensivos. Esa elipsis nos indica que como argumentos adicionales de printf()
podemos poner una serie ilimitada de otros argumentos, que se supone que la función sabrá qué hacer con ellos. Y eso es justamente lo que hace tan fabulosa y útil a printf()
.
Como hemos visto, el uso más simple de printf()
es imprimir una cadena de texto simple y corriente. Como ya vimos:
printf(
"Hola Mundo
\n
"
);
/*imprime la cadena*/
Y también hemos visto printf()
también puede, con un argumento extra y una sintaxis especial, imprimir un número entero que hayamos almacenado en una variable:
char
resultado;
resultado=
5
+
2
;
printf(
"Resultado de la suma:
%i
\n
"
,resultado);
Aquí el punto de inserción es la secuencia %i
. printf()
siempre trata las secuencias que comiencen por %
como secuencias de control que le dicen que debe imprimir algo que le proporcionamos en los otros argumentos. Así, podemos imprimir varios enteros distintos en los sitios que queramos de la cadena, insertando varias de estas secuencias %i
:
int
numero;
numero=
3
;
printf(
"El doble de
%i
es
%i
y su cuadrado es
%i\n
"
,numero,numero*2,numero*numero);
Lectura de datos del teclado
editarLa entrada de datos se puede hacer de muchas maneras y entre ellas están desde el uso de dispositivos especiales hasta nuestro simple teclado. La entrada de datos se refiere a cualquier forma de influencia del usuario sobre los datos que posee el sistema.
Con el fin de mostrar una forma de entrada simple para el aprendizaje vamos a hablar de la función scanf()
que se encuentra definida en <stdio.h>
y que se usa para capturar diferentes tipos de datos.
La función scanf()
editar
scanf()
es una de las funciones más usadas por los principiantes para hacer entrada de datos en el lenguaje C. Tiene una sintaxis muy parecida a printf
: recibe una cadena con el formato de los datos y luego se ponen las variables en orden que correspondan a ese tipo de datos. Es decir, así como en printf
se pueden mostrar por pantalla los datos de varias variables en una misma sentencia, en scanf
se pueden capturar varios datos en una sola sentencia.
#include <stdio.h>
int main() {
int a;
printf ("diga un valor para a:");
scanf("%i",&a);
printf ("el valor es: %i\n",a);
return 0;
}
Por ahora no nos interesan las demás sentencias, sólo la que contiene scanf
. En el código se ve lo siguiente:
scanf("%i",&a);
Se observa que la funcion printf dejó en pantalla una petición para que el usuario introdujera un valor. Entonces, scanf
recibe como argumento una cadena del formato en que se van a capturar los datos y la lista de variables que van a recibir valores y que deben coincidir con los del formato.
En este caso la cadena de formato, "%i"
, especifica que el usuario ingresará un número entero. Luego se designa a la variable a
para contener a ese número. El símbolo (&) que precede a a
es para especificar que lo que se está enviando como argumento no es el valor que posee la variable a
sino la dirección de memoria en que se encuentra. En este momento eso no tiene mucha relevancia, sólo hay que recordar que se debe usar el símbolo & dentro del scanf
. En el momento en que hablemos de punteros veremos más detalles de esto.
Otro ejemplo del uso de scanf
:
#include <stdio.h>
int main() {
int a,b;
printf ("introduzca dos valores con el formato \"a,b\" :");
scanf("%i,%i",&a,&b);
printf ("el primer valor : %i\n",a);
printf ("el segundo valor : %i\n",b);
return 0;
}
Aquí hemos introducido una nueva variable en el código. La cadena de formato, "%i,%i"
especifica que el usuario ingresará un número, seguido de una coma, y luego otro número. El primer %i
será capturado por la variable a
y el segundo por b
.