Blog literacki, portal erotyczny - seks i humor nie z tej ziemi
INDEX
Programowanie w CZaczynamy...
Identyfikator
Zanim zaczniemy powiemy sobie coś o podstawowych elementach języka. Identyfikatory to słowa, którymi oznaczamy obiekty programu źródłowego, takie jak nazwy zmiennych i funkcji czy definicje struktur itp. W języku programowania C identyfikator składa się z liter, cyfr oraz znaku podkreślenia: _ (underline), przy czym musi zaczynać się od litery lub znaku podkreślenia.
Niektóre kompilatory dopuszczają stosowanie znaku dolara (dollar sign) w nazwach identyfikatorów, ale nigdy na pierwszym miejscu. Jednak nie jest to powszechnie stosowane przez programistów (kod programu nie jest kompatybilny z innymi kompilatorami: non-portable TT), tudzież nigdy nie będzie przez nas używane.
Przy konstruowaniu identyfikatorów musimy pamiętać o dwóch podstawowych zasadach:
Litery małe i wielkie uważa się za różne. Identyfikatory INDEX, index, InDeX nie są zatem tożsame. Możemy ich użyć w jednym programie do nazwania trzech różnych zmiennych; nie jest to jednak zalecane - nazwy powinny różnić się od siebie znaczeniem adekwatnym do sytuacji. Standardowo za znaczące uważa się pierwsze 32 znaki nazwy identyfikatora. Większość kompilatorów dopuszcza stosowanie dłuższych nazw, lecz znaki po 32 mogą być zignorowane przez kompilator. Warto dodać, że nigdy nie ma potrzeby używania tak długich identyfikatorów.
Elementy programu
Ogólnie program w języku C składa się z:
dyrektyw preprocesora
komentarzy
deklaracji
instrukcji
Dyrektywy preprocesora
Dyrektywy preprocesora zajmują pełne wiersze i zaczynają się od znaku # (hash). Najczęściej spotykaną dyrektywą jest linia postaci: #include <nazwa_pliku>, gdzie nazwa_pliku jest nazwą pliku nagłówkowego (header file). Dyrektywa ta odpowiada instrukcji uses z Turbo Pascala. Wymieniony plik zostaje przed kompilacją w całości włączony do programu i najczęściej zawiera deklaracje funkcji standardowych.
Komentarze
Komentarze - które ułatwiają życie każdemu, kto pracuje nad tekstem źródłowym programu - mogą być dwojakiego rodzaju:
/* Komentarz */
// Komentarz
W pierwszym przypadku tekst komentarza może być jedno- lub wielowierszowym napisem nie zawierającym dwuznaku */ (gwiazdka, ukośnik). Natomiast po dwóch ukośnikach komentarz jest napisem mieszczącym się w jednym wierszu. Ta ostatnia metoda jest bardzo powszechna i wygodna (większość kompilatorów ją akceptuje), mimo że nie jest częścią standardu ANSI C.
Pierwszy program w C
Spójrzmy teraz na przykładowy program w C (banalny.c). Jest to najprostsza z możliwych konstrukcja językowa w C. Mimo iż program jest prawidłowy, jednak nie robi on zupełnie nic. Po skompilowaniu i uruchomieniu nie stanie się nic.
listing pliku banalny.c:
1 int main(void)
2 {
3 return 0;
4 }
W pierwszej linii znajduje się bardzo ważne słowo main. Jest to główna funkcja programu; musi ona wystąpić w programie dokładnie jeden raz. Od tej funkcji rozpoczyna się wykonywanie programu. Oczywiście nie musi wystąpić zaraz na początku kodu, lecz pamiętajmy, że jest to taki punkt wyjściowy dla reszty programu. Taka deklaracja funkcji, jak w naszym przykładzie nazywana jest definicją funkcji. Definicja funkcji składa się z nagłówka oraz ciała.
Nagłówek funkcji
W naszym przypadku nagłówek ma postać: int main(void), lecz można w nim pominąć zarówno słowo int, jak i słowo void. Jeśli przed nazwą funkcji nie ma określenia jej typu, funkcja jest domyślnie typu int, tzn. jej rezultat jest liczbą całkowitą (integer). Funkcja może wymagać pewnych parametrów w celu właściwego wykonania. Określenia tych parametrów umieszczamy w nawiasach okrągłych (parentheses) za nazwą funkcji. Puste nawiasy oznaczają, że funkcja jest bezparametrowa, co można podkreślić słowem kluczowym void. Aby uruchomić program wystarczy w linii poleceń wpisać jego nazwę. Podsumowując cztery poniższe nagłówki są sobie równoważne:
int main(void)
int main()
main(void)
main()
Ciało funkcji
Ciało funkcji jest ujęte w klamry (braces). Całość kodu wewnątrz klamr odnosi się do funkcji (tutaj funkcji main). W naszym przypadku istnieje tylko jedno zdanie w ciele funkcji - jest to przekazanie systemowi operacyjnemu argumentu instrukcji return (tu danej o wartości zero; jest to znak pomyślnego zakończenia programu, tzw. kod sukcesu).
Zwróćmy uwagę na średnik (semi-colon) kończący linę 3. Jest to charakterystyczna cecha języka C. Średnik jest zakończeniem zdania.
Niektóre kompilatory wymagają, aby główna funkcja programu była typu int. Istnieje bowiem możliwość zdefiniowania funkcji tak, aby nie udostępniała rezultatu - poprzez określenie jej typu jako void. Nagłówek ma wtedy postać void main(void). Chciałbym tutaj podkreślić, że pomimo dopuszczenia przez niektóre kompilatory takiej formuły, deklaracja funkcji main, jako typu void jest niepoprawna (vide: C-faq by Steve Summit).
Analizowany wcześniej program uzupełniony komentarzami (koment.c) ma postać:
1 /* Program 1.2 - koment.c */
2
3 int main(void) // Funkcja główna
4 {
5 return 0; /* Zwrot zera (kodu
6 sukcesu) do systemu */
7 }
8
9 /* Koniec programu */
Program, który coś wykonuje
Drugim przykładem niech będzie program, który wysyła na ekran monitora tekst powitania w języku angielskim (hello.c).
1 #include <stdio.h>
2
3 int main(void)
4 {
5 printf("Hello, world");
6
7 return 0;
8 }
Są tutaj dwa nowe elementy: dyrektywa preprocesora #include oraz wywołanie nowej funkcji printf. Funkcja printf służy do wyprowadzania danych na standardowe wyjście (domyślnie wyprowadza tekst na ekran monitora). Jest to funkcja standardowa, której prototyp znajduje się w pliku stdio.h. Powinien być on dostarczany wraz z kompilatorem (często można go znaleźć w podkatalogu o nazwie include). Kompilator musi wiedzieć gdzie szukać prototypu funkcji, dlatego plik stdio.h włączamy dyrektywą #include do programu. Zauważmy, że dyrektywa jest umieszczana na początku kodu źródłowego.
Nazwa pliku nagłówkowego może też być otoczona nie przez znaki nierówności lecz przez cudzysłów. Tak najczęściej włączane są pliki niestandardowe, przygotowane przez programistę na cel projektu. Taka forma oznacza, iż plik będzie poszukiwany nie tylko w katalogu z bibliotekami standardowymi, lecz również w katalogu bieżącym.
Po skompilowaniu i uruchomieniu w środowisku DOS ukaże się naszym oczom napis Hello, world. Jeśli uruchomimy program w Windows, to program wykona się i zakończy natychmiast, a my nie zdążymy zobaczyć żadnego efektu. Jak temu zaradzić? Istnieje kilka sposobów. My użyjemy tutaj konstrukcji while (getchar() != '\n'){;}, która pozwoli zakończyć program dopiero po naciśnięciu klawisza ENTER. Czasem wystarczy wpisać tylko getchar();, aby uzyskać ten sam efekt bez utrudnień ze strony kompilatora. Można również spotkać inne instrukcje końcowe, np.:
getch(); lub while (!kbhit()); prototypy w pliku conio.h (plik zawarty w bibliotekach produktów Borlanda, ale nie tylko)
system("pause"); prototyp w pliku stdlib.h
Polecenia getch() oraz konstrukcja while (!kbhit()); czeka na naciśnięcie dowolnego klawisza, natomiast funkcja system("nazwa_komendy") pozwala na wykonanie zawartej w nawiasach komendy systemowej przez system operacyjny. W systemie DOS komenda pause jest swego rodzaju przerywnikiem, wyświetla komunikat: Naciśnij dowolny klawisz, aby kontynuować . . . Dopiero po naciśnięciu jakiegoś klawisza system operacyjny może kontynuować interpretowanie następnych poleceń.
INDEX