Kurs maturalny z języka angielskiego!
kurs-maturalny-jezyk-angielski

PROGRAMOWANIE I ALGORYTMY

Zajęcia maturalne z informatyki
Olimpiada Informatyczna Juniorów
    Prowadzący: Marcin Kasprowicz
  • właściciel serwisu algorytm.edu.pl
  • wrzesień 2024 — start zajęć
  • czytaj więcej

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.

#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:

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