Manipulatory

powrót

W tym artykule omówię krótko zasadę wykorzystania manipulatorów zdefiniowanych w standardowej bibliotece i w bibliotece iomanip, które formatują dane wyjściowe przy użyciu obiektu cout.

Zmiana systemu liczbowego  wyświetlanych liczb - manipulatory hex, oct i dec

Mamy do dyspozycji trzy systemy: szesnastkowy (hex), ósemkowy (oct) oraz dziesiętny (dec) - domyślny. Do zmiany systemu liczbowego dla wyświetlania liczb za pomocą obiektu cout, musimy podać jeden z trzech dostępnych manipulatorów przed wyświetlaną liczbą. System będzie obowiązywał do momentu zmiany na inny.  Domyślnie jest ustawiony dziesiętny.

Przykład
#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int liczba = 19880;

cout<<"Liczba w systemie dziesiętnym: "<<liczba<<endl;

cout<<"Ta sama liczba w systemie ósemkowym: "<<oct<<liczba<<endl;

cout<<"Ta sama liczba w systemie szesnastkowym: "<<hex<<liczba<<endl;

cout<<"I powrót do systemu dziesiętnego: "<<dec<<liczba<<endl;

system("pause");
return 0;
}

 

Szerokość pola

 

Aby ustawić ilość miejsc dla wyswietlanej liczby lub ciągu znaków, wykorzystujemy metodę width(int). W przeciwieństwie do manipulatorów ustawiających system, metada ta działa tylko dla jednej (następnej) liczby lub ciągu. Możemy ją wykorzystać, jeśli zależy nam na równym wyświetlaniu danych. Zasadę działania pokażę na przykładzie:

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int liczba = 43, a = 8, b = 10;


cout.width(30);

cout<<"Szerokość tego pola to 30"<<endl;

//wyrównanie liczb do prawej strony 
//(na całą liczbę przeznaczamy siedem miejsc)
//puste miejsca będą wypełnione spacjami

cout.width(7);
cout<<liczba<<endl;
cout.width(7);
cout<<a<<endl;
cout.width(7);
cout<<b<<endl;

system("pause");
return 0;
}

 

Znaki wiodące

Gdy szerokość pola danych jest ustawiona na większą niż same dane, puste miejsca są wypełniane spacjami. Można zmienić znak wypełniający na inny za pomocą metody fill(char);

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int a = 10, b = 100;

//puste miejsca z prawej strony będą wypełnione znakami "_"

cout.fill('_');

cout.width(10);
cout<<a<<endl;

cout.width(10);
cout<<b<<endl;

system("pause");
return 0;
}

 

Ustawianie precyzji liczb zmiennoprzecinkowych

Do ustawienia wyświetlenia ilości cyfr danej liczby zmiennoprzecinkowej służy metoda precision(precyzja). Popatrzmy na przykład:

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
float a = 3.12345;

cout<<a<<endl;

//wyświetlenie liczby której całkowita ilość cyfr jest równa 2
cout.precision(2);
cout<<a<<endl;

//ustawienie pola trzech cyfr (3.12)
cout.precision(3);
cout<<a<<endl;

system("pause");
return 0;
}

 

Aby wyświetlić liczbę z zadaną ilość miejsc po przecinku należy użyć następującej konstrukcji:

cout<<fixed<<setprecision(ilość miejsc po przecinku)<<liczba_zmiennoprzecinkowa;

gdzie fixed usuwa notację wykładniczą z zadanej liczby - potrzebna jest biblioteka iomanip (iomanip.h).

Popatrzmy na przykład:

#include<iostream>
#include<iomanip>
#include<cstdlib>
using namespace std;

int main()
{
cout<<"Podaj liczbę zmiennoprzecinkową: ";
long double liczba;
cin>>liczba;
cout<<"Podaj precyzję: ";
int precyzja;
cin>>precyzja;
	
cout<<"Podałeś liczbę: "<<liczba<<endl;
cout<<"Po ustawieniu precyzji liczba wygląda tak: "<<fixed
      <<setprecision(precyzja)<<liczba<<endl;
	
system("pause");
return 0;
}

 

Metoda setf() - zdefiniowana w bibliotece iostream

Metoda setf() pobiera argument, który ustawia odpowiedni format danych. Mamy do dyspozycji kilka flag formatujących, oto niektóre z nich:

  • ios_base::showbase - dla danych wyjściowych ustawienie prefiksów liczbowych (0, 0x)
  • ios_base::uppercase - używanie dużych liter na wyjściu w systemie szesnastkowym oraz wielkiej litery E w notacji naukowej
  • ios_base::showpos - wymuszenie umieszczenia znaku + przed liczbami dodatnimi

Do unieważnienia flagi metody setf() służy metoda unsetf().

Popatrzmy na przykład:

 

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
int a = 3, b=6;

cout<<a;

//wymuszenie wstawienia przed liczbę dodatnią znaku "+"

cout.setf(ios_base::showpos);

cout<<b<<"=";

//unieważnienie działania metody setf()

cout.unsetf(ios_base::showpos);

cout<<a+b<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}

 

Biblioteka iomanip

 

Bibliotekę tą stworzono w celu uproszczenia stosowania manipulatorów. Oto przykładowe odpowiedniki dla manipulatorów z biblioteki standardowej:

#include <cstdlib>
#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
float a = 3.141414;

cout<<setw(20); //ustawienie wielkości pola na dane - 20 miejsc

cout<<setfill('_'); //ustawienie znaków wiodących

cout<<setprecision(4); //precyzja - 4 cyfry na całą liczbę 
                             //zmiennoprzecinkową

cout<<a<<endl;

system("pause");
return 0;
}