[ Pobierz całość w formacie PDF ]

1. Wprowadzenie do kursu




Są dwa powody, dla których zdecydowałem się napisać kurs języka C. Pierwszy jest taki, że nie udało mi się znaleźć w internecie strony, która zawierałaby taki kurs w języku polskim. Owszem, można znaleźć kilka tego typu publikacji, ale wszystkie są napisane w języku angielskim. Drugiego powodu, który skłonił mnie do tego kroku nie zdradzę, ale pewna grupa ludzi wie o co chodzi (sorry, że tak wyszło, ale sami chcieliście ;) Przejdźmy wreszcie do rzeczy...

Na wstępie chciałbym przedstawić założenia, jakie przyjąłem odnośnie Twojej wiedzy oraz kilka ogólnych informacji dotyczących języka C.

Język C, podobnie jak Pascal, jest językiem strukturalnym. Jednak w przeciwieństwie do Pascala jest on o wiele mniej rygorystyczny w stosunku do programisty, dzięki czemu osoba pisząca program w C ma o wiele większą swobodę działania. Poza tym język ten jest bardziej kompaktowy - w jednej linijce programu w C można zawrzeć to, co w przypadku Pascala zajęłoby dziesięć. Niektórzy uważają to za wadę, bo powoduje to trudności w późniejszym analizowaniu kodu programu, jednak według mnie jest to ogromna zaleta tego języka. To programista decyduje tu jak ma wyglądać jego program - jeśli chce czysty, przejrzysty kod to pisze dziesięć linijek kodu, ale jeśli wygodniej jest mu to samo zawrzeć w jednej linijce to dlaczego standard języka miałby go ograniczać ?

Jednak mimo tego (a może właśnie dlatego) sądzę, że język C nie powinien być pierwszym językiem programowania, który się poznaje. Według mnie powinno się zacząć o bardziej "szkoleniowego" języka jakim jest Pascal. Dopiero po zapoznaniu się z ogólnymi koncepcjami programowania można myśleć o rozpoczęciu nauki języka C. Dlatego też nie będę w tym kursie tłumaczył takich podstawowych pojęć jak np. zmienna. Zakładam, że masz już ogólne pojęcie o programowaniu. Do zrozumienia tego kursu nie będzie jednak konieczna znajomość Pascala, może to być dowolny inny język programowania. Będzie to jednak bardzo pomocne, gdyż często będę podawał odpowiedniki danej instrukcji właśnie w tym języku. Powinieneś także pamiętać, że samo przeczytanie tego kursu nic Ci nie da. Ja przekażę Ci tylko koncepcję języka, jego słowa kluczowe i przykłady ich zastosowania, jednak umiejętność praktycznego ich wykorzystania nabędziesz tylko i wyłącznie podczas samodzielnego pisania programów w języku C. Tak więc pamiętaj - ćwiczyć, ćwiczyć i jeszcze raz ćwiczyć !

Dołożyłem wszelkich starań, aby kurs ten w sposób jasny i czytelny przedstawiał zasady pisania w języku C. Jeśli jednak coś jest nie do końca zrozumiałe to możesz do mnie napisać. Mój email to motzel@panda.bg.univ.gda.pl lub motzel@polbox.com. Preferuję ten pierwszy, jeśli jednak on nie działa (bo na przykład oblałem jakiś egzamin i wyrzucili mnie ze studiów ;) to napisz na drugi. Postaram się w miarę możliwości wytłumaczyć dane zagadnienie. Proszę jednak, żebyś z pytaniami wstrzymał się aż do momentu, gdy przeczytasz punkt "Mój pierwszy program". Do tego momentu coś może wydawać się niejasne ponieważ brak jest odpowiednich przykładów, jednak ten pierwszy program powinien rozwiać wszelkie wątpliwości.
Mam też prośbę do osób znających już język C, a czytających ten kurs (są tacy ?). Jeśli znaleźliście jakieś nieścisłości lub też po prostu błędy, to proszę o informację, abym mógł to poprawić.

Wszystkie przykładowe programy przedstawione w tym kursie były kompilowane przy użyciu DJGPP (jest to dosowa wersja gcc, znanego z systemów unixowych), jednak powinny kompilować się bez problemu przy użyciu dowolnego innego kompilatora C. Możesz je zsciągnąć w postaci pliku . Zakładając, że używasz tego samego kompilatora, aby skompilować te pliki musisz wydać polecenie:

