|
Wyjście Spis treści Wstecz Dalej
Autor artykułu |
©2026 mgr Jerzy Wałaszek
|
Prawie każdy program komputerowy przetwarza jakieś dane. Wymaga to przechowywania tych danych w pamięci komputera. Do tego celu w języku C służą zmienne (ang. variables). Przed pierwszym użyciem w programie zmienną należy odpowiednio zdefiniować. Dlaczego? Odpowiedź jest prosta, jeśli zrozumiałeś materiał z poprzedniego rozdziału. W pamięci komputera przechowywane są tylko bity. Z bitów jako takich nie wynika, jakiego rodzaju informację one przechowują. Dlatego musimy poinformować kompilator, co zamierzamy w zmiennej przechowywać, aby mógł przydzielić dla zmiennej odpowiednią ilość pamięci oraz później odpowiednio interpretować informację przechowywaną w zmiennej.
Definicja zmiennej w języku C wygląda następująco:
Typ określa rodzaj informacji przechowywanych w zmiennych. Mamy następujące typy podstawowe (typów jest więcej, zajmiemy się nimi dokładniej w dalszej części kursu):
Nazwa określa identyfikator, za pomocą którego będziemy się do zmiennej odwoływać. Nazwy zmiennych w języku C należy budować wg następujących reguł:
Przykłady poprawnych nazw:
Przykłady niepoprawnych nazw zmiennych (zły znak zaznaczony na czerwono):
Przykładowe definicje zmiennych wyglądają następująco:
Gdy zmienna została zdefiniowana na początku funkcji w programie, to można jej użyć do przetwarzania danych. Tutaj pojawia się kolejne pojęcie: wyrażenie (ang. expression). Wyrażenie jest zapisem pewnego działania matematycznego, które daje w wyniku jakąś wartość. Najprostszym wyrażeniem jest liczba:
Powyżej mamy liczby: całkowitą dodatnią (nadaje się do wszystkich zmiennych), całkowitą ujemną (nadaje się do zmiennych typu int i float), zmiennoprzecinkową (nadaje się do zmiennej typu float).
W wyrażeniach możemy stosować operatory matematyczne – operator jest symbolem operacji:
Przykłady wyrażeń z operatorami:
Oprócz liczb w wyrażeniach mogą pojawić się nazwy zmiennych. W takim przypadku w wyrażeniu zostanie użyta aktualna zawartość danej zmiennej:
Wynik wyrażenia możesz umieścić w wybranej zmiennej za pomocą instrukcji przypisania (ang. assignment statement), która posiada następującą składnię:
Znak równości, który występuje w tym poleceniu nie oznacza równości. Komputer oblicza wartość wyrażenia, a wynik umieszcza w zmiennej, której nazwę podasz po lewej stronie znaku równości.
Na przykład:
Instrukcja przypisania umożliwia ci wykonywanie obliczeń. Pozostaje problem wyświetlenia wyników tych obliczeń. Do tego celu używamy funkcji printf( ). Dotychczas wykorzystywana była do wyświetlania tekstów. Jednak funkcja ta potrafi dużo więcej. Nazwa funkcji printf( ) pochodzi od nazwy angielskiej print formatted data to stdout (wypisz sformatowane dane na standardowym wyjściu). Jej właściwa składnia wygląda następująco:
format – tekst formatujący, który określa
sposób interpretacji i prezentacji danych
dana – wyrażenie lub zmienna, których wartość zostanie
zinterpretowana przez funkcję i wyświetlona zgodnie z zawartością tekstu formatującego.
Najlepiej zobrazować działanie printf( ) odpowiednimi przykładami. Utwórz nowy projekt w Code::Blocks i skopiuj do niego poniższy program (w Linuxie zastosuj polskie litery):
Wynik:
A teraz wyjaśniamy. Tekst formatujący w funkcji printf( ) jest wyświetlany aż do napotkania znaku %, który posiada znaczenie specjalne (jeśli zechcesz po prostu wyświetlić znak %, to musisz użyć dwóch: %%). Za znakiem % umieszczamy kod formatu kolejnej danej, która zostanie wyświetlona w tym dokładnie miejscu. Np. %d oznacza liczbę dziesiętną, czyli kolejna dana zostanie pobrana i wypisana w postaci liczby dziesiętnej. Zwróć uwagę, że w jednym tekście formatującym może być kilka takich elementów. Np. %d %o %x powoduje pobranie trzech danych z listy argumentów funkcji i wyświetlenie pierwszej jako liczby dziesiętnej, drugiej jako liczby ósemkowej i trzeciej jako liczby szesnastkowej.
| Kod | Wynik | Przykład |
|---|---|---|
| %d lub %i | Liczba całkowita ze znakiem | 12, -55 |
| %u | Liczba całkowita bez znaku | 653 |
| %o | Liczba ósemkowa bez znaku | 7255 |
| %x | Liczba szesnastkowa bez znaku z małymi literami cyfr | 1fa5 |
| %X | Liczba szesnastkowa bez znaku z dużymi literami cyfr | 1FA5 |
| %f | Liczba zmiennoprzecinkowa, małe e | 6.57, 1.3e+2 |
| %F | Liczba zmiennoprzecinkowa, duże E | 6.57, 1.3E+2 |
| %c | Znak | A, c |
| %s | Tekst | Hello |
Kodów formatów dla printf( ) jest dużo więcej, jednak na razie wystarczą te, które podałem (pozostałe wprowadzimy w miarę potrzeb). Zapisz je sobie na boku, abyś miał je pod ręką.
Mamy już wszystkie podstawowe elementy, które pozwolą napisać prosty program obliczeniowy:
Wynik:
Popracujemy teraz nad ulepszeniem tego programu. Przyjrzyj się wyświetlonym liczbom. Lepiej byłoby, aby wszystkie punkty dziesiętne znalazły się jeden pod drugim, co zwiększyłoby czytelność tych wyników. Aby to osiągnąć, musisz nieco zmodyfikować kod formatu. Pomiędzy znakami % a f dodasz szerokość pola liczby (czyli z ilu maksymalnie znaków ma się składać) oraz precyzję (czyli liczbę cyfr po przecinku). Jeśli tego nie określisz, to printf( ) wyświetla liczby zmiennoprzecinkowe z 6 cyframi po przecinku. Powiedzmy, że nie interesuje nas taka dokładność i wystarczą nam dwie cyfry po przecinku. Natomiast część całkowita liczby ma być ograniczona do maksymalnie 5 cyfr (typ float posiada dokładność 7...8 cyfr, co widać w pierwszym wyniku, gdzie na końcu pojawiła się cyfra 1, której w programie nie wstawialiśmy). Kod formatu będzie wyglądał następująco:
8 – 5 cyfr całkowitych + kropka dziesiętna + 2
cyfry ułamkowe wymaga pola o szerokości 8 znaków
2 – 2 cyfry po kropce dziesiętnej
W programie zmień ostatnie printf( ) na:
Wynik:
Teraz wyniki są prezentowane w sposób bardziej czytelny.
Operacje arytmetyczne w języku C są wykonywane w wyrażeniu w następującej kolejności:
Przykład:
Jeśli zechcesz zmienić kolejność działań, to musisz zastosować nawiasy okrągłe (i tylko one, nawiasy można zagnieżdżać) . Część wyrażenia w nawiasach jest obliczana najpierw:
Przykład:
Przykłady zapisu wyrażeń w C:
Przy obliczaniu wyrażeń musisz zwrócić uwagę na operację dzielenia. Dzielenie przez 0 spowoduje błąd w czasie działania programu (ang. run time error).
Tego typu błędy nie są wykrywane w czasie kompilacji, tzn. program jest poprawny pod względem składniowym, lecz zawiera błąd logiczny – dzielenie przez zero.
Druga własność dzielenia pojawia się wtedy, gdy oba argumenty są typu całkowitego. Wtedy wynik dzielenia również jest całkowity:
W tym programie dzielimy 5 przez 2 i wynik umieszczamy w zmiennej x. Ponieważ oba argumenty dzielenia (zmienna a oraz liczba 2) są liczbami całkowitymi, to wynik też jest liczbą całkowitą. Nie zmienia tutaj niczego fakt, iż wynik zapisujemy w zmiennej typu float. Otrzymujemy 2.000000, a powinno być 2.500000. Aby otrzymać wynik poprawny, zmień liczbę 2 na jej odpowiednik zmiennoprzecinkowy 2.0:
Jeśli jeden z argumentów dzielenia jest liczbą zmiennoprzecinkową, to wynik również będzie zmiennoprzecinkowy. Zapamiętaj dobrze tę własność dzielenia – unikniesz wielu błędów i frustracji w swoich przyszłych programach. Poniżej jest pouczający przykład. Program przelicza temperaturę w skali Celsjusza TC na temperaturę w skali Fahrenheita TF. Wzór jest następujący:

