domingo, 24 de febrero de 2013

Funciones Básicas de Entrada Y Salida


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;

    printf("Introduce un numero: ");

    scanf("%f",&a);

    printf("Intrduciste el numero: %f\n",a);

    getchar();

    printf("Introduce una letra: ");

    scanf("%c",&b);

    printf("Introduciste la letra %c\n\n",b);

    printf("Presiona Enter pasa Salir");

    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