Podstawy programowania

Programowanie

to proces projektowania, tworzenia, testowania i utrzymywania kodu źródłowego programów komputerowych lub urządzeń mikroprocesorowych (mikrokontrolery). Kod źródłowy jest napisany w języku programowania, z użyciem określonych reguł, może on być modyfikacją istniejącego programu lub czymś zupełnie nowym. Programowanie wymaga dużej wiedzy i doświadczenia w wielu różnych dziedzinach, jak projektowanie aplikacji, algorytmika, struktury danych, znajomość języków programowania i narzędzi programistycznych, wiedza nt. kompilatorów, czy sposób działania podzespołów komputera. W inżynierii oprogramowania, programowanie (implementacja) jest tylko jednym z etapów powstawania programu.

Programista

Osoba programująca komputery nazywa się programistą lub potocznie koderem. Ich praca zazwyczaj obejmuje:

·        Analizę wymagań systemowych

·        Specyfikację aplikacji

·        Architekturę systemu informatycznego

·        Programowanie

·        Kompilację oprogramowania

·        Testowanie oprogramowania

·        Dokumentacę programu

·        Integrację

·        Pielęgnację oprogramowania

 

Najpopularniejsze języki programowania 

Lista dwudziestu najpopularniejszych języków programowania według TIOBE (stan na styczeń 2013):

1.     C

2.     Java

3.     Objective-C

4.     C++

5.     C#

6.     PHP

7.     (Visual) Basic

8.     Python

9.     Perl

10.  JavaScript

11.  Ruby

12.  Visual Basic NET

13.  Lisp

14.  Pascal

15.  Delphi/Object Pascal

16.  Ada

17.  MATLAB

18.  LUA

19.  Assembly

20.  Bash

 

C – imperatywny, strukturalny język programowania wysokiego poziomu stworzony na początku lat siedemdziesiątych XX w. przez Dennisa Ritchiego do programowania systemów operacyjnych i innych zadań niskiego poziomu.

Słowa kluczowe 

Lista słów kluczowych języka C na podstawie normy ISO/IEC 9899-1999 (C99). Istnieją zależne od implementacji rozszerzenia języka o inne słowa kluczowe jak np. asm.

auto

enum

restrict

unsigned

break

extern

return

void

case

float

short

volatile

char

for

signed

while

const

goto

sizeof

_Bool

continue

if

static

_Complex

default

inline

struct

_Imaginary

do

int

switch

 

double

long

typedef

 

else

register

union

 

 

Typy podstawowe 

Typ

Typowe wielkości pamięci

Uwagi

bool

1 bajt

tylko w wersji C99 (po włączeniu nagłówka)

char

1 bajt

 

unsigned char

1 bajt

 

signed char

1 bajt

 

int

2 lub 4 bajty

 

unsigned int

2 lub 4 bajty

 

short int

2 bajty

 

unsigned short int

2 bajty

 

long int

4 lub 8 bajtów

 

unsigned long int

4 lub 8 bajtów

 

long long int

8 bajtów

tylko w nowych wersjach

unsigned long long int

8 bajtów

tylko w nowych wersjach

float

4 bajty

 

double

8 bajtów

 

long double

8, 10, 12 lub 16 bajtów

 

float _Complex

8 bajtów

tylko w nowych wersjach

double _Complex

16 bajtów

tylko w nowych wersjach

long double _Complex

24 bajty

tylko w nowych wersjach

float _Imaginary

 

tylko w nowych wersjach

double _Imaginary

 

tylko w nowych wersjach

long double _Imaginary

 

tylko w nowych wersjach

void

 

 

Zmienne deklaruje się za pomocą prostej konstrukcji:

typ nazwa;

Należy pamiętać, że podane powyżej rozmiary zmiennych są jedynie orientacyjne i mogą się różnić w zależności od środowiska (w systemach 64-bitowych zmienna long posiada zazwyczaj 64-bity).

