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);.