Wglab_jezyka_C_-_A.Sapek.pdf

(1016 KB) Pobierz
199648830 UNPDF
199648830.003.png 199648830.004.png
 
Spis treści
I. Programowanie niestrukturalne
3
1. Instrukcje break i continue
4
2. Instrukcja goto
7
3. Instrukcja switch
8
4. Optymalizacja
13
II. Preprocesor
16
1. Dyrektywa preprocesora 16
1.1. Dyrektywa #pragma 16
1.2. Dyrektywa include 16
1.3. Dyrektywy #if, #ifdef, # ifndef, #else, #endif 18
1.4. Dyrektywy #define i #undef 20
2. Zastosowania dyrektywy #define 23
2.1 Definiowanie „stałych” 23
2.2. Makrodefinicje 25
2.3. Inne zastosowania definicji identyfikatorów 27
III. Formatowanie wejście/wyjście
33
1. Funkcje ze zmienną liczbą argumentów
32
2. Funkcje formatowanego wyjścia
37
2.1 Funkcja printf
37
2.2. Funkcja fprintf
40
2.3. Funkcja sprintf
41
2.4. Funkcje vprintf, vfprintf, vsprintf
41
2.5. Funkcja cprintf
43
3. Funkcje formatowanego wejścia
44
3.1. Funkcja scanf
44
3.2. Standardowe wejście
49
3.3. Funkcja fscanf
50
3.4. Funkcja sscanf
54
3.5. Funkcja cscanf
56
3.6. Funkcje vscanf, vfscanf i vsscanf
56
4. Zastosowania funkcji formatowanego wejścia/wyjścia
57
4.1 Projektowanie wyglądu ekranu
57
4.2. Reprezentacja rekordów w pliku
59
IV. Programowanie współbieżne
62
1. Dlaczego współbieżność?
62
2. Funkcje setljmp i longjmp
63
3. Przełączanie zadań
64
4. Zapis praktyczny
66
5. Program współbieżny
70
6. Komunikacja między procesami
75
7. Współbieżne wejście z klawiatury
80
V. Kod wynikowy
83
1. Zmieniamy Startup
84
2. Programy rezydentne
88
2.1 Jakie są zastosowania programów rezydentnych?
88
2.2 Tworzenie programów rezydentnych
89
2.3 Funkcja main jako program rezydentny
89
3 Przykładowe programy rezydentne
94
199648830.005.png
Wgłąb języka C
Wydawnictwo Helion
199648830.001.png 199648830.002.png
2
Wgłąb języka C
PRZEDMOWA
Niniejsza książka jest pomyślana jako książka dla programistów. Nie stanowi
ona całościowego, systematycznego opisu języka C i nie jest książką do nauki
programowania. Mam natomiast nadzieję, że będzie ona pożyteczna dla każde-
go, kto zna i używa języka C. Można na tę książkę spojrzeć na dwa sposoby.
Z jednej strony zawiera ona bardzo solidne i dogłębne opisy pewnych zagadnień
i może służyć jako podręcznik, do którego się często sięga w pracy (takie są roz-
działy o funkcjach formatowanego wejścia-wyjścia i preprocesorze). Z drugiej
zaś strony książka ta pełna jest perełek, nietypowych konstrukcji i zastosowań
języka. Słowem, nawet zaawansowani programiści znajdą tu coś ciekawego.
Rozdziały są właściwie niezależne od siebie i mogą być czytane w dowolnej
kolejności. Tym nie mniej, są one ułożone kolejno, według rosnącego stopnia
trudności i czytane po kolei będą najłatwiejsze do zrozumienia. Poza tym, przed
przeczytaniem rozdziału o programowaniu współbieżnym, w którym bardzo in-
tensywnie jest używany preprocesor, radzę przeczytać rozdział o preprocesorze.
Na deser radzę zostawić ostatni rozdział o niewiele mówiącym tytule "Kod wy-
nikowy". Opisuję w nim między innymi jak kompilować programy w C żeby
otrzymać kod o długości rzędu 50 bajtów i jak automatycznie zamienić zwykły
program w program rezydentny. Po przeczytaniu tego rozdziału trudno będzie
się oprzeć przed spędzeniem nocy przy komputerze.
Gliwice 29.05.1993
A.S.
I. Programowanie niestrukturalne
3
I. Programowanie niestrukturalne
Tytuł może trochę dziwić: w książkach o programowaniu można raczej spotkać
rozdziały o programowaniu strukturalnym. Wielu programistów i autorów ma do
sprawy strukturalności stosunek dogmatyczny, nie dopuszczając żadnych od-
stępstw. Ja chciałbym tutaj wziąć w obronę "wyklęte niestrukturalności" i przy
okazji przedstawić sposób ich realizacji w języku C. Rozdział ten przedstawia
zarówno zastosowania konstrukcji niestrukturalnych w "solidnym" programowa-
niu, jak i pewne "sztuczki". W niektórych przykładach pokażę, że czasami algo-
rytm niestrukturalny może dać bardziej czytelny program. Znajdą się w tym
rozdziale także konstrukcje nietypowe, prawdopodobnie mniej czytelne,
w których niestrukturalność zastosowano w celu otrzymania bardzo zwięzłego
kodu.
Przyjęcie takiej zasady jest na ogół słuszne i zmusza do bardziej porządnego kon-
struowania programu (piszę "zmusza", bo w wielu przypadkach zapisanie algoryt-
mu w sposób strukturalny jest trudniejsze). Czasami jednak podporządkowanie się
tej zasadzie powoduje zbytnie zagnieżdżenie struktur programu i czyni go mniej
czytelnym. W takiej sytuacji należy oczywiście zastosować rozwiązanie dające
program bardziej przejrzysty, nawet jeśli jest ono niestrukturalne. Innym powodem
zastosowania konstrukcji niestrukturalnej jest chęć skrócenia kodu wynikowego
(na przykład w programach rezydentnych). W takich sytuacjach mądrze zaplano-
wany skok pozwala często uniknąć zbędnego powtarzania jakiejś sekwencji in-
strukcji.
while
Przypomnijmy najpierw, na czym polega programowanie strukturalne. Zakłada
ono, że sterowanie nie może być przekazywane przy pomocy żadnych instrukcji
skoku z wyjątkiem tych "zaszytych" w instrukcjach sterowania pętli ( for
Zgłoś jeśli naruszono regulamin