Programowanie i algorytmy

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;
}