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.
#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;
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 metoda 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 <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;
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 <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;
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 <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;
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>
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;
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:
Do unieważnienia flagi metody setf() służy metoda unsetf().
Popatrzmy na przykład:
#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;
return 0;
}
Biblioteka iomanip
Bibliotekę tą stworzono w celu uproszczenia stosowania manipulatorów. Oto przykładowe odpowiedniki dla manipulatorów z biblioteki standardowej:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double 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;
return 0;
}