gcc nazwa.c -o nazwa.exe

Po poprawnej kompilacji na dysku zostanie utworzony plik exe, który jest gotowym do uruchomienia programem.



 

2. Wprowadzenie do języka C




Program w języku C jest podzielony na bloki zawarte między nawiasami klamrowymi { i } (są to odpowiedniki "begin" i "end" z Pascala). Każdy blok może być kompletną funkcją, albo po prostu fragmentem kodu w ramach danej funkcji. Funkcja jest to po prostu wydzielona cząstka programu, która wykonuje jakieś zadanie (np. oblicza pole powierzchni prostokąta o danych bokach). W każdym programie napisanym w języku C musi znaleźć się funkcja o nazwie "main". Jest to główna programu, od której zaczyna on swój bieg. Najprostszy program w języku C wygląda więc tak:
 

void main(void)

{

}

Pomińmy na razie słówko "void" (przejdziemy do tego w następnym punkcie) i przeanalizujmy ten program. Mamy tutaj jedną, jedyną funkcję "main", która w naszym przypadku nie zawiera żadnego kodu (czyli nic nie robi). Jak widzimy definicja funkcji składa się z nagłówka, który określa jej nazwę, parametry wejściowe i rodzaj zwracanej wartości (to także omówimy później) oraz z właściwego ciała funkcji zawartego między { i } . Zapisując to inaczej definicja funkcji wygląda to tak:

typ_zwracanej_wartości nazwa_funkcji(lista parametrów)

{

}

Analogiczna definicja funkcji w Pascalu wygląda tak:

function nazwa_funkcji(lista parametrów) : typ_zwracanej_wartości;

begin

end;

Podobne, prawda ?

Na uwagę zasługuje jeszcze fakt, że po nazwie funkcji w języku C nie stawiamy średnika, tak jak to było w Pascalu. Jest to sensowne ponieważ średnik symbolizuje zakończenie pewnej logicznej całości, a tu mamy do czynienia z sytuacją wręcz przeciwną - od tego miejsca funkcja się zaczyna, nie kończy.

Na zakończenie tego punktu powiemy sobie jeszcze o zasadach konstrukcji nazw funkcji (tyczy to się także nazw zmiennych, o których będzie następny punkt). W języku C każdy identyfikator musi zaczynać się od litery, albo od podkreślenia dolnego "_". Pozostałe znaki identyfikatora mogą oprócz liter i "_" zawierać także cyfry. Długość jest ograniczona do 32 znaków (może być większa, ale pozostałe znaki są po prostu ignorowane). I tutaj ważna uwaga: język C rozróżnia wielkość liter, tak więc "PoleProstokata" i "poleprostokata" to dwie różne nazwy ! Szczególnie muszą uważać osoby, które pisały wcześniej w języku Pascal (w którym jest brak takiego rozróżnienia), gdyż może prowadzić to do trudnych do zlokalizowania błędów.



 

3. Typy danych




W języku C są cztery podstawowe proste typy danych: znak, liczba całkowita, liczba rzeczywista i typ bezwartościowy. Typy te można nieco zmodyfikować poprzez dodanie przy deklaracji następujących słów: "signed", aby uzyskać liczbę ze znakiem (jest to ustawienie domyślne); "unsigned", aby uzyskać liczbę bez znaku; "short", aby zmniejszyć wielkość zmiennej (ale zmniejszeniu ulega także zakres); "long", aby zwiększyć wielkość zmiennej (zwiększeniu ulega zakres, ale zmienna zajmuje więcej miejsca w pamięci).

Poniższa tabela zawiera wspomniane typy:
 

Nazwa typu

Typ

Zakres

Wielkość (w bajtach)

Uwagi

char

całkowity

-128..127

1

 

unsigned char

całkowity

0..255

1

 

int

całkowity

-2^31..2^31-1

4

Na kompilatorach 16 bitowych ma 2 bajty

unsigned int

całkowity

0..2^32

4

Na kompilatorach 16 bitowych ma 2 bajty

short int

całkowity

-32768..32767

2

 

unsigned short int

całkowity

0..65535

2

 

long int

całkowity

-2^31..2^31-1

4

 

unsigned long int

całkowity

0..2^32

4

 

float

rzeczywisty

6 znaków precyzji

