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