C++: El archivo iomanip.h III

En el programa de la entrada comentarios en C del dia sabado 22 de agosto de 2009 a las 6:59 pm   http://ingeniedia.blogspot.com/2009/08/comentarios-en-c.html, escrito en C, se realizó un sencillo cálculo utilizando valores de tipo float, al ejecutarlo observamos que la salida mostrada en la pantalla invariablemente desplegaba seis dígitos decimales, incluso introduciendo valores que dieran por resultado un valor exacto. En comparación, el mismo programa escrito en C++, entsal.cpp, despliega automáticamente los dígitos decimales de acuerdo al cálculo realizado, sin embargo, en ciertas aplicaciones puede ser deseable especificar un número determinado de dígitos a desplegar por el flujo de E/S. Para éste fin se utiliza el manipulador setprecision() en donde podemos especificar mediante un valor de tipo int el número de dígitos a la derecha del punto decimal a desplegar en pantalla, estudie el programa llamado manipu04.cpp

//*********************************************************
// manipu04.cpp
//*********************************************************
#include <iostream.h> // para operaciones de E/S
#include <iomanip.h> // define diferentes manipuladores
int main()
{
 int i;
 double variable1=22, variable2=7;
 for(i=0; i<15; i++)
 {
  cout << setprecision(i);
  cout << variable1/variable2 << endl;
 }
 return 0;
}
     Ya habrá notado que los flujos de E/S tienen ciertos valores predefinidos y que éstos valores se pueden modificar utilizando manipuladores como oct y hex, sucede que los flujos de E/S tienen un campo para especificar los valores correspondientes y éstos campos se llaman banderas (flags). El archivo de cabecera ios.h define diferentes especificaciones de banderas. Mediante el uso del manipulador setiosflags() nuestros programas pueden manipular muchas de éstas banderas utilizando a su vez el operador de alcance, identificado por un par de símbolos de dos puntos (::) y que nos sirve para acceder a una variable de alcance global ó a los miembros de una clase. Recuerde que en la siguiente lección daremos la definición de una clase y demostraremos detalladamente el uso del operador de alcance, por lo pronto es importante que conserve en mente los datos previos de ésta lección pues serán aplicados prácticamente en todo programa que escriba en C++. En una determinada sección del archivo de cabecera ios.h podemos encontrar las definiciones para las diferentes banderas como un tipo de dato enum, generalmente de la siguiente manera:
enum
{
    skipws     = 0x0001,  // Salta espacios en blanco durante la entrada
    left       = 0x0002,  // justifica a la izquierda
    right      = 0x0004,  // justifica a la derecha
    internal   = 0x0008,  // relleno después de signo ó indicador de base
    dec        = 0x0010,  // base decimal
    oct        = 0x0020,  // base octal
    hex        = 0x0040,  // base hexadecimal
    showbase   = 0x0080,  // muestra indicador de base durante la salida
    showpoint  = 0x0100,  // punto decimal obligatorio en float
    uppercase  = 0x0200,  // salida hex en mayúsculas
    showpos    = 0x0400,  // signo positivo obligatorio
    scientific = 0x0800,  // notación de tipo 3.145363E23
    fixed      = 0x1000,  // dígitos decimales predeterminados
    unitbuf    = 0x2000,  // desaloja flujos después de inserción
    stdio      = 0x4000   // desaloja stdout, stderr después de inserción
};
     Puede identificar fácilmente algunos de los manipuladores que ya hemos estudiado y ahora veremos cómo se utilizan éstas banderas mediante el manipulador setiosflags() y cómo restituimos las condiciones originales mediante el manipulaodr resetiosflags(), estudie y compile el siguiente ejemplo, manipu05.cpp, además experimente con las banderas no incluidas en el programa, estoy seguro que no presentará problema alguno comprender el uso de las diferentes banderas.

//***********************************************
// manipu05.cpp
//***********************************************

#include <iostream.h>
#include <iomanip.h>

int main()
{
 int numero;
 cout << "Introduzca un numero:\n";
 cin >> numero;
 cout << "El valor introducido en base 10 es: " << numero
   << endl;
 cout << setiosflags(ios::oct);
 cout << "en base octal es: " << numero << endl;
 cout << setiosflags(ios::hex);
 cout << "y en base hexadecimal es: " << numero << endl;
 cout << setiosflags(ios::uppercase|ios::showbase);
 cout << "utilizando los manipuladores uppercase y showbase"
  " el valor es: " << numero << endl;
 cout << resetiosflags(ios::hex);
 cout << "Ahora el valor se representa en base octal asi: "
  << numero << endl;
 cout << resetiosflags(ios::uppercase|ios::showbase|ios::oct);
 cout << setiosflags(ios::showpos|ios::showpoint|ios::fixed);
 cout << "Ahora el valor es: " << (float)numero << endl;
 cout << resetiosflags(ios::showpos|ios::showpoint|
  ios::fixed);
 cout << "El valor es " << numero << endl;
 return 0;
}
 El programa manipu05.cpp empieza solicitándole un número el cual es desplegado inmediatamente para demostrar los ajustes predeterminados para los flujos de E/S, después se utiliza la bandera oct para representar el valor introducido en base octal, luego de mostrar el valor en pantalla se vuelve a utilizar la bandera hex ésta vez para mostrar el número introducido en base hexadecimal. En ésta parte del programa, línea 19, es conveniente hacer notar que hemos modificado dos veces la representación que deseamos darle a los flujos de E/S, en éste orden, primero indicamos que deseamos la base octal y posteriormente la base hexadecimal, si después de la línea 19 utilizamos el manipulador setiosflags(ios::oct) la representación de los flujos de E/S no será en base octal sino en hexadecimal, entonces, si deseamos nuevamente la representación del valor numérico introducido en base octal necesitamos reestablecer la bandera oct anteriormente establecida en la línea 15, para esto utilizamos el manipulador resetiosflags() como está ilustrado en la línea 23 y posteriormente en las líneas 26 y 29 del programa. Cuando sea necesario especificar varias banderas podemos hacer uso del operador OR tanto con el manipulador setiosflags() como con resetiosflags() tal y como se puede apreciar en las líneas 20, 26, 27 y 30 del programa.

No response to “C++: El archivo iomanip.h III”