Metodyki i techniki programowania, ETDI, sem. 2

Podstawy języka C – cz. II

dr inż. Maciej Kusy

Katedra Podstaw Elektroniki

Wydział Elektrotechniki i Informatyki

Politechnika Rzeszowska

Elektronika i Telekomunikacja, sem. 2

Metodyki i techniki programowania, ETDI, sem. 2

Plan wykładu

• Typy pochodne:

– wskaźniki

– tablice

• Typy złożone (struktury, unie)

• Pojęcie funkcji

– deklaracja i definicja funkcji

– wywołanie funkcji

– argumenty funkcji

– zmienne lokalne i globalne

2

Metodyki i techniki programowania, ETDI, sem. 2

Typy pochodne – wskaźniki

Wskaźnik rodzaj zmiennej, który wskazuje na miejsce w pamięci, gdzie zapisana jest dana informacja.

Aby wykorzystywać wskaźnik, musi on wskazywać na

określony typ (*) i musi mu być przypisany adres zmiennej, której typ jest zgodny z typem wskaźnika.

int i = 5, j = 6, k;

int* p;

p = &i; // => *p => 5, p => 0021FAAC (np.)

*p = 2;

// => i = 2; (modyfikacja i)

p = &j;

*p *= 2; // => j *= 2; j = 12;

k = *p;

// => k = 12;

3

Metodyki i techniki programowania, ETDI, sem. 2

Właściwości wskaźników

• Wskaźnik wskazuje na obszar pamięci, w którym

zapisana jest zmienna jakiegoś typu, struktury;

• Wskaźnik jest tego samego typu co zmienna, na którą pokazuje;

• Wskaźnik deklaruje się poprzez operator * przy typie zmiennej, np: int *p;

• Modyfikacja wartości pokazywanej przez wskaźnik (*p) spowoduje modyfikację zmiennej, na którą pokazuje;

• Aby dostać się do wartości wskazywanej przez wskaźnik, należy użyć operatora wyłuskania: *.

4

Metodyki i techniki programowania, ETDI, sem. 2

Typy pochodne – tablice

Tablica to kolekcja, która przechowuje dane tego samego typu w zorganizowany sposób.

Matematycznym odpowiednikiem tablicy jest ciąg.

Dostęp do poszczególnego elementu tablicy uzyskuje się poprzez odwołanie się do nazwy tablicy i odpowiedniej wartości indeksu (0,…,n-1) umieszczonego w [].

Nazwa tablicy jest jednocześnie jej adresem w pamięci.

Rozmiar tablicy może być ustalony z góry (statycznie), ale nie w trakcie wykonywania programu.

5

Metodyki i techniki programowania, ETDI, sem. 2

Deklaracja tablic

Tablicę definiuje się za pomocą następującej składni: Tablica statyczna na 10 elementów:

typ nazwa[10];

int tab[10]={1,2,3,4,5,6,7,8,9,10};

tab[0] = 1;

tab[9] = 10;

double liczby[] = {1.1,2.2,3.3,4.4,5.5};

char test[80];

char test[] = " Programowanie w j. C";

//test[0]='P'

test[1]='r' test[20]=' \0'

6

Metodyki i techniki programowania, ETDI, sem. 2

Właściwości tablic

• Tablice definiuje się dla danego typu;

• Długość tablicy może przyjmować wartość stałą, np.: char tablica[5];

• Tablice mogą być tworzone dynamicznie za pomocą

wskaźników;

• Nazwa tablicy jest wskazaniem na zerowy jej element;

• Indeksacja elementów rozpoczyna się od 0;

• Ostatnim elementem n-elementowej tablicy jest element o indeksie n-1;

• Odniesienie się do danego elementu tablicy polega na podaniu jej nazwy oraz odpowiedniego indeksu w

nawiasach [].

7

Metodyki i techniki programowania, ETDI, sem. 2

Wskaźniki i tablice – I

Wskaźniki można ustawić tak, aby pokazywały na tablicę.

int tab[5] = {1,2, 3,4,5};

int* p;

p = & tab[0]; // p = tab;

*p => 1

*(p + 2) = 0;

tab[2] = 0

p[2] = 0;

tab[0] = 1, tab[1] = 2, tab[2] = 0,

tab[3] = 4, tab[4] = 5

8

Metodyki i techniki programowania, ETDI, sem. 2

Wskaźniki i tablice – II

Wskaźnik można użyć jako tablicę o dynamicznie

ustalonej długości.

Takiemu wskaźnikowi należy najpierw przydzielić

pamięć na zadaną liczbę elementów:

int n;

// n > 0

double* tab;

printf("Podaj liczbe elementow: ");

scanf("%i", &n);

tab = (double*)malloc(sizeof(double) * n); tab[0] = 3.14; // *(tab+0) = 3.14;

printf("%f\n", tab[0]);

Przydzieloną pamięć należy następnie zwolnić: free(tab); 9

Metodyki i techniki programowania, ETDI, sem. 2

Typy złożone – struktura

Struktura – typ, który grupuje w sobie dane różnego typu.

Strukturę definiuje się za pomocą słowa kluczowego struct i podanie jej nazwy:

struct nazwa

{

//deklaracje pól różnych typów

};

Dane w strukturze grupowane są w jednym obszarze

pamięci

10

Metodyki i techniki programowania, ETDI, sem. 2

Struktura – przykład

