Języki i metody programowania Omówienie języków C, C++ i Java
Język C Język programowania ogólnego przeznaczenia Historia: M. Richards - BCPL - lata 60-te ubiegłego stulecia K. Thompson - B dla UNIX (DEC PDP-7) - 1970 wprowadzenie PDP-11 w 1970 roku D. Ritchie - nowe B dla PDP-11 - język C C staje się standardowym językiem UNIXa w latach 1983-88 standaryzacja C - ANSI C Literatura: B. W. Kernighan i D. M. Ritchie: Język ANSI C JiMP, JC/2006 w01 2
Język C język niskiego poziomu - język programowania systemów operacyjnych działa na znakach, liczbach całkowitych i zmiennoprzecinkowych, adresach, strukturach nie zawiera operacji na obiektach złożonych typu ciągi znaków, tablice, listy, pliki czy zbiory zapewnia tylko jednowątkowy mechanizm kontroli brak mechanizmu garbage collection nie definiuje operacji wejścia/wyjścia wszystkie operacje wyższego poziomu realizowane poprzez odwołanie się do funkcji JiMP, JC/2006 w01 3
Język C zwarty, mocny język duża swoboda programowania (zakłada się, że programista wie co robi) używanie standardu pozwala na dobrą przenośność oprogramowania standard definiuje też bibliotekę (operacje we/wy, operacje na znakach, przydzielanie pamięci) w oparciu o składnię C powstały języki takie jak C++ czy też Java JiMP, JC/2006 w01 4
Jak zacząć? stworzenie kodu źródłowego używając dowolnego edytora tekstu (standardowe rozszerzenie.c) kompilacja kodu - stworzenie kodu pośredniego (.o) konsolidacja (linkowanie) kodu pośredniego+bibliotek daje kod wykonywalny wykonanie (wywołanie kodu wykonywalnego) Linux: edytor: vi, emacs, piko, kompilacja: gcc -c prog1.c prog2.c wytworzy prog1.o, prog2.o konsolidacja: gcc prog1.o prog2.o lista_bibliotek -o wynik kompilacja+linkowanie: gcc prog1.c prog2.c lista_bibliotek -o wynik warto użyć flagi -Wall w czasie kompilacji JiMP, JC/2006 w01 5
Struktura programu Podstawową jednostką jest funkcja: typ nazwa_funkcji (lista_argumentów) { ciało funkcji } funkcje nie mogą być zagnieżdżone typ - określa typ zwracanej wartości nawiasy ( ) konieczne nawet gdy lista_argumentów jest pusta szczególna rola funkcji main od jej pierwszej instrukcji zaczyna się wykonywanie programu, a więc może być tylko jedna musi wystąpić w każdym programie! (w dowolnym pliku kodu) JiMP, JC/2006 w01 6
Raczkowanie #include <stdio.h> main() { printf(" czesc ziutek \n"); } Dyrektywa preprocesora włączenie standardowego we/wy definicja funkcji main początek ciała funkcji otoczonego przez { } wywołanie funkcji bibliotecznej printf printf - drukowanie ciągu znaków \n - znak nowej linii (escape sequence) prompt> gcc czesc.c -o czesc prompt>./czesc wynik programu to: kompilacja i linkowanie programu wywołanie (wykonanie) czesc ziutek JiMP, JC/2006 w01 7
Jak działa printf? #include <stdio.h> main() { printf(" czesc "); printf(" ziutek "); printf( \n "); } wiele wywołań printf bez użycia \n daje jedną linię tekstu Wyprowadza ciąg znaków zawartych w cudzysłowach (stała tekstową) na stdout Wynik to: czesc ziutek Sekwencje specjalne (escape sequence) \a - alarm \b - cofnięcie \f - nowa strona \n - nowa linia \r - powrót karetki drukarki \t - tabulacja pozioma \v - tabulacja pionowa \\ - backslash (znak \) \? - pytajnik \ - apostrof \ - cudzysłów \ooo - liczba ósemkowa (znak o kodzie ooo) \xhh - liczba szesnastkowa (znak o kodzie hh) JiMP, JC/2006 w01 8
#include <stdio.h> Zmienne i wyrażenia arytmetyczne /* drukuj tablice Fahrenheit-Celsius dla różnych wartości */ main() { int fahr,cels,low,up,krok; float fc; /* dolna granica w tablicy */ low = 0; } up = 300; /* górna granica*/ krok = 20; fahr = low; while(fahr<= up) { cels = 5*(fahr-32)/9; printf( %d\t%d\n,fahr,cels); fahr = fahr+krok; } Komentarz pomiędzy /* i */ jest ignorowany przez kompilator; dobre komentarze do kodu mają dużą wartość. Definicja zmiennych: nazwa_typu lista_nazw_zmiennych; muszą zaczynać się od litery lub podkreślenia nie mogą być słowami kluczowymi auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while JiMP, JC/2006 w01 9
Zmienne i wyrażenia arytmetyczne deklaracja powoduje rezerwację pamięci - znany jest adres rozmiar przydzielonej pamięci zależy od typu zmiennej oraz kompilatora czy też maszyny Typy podstawowe char - znak ( jeden znak lokalnego zbioru znaków) int - zmienna całkowita float - zmienna zmiennoprzecinkowa double - zmiennoprzecinkowa zmienna w podwójnej precyzji Mogą być modyfikowane przez: short - krótka zmienna long - długa zmienna signed - ze znakiem unsigned - bez znaku Można tworzyć również tablice, struktury i zbiory tych zmiennych. Operator sizeof(nazwa_typu) - liczba bajtów koniecznych do zapamiętania obiektu o typie nazwa_typu sizeof(char) wynosi 1, dla tablicy o rozmiarze n poda n*(rozmiar elementu w bajtach) JiMP, JC/2006 w01 10
Zmienne i wyrażenia arytmetyczne Operator przypisania = x = 30; /* przypisanie x wartości, podstawienie */ z = k+7.4; /* przypisanie z wartości wynikającej z prawostronnej operacji */ t = t+1; /* to wyrażenie ma sens bo w odróżnieniu od codziennego życia operator przypisania to nie jest logiczne porównanie oznaczane przez = */ g = d = (bb+8)/kk /* prawostronna łączność */ Wynik zależy od typu zmiennej, cf. int icel; float fcel; icel = 5*(fahr-32)/9; fcel = (5.0/9.0)*(fahr-32.0); JiMP, JC/2006 w01 11
Pełna składnia funkcji printf Formatowany wydruk na standardowy strumień outputowy: int printf(const char *format, arg1, arg2,...) Łańcuch znaków format służy do kontroli formatu wydruku i może zawierać: zwykłe znaki - kopiowane do wydruku specyfikacje wydruku kolejnych argumentów: zaczyna się od znaku % kończy znakiem formatu, czyli d,i int Postać dziesiętna o int Postać ósemkowa x,x int Postać szesnastkowa u int Liczba dziesiętna bez znaku c int Znak s char * Łańcuch znaków f double Liczba zmiennoprzecinkowa, [-]m.dddddd; zwyczajowa precyzja 6 e,e double Postać wykładnicza g,g double Postać f lub e,e % Drukowanie znaku % JiMP, JC/2006 w01 12
printf cd. Pomiędzy znakiem % a specyfikacją konwersji może wystąpić: znak minus - równanie do lewej strony, znak plus - liczba drukowana zawsze ze znakiem, spacja - jeśli pierwszy znak nie jest znakiem to wystąpi spacja, zero - uzupełnianie liczby zerami, liczba oznaczająca minimalną szerokość pola, znak kropki rozdzielający szerokość pola od precyzji, liczba oznaczająca precyzję: maksymalną liczbę znaków lub liczbę cyfr po przecinku dla liczby typu float, lub minimalną liczbę cyfr dla liczby całkowitej, literę h jeśli liczba całkowita ma być wydrukowana jako short lub literę l gdy ma być wydrukowana jako long lub double lub L dla liczb long double. JiMP, JC/2006 w01 13
printf cd. Przykłady: printf(format, ala ma kota ); format wydruk :%s: :ala ma kota: :%8s: :ala ma kota: :%.8s: :ala ma k: :%-8s: :ala ma kota: :%.15s: :ala ma kota: :%-15s: :ala ma kota : :%15.10s: : ala ma kot: :%-15.10s :ala ma kot : Wyjątki: printf( %.*s,max,string); - konwersja zgodna z nastepnym argumentem typu int! printf(s); źle działa jeśli łańcuch s zawiera znak %, printf( %s,s); jest bezpieczny. JiMP, JC/2006 w01 14
Formatowane wprowadzanie danych: scanf int scanf(char *format, arg1, arg2,...) wprowadza dane ze stdin zgodnie z opisem danym przez format i przypisuje je zmiennym określonym przez pozostałe argumenty (muszą być wskaźnikami) adres zmiennej x jest dany poprzez &x zwraca liczbę wczytanych i przypisanych wartości. format: % * (opcjonalnie) wstrzymanie przekształcenia h, l lub L (opcjonalnie) liczba (opcjonalnie) - maksymalna długość pola inne znaki - muszą wystąpić w strumieniu wejściowym int x,y; scanf( (%d,%d),&a,&b); na wejściu: (33,66) to a = 33 i b = 66 na wejściu: 33 66 da błąd! JiMP, JC/2006 w01 15