1 ELEMENTARZ
Ta ostatnia zmiana jest ilustracją podstawowej zasady języka C: wszędzie tam, gdzie może wystąpić wartość zmiennej pewnego typu, możesz zastosować bardziej skomplikowane wyrażenie tego typu. Trzeci argument funkcji printf powinien być wartością zmiennopozycyjną (odpowiadającą formatowi %6.1f), a więc może nim być dowolne wyrażenie zmiennopozycyjne.
Instrukcja for jest pętlą bardziej ogólną niż while. Gdy porównasz tę instrukcję z instrukcją while w poprzednim przykładzie, wówczas jej działanie stanie się zrozumiałe. W nawiasach okrągłych instrukcji for występują trzy części oddzielone średnikami. Pierwszą część, inicjującą pętlę:
fahr = 0
wykonuje się raz przed wejściem do właściwej pętli. Druga część jest warunkiem sterującym powtarzaniem pętli:
fahr <= 300
Po obliczeniu wartości warunku i sprawdzeniu, że jest prawdziwy, wykona się treść pętli (tu jedynie wywołanie funkcji printf) oraz trzecia część, nazywana przyrostem
fahr = fahr + 20
w której zwiększa się wartość zmiennej. Następnie znów jest obliczana wartość warunku. Powtarzanie pętli kończy się z chwilą, gdy warunek stanie się fałszywy. Treść pętli, podobnie jak w instrukcji while, może być jedną instrukcją lub grupą instrukcji ujętą w nawiasy klamrowe. Części: inicjowanie, warunek i przyrost mogą być dowolnymi wyrażeniami. I
Wybór między instrukcjami while i for zależy od tego, która z nich wydaje się bardziej przydatna. Instrukcję for zwykle stosuje się w pętlach, w których części inicjoH wania i przyrostu są pojedynczymi, logicznie związanymi instrukcjami. Jej postać jest bowiem bardziej zwarta niż postać instrukcji while i skupia w jednym miejscu instrukcje sterujące wykonaniem pętli. I
*
Ćwiczenie 1.5. Zmień program przekształcania temperatur tak, aby wypisywał zestawienie w odwrotnej kolejności, to znaczy od 300 stopni do zera. j]
Jeszcze kilka ostatnich spostrzeżeń, zanim na zawsze porzucimy nasz program pr; kształcania temperatur. Do złej praktyki programowania należy zaszywanie w p
1.5 WEJŚCIE I WYJŚCIE ZNAKOWE
powerea oy
Misio!
gramie takich „tajemniczych” liczb, jak 300 czy 20: będą one niewiele znaczyJTcIJa kogoś, kto w przyszłości będzie musiał przeczytać ten program. Trudno je także zmienić w sposób systematyczny. Jedną z metod postępowania z tajemniczymi liczbami jest nadawanie im znaczących nazw. Wiersz #define wprowadza definicję nazwy symbolicznej, nazwanej także stałą symboliczną, która ma reprezentować określony ciąg znaków:
#define nazwa tekst zastępujący
Od tej chwili każde wystąpienie nazwy (oprócz nazw zawartych w cudzysłowach oraz stanowiących fragment innej nazwy) zostanie zamienione na odpowiadający jej tekst zastępujący. Nazwa symboliczna ma taką samą postać, jak nazwa zmiennej: jest ciągiem liter i cyfr, rozpoczynającym się od litery. Zastępujący ją tekst może być zupełnie dowolnym ciągiem znaków, nie jest ograniczony tylko do liczb.
#include <stdio.h>
#define LOWER 0 /* dolna granica temperatur */
#define UPPER 300 /* górna granica */
#define STEP 20 /* rozmiar kroku */
main() /* zestawienie temperatur Fahrenheita-Celsjusza */
{ • int fahr;
for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf(”%3d %6.1f\n”, fahr, (5.0/9.0)*(fahr-32));
}
Obiekty LOWER, UPPER i STEP nie są zmiennymi, lecz stałymi symbolicznymi, toteż nie pojawiają się wśród deklaracji. Nazwy symboliczne umownie zapisuje się wielkimi literami alfabetu w celu odróżnienia ich od nazw zmiennych. Zwróć uwagę na brak średnika na końcu wiersza zawierającego #define.
Rozważymy teraz rodzinę programów służących do przetwarzania danych znakowych. Odkryjesz później, że wiele programów jest tylko rozszerzoną wersją prototypów, które tutaj omawiamy.
35