• No se han encontrado resultados

CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN C++

N/A
N/A
Protected

Academic year: 2021

Share "CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN C++"

Copied!
58
0
0

Texto completo

(1)

CONTENIDO DE LA LECCIÓN 6 FLUJO DE SALIDA ESTANDAR EN C++

1. INTRODUCCIÓN 3

2. FLUJOS 3

2.1. Archivos de encabezado de la biblioteca iostream 4

2.2. Clases y objetos de flujo de entrada/salida 5

3. FLUJO DE SALIDA 7

3.1. Operador de inserción de flujo 7

3.1.1. Ejemplos 6.1, 6.2 7

3.2. Cascada del operador de inserción de flujo 8

3.2.1. Ejemplo 6.3 9

3.3. Uso de caracteres especiales 9

3.3.1. Ejemplos 6.4, 6.5, 6.6, 6.7, 6.8 10

3.3.2. Otros caracteres especiales 11

3.3.3. Ejemplo 6.9, 6.10 11

3.4. Visualizando números con cout 12

3.4.1. Ejemplos 6.11, 6.12 12

3.5. Visualizando varios valores con un cout 13

3.5.1. Ejemplo 6.13 13

3.6. Visualizando caracteres fijos con cout 13

3.6.1. Ejemplo 6.14 14

3.7. Visualizando cadena de caracteres y números con cout 14

3.7.1. Ejemplo 6.15, 6.16, 6.17 14

3.8. Utilizando cout para combinar diferentes tipos de valores 15

3.8.1. Ejemplos 6.18 15

3.9. Visualizando objetos variable con cout 16

3.9.1. Ejemplo 6.19 16

3.10. Salida de variables char * 16

3.10.1. Ejemplo 6.20 17

3.11. Salida de caracteres con la función miembro put( ); put( ) en cascada 17

4. E/S SIN FORMATO MEDIANTE read( ), gcount( ) y write( ) 17

4.1. Ejemplo 6.21 18

5. REDIRECCIONANDO LA SALIDA DE cout 19

5.1. Ejemplos 6.22, 6.23 19

6.

EXAMEN BREVE 14 20

7.

MANIPULACIÓN DEL FLUJO 20

7.1. Cambio de base para números enteros: dec, oct, hex y setbase( ) 22

7.1.1. Ejemplos 6.24, 6.25 22

7.2. Precisión de punto flotante 23

7.2.1. Ejemplos 6.26, 6.27 24

7.3. Anchura de campo (setw( ), width( )) 25

7.3.1. Ejemplos 6.28, 6.29, 6.30, 6.31, 6.32 26

7.4. Examen breve 15 29

7.5. Manipuladores definidos por el usuario 29

7.5.1. Ejemplo 6.33 29

(2)

8. ESTADOS DE FORMATO DE FLUJO 30

8.1. Indicadores de estado de formato 31

8.2. Ceros a la derecha y puntos decimales ( ios::showpoint ) 32

8.2.1. Ejemplo 6.34 32

8.3. Alineación ( ios::left, ios::right, ios::internal ) 33

8.3.1. Ejemplos 6.35, 6.36, 6.37, 6.38 33

8.4. Relleno ( fill, setfill ) 35

8.4.1. Ejemplos 6.39, 6.40 36

8.5. Base de flujo integral ( ios::dec, ios::oct, ios::hex, ios::showbase ) 37

8.5.1. Ejemplo 6.41 38

8.6. Números de punto flotante, notación científica ( ios::scientific, ios::fixed ) 38

8.6.1. Ejemplos 6.42, 6.43 38

8.7. Control de mayúsculas / minúsculas ( ios::uppercase ) 39

8.7.1. Ejemplo 6.44 40

8.8. Establecimiento y restablecimiento de los indicadores de formato 40 ( flags, setiosflags, resetiosflags )

8.8.1. Ejemplo 6.45 40

9. EXAMEN BREVE 16 41

10. ESTADOS DE ERROR DE FLUJO 41

10.1. Ejemplo 6.46 43

11. ENLACE DE UN FLUJO DE SALIDA A UN FLUJO DE ENTRADA 44

12. CONCEPTO DE PRECISIÓN 44

12.1. Ejemplo 6.47 44

13. CONCEPTO DE SOBRE FLUJO 45

13.1. Ejemplo 6.48 46

14. UTILIZANDO cout PARA IMPRIMIR INFORMACIÓN 46

14.1. Ejemplo 6.49 47

15. LO QUE NECESITA SABER 49

16. PREGUNTAS Y PROBLEMAS 53

16.1. Preguntas 53

16.2. Problemas 54

(3)

LECCIÓN 6

FLUJO DE SALIDA ESTANDAR EN C++

INTRODUCCIÓN

En esta lección se verá como generar datos de salida desde el sistema. En general la obtención de datos de entrada al sistema se conoce como lectura y la generación de datos desde el sistema se denomina escritura. Veremos cómo escribir información en la pantalla de su monitor y en la impresora. En otra lección, aprenderá cómo escribir información en un archivo, asi como leer información desde el teclado y desde un archivo en disco.

Objetivo de esta lección:

•• Comprender y utilizar el flujo de salida orientada a objetos de C++.

•• Aprender a formatear las salidas.

•• Comprender la jerarquía de clases de flujo de E/S.

•• Aprender a enviar la salida a objetos de tipos definidos por el usuario.

•• Crear manipuladores de flujo definidos por el usuario.

•• Determinar el éxito o la falla de las operaciones d e entrada/salida.

•• Saber como enlazar flujos de salida con flujos de entrada.

Las bibliotecas estándar de C++ proporcionan un amplio conjunto de capacidades de entrada/salida. Esta lección trata de los flujos de E/S comunes, suficiente para resolver la mayoría de los problemas de computación, además ofrece una panorámica de las capacida- des restantes.

Las características de E/S que aquí se describen están orientadas a objetos. Deberá encontrar interesante el ver la manera en que se implementan. Este estilo de E/S utiliza otras características de C++, tales como referencias, sobrecarga de funciones y de operado- res.

Como veremos, C++ utiliza E/S a prueba de tipos. Cada operación de E/S se realiza automáticamente en una forma sensible con respecto al tipo de datos. Si una función de E/S se ha definido adecuadamente para que maneje un tipo de dato en particular, entonces dicha función manejará automáticamente ese tipo de datos. Si no hay concordancia entre el tipo de datos y la función que maneja ese tipo de datos, el compilador envía un mensaje de error. Por lo tanto, los datos inadecuados no pueden andar furtivamente por el sistema (co- mo puede suceder en C –un hueco que C permite para producir algunos errores sutiles y extraños).

