Three Dots

Programowanie - uDner Cnossstrucion


C/C++ w praktyce*
*Three Dots

*C/C++ - trochę historii
*Za ojca języka C uważa się Dennisa Ritchie, który zaimplementował go po raz pierwszy w 1972 roku na maszynie PDP-11. C był następcą języka B, który z kolei był językiem bazującym na języku BCPL. Przez długi czas trwały spory, czy kolejna wersja języka będzie się nazywać D (kolejna litera alfabetu), czy też P (kolejna litera ciągu BCPL). Tymczasem rozwinięciem C zostało C++, co w notacji tego języka oznacza C+1. C++ został zaprojektowany głównie przez Bjarne Stroustrupa.

*Kilka powodów dlaczego warto znać C/C++
  1. C/C++ to język ojczysty unixowych systemów operacyjnych, a także ojciec większości współczesnych języków programowania. Perl, Java, PHP... jeśli znacz C/C++ to programowanie w tych językach też masz prawie opanowane :)
  2. C to język przy pomocy którego stworzysz kod prawie tak szybki jak maszynowy. W C możesz napisać programy rezydentne dla DOSa, procedury obsługi przerwań itd. Słowem - dojdziesz tak nisko jak przy pomocy assemblera.
  3. C++ jest językiem obiektowym, a to oznacza niezwykłą łatwość tworzenia nawet bardzo skomplikowanych aplikacji.
  4. Składnia C/C++ jest niezwykle kompaktowa, a jednocześnie czytelna. Programy można pisać zwięźle, a jednocześnie czytelnie.
  5. i tak dalej... i tym podobne :D
*Pierwszy przykład hello.c
#include <stdio.h>

int main(void) {
  printf("Hello world!\n");
  return 0;
}
*Ten przykład jest gwarantowaną pozycją każdego kursu programowania w C/C++. Po poprawnym wpisaniu, skompilowaniu i uruchomieniu program przywita się z nami napisem "Hello world!". Oto z czego składa się kod programu:
*W pierwszej linii znajduje się komenda preprocesora C/C++ #include <stdio.h>, która po prostu włącza do naszego programu plik nagłówkowy <stdio.h>, w którym znajduje się między innymi definicja funkcji printf.
*Nasz program zawiara jedną funkcję: int main(void). Wykonanie każdego programu w C/C++ rozpoczyna się właśnie od funkcji main. Parametr int to typ zwracanej przez funkcję main wartości. int jest to wartość integer, czyli równa zazwyczaj maszynowemu słowu procesora. W większości wypadków int to cztery bajty, choć np. stare kompilatory Borlanda za int przyjmowały dwa bajty. W nawiasach okrągłych znajduje się definicja argumentów przyjmowanych przez funkcję main. Słowo void oznacza, że funkcja nie przyjmuje żadnych argumentów (parametrów).
*Kolejna linia to wywołanie funkcji printf, która formatuje i wypisuje na standardowe wyjście ciąg znaków podany jako parametr. Formatowanie poleg między innymi na zamianie ciągu znaków \n na znak nowej linii.
Ostatnia instrukcja to polecenie powrotu z funkcji. main kończy działanie zwracając kod 0. Przyjmuje się, że poprawnie zakończony program zwraca wartość 0, zaś wszystkie inne wartości oznaczają kod błędu.

*Słów kilka o typach zmiennych
*W C/C++ występują następujące, podstawowe typy zmiennych:
char - znak, czyli jeden bajt ze znakiem. Przyjmuje wartości od -128 do 127.
short - krótkie słowo. Zazwyczaj pół słowa maszynowego, czyli np. na maszynie 32 bitowej jest to 16 bitów ze znakiem. Zatem przyjmuje wartości od -215 (-32768) do 215-1 (32767).
int - słowo. Na 32 bitowej maszynie przyjmuje wartości od -2147483648 do 2147483647.
long - długie słowo. Choć logika nakazuje by było podójnej długości słowa maszynowego, to lepiej to sprawdzić.
float - czterobajtowa liczba zmiennoprzecinkowa.
double - ośmiobajtowa liczba zmiennoprzecinkowa.
void - nic lub zmienna niezdefiniowana.
Dodatkowo można stosować modyfikatory typów zmiennych, np. słowo unsigned, które sprawia że zmienna staje się zmienną bez znaku, np. unsigned char definiuje zmienną z przedziału od 0 do 255. Czasem można się spotkać z definicjami zmiennych całkowitych z dodanym słowem int, np. short int. Obie poniższe definicje są poprawne:
unsigned - to samo co unsigned int
long int - to samo co long

