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
Złożone operatory przypisania
a
■
= b;
a = a
■
b;
Zapis równoważny:
Operatorem
■
może być jeden z:
+ - * / % & | ^ << >>
a *= b + 1;
a = a * (b + 1);
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
●
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
●
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.
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ą.
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).
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 funkcji, elementy tabeli, itd....
Deklaracja argumentu funkcji przypomina deklarację zmiennej – zawsze
wymagane jest podanie typu i nazwy argumentu.
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);
}
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...
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);
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
();
}
long
silnia
(int n) {
if(n==1)
return(1);
else
return(n *
silnia
(n-1));
}
Rekurencja – przykład
●
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
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.