Los usuarios pueden especificar la E/S tanto de tipos estándar como de tipos defini- dos por el usuario. Esta capacidad es una de las características más valiosas de C++.

FLUJOS

La E/S en C++ se da en flujo de bytes. Un flujo es simplemente una secuencia de

(4)

teclado, unidad de disco, escáner) hacia la memoria principal. En operaciones de salida los bytes fluyen de la memoria principal hacia un dispositivo (por ejemplo: pantalla, impreso- ra, unidad de disco, escáner).

La aplicación asocia significado a los bytes. Los bytes pueden representar: caracte- res ASCII, datos sin procesar en formato interno, imágenes gráficas, voz digital, video digital o cualquier otro tipo de información que pueda requerir una aplicación.

El trabajo de los mecanismos de E/S del sistema es mover bytes de los dispositivos hacia la memoria y viceversa, en forma consistente y confiable. Tales transferencias involu- cran frecuentemente el movimiento mecánico, tal como la rotación de un disco o de una cinta o la digitación de caracteres en un teclado. El tiempo que se llevan estas transferencias normalmente es inmenso en comparación con el tiempo que le lleva al procesador manejar los datos internamente. Por lo tanto, las operaciones de E/S requieren una planeación y afi- nación cuidadosa para asegurar el máximo desempeño.

C++ proporciona capacidades de E/S de bajo nivel y alto nivel. Las capacidades de E/S de bajo nivel (es decir, E/S sin formato) por lo general especifican que un cierto núme- ro de bytes deberá transferirse de un dispositivo a la memoria o de la memoria a un disposi- tivo. En dichas transferencias el byte individual es el asunto de interés. Tales capacidades de bajo nivel proporcionan transferencias de alta velocidad y de gran volumen, pero no son particularmente convenientes para los usuarios.

Los usuarios prefieren una vista de nivel alto de la E/S (es decir, la E/S formatea- da), en donde los bytes están agrupados en unidades significativas, tales como : enteros, números de punto flotante, caracteres, cadenas y tipos definidos por el usuario. Estas capa- cidades orientadas a tipo son satisfactorias para la mayor parte de la E/S, que no sea el procesamiento de archivo de alto volumen.

ARCHIVOS DE ENCABEZADO DE LA BIBLIOTECA iostream

La biblioteca iostream de C++ proporciona cientos de capacidades de E/S. Varios archivos de encabezado contienen partes de la interfaz a la biblioteca.

La mayoría de los programas C++ incluyen el archivo de encabezado <iostream.h>, que contiene la información básica requerida para todas las operaciones de flujo de E/S.

Dicho archivo contiene los objetos cin, cout, cerr y clog, que corresponden respectivame nte con el flujo de entrada y salida estándar, el flujo de errores estándar no almacenado en búfer y el flujo de errores estándar almacenado en búfer. Se proporcionan capacidades de E/S formateadas y sin formato.

El archivo de encabezado <iomanip.h> contiene información útil para realizar la E/S formateada con los llamados manipuladores de flujo con parámetros.

El archivo de encabezado <fstream.h> contiene información importante para las

operaciones de procesamiento de archivos controladas por el usuario.

(5)

Cada implementación de C++ por lo general contiene otras bibliotecas relacionadas con la E/S que proporcionan capacidades específicas del sistema, tales como el control de dispositivos de propósito especial para E/S de audio y video.

CLASES Y OBJETOS DE FLUJO DE ENTRADA / SALIDA

La biblioteca iostream contiene muchas clases para manejar una amplia variedad de operaciones de E/S. La clase istream soporta las operaciones de flujo de entrada. La clase ostream soporta las operaciones de flujo de salida. La clase iostream soporta las operacio- nes de flujo tanto de entrada como de salida.

La clase istream y la clase ostream deriva mediante herencia simple a partir de la clase base ios. La clase iostream deriva mediante herencia múltiple tanto de la clase is- tream como de la clase ostream. En la figura 6.1 se resumen estas relaciones de herencia.

ios

istream ostream

iostream

Figura 6.1 Parte de la jerarquía de clases de flujo de E/S.

La sobrecarga de operadores (utilización de un operador para realizar más de una tarea) proporciona una notación conveniente para la realización de la entrada/salida. El operador de desplazamiento a la izquierda (<< ) está sobrecargado para indicar el flujo de salida y se denomina operador de inserción de flujo. El operador de desplazamiento a la derecha (>>) está sobrecargado para indicar el flujo de salida y se denomina operador de extracción de flujo. Estos operadores se utilizan con los objetos de flujo estándar cin, cout, cerr, clog, y comúnmente con los objetos de flujo definidos por el usuario.

cin es un objeto de la clase istream, y se dice que está enlazado (o conectado) al dispositivo de entrada estándar que normalmente es el teclado. El operador de extracción de flujo, como se utiliza en la siguiente instrucción, causa que un valor para la variable entera calificacion (suponiendo que calificacion ha sido declarada como int) se reciba desde cin hacia la memoria:

cin >> calificacion;

Observe que la operación de extracción de flujo es lo suficientemente inteligente para saber el tipo de dato que es. Suponiendo que calificacion se haya declarado adecua- damente, no se necesita especificar información adicional con dicho operador (como es el caso de la E/S estilo C).

cout es un objeto de la clase ostream, y se dice que está enlazado al dispositivo de

salida estándar que normalmente es la pantalla. El operador de inserción de flujo, como se

(6)

utiliza en la siguiente instrucción, causa que al valor de la variable entera calificacion se le dé salida desde la memoria hacia el dispositivo de salida estándar:

cout << calificacion;

Observe que el operador de inserción es lo suficientemente inteligente para saber el tipo de calificacion (suponiendo que se haya declarado adecuadamente), por lo que no se necesita especificar información adicional con dicho operador.

El formato general para el enunciado cout es el siguiente:

cout << elemento1 << elemento2 << elemento 3 << ... << elementoN;

Como puede observar, después de cout sigue una lista de elementos para escribirse, los cuales están separadas por el operador de inserción de flujo <<. De esta ma nera, un enunciado cout representa una secuencia o flujo de datos o que se dirige a la pantalla del monitor. Los elementos se insertan dentro de un flujo de salida a través del operador de inserción de flujo <<. Conforme los elementos se insertan dentro del flujo, estos fluyen a la pantalla de su monitor, como se ilustra en la figura 6.3:

cout << elemento1 << elemento2 << elemento3 << ... << elementoN;

Elementos de datos del flujo de salida cout que se muestran en la pantalla

