1 ELEMENTARZ
Większość pracy programu jest realizowana przez pętlę while. Obliczenie temperatury w skali Celsjusza i przypisanie zmiennej celsius tej wartości wykonuje instrukcja
celsius = 5 * (fahr-32) / 9;
Mnożenie przez 5 i dzielenie przez 9 zamiast mnożenia po prostu przez 5/9 jest spowodowane tym, że w języku C (jak w wielu innych językach) dzielenie całkowite zaokrągla wynik, to znaczy odrzuca część ułamkową tego wyniku. Liczby 5 i 9 są całkowite, więc wyrażenie 5/9 dałoby w wyniku zero i wtedy wszystkie temperatury Celsjusza miałyby wartość zero.
Ten przykład także mówi coś więcej o działaniu funkcji printf. W rzeczywistości printf jest funkcją formatowanego wypisywania danych. Jej szczegółowy opis znajduje się w rozdz. 7. Pierwszym argumentem funkcji printf jest ciąg znaków, które należy wypisać. Każdy znak % symbolicznie wskazuje miejsce na wartość kolejnego argumentu (tzn. drugiego, trzeciego itd.) oraz podaje format, w jakim ta wartość będzie wypisana. Na przykład specyfikacja %d wskazuje na argument całkowity, więc instrukcja
printf(”%d\t%d\n”, fahr, celsius);
spowoduje wypisanie wartości dwóch argumentów całkowitych fahr i celsius przedzielonych znakiem tabulacji (\t).
Każda specyfikacja przekształcenia (którą wprowadza znak %) zawarta w pierwszym argumencie funkcji printf stanowi parę z odpowiadającym jej (drugim, trzecim itd.) argumentem wywołania tej funkcji. Argumenty muszą być właściwie uporządkowane ze względu na numer i typ specyfikacji, gdyż inaczej możesz uzyskać błędne wyniki.
Przy okazji zwróć uwagę na to, że funkcja printf nie jest częścią języka C - on sam nie definiuje wejścia ani wyjścia. Po prostu printf jest pożyteczną funkcją ze standardowej biblioteki funkcji powszechnie dostępnych dla programów napisanych w języku C. Zachowanie się funkcji printf jest zdefiniowane w standardzie ANSI C, więc jej właściwości powinny być takie same we wszystkich kompilatorach i bibliotekach dostosowanych do standardu.
Aby skoncentrować się na samym języku C, nie będziemy na razie rozwodzić się na temat wejścia-wyjścia aż do rozdz. 7. W szczególności pominiemy formatowane wejście, które tam opisano. Jeśli będziesz zmuszony wprowadzić liczby, to przeczytaj omówienie funkcji scanf w p. 7.4. Funkcja ta jest bardzo podobna do printf z tym, że czyta dane z wejścia zamiast wypisywać wyniki na wyjście. j
Z programem przekształcania temperatur wiąże się kilka problemów. Najprostszym z nich jest ten, że wynik nie wygląda ładnie, ponieważ liczby w kolumnach nie W wyrównane do prawej strony. To da się łatwo naprawić: gdy każdą specyfikację w instrukcji printf uzupełnimy szerokością pola, wówczas wypisywane liczby będł dosunięte do prawej granicy pola. Możemy na przykład napisać
1.2 ZMIENNE I WYRAŻENIA ARYTMETYCZNE
printf("%3d %6d\n”, fahr, celsius);
i w każdym wierszu pierwsza liczba zostanie wypisana w polu dla trzech cyfr, a druga - w polu dla sześciu cyfr; wynik będzie wówczas wyglądał tak
0 |
-17 |
20 |
-6 |
40 |
4 |
60 |
15 |
80 |
26 |
100 |
37 |
Bardziej poważnym problemem jest dokładność wyniku. Wyliczone temperatury Celsjusza nie są zbyt dokładne, zastosowaliśmy bowiem arytmetykę liczb całkowitych; np. odpowiednikiem temperatury 0° F faktycznie jest temperatura ok. -17,8°C, a nie -17. Aby uzyskać dokładniejsze wyniki, musimy zamiast arytmetyki całkowitej zastosować arytmetykę liczb zmiennopozycyjnych. To zaś wymaga paru zmian w programie. Oto jego nowa wersja
#include <stdio.h>
/* wypisz zestawienie temperatur Fahrenheita-Celsjusza dla fahr = 0, 20..... 300; wersja zmiennopozycyjna */
main()
{
float fahr, celsius; int lower, upper, step;
lower = 0; /* dolna granica temperatur */
upper = 300; /* górna granica */ step = 20; /* rozmiar kroku */
fahr = lower;
while (fahr <= upper) {
celsius = (5.0/9.0) * (fahr-32.0); printf(”%3.0f %6.1f\n”, fahr, celsius); fahr = fahr + step;
31