background image

 

 

Programowanie

w języku C

Programowanie

w języku C

© 2011

Grzegorz Łukawski & Maciej Lasota
Politechnika Świętokrzyska w Kielcach

Wykład nr 5:

Złożone operatory przypisania

Formatowanie printf() - uzupełnienie

Funkcje, argumenty funkcji, rekurencja

Funkcje ze zmienną liczbą argumentów

background image

 

 

Złożone operatory przypisania

= b;

a = a 

 b;

Zapis równoważny:

Operatorem 

 może być jeden z:

+  -  *  /  %  &  |  ^  <<  >>

a *= b + 1;
a = a * (b + 1);

background image

 

 

Formatowanie printf() / scanf()

%d

char, int, short, long

-23001

%x

char, int, short, long

f45aba

%X

F45ABA

%u

unsigned …

123400

%c

char

A

%s

char*

Tekst

%f

float, double

198.001468

%e

float, double

2.224653e+002

%E

2.224653E+002

%

Typy danych

Przykład

background image

 

 

Minus, dosuwający przekształconą wartość do lewej strony pola.

Zero,  wymuszający  uzupełnianie  znakiem  0  (zero)  do  szerokości  pola, 

domyślnie jest to spacja.

Liczba określająca minimalny rozmiar pola. Przekształcona wartość będzie 

wpisana  do  pola  o co  najmniej  takim  rozmiarze.  Jeśli  trzeba,  pole  będzie 

uzupełnione  do  pełnego  rozmiaru  z lewej  lub  prawej  strony.  Dla  tekstów 

znakiem uzupełniającym jest spacja.

Kropka.

Liczba  określająca  precyzję  –  maksymalną  liczbę  znaków  dla  tekstu, 
minimalną liczbę cyfr dla wartości całkowitej (uzupełnienie zerami), liczbę 

cyfr po przecinku dla wartości zmiennoprzecinkowych.

Litera 'h' jeśli podany argument jest typu short, lub 'l' dla long/double.

Formatowanie printf() / scanf()

%

-04.4h

d

background image

 

 

Zawsze obok nazwy funkcji występują nawiasy okrągłe.

Na początku każdej funkcji można deklarować zmienne lokalne.

Funkcja w języku C może posiadać zmienną liczbę argumentów*.

Niemożliwe jest definiowanie funkcji wewnątrz innych funkcji 

(dotyczy ANSI C).

Funkcje i „procedury”

typ_zwracanej_wartosci 

nazwa

(argumenty) {

deklaracje_zmiennych;

instrukcje;

}

UWAGA!
Deklarując  funkcje  należy  trzymać  się  zasady,  że  aby  zmienna/funkcja 

mogła być użyta, musi być zadeklarowana wcześniej w pliku źródłowym.

background image

 

 

Funkcja kończy się:

po klamrze zamykającej;

w  miejscu  wystąpienia  instrukcji  return  (również  dla  funkcji  nie 
zwracających wartości).

Zakończenie funkcji

return

(wynik);   

<==>   

return

 wynik;

Domyślny  typ  zwracanej  wartości  to  int.  Jeśli  zaistnieje  potrzeba,  wartość 

zwracana zostanie przekształcona na typ wyniku funkcji.

UWAGA!
Funkcja  musi  zakończyć  się  instrukcją  return  po  każdym  możliwym 

wariancie  zakończenia  funkcji  (po  każdym  odgałęzieniu  instrukcji  if), 

w przeciwnym razie funkcja może zwrócić wartość nieokreśloną.

background image

 

 

Wartość  zwracana  przez  funkcję  może  zostać  zignorowana  przez  kod 
wywołujący tę funkcję.

Zakończenie funkcji

Użycie  return  w  funkcji  main()  spowoduje  zakończenie  programu 

i zwrócenie wartości do systemu operacyjnego (powłoki).

background image

 

 

Argumenty (parametry) funkcji

Lista argumentów (parametrów) formalnych:

int 

funkcja

(

int x

int y

) { … }

Lista argumentów (parametrów) aktualnych:

wynik = 

funkcja

(

liczba

3

);