Figura 6.3. Los elementos que se muestran se insertan dentro del flujo de salida cout usando el operador de inserción de flujo <<.

Algunos sistemas acumulan información de salida en una memoria temporal (búfer o buffer) hasta que haya suficiente información para justificar la escritura en la pantalla.

cerr es un objeto de la clase ostream, y se dice que está enlazado al dispositivo de errores estándar. Las salidas hacia el objeto cerr no se almacena en el búfer. Esto significa que cada inserción de flujo de cerr causa que su salida aparezca inmediatamente; esto es adecuado para notificar al usuario algún error en forma inmediata.

clog es un objeto de la clase ostream, y también se dice que esta enlazado al dispo- sitivo de errores estándar. Las salidas de clog se almacenan en el búfer. Esto significa que cada inserción a clog puede causar que su salida se conserve en un búfer hasta que éste se llene o vacíe.

Elemento1 Elemento2 Elemento3 ... ElementoN

PANTALLA

(7)

El procesamiento de archivos de C++ utiliza las clases ifstream para realizar opera- ciones de entrada de archivo, ofstream para las operaciones de salida de archivo y fstream para las operaciones de entrada/salida de archivo. La clase ifstream hereda de istream, la clase ofstream hereda de ostream y la clase fstream hereda de iostream. En la figura 6.2 se resumen las diversas relaciones de herencia de las clases relacionadas con la E/S. Existen más clases, en la jerarquía de clases de flujo de E/S completa, soportadas en la mayoría de las instalaciones, pero las clases que aquí se muestran proporcionan las capacidades que necesitan casi todos los programadores. Si desea más información sobre el procesamiento de archivos, vea la referencia de la biblioteca de clases de su sistema C++.

ios

istream ostream

ifstream iostream ofstream

fstream

Figura 6.2 Parte de la jerarquía de clases de flujo de E/S con las principales clases para el procesamiento de archivos.

FLUJO DE SALIDA

La clase ostream de C++ proporciona la habilidad para realizar salida formateada y sin formato. Las capacidades para la salida incluyen: salida de tipos de datos estándar con el operador de inserción de flujo, salida de caracteres con la función miembro put( ) , sali- da sin formato con la función miembro write( ), salida de enteros en formatos decimal, oc- tal y hexadecimal, salida de valores de punto flotante con diversas precisiones, con puntos decimales forzados en notación científica y en notación fija, salida de datos alineados en campos de anchura indicados, salida de datos en campos rellenados con caracteres especi- ficados y salida de letras mayúsculas en notación científica y notación hexadecimal.

OPERADOR DE INSERCIÓN DE FLUJO

El flujo de salida puede realizarse mediante el operador de inserción de flujo <<

sobrecargado. Dicho operador está sobrecargado para dar salida a elementos de datos de tipos estándar: numérico, cadenas y valores de apuntador.

Ejemplo 6.1

El siguiente programa: SALUDOS1.CPP, muestra la salida de una cadena utilizando una sola ins- trucción de inserción de flujo.

(8)

Ejemplo 6.2

El siguiente programa: SALUDOS2.CPP, muestra la misma salida que el programa SALU- DOS1.CPP, utilizando varias instrucciones de inserción de flujo.

CASCADA DEL OPERADOR DE INSERCIÓN DE FLUJO

Los operadores << y >> sobrecargados pueden utilizarse en forma de cascada, co- mo se muestra en el siguiente ejemplo:

Ejemplo 6.3

El siguiente programa: CASCADA.CPP, ilustra el uso del operador << sobrecargado en forma de cascada.

Las múltiples inserciones de flujo del programa CASCADA.CPP, se ejecutan como si hubie- ran sido escritas de la siguiente manera :

/* El siguiente programa: SALUDOS1.CPP, muestra la salida de una cadena utilizando

una sola instrucción de inserción de flujo.

*/

#include <iostream.h> //Para cout

void main( void ) {

cout << "¡Bienvenidos al INSTITUTO POLITÉCNICO NACIONAL!";

}//Fin de main( )

/* El siguiente programa: SALUDOS2.CPP, muestra la salida de una cadena utilizando

varias instrucciones de inserción de flujo.

*/

#include <iostream.h> //Para cout

void main( void ) {

cout << "¡Bienvenidos al ";

cout << "INSTITUTO POLITÉCNICO NACIONAL! ";

}//Fin de main( )

/* El siguiente programa: CASCADA.CPP, ilustra el uso del operador de inserción <<

utilizado en forma de cascada.

*/

#include <iostream.h> //Para cout

void main( void ) {

cout << "15 más 27 es: " << ( 15 + 27 ) << endl;

}//Fin de main( )

Salida :

¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida:

¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida: 15 más 27 es: 42

(9)

( ( ( cout << "15 más 27 es: ") << ( 15 + 27 ) ) << endl );

es decir, << asocia de izquierda a derecha. Este tipo de puesta en cascada de los operadores de inserción de flujo se permite debido a que el operador << sobrecargado devuelve una re- ferencia hacia el objeto operando izquierdo –es decir, cout. Por lo tanto, la expresión entre paréntesis del extremo izquierdo

( cout << "15 más 27 es: " )

envía la cadena de caracteres y devuelve una referencia a cout. Esto permite evaluar la ex- presión que está entre paréntesis en la parte media como

( cout << ( 15 + 27 ) )

que envía el valor entero 100 y devuelve una referencia a cout. A continuación la expresión entre paréntesis más a la derecha se evalúa como

( cout << endl );

que envía a la salida un salto a una nueva línea, vacía a cout y devuelve una referencia a co- ut. Esta última devolución ya no se utiliza.

USO DE CARACTERES ESPECIALES

La mayoría de los programas que elaborará, visualizarán varias líneas de salida.

Cuando desea avanzar el cursor al principio de una nueva línea, puede utilizar el carácter nueva línea ( '\n' ) en el flujo de salida. Cuando se inserta en el flujo de salida, se genera un retorno de carro/salto de línea (CRLF). C++ le proporciona dos maneras de generar una nueva línea.

Primero, puede colocar el carácter '\n' dentro de una cadena de caracteres como se muestra en el Ejemplo 6.4:

Ejemplo 6.4

El siguiente programa: DOSLINEAS.CPP, visualiza la salida de dos cadenas en dos líneas, utilizan- do la secuencia de escape

'

\n

'

.

/* El siguiente programa: DOSLINEAS.CPP, muestra en la pantalla dos cadenas de caracteres en dos líneas, utilizando el carácter de escape

'

\n

'

.

*/

#include <iostream.h> // Para cout

void main( void )

