Descargar

Entrada y salida estándar en C++

Enviado por apalate


    1. Operaciones de salida.
    2. Operaciones de entrada
    3. Anexos

    Cuando nos referimos a entrada/salida estándar (E/S estándar) queremos decir que los datos o bien se están leyendo del teclado, ó bien se están escribiendo en el monitor de video. Como se utilizan muy frecuentemente se consideran como los dispositivos de E/S por default y no necesitan ser nombrados en las instrucciones de E/S.

    En el lenguaje c++ tenemos varias alternativas para ingresar y/o mostrar datos, dependiendo de la librería que vamos a utilizar para desarrollar el programa, entre estas están: iostream.h y sodio.h.

    < IOSTREAM.H>

    Las operaciones de entrada y salida no forman parte del conjunto de sentencias de C++, sino que pertenecen al conjunto de funciones y clases de la biblioteca estándar de C++. Ellas se incluyen en los archivos de cabecera iostream.h por lo que siempre que queramos utilizarlas deberemos introducir la línea de código #include <iostream.h>

       Esta biblioteca es una implementación orientada a objetos y está basada en el concepto de flujos. A nivel abstracto un flujo es un medio de describir la secuencia de datos de una fuente a un destino o sumidero. Así, por ejemplo, cuando se introducen caracteres desde el teclado, se puede pensar en caracteres que fluyen o se trasladan desde el teclado a las estructuras de datos del programa.

        Los objetos de flujo que vienen predefinidos serán:

    1. cin, que toma caracteres de la entrada estándar (teclado);
    2. cout, pone caracteres en la salida estándar (pantalla);
    3. cerr y clog ponen mensajes de error en la salida estándar.

    Estos objetos se utilizan mediante los operadores << y >>. El operador << se denomina operador de inserción; y apunta al objeto donde tiene que enviar la información. Por lo tanto la sintaxis de cout será:

                        cout<<variable1<<variable2<<…<<variablen;

    No olvidemos que las cadenas de texto son variables y se ponen entre " " (comillas dobles).

    Por su parte >> se denomina operador de extracción, lee información del flujo cin (a la izquierda del operador) y las almacena en las variables indicadas a la derecha).     La sintaxis sería la siguiente:

                            cin>>variable1>>…>>variablen;

           Un ejemplo de código utilizando ambos objetos podría ser el siguiente:

    #include <iostream.h> … main () {     int i;     cout<<"Introduce un número";     cin>>i;     … } …

      Que mostraría por pantalla la frase "Introduce un número" y posteriormente almacenaría el valor introducido por teclado en la variable i.

    <STDIO.H>

    Operaciones de salida.

    Printf: Imprimir en pantalla

    Para utilizar la función printf en nuestros programas debemos incluir la directiva:

    #include <stdio.h>

    Si sólo queremos imprimir una cadena basta con escribir la siguiente línea de código.

    printf( "Cadena" );

    Como resultado muestra en pantalla:

    Cadena

    Lo que pongamos entre las comillas es lo que vamos a sacar por pantalla.

    Si volvemos a usar otro printf, por ejemplo:

    #include <stdio.h>

    void main()

    {

    printf( "Cadena" );

    printf( "Segunda" );

    }

    Obtendremos:

    CadenaSegunda

    Este ejemplo nos muestra cómo funciona printf. Para escribir en la pantalla se usa un cursor que no vemos. Cuando escribimos algo el cursor va al final del texto. Cuando el texto llega al final de la fila, lo siguiente que pongamos irá a la fila siguiente. Si lo que queremos es sacar cada una en una línea deberemos usar "n". Es el indicador de retorno de carro. Lo que hace es saltar el cursor de escritura a la línea siguiente:

    #include <stdio.h>

    void main()

    {

    printf( "Cadenan" );

    printf( "Segunda" );

    }

    y tendremos:

    Cadena

    Segunda

    También podemos poner más de una cadena dentro del printf:

    printf( "Primera cadena" "Segunda cadena" );

    Lo que no podemos hacer es meter cosas entre las cadenas:

    printf( "Primera cadena" texto en medio "Segunda cadena" );

    esto no es válido. Cuando el compilador intenta interpretar esta sentencia se encuentra "Primera cadena" y luego texto en medio, no sabe qué hacer con ello y da un error.

    Pero ¿qué pasa si queremos imprimir el símbolo " en pantalla? Por ejemplo imaginemos que queremos escribir:

    Esto es "extraño"

    Si para ello hacemos:

    printf( "Esto es "extraño"" );

    obtendremos unos cuantos errores. El problema es que el símbolo " se usa para indicar al compilador el comienzo o el final de una cadena. Así que en realidad le estaríamos dando la cadena "Esto es", luego extraño y luego otra cadena vacía "". Pues resulta que printf no admite esto y de nuevo tenemos errores.

    La solución es usar ". Veamos:

    printf( "Esto es "extraño"" );

    Esta vez todo irá como la seda. Como vemos la contrabarra '' sirve para indicarle al compilador que escriba caracteres que de otra forma no podríamos.

    Esta contrabarra se usa en C para indicar al compilador que queremos meter símbolos especiales. Pero ¿Y si lo que queremos es usar '' como un carácter normal y poner por ejemplo HolaAdiós? Pues muy fácil, volvemos a usar '':

    printf( "Hola/Adiós" );

    y esta doble '' indica a C que lo que queremos es mostrar una ''.

    Operaciones de entrada

    Algo muy usual en un programa es esperar que el usuario introduzca datos por el teclado. Para ello contamos con varias posibilidades: Usar las funciones de la biblioteca estándar, crear nuestras propias interrupciones de teclado (MS-Dos) o usar funciones de alguna biblioteca diferente (como por ejemplo Allegro).

    En este trabajo topare solo la primera opción, usando las funciones de la biblioteca estándar. Pero veamos por encima las otras posibilidades.

    Las funciones estándar están bien para un programa sencillito. Pero cuando queremos hacer juegos por ejemplo, no suelen ser suficiente. Demasiado lentas o no nos dan todas las posibilidades que buscamos, como comprobar si hay varias teclas pulsadas. Para solucionar esto tenemos dos posibilidades:

    La más complicada es crear nuestras propias interrupciones de teclado. ¿Qué es una interrupción de teclado? Es un pequeño programa en memoria que se ejecuta continuamente y comprueba el estado del teclado. Podemos crear uno nuestro y hacer que el ordenador use el que hemos creado en vez del suyo.

    Otra posibilidad más sencilla es usar una biblioteca que tenga funciones para controlar el teclado. Por ejemplo si usamos la biblioteca Allegro, ella misma hace todo el trabajo y nosotros no tenemos más que recoger sus frutos con un par de sencillas instrucciones. Esto soluciona mucho el trabajo y nos libra de tener que aprender cómo funcionan los aspectos más oscuros del control del teclado.

    Vamos ahora con las funciones de la biblioteca estándar antes mencionada.

    Scanf

    El uso de scanf es muy similar al de printf con una diferencia, nos da la posibilidad de que el usuario introduzca datos en vez de mostrarlos. No nos permite mostrar texto en la pantalla, por eso si queremos mostrar un mensaje usamos un printf delante. Un ejemplo:

    #include <stdio.h>

    void main()

    {

    int num;

    printf( "Introduce un número " );

    scanf( "%i", &num );

    printf( "Has tecleado el número %in", num );

    }

    Primero vamos a ver unas nota de estética, para hacer los programas un poco más elegantes. Parece una tontería, pero los pequeños detalles hacen que un programa gane mucho. El scanf no mueve el cursor de su posición actual, así que en nuestro ejemplo queda:

    Introduce un número _ /* La barra horizontal indica dónde esta el cursor */

    Esto es porque en el printf no hemos puesto al final el símbolo de salto de línea 'n'. Además hemos dejado un espacio al final de Introduce un número: para que así cuando tecleemos el número no salga pegado al mensaje. Si no hubiésemos dejado el espacio quedaría así al introducir el número 120 (es un ejemplo):

    Introduce un número120

    Veamos cómo funciona el scanf. Lo primero nos fijamos que hay una cadena entre comillas. Esta es similar a la de printf, nos sirve para indicarle al compilador qué tipo de datos estamos pidiendo. Como en este caso es un integer usamos %i. Después de la coma tenemos la variable donde almacenamos el dato, en este caso 'num'.

    Fíjate que en el scanf la variable 'num' lleva delante el símbolo &, este es muy importante, sirve para indicar al compilador cual es la dirección (o posición en la memoria) de la variable.

    Podemos preguntar por más de una variable a la vez en un sólo scanf, hay que poner un %i por cada variable:

    #include <stdio.h>

    void main()

    {

    int a, b, c;

    printf( "Introduce tres números: " );

    scanf( "%i %i %i", &a, &b, &c );

    printf( "Has tecleado los números %i %i %in", a, b, c );

    }

    De esta forma cuando el usuario ejecuta el programa debe introducir los tres datos separados por un espacio.

    También podemos pedir en un mismo scanf variables de distinto tipo:

    #include <stdio.h>

    void main()

    {

    int a;

    float b;

    printf( "Introduce dos números: " );

    scanf( "%i %f", &a, &b );

    printf( "Has tecleado los números %i %fn", a, b );

    }

    A cada modificador (%i, %f) le debe corresponder una variable de su mismo tipo. Es decir, al poner un %i el compilador espera que su variable correspondiente sea de tipo int. Si ponemos %f espera una variable tipo float.

    Getch y getche

    Si lo que queremos es que el usuario introduzca un carácter por el teclado usamos las funciones getch y getche. Estas esperan a que el usuario introduzca un carácter por el teclado. La diferencia entre getche y getch es que la primera saca por pantalla la tecla que hemos pulsado y la segunda no (la e del final se refiere a echo=eco). Ejemplos:

    #include <stdio.h>

    void main()

    {

    char letra;

    printf( "Introduce una letra: " );

    fflush( stdout );

    letra = getche();

    printf( "nHas introducido la letra: %c", letra );

    }

    Resultado:

    Introduce una letra: a

    Has introducido la letra: a

    ¿Qué es el fflush( stdout )?. Pues bien, cuando usamos la función printf, no escribimos directamente en la pantalla, sino en una memoria intermedia (lo que llaman un bufer). Cuando este bufer se llena o cuando metemos un carácter 'n' es cuando se envía el texto a la pantalla. En este ejemplo yo quería que apareciera el mensaje Introduce una letra: y el cursor se quedara justo después, es decir, sin usar 'n'. Si se hace esto, en algunos compiladores el mensaje no se muestra en pantalla hasta que se pulsa una tecla (probar). Y la función fflush( stdout ) lo que hace es enviar a la pantalla lo que hay en ese bufer.

    Y ahora un ejemplo con getch:

    #include <stdio.h>

    void main()

    {

    char letra;

    printf( "Introduce una letra: " );

    fflush( stdout );

    letra = getch();

    printf("n has introducido la letra :%c", letra );

    }

    Resultado:

    Introduce una letra:

    Has introducido la letra: a

    Como vemos la única diferencia es que en el primer ejemplo se muestra en pantalla lo que escribimos y en el segundo no.

    ANEXOS

    Usos de printf y scanf

    printf("Mensaje"); printf("Mensaje %d",Variable); printf("Mensaje %d",Variable:2:3); cprintf("Mensaje");

    Escribe Mensaje en la pantalla Escribe Mensaje y el valor de la Variable en pantalla Escribe Mensaje y el valor de la Variable con 2 enteros y 3 decimales Escribe Mensaje en color especificado

    scanf("%d",&Variable); scanf("%d %f",&Variable1,&Variable2);

    Asigna valor entero a Variable Asigna valor entero a Variable1 y valor real a Variable2

     

     

     

    Nota

    C++ ofrece una alternativa a las llamadas de funcion printf y scanf para manejar la entrada/salida de los tipos y cadenas de datos estandar. Así en lugar de printf usamos el flujo estandar de salida cout y el operador << ("colocar en"); y en lugar de scanf usamos el flujo de entrada estandar cin y el operador >>("obtener de"). Estos operadores de inserción y extracción de flujo, a diferencia de printf y scanf, no requieren de cadenas de formato y de formato y de especificadotes de conversión para indicar los tipos de datos que son extraidos o introducidos.

    Las siguientes funciones nos resultan indispensable para poder brindar una mejor presentación de los datos en pantalla.

    Gotoxy: Posicionando el cursor (DOS)

    Esta función sólo está disponible en compiladores de C que dispongan de la biblioteca <conio.h>

    Hemos visto que cuando usamos printf se escribe en la posición actual del cursor y se mueve el cursor al final de la cadena que hemos escrito.

    Vale, pero ¿qué pasa cuando queremos escribir en una posición determinada de la pantalla? La solución está en la función gotoxy. Supongamos que queremos escribir 'Hola' en la fila 10, columna 20 de la pantalla:

    #include <stdio.h>

    #include <conio.h>

    void main()

    {

    gotoxy( 20, 10 );

    printf( "Hola" );

    }

    (Nota: para usar gotoxy hay que incluir la biblioteca conio.h).

    Fíjate que primero se pone la columna (x) y luego la fila (y). La esquina superior izquierda es la posición (1, 1).

    Clrscr: Borrar la pantalla (DOS)

    Ahora ya sólo nos falta saber cómo se borra la pantalla. Pues es tan fácil como usar:

    clrscr()

    (clear screen, borrar pantalla).

    Esta función nó solo borra la pantalla, sino que además sitúa el cursor en la posición (1, 1), en la esquina superior izquierda.

    #include <stdio.h>

    #include <conio.h>

    void main()

    {

    clrscr();

    printf( "Hola" );

    }

    Este método sólo vale para compiladores que incluyan el fichero stdio.h.

    BIBLIOGRAFÍA

    Como programar en C/C++. H.M. Deitel / P.J. Deitel. Prentice may, 2da ed. 1995.

    Programación orientada a objetos con C++. Fco. Javier Ceballos. Ed. ra-ma 1993.

    Programacion en C++. Enrique hernandez / Jose hernandez. Ed. Paraninfo 1993.

    EN INTERNET

    www.lawebdelprogramador.com

    http://www.publispain.com/supertutoriales/programacion

     

    Autor:

    Palate Gaibor Alex Fernando

    Datos personales:

    .