Wynik:
Format %4d oznacza liczbę dziesiętną ze znakiem, która będzie wypisana w polu o szerokości 4 znaków z dosunięcie do prawej krawędzi tego pola.
Otrzymujemy zły wynik, ponieważ 25ºC = 77ºF, a nie 57ºF! Skąd ten błąd? Z dzielenia 9 przez 5! Ponieważ obie liczby są całkowite, to wynikiem będzie 1, ponieważ 5 mieści się 1 raz w 9 i zostaje reszta 4. Program możesz naprawić na dwa sposoby, zmieniając nieco wzór obliczeniowy:
Tutaj zmieniamy jeden z argumentów dzielenia na liczbę zmiennoprzecinkową.
Tutaj reorganizujemy obliczenia. Teraz 5 dzieli większą liczbę, zatem wynik dzielenia będzie bardziej dokładny.
W języku C instrukcja przypisania posiada wartość: jest równa temu, co zostaje umieszczone w zmiennej. Dzięki tej własności możemy sobie uprościć inicjalizację zmiennych.
Zamiast:
Piszemy:
Wartość 5 zostanie umieszczona w zmiennych a, b i c. Działa to tak, że komputer wylicza wartość wyrażenia na końcu po prawej stronie, następnie zostaje wykonane przypisanie c = 5; czyli w zmiennej c znajdzie się liczba 5. Jednak to przypisanie jest nowym wyrażeniem w instrukcji przypisania: b = (c = 5); a jego wartością jest 5, które trafi do b. Ta instrukcja przypisania jest dalej wyrażeniem dla a = (b = (c =5)); i ma wartość wciąż 5, ponieważ tyle zostało przypisane (umieszczone w) zmiennej b. Zatem do zmiennej a również trafi 5. Taki ciąg przypisań można rozszerzać na dowolną liczbę zmiennych.
Język C potrafi być zarówno przejrzysty jak i zagmatwany. Ponieważ przypisanie posiada wartość, to można go użyć jak liczby w dowolnym wyrażeniu arytmetycznym:
Odradzam stosowanie takich konstrukcji, chociaż mogą się wydawać kuszące.
Modyfikacja zmiennej polega na zmianie jej zawartości, lecz nie na zupełnie nową, lecz na taką, która wiąże się z poprzednią zawartością, np. zwiększenie o 2, pomnożenie przez 4. Każdą modyfikację możesz wykonać za pomocą instrukcji przypisania.
Ponieważ modyfikacje zmiennych są często wykonywane w programach, język C posiada specjalne operatory, które ułatwiają ich wykonywanie. Najpierw omówimy dokładnie operatory zwiększania i zmniejszania o 1:
Operator zwiększania/zmniejszania o 1 możesz umieścić przed lub za zmienną. Działanie będzie takie samo w obu wypadkach:
Przeanalizuj powyższy program.
Jeśli operacje ++zmienna,
zmienna++, --zmienna,
zmienna--
występują samodzielnie, to nie ma znaczenia, czy operator
++/-- zapiszesz przed, czy za zmienną. Musisz jednak
wiedzieć, że operacja modyfikacji ma wartość i może zostać użyta
w dowolnym wyrażeniu arytmetycznym, z czego programiści chętnie
korzystają. W takim przypadku nie jest obojętne, czy jest przed
zmienną, czy za nią, ponieważ wartość operacji będzie inna:
Poniżej mamy przykład obrazujący to zachowanie się operatora
++ (operator -- zachowuje się
identycznie):
W obu przypadkach zmienne c i
d zostały zwiększone o 1.
Jednak do zmiennej a trafiła wartość 5, a do zmiennej
b trafiła
wartość 6. Stało się tak dlatego, iż wartością wyrażenia
c++ jest zawartość zmiennej
c przed modyfikacją, która zostanie
wykonana dopiero po przypisaniu. Z kolei wartością wyrażenia
++d
jest zmodyfikowana zmienna d, czyli zwiększona o 1.
Mnemotechnicznie zapamiętasz to działanie, jeśli będziesz
analizował wyrażenie od strony lewej do prawej: jeśli najpierw
napotkasz zmienną, to wartością będzie zawartość
zmiennej przed
modyfikacją (operator ++/--
znajduje się za zmienną, więc zmienna zostanie zmodyfikowana
później). Jeśli najpierw napotkasz operator, to zmienna
zostanie zmodyfikowana, a następnie w wyrażeniu będzie
już użyta jej
nowa wartość.
Nie nadużywaj operatorów ++/-- w wyrażeniach, bo łatwo uczynić je trudnymi w analizie:
Oprócz operatorów modyfikacji ++ i -- mamy operatory dla każdej operacji dwuargumentowej:
Jest to odpowiednik operacji:
Na przykład:
Odpowiada:
Podsumowując
Poniższy program oblicza 35:
Zapraszam do następnego rozdziału.
![]() |
Zespół Przedmiotowy Chemii-Fizyki-Informatyki w I Liceum Ogólnokształcącym im. Kazimierza Brodzińskiego w Tarnowie ul. Piłsudskiego 4 ©2026 mgr Jerzy Wałaszek |
Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone pod warunkiem podania źródła oraz niepobierania za to pieniędzy.
Pytania proszę przesyłać na adres email:
Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.
Informacje dodatkowe.