User Tools

Site Tools


dydaktyka:cprog:2016:intro

This is an old revision of the document!


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

  1. Otwórz aplikację Code:Blocks.
  2. Wybierz z menu: File → New → Project…
  3. Zaznacz typ projektu – Console application.
  4. Wybierz C jako język projektu.
  5. Wybierz tytuł projektu oraz katalog, w którym projekt zostanie on utworzony.
  6. Zatwierdź przyciskiem Finish.
  7. 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:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    printf("Hello world!\n");
    return 0;
}

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!

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;
}

Komentarze

  • tekst ograniczony kombinacjami znaków (zakres) bądź // (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:

// Komentarz w jednej linii
instrukcje;
/* Komentarz w
   kilku liniach */

Derektywa #include

#include <stdio.h>
  • #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()

int main(void) {
    // instrukcje...
    return 0;
}
  • “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()

    printf("Hello world!");
  • 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.

Etapy tworzenia pliku wykonywalnego:

  1. Programista pisze kod źródłowy programu (jako pliki tekstowe).
  2. 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)
  3. 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:

hello_world_errors.c
#include <stdlib.h>
 
int ain()
{
    printf("Hello world!\n")
    return 0;
}

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!

Zadania

Zapoznaj się z:

  • zasadami tworzenia czytelnego kodu: (klik)
  • dostępnymi materiałami dydaktycznymi: (klik)
    (chodzi o to, aby kojarzyć gdzie ewentualnie szukać wiedzy i pomocy)
dydaktyka/cprog/2016/intro.1468397743.txt.gz · Last modified: 2020/03/25 11:46 (external edit)