{

cout << "Esta es la línea uno.\nEsta es la línea dos.";

} // Fin de main( )

Salida:

Esta es la línea uno.

Esta es la línea dos.

(10)

Segundo, si no esta desplegando una cadena de caracteres, puede colocar el carácter nueva línea entre apóstrofes, como se ve en el Ejemplo 6.5:

Ejemplo 6.5

El siguiente programa NVALINEA.CPP visualiza los números 1,0,0 y 1 en líneas diferentes:

En vez de utilizar el carácter nueva línea, puede ut ilizar el manipulador de flujo (ver este tema más adelante) endl (end line). El manipulador de flujo endl hace dos cosas:

primero, al igual que la secuencia de escape '\n' genera un CRLF y, segundo, a diferencia de la secuencia de escape '\n', inmediatamente emite la salida. El manipulador de flujo endl hace que cualquier información acumulada en la memoria temporal o búfer se escriba inmediatamente.

Ejemplo 6.6

El siguiente programa: ENDL1.CPP, muestra el uso del manipulador de flujo endl.

Ejemplo 6.7

El siguiente programa: ENDL2.CPP, ilustra el uso de endl:

/* El siguiente programa: NVALINEA.CPP, visualiza los números 1, 0, 0 y 1 en líneas

diferentes.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << 1 << '\n' << 0 << '\n' << 0 << '\n' << 1;

} // Fin de main( )

/* El siguiente programa. ENDL2.CPP, ilustra el uso del manipulador endl. */

#include <iostream.h> // Para cout

void main( void ) {

cout << "El lenguaje C++ es ... " << endl << "bastante fácil.";

} // Fin de main( )

/* El siguiente programa: ENDL1.CPP, muestra el uso del manipulador de flujo endl. */

#include <iostream.h> //Para cout

void main( void ) {

cout << "¡Bienvenidos al ";

cout << "INSTITUTO POLITÉCNICO NACIONAL!";

cout << endl;

}//Fin de main( )

Salida:

1 0 0 1

Salida:

¡Bienvenidos al INSTITUTO POLITECNICO NACIONAL!

Salida:

El lenguaje C++ es ...

bastante fácil.

(11)

Ejemplo 6.8

Es posible enviar a la salida expresiones tal como se muestra en el siguiente programa: EXPRESIO- NES.CPP.

OTROS CARACTERES ESPECIALES

En la lección 3 página 3-24 (constantes de tipo carácter y cadena) hemos visto ya los caracteres especiales, los repetiremos simplemente para tener una rápida referencia.

Carácter Propósito

\a Carácter alerta (o campana)

\b Carácter retroceso (backspace)

\f Carácter alimentación de hoja (formfeed)

\n Carácter nueva línea (newline)

\r Carácter retroceso de carro (carriage return)

(no alimenta nueva línea)

\t Carácter de tabulador horizontal

(horizontal tab)

\v Carácter de tabulador vertical

(vertical tab)

\\ Carácter diagonal inverso (backslash)

\? Carácter interrogación (question mark)

\’ Carácter apóstrofe

\” Carácter comillas

\0 Carácter nulo

\0OO Valor octal tal como \007

\xhhh Valor hexadecimal tal como \xFFFF

Ejemplo 6.9

El siguiente programa: ESPECIAL.CPP utiliza los caracteres especiales

'

\a

'

(alerta) y tabulador (

'

\t

'

) para emitir un sonido en la bocina de la computadora y luego visualiza las palabras, Campana Campana Campana, separadas cada una de ellas por un tabulador.

/* El siguiente programa: EXPRESIONES.CPP, muestra el uso de envío a la salida de valores de expresiones.

*/

#include <iostream.h> //Para cout

void main( void ) {

cout << "15 más 27 es: ";

//No se necesitan los paréntesis, pero se utilizan para claridad

cout << ( 15 + 27 ); //expresión

cout << '\n';

}//Fin de main( )

Salida:

15 más 27 es: 42

(12)

Como antes hemos dicho, la salida no es inmediatamente emitida al dispositivo, sino más bien se va acumulando en cierta área de la memoria (búfer o buffer) asignada a tal dis- positivo. Sin embargo, cuando se encuentra con el manipulador endl o bien una operación de lectura, el búfer es vaciado (enviar la información al dispositivo). Si desea vaciar inme- diatamente el buffer asignado al dispositivo sin necesidad de dar un salto de línea se puede utilizar la palabra flush.

Ejemplo 6.10

El siguiente programa: FLUSH.CPP, ilustra el uso del manipulador flush para vaciar el búfer.

VISUALIZANDO NÚMEROS CON cout

Cuando quiera escribir información numérica fija, simplemente inserte los valores numéricos dentro del flujo de salida cout utilizando el operador <<.

Ejemplo 6.11

El siguiente programa: 1001.CPP despliega el número 1001 en su pantalla:

/* El siguiente programa: 1001.CPP, despliega el número 1001 por pantalla. */

#include <iostream.h> // Para cout