Definicja struktury: słowo kluczowe struct, nazwa i umieszczone w nawiasach klamrowych deklaracje wszystkich pól składowych (średnik po klamrze zamykającej), np.; struct Wydzial

stworzenie obiektu struktury

{

char nazwa[20];

int liczba_Studentow;

};

struct Wydzial WEiI;

WEiI. liczba_Studentow = 177;

odniesienie się do pola

11

Metodyki i techniki programowania, ETDI, sem. 2

Właściwości struktur

• Struktura jest typem, który grupuje w sobie dane różnego typu w jednym obszarze pamięci;

• Składowymi struktur są pola, posiadające określone nazwy;

• Składowymi struktur mogą być zmienne typów prostych (całkowitych, zmiennoprzecinkowych) oraz typy pochodne (tablice, wskaźniki);

• Składową struktury może być również obiekt innej (wcześniej zdefiniowanej) struktury;

• Dostęp do wszystkich składowych struktury jest publiczny;

• Obiekty struktur można przesyłać do funkcji poprzez wartość lub za pomocą wskaźnika;

• Rozmiar struktury (w bajtach) może być większy niż suma rozmiarów poszczególnych pól struktury.

12

Metodyki i techniki programowania, ETDI, sem. 2

Typy złożone – unia

Unia – typ podobny do struktury. Wszystkie pola zajmują ten sam obszar pamięci. Rozmiar unii równy jest

rozmiarowi największego składnika.

union nazwa

{

//deklaracje pól różnych typów

};

Użycie unii ma na celu zmniejszenie zapotrzebowania na pamięć (wykorzystanie tylko jednego pola); często łączone jest z użyciem struktur.

13

Metodyki i techniki programowania, ETDI, sem. 2

Funkcje w języku C

Funkcja – procedura implementująca określone działanie.

Funkcja definiowana jest w wydzielonej części programu.

Posiada: typ zwracany, nazwę, listę argumentów ujętych w nawiasy okrągłe oraz ciało umieszczone w nawiasach klamrowych.

Sposób definiowania funkcji w języku C:

typ nazwa(typ arg_1, typ arg_2, ...)

{

//instrukcje

}

14

Metodyki i techniki programowania, ETDI, sem. 2

Deklaracja funkcji

Deklaracja funkcji – podanie kompilatorowi informacji na temat „szczegółów” funkcji (typ zwracany, nazwa,

argumenty).

Po umieszczeniu deklaracji zapowiadającej funkcji, przy każdorazowym użyciu funkcji w dalszej części

programu kompilator weryfikuje, czy wywołanie funkcji jest prawidłowe oraz z którą funkcją ma do czynienia.

Przykładowa deklaracja zapowiadająca funkcji:

double Srednia(double* tab, int n);

Przy deklaracji nie jest konieczne podanie nazw argumentów: double Srednia(double*, int);

15

Metodyki i techniki programowania, ETDI, sem. 2

Definicja funkcji

Definicja funkcji – jest jej deklaracją wraz z implementacją (ciało funkcji) umieszczoną w nawiasach klamrowych {}.

Deklaracji funkcji może być kilka (w projektach wielo-plikowych) natomiast definicja funkcji może być tylko jedna.

double Srednia(double* tab, int n)

{

double suma = 0; int i;

for(i = 0; i < n; i++)

suma += tab[i];

return suma/n;

}

16

Metodyki i techniki programowania, ETDI, sem. 2

Wywołanie funkcji

Wywołanie funkcji – podanie w kodzie programu nazwy funkcji wraz z opcjonalnymi argumentami oddzielonymi przecinkami, które umieszczone są w nawiasach okrągłych.

Liczba argumentów podczas wywołania musi być równa liczbie parametrów zdefiniowanej funkcji.

Niepodanie () interpretowane jest jako adres funkcji.

double tab[5] = {1.1, 2.2, 3.3, 4.4, 5.5};

printf("%f\n", Srednia(tab, 5));

17

Metodyki i techniki programowania, ETDI, sem. 2

Argumenty funkcji

Jeżeli funkcja zdefiniowana jest z listą argumentów, można ją wywołać przekazując jej odpowiednio zdefiniowane wcześniej zmienne.

Wystarczy wówczas w nawiasach okrągłych podczas

wywołania podać nazwy tych zmiennych.

Kolejność i typ przesyłanych zmiennych muszą być zgodne z kolejnością i typem argumentów w definicji funkcji.

Zmienne można przekazywać do funkcji poprzez:

– wartość: praca na kopii zmiennej w funkcji,

– wskaźnik: praca na oryginale zmiennej w funkcji.

Funkcja może posiadać zmienną liczbę argumentów

ustawioną podczas deklaracji:

void fun(char typ[], ... );

18

Metodyki i techniki programowania, ETDI, sem. 2

Zmienne lokalne i globalne

Ciało funkcji ujęte jest w zakresie nawiasów klamrowych.

Przez to, wewnątrz funkcji tworzony jest zakres lokalny.

Jeżeli w zakresie lokalnym funkcji zostaną stworzone jakiekolwiek zmienne (stos) – będą to zmienne lokalne.

Przestaną one istnieć po zakończeniu działania funkcji.

Jeżeli nazwa i typ zmiennej lokalnej zdefiniowanej w funkcji będzie taka sama jak nazwa i typ zmiennej o zakresie globalnym, to wewnątrz funkcji zmienna lokalna przysłoni zmienną globalną.

19