Académique Documents
Professionnel Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
Jzyk C. Wprowadzenie
do programowania
Autor: Stephan G. Kochan
Tumaczenie: Tomasz mijewski
ISBN: 83-7361-754-X
Tytu oryginau: Programming in C. A complete
introduction to the C programming language
Format: B5, stron: 504
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Spis treci
O Autorze ........................................................................................ 13
Wstp ............................................................................................. 15
Rozdzia 1. Wprowadzenie ................................................................................. 17
Rozdzia 2. Podstawy ........................................................................................ 21
Programowanie................................................................................................................ 21
Jzyki wysokiego poziomu.............................................................................................. 22
Systemy operacyjne......................................................................................................... 22
Kompilowanie programw.............................................................................................. 23
Zintegrowane rodowiska programistyczne .................................................................... 25
Interpretery...................................................................................................................... 26
Spis treci
Spis treci
9
Funkcje fgets i fputs ................................................................................................ 348
stdin, stdout i stderr ................................................................................................. 349
Funkcja exit............................................................................................................. 349
Zmiana nazw i usuwanie plikw ............................................................................. 350
wiczenia...................................................................................................................... 351
10
Spis treci
11
Funkcje obsugi znakw................................................................................................ 451
Funkcje wejcia i wyjcia.............................................................................................. 452
Funkcje formatujce dane w pamici ............................................................................ 457
Konwersja acucha na liczb ....................................................................................... 458
Dynamiczna alokacja pamici ....................................................................................... 459
Funkcje matematyczne .................................................................................................. 460
Arytmetyka zespolona............................................................................................. 466
Funkcje oglnego przeznaczenia................................................................................... 468
Skorowidz...................................................................................... 483
Rozdzia 4.
Uycie zmiennych
Pocztkowo programici musieli pisa swoje programy w binarnych jzykach obsugiwanych komputerw. Instrukcje maszynowe trzeba byo rcznie kodowa w formie liczb
dwjkowych i dopiero wtedy mona byo przekazywa je do komputera. Co wicej,
programici musieli jawnie przypisywa miejsce w pamici i potem odwoywa si do
niego, podajc konkretny adres fizyczny.
Obecnie jzyki programowania pozwalaj skoncentrowa si na rozwizywaniu konkretnych problemw, zbdne stao si odwoywanie si do kodw maszynowych czy adresw fizycznych w pamici. Do zapisywania wynikw oblicze i potem odwoywania
si do nich mona uywa nazw symbolicznych nazw zmiennych. Nazwa zmiennej
moe by tak dobierana, aby od razu byo wida, jakiego typu warto zawiera dana
zmienna.
W rozdziale 3. uywalimy kilku zmiennych do zapisywania wartoci cakowitoliczbowych. W programie 3.4 na przykad zmienna sum zawieraa wynik dodawania liczb
50 i 25.
Jzyk C pozwala stosowa inne typy zmiennych, nie tylko liczby cakowite. Jednak przed
ich uyciem konieczne jest prawidowe zadeklarowanie. Zmienne mog zawiera liczby
zmiennoprzecinkowe, znaki, a nawet wskaniki do okrelonych miejsc w pamici.
38
Zasady tworzenia nazw zmiennych s proste nazwa musi zaczyna si liter lub
podkreleniem (_), dalej moe by dowolna kombinacja liter (wielkich i maych), podkrele oraz cyfr, 0 do 9. Oto przykady poprawnych nazw zmiennych:
sum
pieceFlag
i
J5x7
Liczba_ruchow
_sysflag
piece flag
3Spencer
int
int
to sowo zarezerwowane
Nie mona wykorzysta sowa int jako nazwy zmiennej, gdy sowo to ma w jzyku C
specjalne znaczenie, czyli jest to sowo zarezerwowane. Oglna zasada jest taka, e nie
mona jako nazwy zmiennej uywa adnej nazwy majcej dla kompilatora C specjalne
znaczenie. W dodatku A podano pen list nazw zarezerwowanych.
Zawsze trzeba pamita, e w jzyku C ma znaczenie wielko liter. Wobec tego nazwy
zmiennych sum, Sum i SUM odnosz si do rnych zmiennych. Nazwy zmiennych mog
by dowolnie dugie, ale znaczenie maj tylko pierwsze 63 znaki, a w pewnych sytuacjach, opisanych w dodatku A, nawet tylko pierwsze 31 znakw. Zwykle nie zaleca si
stosowania dugich nazw po prostu dlatego, e wymagaj one zbyt wiele pisania. Poniszy zapis jest wprawdzie poprawny:
ilePieniedzyZarobilemOdPoczatkuTegoRoku = pieniadzeNaKoniecTegoRoku
pieniadzeNaPoczatkuTegoRoku;
39
Jzyk C ma jeszcze cztery inne podstawowe typy danych: float, double, char oraz
_Bool. Zmienna typu float moe zosta uyta dla liczb zmiennoprzecinkowych. Typ
double jest podobny do float, ale umoliwia zapisanie liczby z okoo dwukrotnie wiksz dokadnoci. Typ char moe by wykorzystany do zapisywania pojedynczego
znaku, na przykad litery a, cyfry 6 czy rednika (wicej na ten temat w dalszej czci
rozdziau). W kocu typ danych _Bool moe zawiera jedynie dwie wartoci: 0 lub 1.
Zmienne tego typu s uywane, kiedy potrzebna jest informacja w rodzaju wczone/wyczone, tak/nie czy prawda/fasz.
W jzyku C liczba, pojedynczy znak lub acuch znakw to stae, na przykad liczba 58
to staa warto cakowitoliczbowa. acuch "Programowanie w C to nieza zabawa.\n"
to przykad staego acucha znakowego. Wyraenia, ktrych wszystkie elementy s
staymi, to wyraenia stae. Wobec tego wyraenie
128 + 7 - 17
jest wyraeniem staym, gdy kady z jego elementw jest wartoci sta. Jeli jednak
i zadeklarujemy jako zmienn typu int, to wyraenie:
128 + 7 - i
40
41
Aby wywietli warto typu double, korzystamy z formantw %f, %e lub %g interpretowanych tak samo jak dla wartoci typu float.
42
Aby uatwi sobie prac ze zmiennymi typu _Bool, uywamy standardowego pliku nagwkowego <stdbool.h>, w ktrym zdefiniowano wartoci bool, true i false. Przykad jego zastosowania pokazano w programie 6.10 A z rozdziau 6.
W programie 4.1 uyto podstawowych typw danych jzyka C.
Program 4.1. Uycie podstawowych typw danych
#include <stdio.h>
int main (void)
{
int
integerVar = 100;
float
floatingVar = 331.79;
double doubleVar = 8.44e+11;
char
charVar = 'W';
_Bool
printf
printf
printf
printf
printf
boolVar = 0;
("integerVar = %i\n", integerVar);
("floatingVar = %f\n", floatingVar);
("doubleVar = %e\n", doubleVar);
("doubleVar = %g\n", doubleVar);
("charVar = %c\n", charVar);
W pierwszej instrukcji programu 4.1 deklarowana jest zmienna integerVar jako zmienna cakowitoliczbowa, przypisywana jest jej warto pocztkowa 100; zapis ten jest
rwnowany dwm osobnym wierszom:
int integerVar;
integerVar = 100;
43
kulator ma na wywietlaczu tylko okrelon liczb cyfr i std bierze si pewna niedokadno. Z tak sam niedokadnoci mamy do czynienia w naszym przypadku
pewne liczby zmiennoprzecinkowe nie daj si dokadnie zapisa w komputerze.
Kiedy wywietlamy warto zmiennej typu float lub double, mamy do dyspozycji
trzy rne formanty. %f powoduje wywietlenie wartoci w sposb standardowy. Jeli
nie okrelimy inaczej, printf zawsze wywietla wartoci float i double, pokazujc
sze cyfr czci uamkowej. W dalszej czci tego rozdziau pokaemy, jak okrela
liczb wywietlanych cyfr.
Formant %e powoduje wywietlanie wartoci float i double w notacji naukowej. Tutaj
take domylnie wywietlanych jest sze cyfr czci uamkowej.
Formant %g powoduje, e funkcja printf wybiera jeden z dwch poprzednich formantw, %f lub %e, i automatycznie usuwa wszelkie kocowe zera. Jeli nie ma adnej
czci uamkowej, kropka dziesitna te nie jest wywietlana.
Przedostatnia instrukcja printf korzysta z formantu %c i wywietla pojedynczy znak 'W',
ktry przypisalimy zmiennej charVar. Pamitajmy jeli acuch znakw (taki jak
pierwszy argument funkcji printf) jest zamknity w podwjny cudzysw, to staa znakowa musi by ujta w par apostrofw.
Ostatnia funkcja printf pokazuje, jak mona wywietli warto zmiennej _Bool przy
wykorzystaniu formantu liczb cakowitych, %i.
Okrelniki typu:
long, long long, short, unsigned i signed
Jeli bezporednio przed deklaracj typu int uyty zostanie okrelnik long, w niektrych
systemach zmienna tak utworzona bdzie miaa wikszy zakres. Przykadowa deklaracja
typu long int moe wyglda nastpujco:
long int silnia;
Deklarujemy zmienn silnia jako liczb typu long int. Tak jak w typach float
i double, konkretna dokadno zmiennej long zaley od uywanego systemu. Czsto
int i long int maj taki sam zakres i mog przechowywa liczby cakowite o wielkoci
do 32 bitw (231-1, czyli 2, 147, 483, 647).
Wartoci stae typu long int moemy tworzy, dodajc do staej liczbowej na kocu
liter L (wielk lub ma). Midzy liczb a L nie mog pojawi si adne spacje. Wobec
tego deklaracja:
long int liczbaPunktow = 131071100L;
powoduje zadeklarowanie zmiennej liczbaPunktow typu long int z wartoci pocztkow 131 071 100.
44
Jeli funkcja printf ma wywietli warto typu long int, przed znakiem typu i, o lub
x dodajemy modyfikator l (litera l). Wobec tego uywamy formantu %li, aby wywietli
warto long int w systemie dziesitnym. Aby wywietli t sam warto semkowo, stosujemy %lo, a szesnastkowo %lx.
Istnieje jeszcze typ liczb cakowitych long long. Instrukcja:
long long int maxIloscPamieci;
deklaruje liczb cakowit o rozszerzonym zakresie. W tym przypadku mamy gwarancj, e warto bdzie miaa przynajmniej 64 bity. W acuchu formatujcym printf
stosuje si dwie litery ll zamiast pojedynczej litery l, na przykad %lli.
Okrelnik long moe te wystpi przed deklaracj typu double:
long double deficyt_USA_2004;
Stae typu long double zapisujemy jak wszystkie inne stae zmiennoprzecinkowe, ale na
kocu dodajemy liter l lub L, na przykad:
1.234e+7L
Aby wywietli warto typu long double, uywamy modyfikatora L. Wobec tego %Lf
spowoduje wywietlenie wartoci long double jako zmiennoprzecinkowej, %Le w notacji naukowej, a %Lg nakae funkcji printf wybiera midzy formantami %Lf a %Le.
Specyfikator short umieszczony przed deklaracj typu int nakazuje kompilatorowi C
traktowa dan zmienn jako warto cakowit o zmniejszonym zakresie. Uycie short
jest uzasadnione przede wszystkim wtedy, gdy chodzi o oszczdno miejsca w pamici
kiedy program ju wymaga bardzo duo pamici lub ilo dostpnej pamici jest
znaczco ograniczona.
W niektrych systemach zmienne typu short int zajmuj poow miejsca przeznaczonego na zwyke zmienne int. Tak czy inaczej, mamy gwarancj, e typ short int zajmie nie mniej ni 16 bitw.
W jzyku C nie mona jawnie zdefiniowa staej typu short int. Aby wywietli zmienn typu short int, przed normalnym oznaczeniem typu cakowitoliczbowego dodajemy
liter h, czyli uywamy formantw %hi, %ho i %hx. Mona te uy dowolnej konwersji
wartoci short int, gdy i tak zostan one odpowiednio przeksztacone przy przekazywaniu do funkcji printf.
Ostatni okrelnik uywany przed typem danych int informuje, czy zamierzamy przechowywa jedynie liczby dodatnie. Deklaracja:
unsigned int licznik;
45
Przykady staych
char
'a', '\n'
%c
_Bool
0, 1
%i, %u
short int
int
%i, %x, %o
unsigned int
%u, %x, %o
long int
0xe5e5e5e5LL, 500ll
12ull, 0xffeeULL
float
double
long double
12.34l, 3.1e-5l
46
Wyraenia arytmetyczne
W jzyku C, tak jak chyba w kadym innym jzyku programowania, znak plus (+)
suy do dodawania dwch wartoci, znak minus (-) do odejmowania, gwiazdka (*) to
mnoenie, a ukonik (/) oznacza dzielenie. Operatory te nazywamy binarnymi operatorami arytmetycznymi, gdy dziaaj na dwch czynnikach.
Widzielimy ju, jak atwo w jzyku C dodawa liczby. Program 4.2 pokazuje jeszcze
odejmowanie, mnoenie i dzielenie. Ostatnie dwa dziaania prowadz do pojcia priorytetu operatora. Kady operator jzyka C ma jaki priorytet uywany do okrelania, jak
naley wylicza wyraenie zawierajce wicej ni jeden operator najpierw wyliczane
s operatory z wyszym priorytetem. Wyraenia zawierajce operatory o takim samym priorytecie s obliczane od lewej do prawej lub od prawej do lewej w zalenoci
od tego, jakich operatorw uyto, a dokadniej od ich cznoci. Pen list priorytetw
operatorw i zasady ich cznoci podano w dodatku A.
Program 4.2. Uycie operatorw arytmetycznych
// Ilustracja dziaania rnych operatorw arytmetycznych
#include <stdio.h>
int main (void)
{
int a = 100;
int b = 2;
int c = 25;
int d = 4;
int result;
result = a b;
// odejmowanie
printf ("a b = %i\n", result);
result = b * c;
// mnoenie
printf ("b * c = %i\n", result);
result = a / c;
// dzielenie
printf ("a / c = %i\n", result);
result = a + b * c;
// priorytety
printf ("a + b * c = %i\n", result);
printf ("a * b + c * d = %i\n", a * b + c * d);
return 0;
*
/
+
*
b
c
c
b
b
=
=
=
*
+
98
50
4
c = 150
c * d = 300
47
Po zadeklarowaniu zmiennych cakowitych a, b, c, d i result program przypisuje zmiennej result wynik odejmowania b od a, nastpnie wywietla wartoci przy uyciu funkcji
printf.
Nastpna instrukcja:
result = b * c;
nie da w wyniku 2550 (10225), ale odpowiednia funkcja printf pokae 150. Wynika to
std, e w jzyku C, tak jak w wikszoci innych jzykw programowania, istniej
zasady okrelajce kolejno wykonywania dziaa. W zasadzie wyraenia s przetwarzane od strony lewej do prawej. Jednak mnoenie i dzielenie maj wyszy priorytet ni
dodawanie i odejmowanie, wic wyraenie:
a + b * c
moe zosta wstawiona do programu 4.2 i ten da taki sam wynik jak poprzednio. Jeli
jednak uyjemy instrukcji:
result = (a + b) * c;
Dzieje si tak w przypadku kompilatora gcc w systemie Windows. W systemach Unix program moe nie
przerwa swojego dziaania, dajc 0 w wyniku dzielenia liczby cakowitej przez zero i nieskoczono
w przypadku dzielenia przez zero wartoci float.
48
zmienna result bdzie miaa warto 2550, gdy warto zmiennej a (100) zostanie
dodana do wartoci b (2) przed mnoeniem przez c (25). Nawiasy mog te by zagniedane wtedy wyraenie wyliczane jest w kolejnoci od nawiasw najbardziej
wewntrznych. Aby unikn pomyek, zwykle wystarczy sprawdzi, czy liczba nawiasw otwierajcych rwna jest liczbie nawiasw zamykajcych.
Z ostatniej instrukcji programu 4.2 wynika, e cakiem poprawne jest przekazywanie
do funkcji printf jako argumentu wyraenia, bez koniecznoci przypisywania zmiennej
wartoci tego wyraenia. Wyraenie:
a * b + c * d
czyli:
(100 * 2) + (25 * 4)
("6 + a / 5 *
("a / b * b =
("c / d * d =
("-a = %i\n",
return 0;
}
b = %i\n", 6 + a / 5 * b);
%i\n", a / b * b);
%f\n", c / d * d);
-a);
49
c / d * d = 25.000000
-a = -25
Do deklaracji zmiennych typu int wstawiono dodatkowe spacje, aby wyrwna wszystkie
deklarowane zmienne. Dziki temu program jest czytelniejszy. Uwani czytelnicy zauwayli te zapewne, e w pokazywanych dotd programach kady operator jest otoczony spacjami. Nie jest to niezbdne, a robione w celu poprawienia estetyki programu.
Warto doda kilka spacji, jeli czytelno programu na tym zyska.
Wyraenie z pierwszego wywoania funkcji printf w programie 4.3 wskazuje, jak istotne
s priorytety operatorw. Wyznaczanie wartoci tego wyraenia odbywa si nastpujco.
0. Dzielenie ma wyszy priorytet od dodawania, wic warto zmiennej a (25)
50
Jednoargumentowy operator minus ma priorytet wyszy od wszystkich innych operatorw arytmetycznych (wyjtkiem jest jednoargumentowy plus, o takim samym priorytecie). Wobec tego wyraenie:
c = -a * b;
Operator modulo
Teraz omwimy operator modulo, oznaczany symbolem procenta %. Na podstawie
programu 4.4 sprbujmy zorientowa si, jak dziaa ten operator.
Program 4.4. Uycie operatora modulo
// Operator modulo
#include <stdio.h>
int main (void)
{
int a = 25, b = 5, c = 10, d = 7;
printf
printf
printf
printf
("a
("a
("a
("a
%% b = %i\n", a % b);
%% c = %i\n", a % c);
%% d = %i\n", a % d);
/ d * d + a %% d = %i\n",
a / d * d + a % d);
return 0;
}
%
%
%
/
b
c
d
d
=
=
=
*
0
5
4
d + a % d = 25
51
Ostatni wiersz wynikowy programu 4.4 wymaga pewnego wyjanienia. Najpierw zauwamy, e odpowiednia instrukcja zostaa zapisana w dwch wierszach. W jzyku C
jest to jak najbardziej dopuszczalne. Instrukcja moe by przeniesiona do nastpnego
wiersza podzia moliwy jest wszdzie tam, gdzie moe wystpi spacja (wyjtkiem s acuchy znakowe, ktre dokadnie bdziemy omawia w rozdziale 10.). Czasami dzielenie programu na kilka wierszy moe by nie tylko przydatne, ale wprost niezbdne. W programie 4.4 przeniesiona do nastpnego wiersza cz instrukcji printf
jest wcita, aby podzia instrukcji na czci by dobrze widoczny.
Zwrmy uwag na wyraenie obliczane w ostatniej instrukcji. Przypomnijmy, e
wszystkie obliczenia na liczbach cakowitych wykonywane s zgodnie z arytmetyk
cakowitoliczbow, zatem reszta uzyskiwana z dzielenia dwch liczb cakowitych jest
po prostu odrzucana. Wobec tego dzielenie 25 przez 7, wynikajce z wyraenia a / d,
daje wynik poredni 3. Mnoc t warto przez d, czyli 7, uzyskamy poredni wynik
21. W kocu, dodajc reszt z dzielenia a przez d (wyraenie a % d), otrzymujemy
ostatecznie 25. Nie jest przypadkiem, e jest to ta sama warto, jak pocztkowo
miaa zmienna a. Oglnie rzecz biorc, wyraenie:
a / b * b + a % b
52
return 0;
53
zawiera nowy operator operator rzutowania. Operator ten powoduje konwersj zmiennej i2 na typ float na potrzeby pokazanego wyraenia. Nie wpywa jednak w trway
sposb na zmienn i2; jest to jednoargumentowy operator zachowujcy si tak, jak
wszystkie inne operatory. Wyraenie a nie ma adnego trwaego wpywu na warto a, tak
samo trwaego wpywu nie ma wyraenie (float) a.
Operator rzutowania typw ma priorytet wyszy ni wszelkie operatory arytmetyczne
poza jednoargumentowymi plusem i minusem. Oczywicie w razie potrzeby mona
uy nawiasw, aby wymusi podan kolejno oblicze. Innym przykadem uycia operatora rzutowania jest wyraenie:
(int) 29.55 + (int) 21.99
Wyraenie:
licznik -= 5
powoduje odjcie od zmiennej licznik wartoci 5 i zapisanie wyniku z powrotem w zmiennej licznik; jest rwnowane wyraeniu:
54
ktre dzieli a przez wyraenie po prawej stronie; w tym wypadku sum b i c, a nastpnie
iloraz przypisuje zmiennej a. Dodawanie jest wykonywane jako pierwsze, gdy operator
dodawania ma wyszy priorytet od operatora przypisania. Zreszt wszystkie operatory
poza przecinkiem maj priorytety wysze od operatorw przypisania; z kolei
wszystkie operatory przypisania maj taki sam priorytet.
Pokazane wczeniej wyraenie bdzie zatem rwnowane nastpujcemu:
a = a / (b + c)
wiczenia
0. Przepisz i uruchom pi programw pokazanych w tym rozdziale. Uzyskane
char
Xx
_1312
_
6_05
alpha_beta_routine
z
A$
0x10.5
0xFFFF
0L
0X0G1
123L
-597.25
W chwili pisania tej ksiki kompilator gcc w wersji 3.3 nie obsugiwa tych typw w peni.
.0001
98.7U
-12E-12
1.2Fe-7
197u
0xabcdu
+12
17777s
07777
15,000
100U
+123
return 0;
3x35x2+6
dla x = 2.55.
0. Napisz program wyznaczajcy warto poniszego wyraenia i pokazujcy
= 256 + 7 256 % 7
= 256 + 7 4
= 259
365
12,258
996
7
23
4
55