Inną ważną sprawą jest szerokość bajtu. Język C wymaga tylko, by bajt składał się z co najmniej 8 bitów. Jest to zwykle najmniejsza porcja danych, która może być adresowana.

Wielu programistów nie zdaje sobie sprawy z powyższych problemów, co może być (i jest) przyczyną wielu błędów oprogramowania, a w rezultacie powstają różne luki w bezpieczeństwie oprogramowania.

 

Typy pochodne 

·        Wyliczeniowy typ danych

enum nazwa { jeden, dwa };

·        Struktury

struct nazwa {

    typ1 nazwa1;

    typ2 nazwa2;

};

·        Unie

union nazwa {

    typ1 nazwa1;

    typ2 nazwa2;

};

·        Pola bitowe

typ [identyfikator] : długość;

·        Tablice

typ nazwa[liczba];

·        Wskaźniki

typ *nazwa;

typ **nazwa;

typ_zwracany (*nazwa_wsk_do_funkcji)(typ parametru1,typ parametru2,...);

Instrukcje sterujące 

Instrukcja if

Instrukcja if (ang. jeśli) to podstawowa instrukcja warunkowa w C – gdy warunek1 jest spełniony (zwraca wartość niezerową), wykonany zostanie kod zawarty w bloku ograniczonym klamrami. Fragment else jest opcjonalny. Problem wiszącego else jest rozwiązany przez przyporządkowanie else do na najbardziej zagnieżdżonego if.

if (warunek1)

    instrukcja1

else

    instrukcja2

Pętla while

Pętla while (ang. podczas gdy) – wykonuje instrukcję tak długo, dopóki jej warunek jest spełniony (ma wartość różną od zera). Instrukcja sprawdza warunek przed wykonaniem ciała pętli. Pętla while może wykonywać się nieskończoną ilość razy, gdy wyrażenie nigdy nie przyjmie wartości 0, może także nie wykonać się nigdy, gdy wartość przed pierwszym przebiegiem będzie zerowa.

while (wyrażenie)

 instrukcja

Przykład

int x = 10;

while (x > 0)

{

  printf(".");

  --x;

}

Pętla będzie się wykonywać tak długo, jak zmienna x będzie dodatnia – wykona się więc 10 razy, drukując w każdym obiegu pętli kropkę na standardowe wyjście.

Pętla do...while

Pętla do...while (ang. wykonuj...dopóki) jest podobna do pętli while z tą różnicą, że warunek sprawdzany jest po każdym wykonaniu pętli, a więc instrukcje w pętli zawsze wykonają się co najmniej raz.

do

instrukcja

while(warunek);

Przykład

int x = 0;

do

{

  printf(".");

}

while(x > 0);

Instrukcje w pętli wykonają się jeden raz i zostanie wydrukowana kropka na standardowe wyjście. Następnie sprawdzony będzie warunek pętli. W podanym przykładzie nie będzie spełniony – pętla zakończy więc działanie po jednym obiegu.

 

Pętla for (ang. dla) jest rozwinięciem pętli while o instrukcję wykonywaną przed pierwszym obiegiem oraz dodatkową instrukcję wykonywaną po każdym przebiegu – najczęściej służącą jako licznik obiegów. Często zmienną liczącą kolejne wykonania ciała pętli nazywa się iteratorem

for (wyrażenie1; wyrażenie2; wyrażenie3)

  instrukcja

Przed pierwszym sprawdzeniem warunku pętli wykonane zostanie wyrażenie1(na diagramie oznaczone przez literkę A), następnie sprawdzony zostanie warunek umieszczony w wyrażeniu2 (literka B). Dopóki warunek będzie miał niezerową wartość, wykonywane będzie ciało pętli oraz – po każdym obiegu –wyrażenie3. Jeśli wyrażenie2 na początku jest fałszywe, ciało pętli nie wykona się wcale. Każde z wyrażeń można opuścić (nie opuszczając jednak towarzyszącego jej średnika) – zamiast nich domyślnie występować będzie wartość niezerowa. Ominięcie wszystkich wyrażeń lub tylko środkowego doprowadzi więc do powstania nieskończonej pętli.

