martes, 10 de enero de 2017

ENTRADA Y SALIDA BÁSICA

CAPITULO 3   ENTRADA Y SALIDA BÁSICA



ENTRADA Y SALIDA
En los programas hechos hasta el momento, hemos utilizado la instrucción cout<<
para mandar mensajes a la pantalla.
La mayoría de los programas en C++ incluyen el archivo de encabezado
<iostream.h>, el cual contiene la información básica requerida para todas las
operaciones de entrada y salida (E/S) de flujo.
Cuando usamos la instrucción:
cout<<”Mensaje a la pantalla”<<endl;
Estamos enviando una cadena de caracteres (“Mensaje a la pantalla”) al dispositivo
de salida estándar (la pantalla). Luego, el manipulador de flujo endl da el efecto de
la secuencia de escape ‘\n’.
Pruebe el siguiente programa:
#include <iostream.h>
int main(){
cout<<"cadena de caracteres"<<endl;
cout<<2+2<<endl; //imprime un entero
cout<<9/2<<endl; //imprime un flotante
cout<<(int)(3.141592+2)<<endl; //imprime un entero
31
return 0;
}
La instrucción cout<< puede imprimir tanto números enteros como flotantes sin
necesidad de decirle específicamente el tipo de datos del que se trata, pero, por
supuesto notemos que al enviarle una cadena de caracteres esta debe de estar entre
comillas. Ya en ejemplos anteriores vimos como se mandaba a la pantalla el valor de
una variable, así que no hace falta más ilustración al respecto.
La interacción con el usuario es algo muy importante en la programación,
imaginemos que en este preciso momento y con los conocimientos que tenemos
hasta ahora, necesitamos hacer un programa que calcule la distancia a la que caerá
un proyectil lanzado a determinada velocidad y ángulo, o simplemente un programa
que calcule las raíces de una ecuación cuadrática. Sería muy molesto estar
cambiando los valores de las variables directamente en el código para cada caso que
queramos calcular. Por eso debemos ver cuanto antes la forma de leer datos desde
el teclado.
La principal función para leer desde el teclado es cin>>, pero es mejor ver un
ejemplo para tener la idea clara.
#include <iostream.h>
int main(){
int numero;
char car;
float otroNum;
cout<<"escribe un numero:"<<endl;
cin>>numero;
cout<<"\nel numero que tecleaste es: "<<numero<<endl;
cout<<"dame una letra"<<endl;
cin>>car;
cout<<"\ntecleaste: "<<car<<endl;
cout<<"escribe un numero flotante"<<endl;
cin>>otroNum;
cout<<"\neste es: "<<otroNum;
32
return 0;
}
En resumen, cin es el flujo de entrada asociado al teclado, cout es el flujo de
salida estándar asociado a la pantalla, y existe otro, que aunque a lo largo de este
trabajo casi no lo utilicemos, es necesario nombrarlo, cerr, que es el flujo de error
estándar asociado a la pantalla.
Los operadores << y >> son operadores de inserción y extracción de flujo
respectivamente, y no deben confundirse con los de desplazamiento de bits. Estos
operadores son muy eficaces porque no es necesario especificar formatos para
presentación o lectura, ellos los presentan en función al tipo de datos de la variable.
Aunque en ocasiones podría necesitar de nuestra ayuda para obtener los resultados
específicos que queremos, y para eso están los modificadores de formato.
MODIFICADORES DE FORMATO
En el primer ejemplo del presente capítulo quizá no entendió del todo lo qué hacía la
instrucción:
cout<<(int)(3.141592+2)<<endl;
Si probó el código y lo ejecutó seguramente esperaba que apareciese en la pantalla
5.141592, esto habría pasado si no hubiésemos hecho una conversión de tipo. La
inclusión de “(int)” dentro de la instrucción provocó que el resultado de la operación,
que debía ser 5.141592, se transformara a un entero y por resultado perdiera sus
valores decimales.
33
A esto se le llama hacer un cast, y es muy común hacerlo cuando no queremos que
se pierdan determinadas propiedades en los resultados de las operaciones. Por
ejemplo, las siguientes líneas de código, que son equivalentes tienen por efecto
convertir el tipo de la variable de origen al de la variable destino:
int B; int B;
double A= (double) B; double A = double(B);
Otra de las herramientas para la especificación de formatos son los manipuladores
de flujos, así como el manipulador de flujo “endl” da una secuencia de escape, los
manipuladores dec, oct y hex, hacen que la variable a la que le anteceden sea
presentada en formato decimal, octal o hexadecimal respectivamente.
#include <iostream.h>
int main(){
int numero=25;
int leido;
cout<<"numero es en octal: "<<oct<<numero<<endl;
cout<<"en hexadecimal: "<<hex<<numero<<endl;
cout<<"en decimal: "<<dec<<numero<<endl;
cout<<"ahora teclea un numero"<<endl;
cin>>hex>>leido;
cout<<"el leido vale: "<<hex<<leido<<endl;
cout<<"y en decimal: "<<dec<<leido<<endl;
cout<<"y en octal: "<<oct<<leido<<endl;
return 0;
}
Estos manipuladores de flujo no son exclusivos de la salida, también funcionan con
la entrada de datos, por defecto, la entrada desde el teclado se lee en decimal y
también la presentación de datos se hace en decimal, así que si se sabe que el
usuario dará a la máquina un dato en hexadecimal, sería buena idea anticiparlo y
poner el formato en que será leído.
34
En cuanto a la precisión, al imprimir en pantalla un número de tipo flotante, no
importa cuantas cifras significativas tenga (mientras esté dentro de los límites de
almacenamiento de flotantes), sólo aparecerán 6 números después del punto, y la
ultima cifra será redondeada en caso de pasar los 6 dígitos. Es decir, que si
queremos mandar a la pantalla el número 1.23456789, en su lugar aparecerá
1.234568.
Cuando se quieren resultados más exactos, nos es muy útil la librería iomanip.h
que contiene el manipulador setprecision() con el que podemos determinar la
precisión con la que queremos que aparezcan esos datos en la pantalla. Existe
también la función miembro pecision(), que puede resultar un poco más cómoda
en algunos casos porque el efecto de precisión funciona para todas las instrucciones
cout que le sigan. A ambas se le pasa como parámetro el número de cifras
significativas deseadas. Veamos un ejemplo.
#include <iostream.h>
#include <iomanip.h>
int main(){
cout<<1.23456789<<endl;
cout.precision(4);
cout<<1.23456789<<endl;
cout<<setprecision(5)<<1.23456789<<endl;
cout.precision(7);
cout<<1.23456789<<endl;
cout<<setprecision(9)<<1.23456789<<endl;
return 0;
}
En ocasiones es útil dar una presentación a nuestros datos en la pantalla, tan sólo el
dejar unos cuantos espacios de margen en la pantalla puede ser un poco tedioso
para quienes no están enterados de las siguientes funciones:
35
setw que se encarga de hacer aparecer el texto alineado determinados espacios a
la derecha, si el numero de espacios solicitados para su alineación es menor que el
numero de caracteres que se imprimirán, no tendrá un efecto.
setfill se ocupa del carácter de relleno, el carácter por defecto es el espacio en
blanco, pero nosotros podemos especificar el que queramos.
Vea el siguiente ejemplo.
#include <iostream.h>
#include <iomanip.h>
int main(){
cout<<setw(5)<<setfill('%')<<"hola"<<endl;
cout<<setw(5)<<89;
cout<<setw(8)<<"centavo"<<endl;
return 0;
}
En la primera instrucción cout, hacemos aparecer el texto alineado 5 espacios y en
esos espacios aparecerá el carácter ‘%’. Es necesario el manipulador setw para
cada operación de salida en pantalla, mientras que setfill funciona para todas las
que se incluyan. Estas funciones, junto con las de alineación son una gran
herramienta para la presentación. Las funciones de alineación se incluyen como
sigue, siendo la predeterminada la alineación a la derecha.
cout.setf(ios::right, ios::adjustfield);
cout.setf(ios::right, ios::adjustield);
36
OTRAS FUNCIONES MUY ÚTILES
La función de lectura desde el teclado cin no es la única que existe. Hay otros
métodos de lectura desde el teclado para la lectura de caracteres, la siguiente tabla
resumirá sus principales características.
Función Sin argumentos Un argumento 2 argumentos 3 argumentos
get Lee un carácter
y devuelve su
valor numérico
Lee un carácter
y lo guarda en
la variable de
argumento
Lee una serie
de caracteres y
los guarda en el
primer
argumento, se
detiene si llega
a la cantidad
máxima de
almacenamient
o enviada como
segundo
argumento
Lee una serie
de caracteres y
los almacena
en el primer
argumento
hasta llegar a la
cantidad
máxima de
almacenamient
o (al igual que
la de dos
argumentos),
pero también se
detiene si
encuentra el
carácter
especificado en
el tercer
argumento.
getline * * * * * * * * * * * * * * * * Funciona igual
que el get de
dos
argumentos,
pero no guarda
el delimitador
de flujo.
* * * * * * * *
read * * * * * * * * * * * * * * * * Almacena en el * * * * * * * *
37
primer
argumento un
número
determinado de
caracteres
write * * * * * * * * * * * * * * * * Muestra, de la
cadena enviada
como primer
argumento,
determinado
numero de
caracteres
(segundo
argumento)
ignore Ignora un
carácter del
flujo (opción
predeterminada
)
Ignora el
numero de
caracteres
enviados como
argumento
* * * * * * * * * * * * * * * *
gcount Devuelve el
número de
caracteres
leídos en la
ultima lectura
sin formato
* * * * * * * * * * * * * * * * * * * * * * * *
Tabla 11 Funciones de lectura sin formato
Ahora veamos un ejemplo.
#include <iostream.h>
int main(){
char caracter,nombre[20], apellido[20];
char seg_apellido[20];
cout<<"Teclea tu nombre por favor"<<endl;
cin.get(caracter);
38
cin.get(nombre,20,' ');
cin.get();
cin.get(apellido,20,' ');
cin.get();
cin.get(seg_apellido,20);
cout<<caracter<<"Tu letra inicial es:"<<caracter<<endl;
cout<<"tu nombre es: "<<caracter<<nombre<<endl;
cout<<"tu apellido paterno es: "<<apellido<<endl;
cout<<"tu apellido materno es: "<<seg_apellido<<endl;
cout<<"Escribe el nombre de tu empresa: "<<endl;
cin.ignore();
cin.getline(nombre,20);
cout<<"el nombre de tu empresa: "<<nombre<<" tiene "
<<cin.gcount()<<" caracteres"<<endl;
cin.get(); //espera que oprimas enter para terminar
return 0;
}
Puede que esta no sea la mejor manera para hacer un programa de este tipo, pero
para nuestro objetivo creo que esta bien. Analicemos.
Primero declaramos una variable char, y 3 variables de cadenas de caracteres, por el
momento no profundizaremos en que es exactamente, pero podemos decir que es
una “tira” o serie de caracteres (char) con 20 elementos.
Pide al usuario que teclee su nombre completo, para luego leer inmediatamente el
primer carácter que teclea y lo almacena en la variable “caracter”. Sigue leyendo y
almacena lo que escribe en la variable “nombre” hasta que encuentre un espacio o
llegue a 20 caracteres. Luego, otra instrucción get se encarga de leer y desechar el
carácter espacio, para nuevamente leer hasta encontrar otro espacio.
Deja de leer hasta que se presione enter, hayas escrito o no tus dos apellidos. Así
que cuando oprimes enter, “carecer” tiene tu letra inicial y la presenta en pantalla,
para aparecer tu nombre imprime “caracter” seguido de “nombre”, porque a ésta
39
última no almacenó el primer carácter. Las siguientes instrucciones son parecidas
hasta que pide el nombre de tu empresa.
La función ignore descarta del flujo el carácter de terminación, para luego permitir a
getline() leer el nombre de tu empresa con un máximo de 20 caracteres o hasta
que oprimas enter (pero no lo guarda). Se escribe el nombre y con gcount()
presenta los caracteres leídos. Finalmente espera que oprimas enter para terminar el
programa.

No hay comentarios:

Publicar un comentario