1 Podstawy C
Transkrypt
1 Podstawy C
1 Podstawy C 1.1 Słowa kluczowe auto break case char const continue default do 1.2 double else enum extern float for goto if struct switch typedef union unsigned void volatile while Typy proste char unsigned int int long int long long int short int float double long double 1.3 int long register return short signed sizeof static c u d ld Ld hd f lf Lf Nazwy zmiennych i funkcji • nazwa zmiennej/funkcji może zawierać tylko litery, cyfry i znaki podkreślenia • nazwa zmiennej/funkcji musi zaczynać się od litery lub podkreślenia • wielkość liter w nazwie ma znaczenie • zmienna/funkcja nie może mieć nazwy identycznej z zarezerwowanym słowem kluczowym 1.4 + * / % Operacje arytmetyczne dodawanie odejmowanie mnożenie dzielenie (!całkowite gdy zmienne typu int) reszta z dzielenia 1 1.4.1 Skrócony zapis łączący operację z przypisaniem int a = 10 a += 2 a -= 3 a *= 3 a /= 2 a %= 3 1.4.2 // // // // // a a a a a = = = = = 12 9 27 13 1 (post/pre)inkrementacja/dekrementacja a++ a-++a --a 1.5 \b \f \n \t \v \r \’ \" 1.6 Znaki specjalne znak cofnięcia nowa strona nowy wiersz tabulator odstęp w pionie powrót kursora (karetki) apostrof cudzysłów Tablice Tablice umożliwiają przechowywanie ciągu wartości, identyfikowanych jedną nazwą zmiennej. Elementy tablicy uważać można za pary indeks-wartość: indeks umożliwia dostęp przechowywanych danych. Tablice definiujemy określając jej rozmiar oraz typ przechowywanych danych, przy czym poszczególne elementy muszą być jednego typu (nie można tworzyć tablic mieszanych). Podczas deklaracji konieczne jest określenie rozmiaru tablicy, który musi być znany na etapie kompilacji. Dynamiczne tworzenie tablic w trakcie wykonywania programu wymaga skorzystania z funkcji dynamicznego przydziału pamięci. typ nazwa[rozmiar ] //schemat deklaracji tablicy int a[10]; //tablica jednowymiarowa o rozmiarze 10 int b[10][5]; //tablica dwuwymiarowa int tab[]={1,2,3}; 2 char imie[] = "Kasia"; //ciag znaków (zakończony znakiem pustym \0) 1.7 ! && || ?: 1.8 Operatory logiczne NOT (zaprzeczenie) AND OR operator trójargumentowy: warunek ? (if true) : (if false) Funkcje C umożliwia użytkownikowi definiowanie własnych funkcji, czyli wykonywanych na żądanie ciągów instrukcji. Funkcję deklarujemy podając jej prototyp: typ_zwracany nazwa(lista typów argumentów); Uwaga: jeśli nie chcemy aby funkcja zwracała wartość, należy jako typ zwracany podać void. Możliwe są także funkcje bezargumentowe; przykładowe deklaracje: void f(void); void f(int, double); float f(void); int f(double); Oprócz prototypu konieczne jest podanie definicji funkcji. Jeśli definicja funkcji poprzedza jej użycie w kodzie, nie ma konieczności wcześniejszego deklarowania prototypu. typ_zwracany nazwa(typ argument_a, typ argument_b, ...){ /* * ciało funkcji */ return zwracana_wartość; } 1.9 Zaawansowane operacje matematyczne Standardowy plik nagłówkowy <math.h> zawiera definicję kilku użytecznych stałych matematycznych oraz deklaracje najczęściej używanych funkcji. Pod- 3 czas kompilacji pod gcc należy pamiętać o dołączeniu biblioteki matematycznej przy użyciu flagi -lm. 1.9.1 Stałe matematyczne M_E M_LOG2E M_LOG10E M_LN2 M_LN10 M_PI M_PI_2 M_PI_4 M_1_PI M_2_PI M_2_SQRTPI M_SQRT2 M_SQRT1_2 podstawa logarytmu naturalnego log2 e log1 0e ln 2 ln 10 π π 2 π 4 π −1 2π −1 √2 √π 2 √1 2 4 1.9.2 Funkcje double double double double double double arcus cosinus arcus cosinus hiperboliczny arcus sinus arcus sinus hiperboliczny arcus tangens arcus tangens dwóch zmiennych x y. Jest to podobne do obliczania arcus tangens y/x ; znaki obu argumentów są wykorzystywane do wyznaczenia ćwiartki, do której należy wynik. arcus tangens hiperboliczny najmniejsza liczba całkowita większa bądź równa danej liczbie rzeczywistej cosinus cosinus hiperboliczny eksponenta wartość bezwzględna liczby zmiennoprzecinkowej największa liczba całkowita mniejsza bądź równa danej liczbie rzeczywistej reszta z dzielenia zmiennoprzecinkowego przedstawienie liczby zmiennoprzecinkowej w postaci a2b zamiana liczby zmiennoprzecinkowej z postaci a2b na postać normalna wartość ln10 e log10 e rozbija liczbę na jej część całkowitą i ułamkową (obie tego samego znaku co pierwotna liczba) podnoszenie do potęgi sinus sinus hiperboliczny pierwiastek kwadratowy tangens tangens hiperboliczny acos(double) acosh(double) asin(double) asinh(double) atan(double) atan2(double, double) double atanh(double) double ceil(double) double double double double cos(double) cosh(double) exp(double) fabs(double) double floor(double) double fmod(double, double) double frexp(double, int *) double ldexp(double, int) double log(double) double log10(double) double modf(double, double *) double double double double double double pow(double, double) sin(double) sinh(double) sqrt(double) tan(double) tanh(double) Uwaga: Deklaracja funkcji int abs(int j); zwracającej wartość bezwzględną liczby całkowitej znajduje się w pliku stdlib.h 1.10 Argumenty wywołania C umożliwia wywoływanie z linii komend programów parametryzowanych argumentami, np: 5 ./program 1000 2 gdzie liczby 1000 i 2 są w tym przypadku pewnymi konkretnymi wartościami argumentów. Przekazanie argumentów do programu realizuje się przez odpowiednia deklarację argumentów funkcji main: int main(int argc, char * argv[]) gdzie argc jest zmienną trzymającą liczbę argumentów wywołania, natomiast char * argv[] tablicą przekazanych do programu argumentów. Uwaga: Dla n argumentów wywołania argc=n+1, gdyż argv[0] przechowuje nazwę programu. 1.11 Zasięg zmiennych Ze względu na zasięg zmienne w programie możemy podzielić na lokalne i globalne. 1.11.1 Zmienne lokalne Deklarowane są w obrębie bloku i tylko w nim można się do nich odwoływać. Zmienne lokalne mogą należeć do jednej z trzech klas pamięci: auto, static i register (poprzedzenie deklaracji odpowiednim słowem kluczowym; kompilator domyślnie przyjmuje auto ). Zmienne klasy auto i register są tworzone na stosie w momencie, gdy rozpoczyna się wykonanie bloku i są z niego usuwane natychmiast po jego zakończeniu. Przy ponownym wykonaniu bloku są tworzone na nowo, wobec czego nie zachowują swej wartości i nie mogą być wykorzystane do przechowywania stanu między kolejnymi wykonaniami bloku! Zmienne klasy register są w miarę możliwości trzymane w rejestrach procesora lub szybkiej pamięci (optymalizacja wydajności). Konsekwencją tego jest brak adresu zmiennej, tzn. nie można dla zmiennej rejestrowej pobrać adresu &. Zmienne klasy static przechowywane są w obszarze danych programu (a nie bloku!). Są tworzone w momencie uruchamiania programu oraz kasowane dopiero w momencie jego zakończenia – w związku z tym nie zmieniają wartości między kolejnymi wykonaniami bloku! 6 1.11.2 Zmienne globalne Deklarowane są poza jakimkolwiek blokiem (na poziomie głównym) i mogą być użyte w każdym miejscu programu. 1.12 Zarządzanie pamięcią Do dynamicznej alokacji i zwalniania pamięci w programie służą funkcje malloc (z ang. memory allocation) i free, zadeklarowane w pliku nagłówkowym <stdlib.h>. Jeśli zależy nam na wyzerowaniu przydzielonego bloku pamięci, należy zamiast malloc użyć funkcji calloc. 1.13 1.13.1 Operacje na plikach Otwarcie i zamknięcie pliku FILE *fp // deklaracja wskaźnika na plik fp = fopen (nazwa_pliku, tryb); // otwarcie przykładowo otwarcie pliku plik.txt z prawem do odczytu: fp = fopen ("plik.txt","r"); if (fp != NULL){ //operacje na pliku } fclose (fp); // zamknięcie w r a w+ r+ a+ b 1.13.2 otwarcie pliku do zapisu; kasuje zawartość starego pliku jeśli istniał otwarcie pliku do odczytu dopisywanie na końcu pliku; tworzy nowy jeśli nie istniał otwarcie pliku do odczytu i zapisu; kasuje zawartość starego pliku jeśli istniał otwarcie pliku do odczytu i zapisu; otwarcie pliku do odczytu i dopisywania na końcu pliku tryb binarny Formatowane we/wy int fscanf(FILE *fp, const char *format, ...); // formatowane wejście int fprintf(FILE *fp, const char *format, ...); // formatowane wyjście 7 1.13.3 Wejście i wyjście znakowe int fgetc(FILE *stream) int fputc(int c, FILE *stream) char *fgets(char *s, int n, FILE *stream) char *fputs(char *s, FILE *stream) int isalpha(int) 1.13.4 odczyt ze strumienia stream kolejnego znaku wpisanie znaku c do strumienia odczyt co najwyżej n-1 znaków i wstawienie ich do tablicy s; tekst zakończony \0 wpisanie tekstu z tablicy s do strumienia mała lub duża litera Klasyfikowanie znaków Nagłówek <ctype.h> zawiera deklaracje kilku funkcji użytecznych do klasyfikowania znaków: int int int int int int int int int isalnum(int) isalpha(int) iscntrl(int) isdigit(int) isgraph(int) islower(int) isprint(int) ispunct(int) isspace(int) int isupper(int) int isxdigit(int) int tolower(int) int toupper(int) 1.13.5 litera lub cyfra dziesiętna mała lub duża litera znak kontrolny cyfra dziesiętna znak drukowalny za wyjątkiem odstępu mała litera znak drukowalny wraz z odstępem znak nie będący literą, cyfrą ani odstępem tzw. znak biały (spacja, tabulacja, nowy wiersz...) duża litera cyfra szesnastkowa zamiana na małą literę zamiana na dużą literę Operacje na ciągach znakowych Nagłówek <string.h> zawiera deklaracje funkcji umożliwiających operacje na ciągach znakowych (tzw. stringach): char *strcpy(char *s, const char *ct) kopiuje tekst z ct do s łącznie ze \0; zwraca s 8 char *strncpy(char *s, const char *ct, int n) kopiuje co najwyżej n znaków z ct do s (dla krótkiego ct dopełnia znakami \0); zwraca s char *strcat(char *s, const char *ct) dopisuje ct do s; zwraca s char *strncat(char *s, const char *ct, int n) dopisuje co najwyżej n znaków z ct do s; zwraca s int strcmp(const char *cs, const char *ct) porównuje tekst w cs i ct; zwraca wartość <0 dla cs<ct, >0 dla cs>ct lub 0, gdy cs==ct int strncmp(const char *cs, const char *ct) działa podobnie do strncmp, z tą różnicą że porównuje co najwyżej n znaków z obu tekstów char *strchr(const char *cs, char c) zwraca wskaźnik do pierwszego wystąpienia znaku c w tekście cs lub NULL gdy podany znak nie występuje char *strrchr(const char *cs, char c) zwraca wskaźnik do ostatniego wystąpienia znaku c w tekście cs lub NULL gdy podany znak nie występuje int strspn(const char *cs, const char *ct) zwraca długość przedrostka w tekście cs składającego się ze znaków występujących w ct int strcspn(const char *cs, const char *ct) zwraca długość przedrostka w tekście cs składającego się ze znaków nie występujących w ct char *strpbrk(const char *cs, const char *ct) zwraca wskaźnik do pierwszego wystąpienia w tekście cs któregokolwiek znaku z ct lub NULL jeśli nie znajdzie char *strstr(const char *cs, const char *ct) zwraca wskaźnik do pierwszego wystąpienia tekstu ct w tekście cs lub NULL jeśli nie występuje int strlen(const char *cs) zwraca długość tekstu w cs 9 1.14 Struktury Język C umożliwia definiowanie własnych typów złożonych, tzw. struktur : struct nazwa{ typ element1; typ element2; ... } np: struct ksiazka{ //definicja char autor[40]; char tytul[60]; int rok_wydania; }; Pod zdefiniowaniu struktury można tworzyć obiekty stanowiące jej instancje. Odwołania do elementów składowych zmiennych będących strukturami realizowane są przy użyciu operatora ".": struct ksiazka k1; k1.autor = "Adam Mickiewicz"; k1.tytul = "Pan Tadeusz"; k1.rok_wydania = 1999; 1.14.1 typedef Słowo kluczowe typedef służy do definiowania tzw. aliasów, czyli alternatywnych nazw typów, np: typedef int bool; bool a; Operator typedef umożliwia uproszczenie deklaracji struktur; zamiast za każdym razem pisać: struct ksiazka k1; 10 można zdefiniować alias na strukturę: typedef struct ksiazka Tksiazka; Tksiazka k1; Tksiazka k2; 11