This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2016:intro [2016/07/13 10:12] pkleczek |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Wprowadzenie do C ====== | ||
- | ===== Cel laboratorium ===== | ||
- | |||
- | * Zapoznanie z językiem C na przykładzie prostego programu //"Hello world!"//. | ||
- | * Zapoznanie ze zintegrowanym środowiskiem programistycznym (IDE). | ||
- | * Omówienie procesu zamiany kodu w języku C na kod zrozumiały dla komputera. | ||
- | * Znajdowanie i usuwanie błędów składniowych kodu. | ||
- | ===== Podstawowe fakty===== | ||
- | |||
- | * Język C to język wysokiego poziomu, czyli jednej instrukcji w kodzie odpowiada wiele instrukcji dla procesora (w przeciwieństwie do języka niskiego poziomu, jak asembler, gdzie każdej instrukcji kodzie odpowiada dokładnie jedna instrukcja dla procesora). | ||
- | * Język C wymaga kompilatora (dedykowanego dla danego systemu operacyjnego). | ||
- | * Istnieją trzy standardy języka (K&R, ANSI, C99). Standard definiuje dopuszczalne konstrukcje języka i ich działanie. \\ :!: Na laboratoriach omawiamy standard ANSI. | ||
- | * Filozofia C: //Zaufaj programistom – oni dobrze wiedzą, co robią!// \\ | ||
- | W języku C wiele konstrukcji jest dopuszczalnych, a "wielka moc to wielka odpowiedzialność!" -- programista musi zachować czujność :-) | ||
- | |||
- | ===== Zintegrowane środowisko programistyczne ===== | ||
- | |||
- | Q: Co jest potrzebne, żeby zacząć programować? \\ | ||
- | A: Wystarczy edytor tekstu i kompilator języka C! | ||
- | |||
- | ale... | ||
- | |||
- | Proces tworzenia programu można znacznie uprościć korzystając ze zintegrowanego środowiska programistycznego (integrated development environment, IDE). | ||
- | |||
- | Główne funkcje IDE: | ||
- | * wbudowany edytor tekstu pod kątem języka programowania | ||
- | * kolorowanie składni | ||
- | * podpowiadanie | ||
- | * automatyczna kompilacja i linkowanie | ||
- | * debugger | ||
- | |||
- | ===== Tworzenie projektu w Code:Blocks ===== | ||
- | |||
- | - Otwórz aplikację Code:Blocks. | ||
- | - Wybierz z menu: //File -> New -> Project...// | ||
- | - Zaznacz typ projektu -- //Console application//. | ||
- | - Wybierz //C// jako język projektu. | ||
- | - Wybierz tytuł projektu oraz katalog, w którym projekt zostanie on utworzony. | ||
- | - Zatwierdź przyciskiem //Finish//. | ||
- | - Po utworzeniu projektu w bocznym panelu rozwiń element //Sources// i kliknij na element z nazwą zakończoną na //.c// -- plik z **kodem źródłowym** naszego programu. | ||
- | |||
- | Plik z kodem powinien wyglądać następująco: | ||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | printf("Hello world!\n"); | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | Aby uruchomić program, wybierz z menu: //Build -> Build and run// | ||
- | |||
- | Pojawi się okno **konsoli**, w którym wyświetlony zostanie napis: ''Hello world!'' (wraz ze statystykami wykonania programu) | ||
- | ===== Hello world! ===== | ||
- | |||
- | <file c hello_world.c> | ||
- | /* Nasz pierwszy program w jezyku C. */ | ||
- | |||
- | #include <stdio.h> | ||
- | |||
- | int main(void) { | ||
- | /* Funkcja printf() wypisuje dane w konsoli... */ | ||
- | printf("Hello world!"); | ||
- | return 0; | ||
- | } | ||
- | </file> | ||
- | |||
- | ===== Komentarze ===== | ||
- | |||
- | * tekst ograniczony kombinacjami znaków /* ... */ (zakres) bądź <nowiki>//</nowiki> (od tego miejsca do końca wiersza) | ||
- | * ignorowany przez kompilator | ||
- | * przydatny dla programistów, aby opisać zachowanie programu i jego fragmentów, założenia i oczekiwania co do jego działania itp. \\ (można uniknąć sytuacji (po miesiącu): //"a co ja tutaj chciałem zrobić?"// -- i spędzenia pół godziny na rozgryzaniu paru linijek programu) | ||
- | |||
- | Przykład: | ||
- | |||
- | <code c> | ||
- | // Komentarz w jednej linii | ||
- | instrukcje; | ||
- | /* Komentarz w | ||
- | kilku liniach */ | ||
- | </code> | ||
- | |||
- | ===== Derektywa #include ===== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | </code> | ||
- | |||
- | * ''#include'' to derektywa preprocesora. Preprocesor wykonuje czynności przygotowawcze przed właściwą kompilacją. | ||
- | * ''stdio.h'' oznacza plik nagłówkowy standardowego wejścia wyjścia (ang. standard input-output) i zawiera głównie makra i funkcje do obsługi komunikacji programu z konsolą (wypisywanie na ekran, pobieranie danych z klawiatury) oraz pracy z plikami. \\ Funkcje wejścia i wyjścia nie są wbudowane, gdyż nie wszystkie programy z nich korzystają, a częścią filozofii C jest unikanie tego, co zbędne. | ||
- | * Plik nagłówkowy (''.h'' = header file) to zbiór makropoleceń, funkcji i stałych przygotowany przez (innych) programistów i gotowych do użytku przez nas. | ||
- | |||
- | ===== Funkcja ===== | ||
- | |||
- | **Funkcja** to logiczny fragment programu, odpowiedzialny za wykonanie pewnego ciągu operacji. | ||
- | |||
- | Funkcja w języku C przypomina trochę funkcję matematyczną -- też może przyjmować argumenty i zwracać wartość... ale nie musi! | ||
- | |||
- | ==== Funkcja main() ==== | ||
- | |||
- | <code c> | ||
- | int main(void) { | ||
- | // instrukcje... | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | * "główna" funkcja: specjalna funkcja w języku C (każdy program musi mieć dokładnie jedną funkcję main()) | ||
- | * komputer zawsze zaczyna wykonywanie programu od funkcji main() | ||
- | * program kończy działanie z chwilą opuszczenia funkcji main() | ||
- | * ''%%return 0;%%'' oznacza zwrócenie przez funkcję wartości ''0'' \\ (Gdzie? Do miejsca, w którym funkcja została wywołana, czyli w tym przypadku do systemu operacyjnego. Wartość ''0'' oznacza, że wszystko poszło OK.) | ||
- | |||
- | ==== Funkcja printf() ==== | ||
- | |||
- | <code c> | ||
- | printf("Hello world!"); | ||
- | </code> | ||
- | * funkcja biblioteczna (z biblioteki ''stdio'') | ||
- | * wypisuje dane w konsoli ("na ekran") | ||
- | * ''\n'' -- kombinacja znaków interpretowana jako znak nowego wiersza | ||
- | |||
- | **Uwaga!** W języku C wielkość liter ma znaczenie, tzn. nazwy ''printf'' i ''Printf'' oznaczają dwie różne funkcje! | ||
- | |||
- | ===== Kompilacja i konsolidacja ===== | ||
- | |||
- | |||
- | **Kompilacja.** Proces przetwarzania kodu źródłowego i plików nagłówkowych na kod przejściowy (przez kompilator). | ||
- | |||
- | **Konsolidacja.** Proces łączenia kodu przejściowego z pozostałym kodem (kodem startowym i kodem bibliotek) w celu utworzenia pliku wykonywalnego. Konsolidacją zajmuje się //konsolidator//, zwany też //linkerem// (linker). | ||
- | |||
- | W wyniku procesu kompilacji i konsolidacji powstaje plik binarny, zawierający kod maszynowy. | ||
- | |||
- | |||
- | {{ :dydaktyka:cprog:2015:compile_and_link.jpg?nolink |}} | ||
- | |||
- | |||
- | |||
- | Etapy tworzenia pliku wykonywalnego: | ||
- | - Programista pisze kod źródłowy programu (jako pliki tekstowe). | ||
- | - Preprocesor dołącza pliki nagłówkowe i przeprowadza inne czynności przygotowawcze, a następnie generuje plik kodu obiektowego (object file, ''.obj'' pod Windowsem). Plik kodu obiektowego zawiera kod przejściowy, czyli taki, w którym brakuje: | ||
- | * kodów funkcji bibliotecznych | ||
- | * kodu startowego (odpowiada za uruchomienie na danym systemie operacyjnym) | ||
- | - Linker dokonuje konsolidacji, czyli dołącza standardowe biblioteki oraz ewentualne biblioteki stworzone przez użytkownika (a dokładniej gotowy kod binarny użytych funkcji bibliotecznych) i tworzy plik gotowy do wykonania (''.exe'' pod Windowsem). | ||
- | |||
- | **Uwaga!** Pliki binarne ''.obj'' i ''.exe'' są przeznaczone dla danego systemu operacyjnego i dla danej architektury komputera. Aby stworzyć program dla innego systemu trzeba dokonać ponownej konsolidacji, z innymi parametrami. | ||
- | |||
- | |||
- | ===== Błędy i ostrzeżenia (podczas kompilacji lub linkowania) ===== | ||
- | |||
- | Spróbuj skompilować poniższy kod: | ||
- | <code c hello_world_errors.c> | ||
- | #include <stdlib.h> | ||
- | |||
- | int ain() | ||
- | { | ||
- | printf("Hello world!\n") | ||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | Co się stało? | ||
- | |||
- | * //Błądzenie jest rzeczą ludzką// -- kompilator często pomoże nam wykryć błędy (pot. bugs). | ||
- | * Kompilator wykrywa błędy składniowe (syntax errors), czyli niezgodności ze specyfikacją i standardami języka. Natomiast nic nie obchodzą go błędy semantyczne (semantic errors), czyli poprawność od strony logicznej -- czy programista napisał faktycznie to, co chciał osiągnąć. | ||
- | * Przykład 1: W języku polskim zdanie w stylu mistrza Yody //Błędy frustrować być mogą!// składa się z poprawnych słów, ale w złym szyku i nie zawsze dobrze dobranych -- to błąd składniowy. Z kolei zdanie //Włochata inflacja myśli na zielono.// zawiera błąd semantyczny (no chyba, że ktoś jest poetą\textellipsis) | ||
- | * Przykład 2: ''n2 = n * n; n3 = n2 * n2;'' -- błąd semantyczny, gdyż ''n3'' miało być sześcianem, a wyszła czwarta potęga. | ||
- | * Wszystkie błędy zgłoszone przez kompilator i linker muszą być poprawione. | ||
- | * Błąd uniemożliwia działanie programu; ostrzeżenie sygnalizuje możliwe problemy (program jest poprawny, ale być może np. użyliśmy konstrukcji nie należącej do standardu języka i dlatego część kompilatorów może nie potrafić skompilować naszego kodu). | ||
- | |||
- | |||
- | Dobre praktyki: | ||
- | |||
- | * W pierwszej kolejności usuwamy błędy (w kolejności jak się pojawiają – od pierwszej linii pliku do ostatniej), a dopiero potem zajmujemy się ostrzeżeniami. | ||
- | * Czytać opisy błędów! (Na tym etapie zajęć) Zazwyczaj to wystarczy, by zorientować się jak je usunąć. | ||
- | |||
- | ---- | ||
- | |||
- | Aby ułatwić sobie pracę, z menu wybierz //Settings > Compiler...//, a następnie na karcie //Compiler settings// i podkarcie //Compiler Flags// zaznacz pole: | ||
- | * Enable warnings demanded by strict ISO C and ISO C++ [-pedantic] | ||
- | |||
- | W ten sposób kompilator ostrzeże cię, gdy w kodzie znajdą się elementy niezgodne ze standardem ANSI C. | ||
- | |||
- | ---- | ||
- | |||
- | I jeszcze coś na wesoło: //It's not a BUG -- it's a FEATURE!// | ||
- | |||
- | {{ :dydaktyka:cprog:2015:bug_feature.jpg?nolink&400 |}} | ||
- | |||
- | ===== Gdzie szukać pomocy? ===== | ||
- | |||
- | * [[http://www.cplusplus.com/reference/|Dokumentacja funkcji bibliotecznych]] | ||
- | * [[http://www.cheatography.com/ashlyn-black/cheat-sheets/c-reference/|"Karta wzorów" dla języka C]] | ||
- | |||
- | ===== Zadania ===== | ||
- | |||
- | Zapoznaj się z zasadami tworzenia czytelnego kodu: **[[dydaktyka:cprog:clean_code|(klik)]]** |