4

 

double

rzeczywisty

10 znaków precyzji

8

 


Jak widać w przypadku wielkość zmiennej mierzona w bajtach jest wprost proporcjonalna do zakresu danych, jaki może ona przechowywać. Dla zmiennych całkowitych zakres ten wynosi od 0 do 2^n (w przypadku liczb bez znaku), lub od -2^n do 2^n-1 (w przypadku liczb ze znakiem), gdzie n to ilość _bitów_ na których zapisana jest zmienna. Dla przypomnienia: jeden bajt ma osiem bitów...

Deklaracja zmiennej wygląda tak:

typ_danych nazwa_zmiennej; (czyli dokładnie odwrotnie niż w Pascalu, w którym było: "nazwa_zmiennej : typ_danych;")


Czyli, jeśli chcemy zadeklarować zmienną znakową o nazwie "znak" to robimy to w ten sposób:

char znak;

W tym miejscu muszę także przedstawić jeden z ważniejszych operatorów języka C (pozostałe zostaną opisane w następnych punktach). Jest to oczywiście operator przypisania "=". Zapewne już wiesz do czego on służy, ale dla dopełnienia formalności napiszę, że przypisuje wartość wyrażenia z lewej strony do zmiennej umiejscowionej po prawej jego stronie. Operator ten to oczywiście odpowiednik Pascalowego ":=". Od razu przedstawię praktyczne jego zastosowanie - zadeklarujemy zmienna taką, jak w powyższym przykładzie i przypiszemy jej wartość początkową:

char znak='A';

Konstrukcja taka nie występuje w Pascalu, gdzie blok deklaracji zmiennych jest wydzielony i trzeba do osiągnięcia tego samego celu wpisać dwie linijki kodu.


Deklaracja zmiennej całkowitej o nazwie "dlugosc" (wraz z przypisaniem jej wartości początkowej) wygląda tak:

unsigned long int dlugosc=5;


Natomiast deklaracja zmiennej rzeczywistej o nazwie "pole" (wraz z przypisaniem jej wartości początkowej) tak:

float pole=3.48;

Jak widzimy w powyższym przykładzie część całkowitą oddzielamy od części ułamkowej przy pomocy kropki, nie przecinka !


Tutaj ważna uwaga. Deklaracja wszystkich zmiennych musi być wpisana na logicznego początku bloku programu (czyli zaraz za znakiem { , który to taki blok rozpoczyna). Zmienna taka jest lokalna, czyli jest dostępna tylko wewnątrz bloku, w którym jest zadeklarowana.

Do omówienia pozostał jeszcze typ bezwartościowy - jak się zapewne domyślacie, jest to wspomniane w poprzednim punkcie "void". Nie jest to typ danych w ścisłym tego słowa znaczeniu ponieważ nie można utworzyć zmiennej tego typu (można jednak utworzyć zmienną typu wskaźnik na void, ale to omówię gdzieś pod koniec tego kursu). Służy on głownie do deklaracji, że funkcja nie zwraca lub też nie przyjmuje żadnych danych. Czyli przykład z pierwszego punktu:

void main(void)

można przetłumaczyć jako informację dla kompilatora, że chcemy zdefiniować funkcję o nazwie "main", która nie zwraca żadnej wartości oraz nie przyjmuje żadnych parametrów.

Jeśli na razie coś nie jest jasne to się nie martw, w następnym punkcie przedstawię jeszcze podstawowe operatory arytmetyczne i wreszcie będziemy już mogli napisać swój pierwszy program, w którym pokażę praktyczne zastosowanie przestawionych rzeczy. A dobry przykład jest lepszy niż tysiąc słów....



 

4. Operatory arytmetyczne




Język C jest bardzo bogato wyposażony we wszelkiego rodzaju operatory arytmetyczne. Poznaliśmy już operator przypisania, przyszła pora na następne. Przedstawię to w formie tabeli, która będzie także zawierać pascalowy odpowiednik.
 

C

Pascal

Opis

+

+

Dodanie dwóch wartości

-

-

Odjęcie jednej wartości od drugiej

/

/ lub div

Podzielenie jednej wartości przez drugą

*

*

Pomnożenie jednej wartości przez drugą (ma także inne znaczenie, ale o tym później)

%

... [ Pobierz całość w formacie PDF ]
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • grabaz.htw.pl
  •