W poprzednim odcinku opisałem instalację i konfigurację kompilatora VBCC, krótko przedstawiłem istotę języka C oraz podałem prosty przykład do skompilowania. Zajmijmy się teraz tym przykładem.
Programy napisane w C składają się głownie z funkcji i zmiennych. Funkcja składa się z instrukcji, które mówią jakie czynności procesu obliczeniowego należy wykonać, natomiast zmienne przechowują wartości, które są w tym procesie używane. Funkcje w języku C są podobne do funkcji lub procedur Amosa czy Pascala. Wróćmy jednak do naszego przykładu:
#include <stdio.h> main() { printf("Pierwszy program napisany w C, pod VBCC\n"); return(0); }
W naszym programie pierwszą funkcją jest main, która jest funkcją specjalną, gdyż nasze programy zawsze rozpoczynają działanie właśnie od tej funkcji i jest ona zawsze wymagana w naszym programie. Linijka #include <stdio.h> mówi kompilatorowi, że należy do programu dołączyć plik stdio.h, który jest informacją o standardowej bibliotece wejścia-wyjścia, z której w naszym programie pochodzi funkcja printf.
Aby przekazać jakieś dane do funkcji (np: tekst do funkcji printf ), należy przekazać funkcji odpowiednie argumenty, które wstawiamy między nawiasy okrągłe funkcji np: printf("Amiga Rulez");. Funkcja ta pochodzi z biblioteki standardowej i wypisuje tekst na wyjście, czyli w naszym przypadku na ekran monitora. W naszym przykładzie funkcja ta dostaje argument "Pierwszy program napisany w C, pod VBCCn", którym jest tutaj tekst ujęty w cudzysłów. Ten ciąg znaków nazywa się stałą napisową lub napisem. W naszym przykładzie występuje jeszcze sekwencja \n, która w języku C oznacza znak nowego wiersza, a w praktyce kończy pisanie w danym wierszu i przenosi kursor do nowego. Kompilator sam nie dostawia tej sekwencji na koniec naszego napisu, dlatego np:
printf("Pierwszy program "); printf("napisany w C, pod VBCC\n");
będzie po skompilowaniu wyglądało jak napis generowany przez nasz program. W języku C takie sekwencje jak \n, zwą się sekwencjami specjalnymi i są dobrym sposobem na przedstawienie znaków nie graficznych jak: znak tabulacji TAB (t), znak cofania BACKSPACE (b) oraz " dla znaku cudzysłowia, czy / dla samego (jednego) backslasha .
Trochę inną funkcją jest main, która nie oczekuje żadnych argumentów (a przynajmniej nie jest to nam na razie potrzebne), co pokazują nam puste nawiasy (). Instrukcje, które są wykonywane przez funkcję są zawarte w nawiasach klamrowych, a w naszym przykładzie są dwie instrukcję wykonywane przez main:
printf("Pierwszy program napisany w C, pod VBCC\n"); return(0);
return(0); nakazuje skończyć program z kodem końcowym równym 0, czyli informuje że program zakończył pracę pomyślnie. Należy też pamiętać, że w języku C, na końcu każdej instrukcji, deklaracji zmiennej czy funkcji, występuje średnik (;). Należy o tym pamiętać, gdyż początkujący programiści zawsze zapominają o dodawaniu średnika na koniec każdej instrukcji.
Warto sprawdzić działanie programu, kompilując go np. bez funkcji exit albo z innymi sekwencjami w funkcji printf, jak np. a. Warto zapoznać się z błędami generowanymi przez kompilator, można robić symulacje błedów, aby się z nimi zapoznać i wiedzieć co one oznaczają. W kompilatorze VBCC, błedy są pokazywane w konsoli (bądź w programie vbrowse) wraz z numerem linii w edytorze, w której dany błąd wystąpił.
Inna sprawa to komentarze w języku C, czyli obszary, które są ignorowane przez kompilator. Komentarze umieszczamy między /*, a */. Można tam umieszczać dowolny tekst, który np. będzie nas informował co dany fragment kodu programu oznacza.
/* Przykład tekstu, który jest ignorowany prze kompilator, tutaj możesz wpisać cokolwiek */
W języku C++ komentarze zaczynają się od //,np.
// Przykład tekstu, który jest ignorowany prze kompilator, tutaj możesz wpisać // cokolwiek
Aby kompilator vbcc poprawnie interpretował komentarze z C++, należy wywoływać go z opcją -+ bądź -cpp-comments.
W języku C, zanim użyjemy zmiennej, musimy ją najpierw zadeklarować. Zmienne deklarujemy poprzez podanie typu zmiennej oraz jej nazwę lub listę zmiennych np.
int zmienna; /* deklaracja zmiennej "zmienna" o typie int */ int raz,dwa trzy; /* deklaracja zmiennych "raz,dwa,trzy" o typie int */
Typ int oznacza, że zdeklarowane zmienne będą liczbami całkowitymi z
przedziału -32768 i +32767.
Oto lista podstawowych typów w C:
int - liczba całkowita,
float - liczba zmiennopozycyjna, (ułamki)
char - znak - jeden bajt,
short - liczba całkowita krótka,
long - liczba całkowita długa,
double - liczba zmiennopozycyjna podwójnej precyzji.
Wynika z tego że deklarować możemy zmienne różnego typu:
#include <stdio.h> main() { int liczba; float ulamek; char literka; short krotka; long dluga; double prec; return(0); }
Każdej zmiennej możemy przypisać wartości poprzez instrukcje przypisania:
liczba = 10;
Po tej operacji zmienna liczba będzie miała wartość 10. Instrukcje przypisania mogą też wyglądać tak:
liczba = liczba + 2;
co oznacza, że zmienna liczba po tej operacji będzie większa o 2. Napiszmy teraz mały programik:
#include <stdio.h> main() { int liczba,kwadrat; /* deklaracja zmiennych liczba i kwadrat */ liczba = 1; /* Przypisanie zmiennej liczba wartości 1 */ /* "Serce" programu,pętla while */ while ( liczba <= 10) { kwadrat = (liczba * liczba); printf("%d %d\n",liczba,kwadrat); liczba = liczba + 1; } return(0); }
Program ten wypisuje w jednej kolumnie wartosci od 1 do 10, a w drugiej ich kwadraty.
W programie użyliśmy pętle while (dopóki), której działanie jest następujące: While sprawdza czy warunek ujęty w nawiasy okrągłe jest prawdziwy (u nas zmienna "liczba" mniejsza lub równa 10), a jeżeli jest on prawdziwy to wykonuje instrukcje zawarte w między nawiasami klamrowymi. Instrukcje które znajdują się w nawiasach klamrowych warto pisać z wcięciem, tak jak pokazane jest to w przykładzie, gdyż kod żródłowy programu będzie wtedy bardziej czytelny.
Sekwencja "( liczba <= 10)" oznacza "liczba mniejsza lub równa 10", co daje nam pewność
że wartość zmiennej liczba nie przekroczy wartości 10. Inne takie warunki to:
a < b a mniejsze od b,
a > b b mniejsze od a,
a >= b a większe lub równe b,
a <= b a mniejsze lub równe b,
a != b a różne od b.
Sekwencja "kwadrat = (liczba * liczba)" przypisuje zmiennej "kwadrat" iloczyn zmiennej "liczba" pomnożonej przez siebie (czyli jej kwadrat).
Pozostałymi funkcjami zajmiemy się w następnym odcinku, a teraz proponuje skompilować i uruchomić ten program. Można też dla zmiennych podać inne wartości i zobaczyć jaki będzie wynik.