Przykład

int x;

for (x = 10; x > 0; x--)

{

  printf(".");

}

Powyższa pętla jest równoważna przykładowi podanemu przy pętli while. Przed sprawdzeniem warunku zmiennax zainicjalizowana zostanie wartością 10. Następnie sprawdzony będzie warunek, który w tym przypadku zwróci wartość niezerową. Wykonane zostanie ciało pętli – na standardowe wyjście wydrukowana zostanie kropka. Następnie wykonana zostanie trzecia instrukcja – dekrementacja wartości x. Pętla wykona się dziesięciokrotnie, a zmienna x, służąca w tej pętli za iterator, po jej zakończeniu będzie miała wartość 0.

Instrukcja switch

Instrukcją decyzyjną switch (ang. przełącznik) zastąpić można wielokrotne wywoływanie instrukcji warunkowej ifnp. dla różnych wartości tej samej zmiennej – przykładowo, gdy zmienna może przyjąć 10 różnych wartości, a dla każdej z nich należy podjąć inne działanie.

switch (wyrażenie) {

     case wartość1 :

        [instrukcje;]

        [break;]

     case wartość2 :

        [instrukcje;]

        [break;]

     default :

        [instrukcje;]

        [break;]

}

Wyrażenie najczęściej jest zmienną o określonej wartości. Jeśli tą wartością jest wartość1, wykonywane są instrukcje następujące po odpowiedniej etykiecie case aż do następnej instrukcji przerywającej, z reguły break(instrukcja opuszczenia nie musi występować na zakończenie każdego bloku rozpoczętego przez case – wykonany zostanie wtedy kod następnych przypadków). Przypadek default jest opcjonalny, określa instrukcje wykonywane, gdy wartość zmiennej nie jest równa żadnemu z wyszczególnionych przypadków.

Przykład

int x;

scanf("%d", &x);

switch(x)

{

  case 0:

  case 1:

    printf("jeden");

    break;

  case 2:

    printf("dwa");

    break;

  default:

    printf("coś innego");

    break;

}

Powyższa instrukcja switch wczyta liczbę ze standardowego wejścia i wyświetli "jeden", jeśli podana liczba to 0 lub 1, "dwa" jeśli podano 2 oraz "coś innego", jeśli podano jakąkolwiek inną wartość liczbową. W przypadku, gdyby program nie zawierał instrukcji break, podanie wartości 0 lub 1 spowodowałoby wyświetlenie zarówno "jeden", jak i "dwa" oraz "coś innego".

Funkcje 

Funkcje w C tworzy się za pomocą następującej składni:

[klasa_pamieci] [typ] nazwa([lista_parametrów])

{

  instrukcje;

  [return wartość;]

}

Klasa pamięci, określenie zwracanego typu oraz lista parametrów są opcjonalne. Jeżeli nie podano typu, domyślnie jest to typ liczbowy int, a instrukcję return kończącą funkcję i zwracającą wartość do funkcji nadrzędnej można pominąć. Listę argumentó tworzą wszystkie zmienne (zarówno przekazywane przez wartość jak i wskaźniki) wraz z określeniem ich typu. Dozwolona jest rekurencja, nie ma natomiast możliwości przeciążania funkcji (wprowadzonego m.in. w C++).

Przykład

int kwadrat(int x)

{

  return x*x;

}

Ta prosta funkcja zwraca podaną do niej liczbę podniesioną do kwadratu. Typ przekazanej do niej zmiennej oraz typ zwracany określony jest jako int. Definicja funkcji umieszczona musi być w głównej przestrzeni (poza wszelkimi innymi funkcjami), a wywoływać ją można z każdego miejsca w programie. Przykładowo, aby zmiennej n przypisać wartość kwadratu z 16, wywołać należy: int n = kwadrat(16);.