void main( void ) {

cout << 1001;

/* El siguiente programa: FLUSH.CPP, muestra el uso del manipulador flush para enviar inmediatamente la salida al dispositivo.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "Esta línea aparece inmediatamente." << flush;

cout << "\nLo mismo sucede con esta línea..." << flush;

} // Fin de main( )

/* El siguiente programa: ESPECIAL.CPP, utiliza los caracteres especiales '\a' (alerta) y tabulador ( '\t') para emitir un sonido en la bocina de la computadora y luego visualiza las palabras, Campana Campana Campana, separadas cada una por un tabulador.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "Campana\a\tCampana\a\tCampana\a";

} // Fin de main( )

Salida:

Campana Campana Campana

Salida:

Esta línea aparece inmediatamente.

Lo mismo sucede con esta línea...

Salida:

1001

(13)

Ejemplo 6.12

Cuando se inserta un valor de punto flotante fijo, se obtiene el decimal fijo equivalente en la salida, no el equivalente exponencial. El siguiente programa: FLOTANTE.CPP, usa cout para desplegar el número 0.12345 en su pantalla.

VISUALIZANDO VARIOS VALORES CON UN cout

Cuando utiliza cout, puede utilizar el operador de inserción más de una vez por enunciado. La salida no genera ningún espacio entre los elementos.

Ejemplo 6.13

El siguiente programa: 1001BIS.CPP, usa el operador cuatro veces para desplegar el número 1001 en la pantalla.

Ambas condiciones (espaciado y salida decimal) se pueden modificar con las opciones de formato dentro del enunciado cout. El formato de salida se explicará mas adelante (Manipulación de flujo).

VISUALIZANDO CARACTERES FIJOS CON cout

Para escribir información de caracteres, deberá encerrar la información de salida entre comillas (comillas simples para caracteres sencillos y comillas dobles para cadenas de caracteres). Por consiguiente, el enunciado:

cout <<

'

A

'

;

genera como salida una A.

/* El siguiente programa: FLOTANTE.CPP, despliega el número 0.12345 por pantalla. */

#include <iostream.h> // Para cout

void main( void ) {

cout << 0.12345;

} // Fin de main( )

/* El siguiente programa: 1001BIS.CPP, utiliza el operador << cuatro veces para desplegar el número 1001 en la pantalla.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << 1 << 0 << 0 << 1;

} // Fin de main( )

Salida:

0.12345

Salida:

1001

(14)

El enunciado:

cout <<

"

La vida es bella!

"

;

produce como salida: ¡La vida es bella!

Ejemplo 6.14

Veamos un ejemplo en el que se muestren varios mensajes en la pantalla del monitor. Lla memos al programa COUT.CPP:

VISUALIZANDO CADENA DE CARACTERES Y NÚMEROS CON cout

Ejemplo 6.15

El siguiente programa: CVALNUM.CPP, utiliza cout para visualizar cadena de caracteres y núme- ros:

Ejemplo 6.16

El programa siguiente: MSTR1001.CPP visualiza una cadena de caracteres y un número utilizando un cout:

/* El siguiente programa: COUT.CPP, utiliza el objeto de flujo de salida cout para visualizar varios mensajes en la pantalla del monitor.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "Esta es la línea uno.\n";

cout << "Este texto se encuentra ";

cout << "en la línea dos.\n";

cout << "Esta es la última línea.";

} // Fin de main( )

/* El siguiente programa: CVALNUM.CPP, muestra como cout visualiza cadena de caracteres y números.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "cout le permite visualizar cadenas de caracteres, números enteros\n";

cout << "y de punto flotante.\n\n";

cout << 1001;

cout << '\n';

cout << 1.2345;

} // Fin de main( )

Salida:

Esta es la línea uno.

Este texto se encuentra en la línea dos.

Esta es la última línea.

Salida:

cout le permite visualizar cadenas de caracteres , números enteros y de punto flotante.

1001 1.2345

(15)

Ejemplo 6.17

El programa siguiente: ENM1001.CPP, visualiza el número 1001 en medio de dos cadenas de carac- teres:

UTILIZANDO cout PARA COMBINAR DIFERENTES TIPOS DE VALORES

Ejemplo 6.18

Un objeto de flujo de salida cout le permite escribir diferentes tipos de valores, como se muestra en el siguiente programa: UNCOUT.CPP:

/* El siguiente programa: UNCOUT.CPP, le muestra como se puede utilizar un solo cout para escribir cadenas y números de diferentes tipos.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "cout visualiza cadenas " << "\n\n" << 1001 << '\n' << 1.2345;

} // Fin de main( )

Salida:

cout visualiza cadenas

1001 1.2345 /* El siguiente programa: MSTR1001.CPP, visualiza una cadena de caracteres y un número, utilizando un solo cout.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "Mi número favorito es: " << 1001;

} // Fin de main( )

/* El siguiente programa: ENM1001.CPP, visualiza el número 1001 en medio de dos cadenas de caracteres.

*/

#include <iostream.h> // Para cout

void main( void ) {

cout << "El número " << 1001 << " es mi favorito";

} // Fin de main( )

Salida:

Mi número favorito es: 1001

Salida:

El número 1001 es mi favorito

(16)

VISUALIZANDO OBJETOS VARIABLE CON cout

Lo siguiente que deberá aprender es cómo escribir información contenida en un ob- jeto variable. De nuevo, ésta es una tarea sencilla si se utiliza el objeto cout : simplemente inserte el (los) identificador(es) de variables dentro del flujo cout con el operador de inser- ción <<. Por ejemplo, si su programa ha definido voltaje, corriente y resistencia como obje- tos variables, puede escribir sus respectivos valores insertándolos dentro de un flujo cout, de la manera siguiente:

cout << voltaje << corriente << resistencia;

El enunciado anterior escribirá los valores almacenados en memoria para voltaje, corriente y resistencia, en ese orden. El orden de salida será el mismo que el orden listado dentro del enunciado cout. Sin embargo, no habrá espacios entre los valores. Los caracte- res en blanco se deben insertar en forma separada para proporcionar espacio.

Ejemplo 6.19

El siguiente programa: OHM.CPP, utiliza la ley de Ohm que establece que el voltaje es igual al pro- ducto de la corriente por la resistencia. Su objetivo es escribir un mensaje junto con los valores de la corriente y resistencia, así como el voltaje.

SALIDA DE VARIABLES char *

En la E/S estilo C es necesario que el programador proporcione información del tipo de datos. C++ determina automáticamente los tipos de datos –una mejora agradable sobre C. Pero a veces esto resulta un estorbo. Por ejemplo, sabemos que una cadena de caracteres

/* El siguiente programa: OHM.CPP, calcula y muestra el voltaje usando la ley de OHM.

*/

#include <iostream.h> // Para cout

void main( void ) {

float voltaje = 0.0; // Para el voltaje calculado.

float corriente = 0.001; // Valor de la corriente.

float resistencia = 4700.0; // Valor de la resistencia.

// Breve descripción del programa.

cout << "Este programa calculará el voltaje dada una corriente de 0.001 "

"amperes\ny una resistencia de 4700.0 ohms." << endl << endl;

// Cálculo del voltaje utilizando la ley de Ohm.

voltaje = corriente * resistencia;

// Mostrar los resultados.

cout << "Valor de corriente = " << corriente << " amperes.\ n"

"Valor de resistencia = " << resistencia << " ohms.\ n"

"Valor del voltaje resultante = " << voltaje << " volts" << endl;

} // Fin de main ( )

Salida:

Este programa calculará el voltaje dada una corriente de 0.001 amperes y una resistencia de 4700.0 ohms.

Valor de corriente = 0.001 amperes.

Valor de resistencia = 4700 ohms.

Valor del voltaje resultante = 4.7 volts

(17)

es de tipo char *. Supongamos que quiere imprimir el valor de ese apuntador, es decir, la dirección de memoria del primer carácter de dicha cadena. Pero el operador << ha sido so- brecargado para que imprima los datos de tipo char * como cadenas terminadas en nulo. La solución es hacer una conversión de tipo mediante cast del apuntador a un tipo void * (esto deberá hacerse para cualquier variable de apuntador que el programador desee enviar a la salida como una dirección).

Ejemplo 6.20

El siguiente programa:

DIRCHAR.CPP

, muestra la impresión de una variable char * en formatos de cadena y dirección. Observe que la dirección se imprime como número hexadecimal (base 16). En C++ los números hexadecimales comienzan con 0x o 0X.

SALIDA DE CARACTERES CON LA FUNCIÓN MIEMBRO put( ); put( ) EN CASCADA

La función miembro put( ) envía a la salida un carácter como en

cout.put('A');

que despliega una A en la pantalla. Las llamadas a put( ) pueden ponerse en cascada como en

cout.put( 'A ').put( '\n' );

la cual da salida a la letra A seguida de un carácter de nueva línea. Como sucede con <<, la instrucción anterior se ejecuta de esta forma debido a que el operador punto (.) asocia de izquierda a derecha y la función miembro put( ) devuelve una referencia al objeto mediante el que se realizó la llamada a put( ). La función put( ) también puede invocarse mediante una expresión de valor ASCII, como en cout.put( 65 ), lo cual también da salida a A.

E/S SIN FORMATO MEDIANTE read( ), gcount( ) y write( )

Aunque la idea de esta lección, es tratar exclusivamente con el objeto flujo de salida de datos, trataremos brevemente el flujo de entrada de datos.

/* El siguiente programa: DIRCHAR.CPP, muestra en pantalla el contenido de una variable char * en formatos de cadena y de dirección.

*/

#include <iostream.h> //Para cout

void main( void ) {

char *cadena = "INSTITUTO POLITÉCNICO NACIONAL";

cout << "El valor de cadena es: " << cadena

<< "\nEl valor de static_cast< void * >( cadena ) es: "

<< static_cast< void * > ( cadena ) << endl;

}//Fin de main( )

Salida:

El valor de cadena es: INSTITUTO POLITECNICO NACIONAL El valor de static_cast<void *>( cadena ) es: 0x169f00ba

(18)

La entrada/salida sin formato se realiza con las funciones miembro read( ) y wri- te( ). Cada una de ellas da entrada o envía a la salida algún número de bytes desde o hacia un arreglo de caracteres que está en memoria. Estos bytes no tienen ningún formato. Se les da entrada o salida simplemente como bytes sin formato. Por ejemplo, la llamada:

char buffer[] =

"

INSTITUTO POLITÉCNICO NACIONAL

"

; cout.write( buffer, 10 );

envía a la salida los primeros 10 bytes de buffer (incluyendo los caracteres nulos que podrí- an causar que terminara la salida con cout y << ). Debido a que una cadena de caracteres se evalúa por la dirección de su primer carácter, la llamada

cout.write(

"

ABCDEFGHIJKLMNOPQRSTUVWXYZ

"

, 10 );

despliega los primeros 10 caracteres de la cadena.

La función miembro read( ) introduce un número determinado de caracteres en un arreglo. Si se leen menos caracteres que el número indicado, se establece la bandera failbit.

Pronto veremos la manera de determinar si se ha establecido failbit.

La función miembro gcount( ) reporta cuántos caracteres ha leído la última opera- ción de entrada.

Ejemplo 6.21

El siguiente programa: SINFORMATO.CPP, muestra las funciones miembro read( ) y gcount( ) de istream y la función miembro write( ) de ostream. El programa utiliza read( ) para introducir 20 ca- racteres (a partir de una secuencia de entrada más larga) en el arreglo de caracteres buffer, se vale de gcount( ) para determinar el número de caracteres que se introdujeron y emplea write( ) para enviar a la salida los caracteres que están en el buffer.

/* El siguiente programa: SINFORMATO.CPP, ilustra el uso de las funciones miembro read( ), gcount( ) y write( ).

*/

#include <iostream.h> //Para cout y cin

void main( void ) {

const int TAMANO = 80;

char buffer[TAMANO];

cout << "Introduzca una oración:\n";

cin.read(buffer, 20);

cout << "\nLa oración introducida fue:\n";

cout.write( buffer, cin.gcount( ) );

cout << endl;

}//Fin de main( )

Salida:

Introduzca una oración:

DABALE ARROZ A LA ZORRA EL ABAD La oración introducida fue:

DABALE ARROZ A LA ZO

(19)

REDIRECCIONANDO LA SALIDA DE cout

En realidad cout dirige la salida al dispositivo estándar (stdout) asignado al sistema (en nuestro caso lo es la pantalla del monitor). Por lo tanto, es posible desde el sistema operativo redireccionar la salida de cout. Por ejemplo, en el caso del programa

FLUSH.CPP

, si quisiéramos que la salida de cout fuera dirigida a la impresora, entonces desde el DOS podemos escribir el siguiente comando:

C:\> FLUSH.EXE > prn

o bien si quisiéramos enviarla a un archivo:

C:\> FLUSH.EXE > nombreArchivo

Si por alguna razón desea que la salida no sea redireccionable, por ejemplo, le agra- daría que los mensajes de error que envíe al usuario aparezcan en la pantalla del monitor y no en la impresora, entonces deberá utilizar el objeto cerr en vez del objeto cout. Este obje- to envía la salida al dispositivo estándar para el manejo de errores ( stderr) el cual no es redireccionable y normalmente es la pantalla del monitor.

Ejemplo 6.22

El siguiente programa: CERR.CPP, ilustra el uso del objeto cerr.

Existe otro objeto de flujo de salida, clog, que se utiliza al igual que cerr, salvo que la salida no la envía directamente al dispositivo asignado (como es el caso de cerr) sino que la envía al área búfer.

* El siguiente programa: CERR.CPP, utiliza el flujo de salida cerr para visualizar el mensaje "Este mensaje siempre aparece en el dispositivo estándar stderr".

*/

#include <iostream.h> // Para cout

void main( void ) {

cerr << "Este mensaje siempre aparece en el dispotivo estándar: stderr";

} // Fin de main( )

Salida:

Este mensaje siempre aparece en el dispotivo estándar: stderr

(20)

Ejemplo 6.23

El siguiente programa: CLOG.CPP, ilustra el uso de clog.

MANIPULACIÓN DEL FLUJO

A la organización de la salida de un programa se le conoce con el nombre de forma- teo de la salida. Las formas más comunes de dar formato a la salida son las siguientes:

1. Mediante el uso de funciones miembro de un objeto de flujo. Su sintaxis es la siguiente:

nombreObjetoInvocador.nombreFuncionMiembro(listaArgumentos );

Por ejemplo:

cout.width( 5 );

cout.fill( '*' );

cout.precision( 2 );

Nota: Estas instrucciones se estudiaran mas adelante.

2. Mediante el uso de funciones especiales llamadas manipuladores (o modificadores), con o sin argumentos.

Por ejemplo:

cout << flush;

cout << endl;

cout << setw( 5 ) << 12 << endl;

cout << seprecision( 2 ) << 12.325 << endl;

Nota: Estas instrucciones se estudiaran mas adelante.

3. Mediante el uso de banderas (indicadores) como argumentos de la función miembro setf( ) del objeto de flujo:

Por ejemplo:

cout.setf( ios::fixed );

cout.setf( ios::showpoint );

Nota: Estas instrucciones se estudiaran mas adelante.

/* El siguiente programa: CLOG.CPP, utiliza el flujo de salida clog para visualizar

el mensaje "Este mensaje NO siempre aparece inmediatamente en el dispositivo estándar: stderr".

*/

#include <iostream.h> // Para cout

void main( void )

{

clog << "Este mensaje NO siempre aparece inmediatamente en el dispositivo estándar: stderr";

} // Fin de main( )

Salida:

Este mensaje NO siempre aparece inmediatamene en el dispositivo estándar: stderr

EXAMEN BREVE 14

(21)

a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una ban- dera usamos la función miembro unsetf( ). Por ejemplo, el siguiente enunciado hará que el programa deje de incluir el signo de mas antes de los enteros positivos que se envían al flu- jo cout.

cout.unsetf( ios::showpos );

4. Mediante el uso de banderas (indicadores) como argumento de la función setiosflags( ).

a. Cualquier bandera (indicador) establecida puede desactivarse. Para desactivar una bande- ra usamos la función resetiosflags( ). Por ejemplo, el siguiente enunciado hará que el pro- grama deje de justificar la salida de los datos a la izquierda.

resetiosflags( ios::left );

5. Para emplear los manipuladores es preciso incluir la siguiente directiva en el programa:

#include <iomanip.h>

Un manipulador es una función que se invoca de manera no tradicional. A su vez, la función manipuladora invoca una función miembro. Los manipuladores se colocan des- pués del operador de inserción <<, como si la función manipuladora fuera un elemento que se enviara a la salida. Al igual que las funciones tradicionales, los manipuladores pueden tener o no argumentos. Ya vimos un manipulador: endl.

El manipulador setw( ) y la función miembro width( ) hacen exactamente lo mismo.

Invocamos al modificador setw( ) escribiéndolo después del operador de inserción <<, co- mo si lo fuéramos a enviar al flujo cout, y este a su vez invoca a la función miembro width( ). Por ejemplo, lo que se muestra a continuación despliega los números 15, 25 y 35 usando la anchura de campo especificada:

cout << “Inicio” << setw( 4 ) << 15 << setw( 4 ) << 25 << setw( 6 ) << 30;

La instrucción anterior produce la siguiente salida:

Inicio 15 25 35

(Hay dos espacios antes del 15, dos antes del 25 y cuatro antes del 30).

El manipulador setprecision( ) hace exactamente lo mismo que la función miembro precision( ). Sin embargo, las llamadas a setprecision( ) se escriben después del operador de inserción <<, tal como se hace con el manipulador setw( ). Por ejemplo, lo que sigue despliega los números que se listan empleando el número de dígitos después del punto de- cimal que se indica en la llamada a setprecision( ):

cout.setf( ios::fixed );

cout.setf( ios::showpoint );

cout << ‘$’ << setprecision( 2 ) << 10.3 << endl << ‘$’ << 20.5 << endl;

La instrucción anterior produce la siguiente salida salida:

$10.30

(22)

Al igual que con la función miembro precision( ) cuando establecemos el número de dígitos después del punto decimal empleando el manipulador setprecision( ) el efecto per- siste hasta que otra llamada a setprecision( ) o precision( ) cambie el número de dígitos.

C++ proporciona diversos manipuladores de flujo que realizan tareas de formato.

Dichos manipuladores proporcionan capacidades tales como :

Establecimiento de:

Base 8, 10 y 16 para números enteros.

Precisiones.

La anchura de campos.

Punto decimal y ceros a la derecha para flotante y doble.

La alineación a la izquierda o derecha.

El caracter de relleno de una salida.

Los indicadores de formato (restablecimiento).

Vaciado de flujo.

Inserción de nuevas líneas en el flujo de salida y vaciado d e flujo.

inserción de un carácter nulo en el flujo de salida y el salto de espacios en blanco en el flujo de entrada.

Estas características se describen en las siguientes secciones.

CAMBIO DE BASE PARA NUMEROS ENTEROS: dec, oct, hex Y setbase( )

Los enteros normalmente se interpretan como valores en base 10. Para cambiar la base sobre la que se interpretan los enteros en un flujo, inserte el manipulador hex para establecer la base a hexadecimal (base 16), inserte el manipulador oct para establecer la base a octal (base 8), inserte el manipulador de flujo dec para restablecer la base a decimal.

La base de un flujo también se puede cambiar por medio del manipulador de flujo setbase( ), el cual toma un argumento entero de 8, 10 o 16 para establecer la base. Debido a que setbase( ) toma un argumento, se le llama manipulador de flujo con parámetro. El uso de setbase( ), o cualquier otro manipulador con parámetro, requiere la inclusión del archivo de encabezado <iomanip.h>. La base permanece igual hasta que se cambia explícitamente.

Ejemplo 6.24

El siguiente programa: OCTHEX1.CPP, muestra el uso de los manipuladores de flujo hex, oct, dec y setbase( ).

/* El siguiente programa: OCTHEX1.CPP, ilustra el uso de los manipiladores de flujo oct, hex, dec y setbase( ).

*/

#include <iostream.h> //Para cout

#include <iomanip.h> //Para oct, hex, dec y setbase( )

void main( void ) {

int n;

Salida:

Introduzca un número decimal: 456 456 en hexadecimal es : 1c8 456 en octal es : 710 456 en decimal es : 456

(23)

Ejemplo 6.25

El siguiente programa: OCTHEX2.CPP, de igual manera ilustra el uso de los manipuladores hex, oct, dec y setbase( ).

NOTA: Observe que cuando utiliza alguno de los manipuladores dec, oct, hex o setbase( ), el mismo permanece activo hasta que termine su programa o utilice un manipulador diferente.

PRECISIÓN DE PUNTO FLOTANTE (precision( ), setprecision( ))

Dependiendo de cuando fue escrito su compilador (versión), la precisión se toma como el número de cifras significativas o el número de dígitos después del punto decimal.

Así, algunos ejemplos de setprecision( 2 ) según la primera opción son:

23. 2.2e7 2.2 6.9e-1 0.00069

Ejemplos en base a la segunda opción son:

23.56 2.26e7 2.21 0.69 0.69e-4

cin >> n;

cout << n << " en hexadecimal es: " << hex << n << '\n' << dec << n << " en octal es : " << oct << n << '\n' << setbase( 10 ) << n << " en decimal es: " << n << endl;

}//Fin de main( )

/* El siguiente programa. OCTHEX2.CPP, ilustra el uso de los manipuladores oct,

hex, dec, setbase( ).

*/

#include <iostream.h> // Para cout

#include <iomanip.h> // oct, dec, hex, setbase( )

void main( void ) {

// Observe como al utilizar un manipuladorel mismo queda activo

// hasta que otro manipuladorlo desactive.

cout << "Octal: " << oct << 10 << ' ' << 20 << endl;

cout << "Hexadecimal: " << hex << 10 << ' ' << 20 << endl; cout << "Decimal: " << dec << 10 << ' ' << 20 << endl;

cout << endl;

cout << "Octal: " << oct << 10 << endl;

cout << "Decimal: " << dec << 0xFF << endl;

cout << "Decimal: " << dec << 012 << endl;

cout << "Hexadecimal: " << hex << 255 << endl;

cout << endl;

// Los siguientes ejemplos muestran el uso del manipulador setbase( )

cout << "Octal: " << setbase( 8 ) << 10 << ' ' << 20 << endl;

cout << "Hexadecimal: " << setbase( 16 ) << 10 << ' ' << 20 << endl;

cout << "Decimal: " << setbase( 10 ) << 10 << ' ' << 20 << endl;

} // Fin de main( )

Salida:

Octal: 12 24 Hexadecimal: a 14 Decimal: 10 20

Octal: 12 Decimal: 255 Decimal: 10 Hexadecimal: ff

Octal: 12 24 Hexadecimal: a 14 Decimal: 10 20

(24)

En estas lecciones, cuando nos refiramos a precision, estaremos hablando de la se- gunda opción: número de dígitos después del punto decimal.

Podemos controlar la precisión de los números de punto flotante utilizando el mani- pulador de flujo setprecision( ) o la función miembro precision( ). Una llamada a cualquie- ra de éstos establece la precisión para todas las operaciones de salida subsecuentes hasta cambiar nuevamente la precision. La función miembro precision( ) sin argumentos devue l- ve el valor de la precisión actual.

Ejemplo 6.26

El siguiente programa: PRECISION1.CPP, ilustra el uso del manipulador setprecision( )

Ejemplo 6.27

El siguiente programa: PRECISION2.CPP, utiliza la función miembro precision( ) y el manipulador setprecision( ) para imprimir una tabla que muestra la raíz cuadrada de 2 con precisiones que varí- an de 0 a 9. (Ver salida a continuación).

/* El siguiente programa: PRECISION1.CPP, muestra el uso del manipulador setprecision( ) para indicar el número de dígitos decimales del valor flotante.

*/

#include <iostream.h> //Para cout

#include <iomanip.h> //Para setprecision( )

void main( void ) {

float valor = 1.2345;

cout << setiosflags( ios::fixed );

cout << setprecision( 0 ) << valor << endl;

cout << setprecision( 1 ) << valor << endl;

cout << setprecision( 2 ) << valor << endl;

cout << setprecision( 3 ) << valor << endl;

cout << setprecision( 4 ) << valor << endl;

cout << setprecision( 5 ) << valor << endl;

cout << setprecision( 6 ) << valor << endl;

} //Fin de main( )

Salida:

1 1.2 1.23 1.235 1.2345 1.23450 1.234500

Salida:

Raíz cuadrada de 2 con precisión 0-9.

Precisión establecida por la función miembro precision( ):

1 1.4 1.41 1.414 1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562

(25)

ANCHURA DE CAMPO (setw( ), width( ))

La función miembro width( ) de ios establece la anchura del campo (es decir, el nú- mero de posiciones de carácter con el que un valor deberá enviarse a la salida o el número de caracteres que deberá introducirse) y devuelve la anchura anterior. Si los valores proce- sados son más pequeños que la anchura de campo, se insertan caracteres de relleno como relleno. Un valor más grande que el ancho indicado no se truncará, sino que se imprimirá el número completo.

/* El siguiente programa: PRECISION2.CPP, utiliza la fu nción miembro precision( ) y el manipulador setprecision( ) para imprimir una tabla que muestra la raíz cuadrada de 2 con precisiones que varían de 0 a 9.

*/

#include <iostream.h> //Para cout

#include <iomanip.h> //Para precision( ) y setprecision( )

#include <math.h> //Para sqrt( )

void main( void ) {

double raiz2 = sqrt( 2.0 );

int posiciones;

cout << setiosflags( ios::fixed )

<< "Raíz cuadrada de 2 con precision 0 -9.\n"

<< "Precision establecida por la "

<< "funcion miembro precision( ):" << endl;

for( posiciones = 0; posiciones <= 9; posiciones++ )

{

cout.precision( posiciones );

cout << raiz2 << '\n';

}//Fin del for

cout << "\nPrecision establecida por el "

<< "manipulador setprecision( ):\n";

for( posiciones = 0; posiciones <= 9; posiciones++ )

cout << setprecision( posiciones ) << raiz2 << '\n';

}//Fin de main( )

Precision establecida por el manipulador setprecision( ):

1 1.4 1.41 1.414 1.4142 1.41421 1.414214 1.4142136 1.41421356 1.414213562

Referencias

Documento similar

La campaña ha consistido en la revisión del etiquetado e instrucciones de uso de todos los ter- mómetros digitales comunicados, así como de la documentación técnica adicional de

You may wish to take a note of your Organisation ID, which, in addition to the organisation name, can be used to search for an organisation you will need to affiliate with when you

Where possible, the EU IG and more specifically the data fields and associated business rules present in Chapter 2 –Data elements for the electronic submission of information

The 'On-boarding of users to Substance, Product, Organisation and Referentials (SPOR) data services' document must be considered the reference guidance, as this document includes the

Products Management Services (PMS) - Implementation of International Organization for Standardization (ISO) standards for the identification of medicinal products (IDMP) in

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

En función de los datos de carga y flujo suministrados por el cliente con los que debe cumplir el elevador de cangilones, la demanda de potencia y velocidad de giro en el eje de

Y tendiendo ellos la vista vieron cuanto en el mundo había y dieron las gracias al Criador diciendo: Repetidas gracias os damos porque nos habéis criado hombres, nos