INTRODUCCIÓN
La gran mayoría de los programas necesitan la interacción
entre el usuario y la máquina. Desde la simple calculadora, hasta las complejas
GUIs necesitan que el usuario introduzca datos. En este tutorial vamos a
complicar un poco las cosas y vamos a construir un programa que no funcionará
si no interactuas con él.
Primero vamos a estudiar un poco la función scanf. Ésta es
el equivalente e inverso de la función printf, de hecho también se incluye en la librería estándar de
C (stdio.h). Funciona exactamente igual que printf, pero al inverso. Es decir
en vez de "devolver" datos, "recibirá". No te costará
aprenderla.
FUNCIONES BÁSICAS DE ENTRADA Y SALIDA
Hay varias maneras de usar entrada/salida en ensamblador,
vamos a presentar la más sencilla, usando funciones de alto nivel del lenguaje
de programación C. En C, las instrucciones básicas de entrada salida son printf
y scanf, las cuales permiten respectivamente enviar (print, imprimir) o recibir
(scan, leer) información.
La función printf permite escribir en la salida estándar
(monitor), proporcionando un formato específico para los datos a escribir.
Esta función recibe una cantidad variable de argumentos, en
los que solo uno de ellos es obligatorio: la cadena de formato. Este parámetro
es una cadena que permite indicar el formato que tendrá la impresión que se
quiere realizar, y en base a la cual se determina la cantidad y tipo de los
parámetros restantes.
Dicha cadena puede contenter caracteres comunes y
corrientes, los cuales se mostrarán en pantalla exactamente como se encuentran
en la cadena, y un segundo tipo de caracteres conocidos como especificadores de
formato, los cuales están formados por un símbolo de porcentaje (%) y un código
de formato.
Además de la cadena de formato, deben existir tantos
parámetros adicionales como especificadores de formato contenga la cadena, ya
que cada uno de los mismos proporciona el valor por el cual será sustituido
cada especificador al momento de mostrar la cadena por la pantalla. Dicho de
otra manera, la cadena de formato puede ser vista como una plantilla, mientras
que el resto de los parámetros son los valores que completan los campos vacíos
de dicha plantilla.
La función scanf permite leer desde la entrada estándar,
proporcionando un formato específico para los datos a recibir. De forma análoga
a la función printf, esta función permite reconocer los tipos de datos
especificados por el estándar ANSI de C tales como números, caracteres y
cadenas.
Los argumentos recibidos por la función scanf son similares
a los de la función printf, siendo de nuevo el primero de ellos la cadena de
formato. Sin embargo en este caso la cadena de formato es utilizada para especificar
una "plantilla" que deberá ser completada con la entrada
proporcionada por el usuario.
En este caso, por cada especificador de formato que se
encuentre en la cadena será necesario proporcionar un apuntador a la dirección
de memoria en la que será almacenado el elemento reconocido. Los
especificadores de formato compatibles con la función scanf son los mismos que
para printf.
Una diferencia importante entre las funciones printf y scanf
consiste en la manera en que se les pasan los argumentos. Todos los argumentos
de una llamada a la función scanf (a excepción de la cadena de formato) son
pasados por referencia, es decir, se proporciona la dirección de la variable y
no su valor. Esto se debe a que la función utiliza estas variables para
almacenar un valor leido de la entrada estándar y en consecuencia necesita
saber la posición de memoria en la que el mismo será almacenado.
En contraparte, la función printf no necesita conocer la
dirección de las variables, sino el valor que contienen para poder escribirlo
en la salida estándar. Por esta razón, todos los tipos de dato simple (enteros,
caracteres, etc.) son pasados por valor. Algunas otras variables como los
arreglos y las estructuras (esto incluye las cadenas ya que son arreglos de
caracteres) son pasados por referencia, pero esto se debe a limitaciones del
pase de parámetros por valor (ya que los parámetros se almacenan en la pila,
véase el capítulo de procedimientos) y no a que la función printf necesite
conocer la dirección de dichos argumentos per se.
Para ilustrar la utilización de ambas funciones desde un
programa en lenguaje ensamblador, se presentan dos ejemplos sencillos. Sin
embargo es importante hacer una acotación en este punto. Cuando se hace una
llamada a las funciones printf y scanf (o a cualquier otro procedimiento), el contenido
de los registros %eax, %ecx y %edx corre el riesgo de ser modificado. El motivo
de esto se explica en la parte de procedimientos, sin embargo, es importante
tener en cuenta este hecho al momento de programar, tomando las precauciones
necesarias para no perder información importante al llevar a cabo las
operaciones de lectura o escritura.
Para terminar una línea de salida y hacer que el cursor pase
a la línea siguiente se utiliza \n dentro del formato de salida.
/*Entrada y
Salida: scanf*/
#include
<stdio.h>
int main()
{
float a;
char b;
scanf("%f",&a);
getchar();
scanf("%c",&b);
getchar();
getchar();
return 0;
}
Ahora:
float a;
char b;
Declaramos
las variables, una de tipo float y una de tipo char.
printf("Introduce un numero: ");
Mostramos
por pantalla el mensaje entre comillas "".
scanf("%f",&a);
printf("Intrduciste el numero:
%f\n",a);
Y aquí
está scanf. Lo que hace está función es "escanear el teclado, en busca de
una tecla activa". Ahora vamos a ver como se utiliza. Entre paréntesis
tenemos un % y una letra, al igual que en printf usamos el % acompañado de una
letra para indicar con qué tipo de dato estamos trabajando. En este caso
estamos diciendo que el teclado escanee en busca de números flotantes. Al final
de las comillas encontramos otro argumento &a esto hace que lo que se
introduzca en el teclado, quede guardado en la variable a (declarada
anteriormente y de tipo float) y termina la función con su ; obligatorio.
El número,
entero (ej:2.00000) o decimal (ej:2.3456) quedó guardado en la variable a.
Ahora, para comprobar si la función scanf funciona, vamos a pedir que el
programa muestre la variable a en pantalla, esto ya lo conoces. ¡Sorpresa! En
pantalla aparece el número que introducimos previamente. Así de simple operan y
pueden coexistir las funciones más importantes de C.
En el
mismo programa incluyo otro ejemplo similar, pero, trabajando con caracteres.
Antes de
empezar con esta parte, quiero que se note el getchar() entre los dos
"bloques". La máquina interpreta el código ya compilado en el orden
en que fue escrito, sin ese getchar(), al imprimir en pantalla, se
"brincaría" a la siguiente parte, llegando incluso a dar errores
extraños, para mantener esto controlado, ponemos esta función, que espera a que
se presione "Enter" para seguir.
Ahora sí:
printf("Introduce una letra: ");
scanf("%c",&b);
printf("Introduciste la letra
%c\n\n",b);
Imprimimos
en pantalla el mensaje. Llamamos a scanf, pero fíjate que ahora usamos un %c,
por lo tanto escaneará en busca de caracteres (Recuerda que char, también puede
almacenar un entero, por lo tanto podrás introducir un número sin problemas) y
almacenamos en b (Previamente declarada como tipo char).
Después
imprimimos b en pantalla, el resultado es el mismo que introducimos
previamente.
Finalmente,
terminamos el programa con una frase "Presiona Enter para salir".
Quiero que se note que los signos guardan cierta
congruencia; por ejemplo, a es tipo float, en él se almacena un número y al
imprimirlo lo imprimimos como tipo float; b es del tipo char, va a almacenar un
caracter t se imprime como tal. Tal vez te pueda parecer redundante, pero puede
ser un error muy dificil de encontrar.
CONCLUSIONES
La E/S por consola se refiere a todas las operaciones que se
producen en el teclado y la pantalla de la computadora.
En el lenguaje de programación C utilizamos las funciones de
entrada y salida printf y scanf.
ANEXOS
Los especificadores de formato, más
usados, compatibles con la función printf son los siguientes:
Especificador
|
Formato
|
%c
|
Caracter
simple
|
%d
|
Entero con
signo en base decimal
|
%s
|
Cadena de
caracteres
|
%u
|
Entero sin
signo en base decimal
|
%x
|
Entero con
signo en base hexadecimal
|
TABLA 1 –
Especificadores de formato
No hay comentarios:
Publicar un comentario