Jako  argumenty  funkcji  można  przekazywać  wartości  stałe,  zmienne
wyrażenia (ich wyniki), wyniki innych funkcjielementy tabeli, itd....

Deklaracja  argumentu  funkcji  przypomina  deklarację  zmiennej  –  zawsze 
wymagane jest podanie typu i nazwy argumentu.

background image

 

 

Typ pusty void

Typ pusty void służy do deklarowania funkcji które nie zwracają żadnych 

wyników, czyli tzw. „procedur”.

void

 wyswietl(int a, int b) {

int suma = a + b;

printf(”Suma liczb = %d\n”, suma);

}

Funkcja tego typu nie musi zawierać instrukcji return.

W  takim  przypadku  instrukcja  return  bez  parametru  może  służyć  do 

wcześniejszego zakończenia funkcji.

void

 wyswietl(int a, int b) {

int suma = a + b;

if(suma < 0) return;

printf(”Suma liczb = %d\n”, suma);

}

background image

 

 

Argumenty = zmienne lokalne

long 

power

(

int baza

int n

) {

long p;

for(p=1;

n>0

;

--n

)

p*=

baza

;

return(p);

}

UWAGA!
Argumenty  do  funkcji  w  języku  C  przekazywane  są  zawsze  przez 

wartość (jako kopie)! Jedynym „wyjątkiem” są tablice...

background image

 

 

Prototyp funkcji (deklaracja zapowiadająca) – pozwala na korzystanie 

z funkcji zanim jej treść zostanie zadeklarowana!

Prototypy funkcji

Prototyp  zawiera  informacje  o  nazwie,  typie  zwracanym  oraz  liczbie 
i typie argumentów funkcji.

Prototyp  funkcji  może  okazać  się  niezbędny,  jeżeli  następują  bardziej 

złożone wywołania rekurencyjne funkcji (rekurencja pośrednia).

Nagłówek:

Prototyp:

int fun(int x, float y) {…}

int fun(int, float);

void wyswietl(int t[32]) {…}

void wyswietl(int[32]);

float sumuj() {…}

float sumuj();

long power(int baza, int n) {…}

long power(int, int);

background image

 

 

UWAGA!
Prototyp  musi  zgadzać  się  z  rzeczywistym  nagłówkiem  funkcji, 

w przeciwnym  wypadku  kompilator  (linker)  nie  utworzy  pliku 

wykonywalnego programu.

Prototypy funkcji – rekurencja pośrednia

?

int B();

int 

A

() {


y = 

B

();

}

int 

B

() {


y = 

A

();

}

int A();

int 

B

() {


y = 

A

();

}

int 

A

() {


y = 

B

();

}

background image

 

 

long 

silnia

(int n) {

if(n==1)

return(1);

else

return(n * 

silnia

(n-1));

}

Rekurencja – przykład

background image

 

 

Statyczne – zmienne globalne i lokalne poprzedzone słowem static, ich 
wartość początkowa to zawsze 0.

Automatyczne  (wewnętrzne,  lokalne)  –  tworzone  na  stosie,  bez 
wartości początkowej, dotyczy też parametrów funkcji.

Rejestrowe – poprzedzone słowem register – sugestia dla kompilatora 
że zmienna będzie często używana i należy ją umieścić w rejestrze CPU.

Rodzaje zmiennych

long 

zliczaj

(int a, int b) {

static

 long 

suma

;

// Początkowo 0

suma

 += a*b;

return(

suma

);

}

a = 

zliczaj

(2, 2);

// 4

b = 

zliczaj

(3, 10);

// 34

c = 

zliczaj

(1, 1);

// 35

background image

 

 

Parametry funkcji main()

ArgC

– liczba argumentów (>= 1);

ArgV[0]

– zawsze obecna nazwa programu;

ArgV[1], ArgV[2],... – pierwszy i kolejne argumenty.

int 

main

(int ArgC, char *ArgV[]) {

}

UWAGA!
Funkcja  main()  może  mieć  argumenty  tylko  w  tej  formie  (nazwy 

argumentów mogą się różnić). Wszystkie argumenty przekazywane są do 

programu jako ciągi znaków.


Document Outline