*Z czym jeść funkcje
*Funkcja to kawałek kodu programu, który nakarmiony danymi wejściowymi zacznie robić różne ciekawe rzeczy, a po skończeniu zwróci nam daną wyjściową. Funkcję definiujemy w następujący sposób:
typ_danej_wy nazwa_funkcji(typ_danej_we1 nazwa1, typ_danej_we2 nazwa2,...) {
/*tutaj kod
  naszej funkcji*/
  return;
}
Jeśli nie chcemy od razu definiować ciała (kodu) funkcji, zamiast niego stawiamy średnik, np.:
int mojafunkcja(int x);
Poniżej przedstawiono kilka prawidłowych definicji funkcji:
void funkcja(void); - Funkcja o nazwie 'funkcja' która nie przyjmuje i nie zwraca żadnych wartości.
int suma(int a,int b); - Funkcja 'suma', która przyjmuje dwa parametry 'a' i 'b' typu int i zwraca wartość typu int.
void kremator(int); - Definicja funkcji 'kremator', która nie zwraca żadnych wartości i przyjmuje parametr typu int. Konstrukcja taka (bez nazwy parametru) jest dopuszczalna w C++.
char terminal(float x,...); - Funkcja 'terminal' zwraca wartość typu char i przyjmuje dowolną ilość parametrów, ale conajmniej jeden typu float.
Nie powinno się stosować definicji funkcji jak przedstawiono na poniższym przykładzie, choć wiele kompilatorów to 'łyknie':
main() - W pierwotnym C taka konstrukcja może być rozwinięta na int main(...), czyli funkcję która zwraca wartość int i przyjmuje dowolną ilość parametrów. C++ natomiast będzie to raczej int main(void). ANSI C++ zabrania definiować funkcje bez deklarowania ich typu zwracanego.
*Prosty przykład użycia funkcji suma.c:
#include 

int suma(int a,int b) {
  return a+b;
}

int main(void) {
  int s1,s2;
  printf("Podaj liczby A i B:");
  scanf("%d%d",&s1,&s2);
  printf("Ich suma to %d",suma(s1,s2));
  return 0;
}
*Tak jak i poprzedni przykład, ten też rozpoczęliśmy od włączenia pliku nagłówkowego <stdio.h> dyrektywą #include. W pliku tym znajdują się definicje funkcji printf oraz scanf, które służą nam do wyświetlania i pobierania danych. W kolejnych trzech liniach zdefiniowaliśmy prościutką funkcję suma, która przyjmuje dwa parametry typu int i zwraca również wartość int. Polecenie return a+b powoduje że zwracana wartość to suma parametrów wejściowych.
W kolejnych linijkach zdefiniowaliśmy funkcję main. Najpierw definiujemy dwie zmienne s1 i s2, obie typu int. Znaną już funkcją printf wypisujemy zachętę do wprowadzenia danych. Następnie funkcją scanf wczytujemy dwie liczby całkowite, podane przez użytkownika. Kolejne wywołanie funkcji printf powoduje wypisanie wyniku obliczonego przez funkcję suma. Program kończy się, zwracając wartość 0 (return 0).

*O printf, scanf i formatowaniu słów kilka.
*Zapewne Twą uwagę zwróciły dziwne zanczki %d występujące w przykładzie powyżej. Otóż, jak mi się zdaje, literka 'f' na końcu nazw funkcji printf i scnaf to skórt od słowa 'formatted', czyli sformatowany. Oznacza to że pierwszy parametr tych funkcji to ciąg znaków, który mówi jak potraktować pozostałe parametry. I tak:
%d - wyświetl następny parametr funkcji jako liczbę dziesiątną
%f - wyświetl następny parametr funkcji jako liczbę zmiennoprzecinkową
%c - wyświetl następny parametr funkcji jako znak
%s - wyświetl następny parametr funkcji jako ciąg znaków
%x - wyświetl następny parametr funkcji jako liczbę szesnastkową
\ooo - wstaw znak o kodzie ósemkowym ooo
\xhh - wstaw znak o kodzie szesnastkowym hh
\n - nowy wiersz
\r - powrót karetki (cofnięcie się do początku bieżącego wiersza
\b - backspace
\t - tabulator
Powyższe zestawienie stanowi ułamek tego, co można wstawić w ciąg formatujący. Poniższe przykłady jako wynik działania wyświetlą wyraz 'rura', choć wyglądają co nieco przerażająco :)
printf("k\bro\buz\bra\ba\n");
printf("\162%c%c%c\n",'u','r','a');
printf("ru\x72\x61\n");
printf("%cur%c\n",0x72,97);

E-mail to: coding@poczta.onet.pl