Programowanie - C++

C++ – Cześć 7 kursu C/C++

7. Printf i wyświetlanie danych

W poprzednim punkcie napisaliśmy program wyświetlający na ekranie tekst. Dla przypomnienia – skorzystaliśmy z funkcji „printf”. Jednak co to za program, który wyświetla z góry ustalone teksty i nie ma możliwości zaprezentowania wyników przeprowadzonych operacji ? W tym właśnie punkcie zaprzęgniemy wspomnianą funkcję do takiej właśnie pracy. Jak zwykle posłużymy się przykładowym programem.

#include <stdio.h>

void main(void)

{

float f = 0.521;

int i = -123;

unsigned int u = 24;

char c = ´A´;

printf(„Zmienna f = %f, natomiast zmienna i jest rowna %d.
„, f, i);

printf(„Zmienna c = %c, a zmienna u jest rowna %u.
„, c, u);

printf(„Zmienna u w zapisie szestnastkowym jest rowna %x,
„, u);

printf(„natomiast w zapisie osemkowym jest rowna %o.”, u);

}

Jak widzimy funkcja „printf” może także wyświetlać wartości zmiennych. Ogólny jej zapis wygląda tak:

printf(ciag_formatujący, lista parametrów);

Ciąg formatujący jest zwykłym ciągiem znaków do wyświetlenia na ekranie. Jednak niektóre znaki mają funkcję specjalną i nie zostaną one po prostu wyświetlone. Takim właśnie znakiem jest znak % . Gdy funkcja printf go napotka to wie, że po nim wystąpi określenie rodzaju argumentu i formatu jego wyświetlenia na ekranie. Ogólnie wygląda to tak:

% [flagi] [szerokość] [precyzja] [modyfiktor wielkości] typ_parametru

Tylko „typ_parametru” musi wystąpić po znaku % , natomiast parametry podane w nawiasach kwadratowym są opcjonalne i może ich w ogóle nie być (tak jest w przedstawionym przykładzie). Poniżej podałem najczęściej stosowane typy parametrów:

%d

zmienna typu int (ze znakiem)

%u

zmienna typu int (bez znaku)

%c

zmienna typu char (litera)

%f

zmienna typu float (rzeczywista)

%x

zmienna typu int (bez znaku) wyświetlana w postaci szesnastkowej

%o

zmienna typu int (bez znaku) wyświetlana w postaci ósemkowej

%s

ciąg znaków (zostanie omówiony później)

%p

wskaźnik (zostanie omówiony później)

Nie przerażaj się jeszcze, po przeanalizowaniu zasady działania funkcji printf wszystko stanie się jasne. Zrobimy to na podstawie pierwszej linijki z tą funkcją w naszym programie, czyli:

printf(„Zmienna f = %f, natomiast zmienna i jest rowna %d.
„, f, i);

Po wywołaniu funkcja printf sprawdza znak po znaku ciąg formatujący. Ciąg ten rozpoczyna się od „Zmienna f = „. Ponieważ na razie nie wystąpił znak % wszystkie te znaki zostaną po prostu wyświetlone na ekranie. Następnie napotyka się na znak % , którego jednak już nie wyświetla, ale sprawdza co stoi za nim. Okazuje się, że jest to literka „f”, czyli razem otrzymuje %f , która to kombinacja oznacza, że w tym miejscu powinna wyświetlić liczbę typu rzeczywistego (patrz tabelka powyżej). Bierze więc pierwszy argument (który jest wypisany po przecinku zaraz za znakiem cudzysłowia kończącego ciąg formatujący), którym w naszym przypadku jest zmienna f i wyświetla jego wartość na ekranie. Następnie przechodzi do dalszego sprawdzania ciągu formatującego. Wyświetla ciąg „, natomiast zmienna i jest rowna „, ponieważ także nie występuje w nim żaden znak kontrolny i dochodzi do miejsca, w którym mamy drugi znak % . Tym razem typem parametru jest „d”, czyli jest to informacja, że ma wyświetlić liczbę całkowitą (ze znakiem). Tak więc funkcja printf pobiera drugi argument, którym w naszym przypadku jest zmienna i, a następnie wyświetla jej zawartość na ekranie. Po tym, jak już to zrobi wraca do sprawdzania ciągu. Tym razem natyka się na „.”, którą to wyświetla i pobiera następny znak, którym jest . Jest to drugi, po % , znak kontrolny. Ciąg
daje informację dla printf , że w tym miejscu powinna ona przejść do następnej linii ekranu. Innymi często używanymi są:

tabulacja

powrót karetki (kursor przesuwa się do początku linii)



backspace (cofnięcie o jeden znak)

a

bell (krótki sygnał dźwiękowy)

znak cudzysłowia (zauważ, że jakbyś po prostu go wpisał to kompilator potraktowałby to jako zakończenie ciągu formatującego)

Czyli w efekcie, po wykonaniu tej funkcji na ekranie pojawi się:

„Zmienna f = 0.521000, natomiast zmienna i jest rowna -123.”

Jak widzimy, wartość zmiennej f jest wyświetlona z dokładnością do sześciu miejsc po przecinku. Jednak nas mogą interesować na przykład jedynie dwa miejsca po przecinku, reszty nie potrzebujemy. Wtedy należy użyć opcjonalnych parametrów, które mogą wystąpić po znaku % . Dla przypomnienia ogólny zapis wygląda tak:

% [flagi] [szerokość] [precyzja] [modyfiktor wielkości] typ_parametru

Zaczniemy od omówienia flag:

wyrównuje liczbę do lewej (normalnie byłaby wyrównana do prawej)

+

liczba zawsze zaczyna się od znaku „+” (dla dodatnich) lub „-” (dla ujemnych), normalnie znak jest wyświetlany tylko dla liczb ujemnych

Teraz parametr szerokość:

n

gdzie n jest liczbą określającą ile znaków zostanie wyświetlonych. Jeśli n jest większe od szerokości liczby to zostanie ona uzupełniona spacjami. Jeśli jest mniejsze to liczba nie zostanie ucięta.

0n

gdzie n jest liczbą określającą ile znaków zostanie wyświetlonych. Jeśli n jest większe od szerokości liczby to zostanie ona uzupełniona zerami. Jeśli jest mniejsze to liczba nie zostanie ucięta.

Teraz parametr precyzja:

Parametr ten zawsze zaczyna się od kropki, a następnie podajemy ilość liczb do wyświetlenia po przecinku (tak jak to było przy szerokości.

Pozostał jeszcze jeden parametr, a mianowicie modyfikator wielkości:

l

określa, że parametr jest typu long (np. long int to %ld)

h

określa, że parametr jest typu short (np. short int to %hd)

Wszystko zostało już omówione, na zakończenie podam jeszcze przykłady użycia. Wszystkie będą pokazywały to, co zostanie wyświetlone na ekranie, przy założeniu, że zmienne mają wartości takie jak w naszym przykładowym programie.

„[%6.3f]”

wyświetli się „[ 0.521]”. Pamiętaj, że liczba sześć oznacza szerokość całej liczby, a nie tylko części przed przecinkiem. Ponieważ szerokość liczby jest równa pięć, to została dodana jedna spacja _przed_ liczbą.

„[%-6.3f]”

wyświetli się „[0.521 ]”. Jak wyżej, tylko spacja została dodana _po_ liczbie (wyrównanie do lewej).

„[%06.3f]”

wyświetli się „[00.521]”. Czyli zamiast spacji, zostało dodane zero.

„[%+6.3f]”

wyświetli się „[+0.521]”. Oczywiście dla f równego -0.521 wyświetli się znak minus, nie plus.