Operator ?:
, instrukcje break
, continue
, case
, do-while
i funkcje
Operator trójargumentowy ?:
Operator trójargumentowy o składni
wyrazenie_logiczne ? wyrazenie_1 : wyrazenie_2
tworzy wyrażenie, którego wartość zależy od wyrazenie_logiczne
.
Jeśli jest ono prawdziwe, wartością całego wyrażenia jest wyrazenie_1
. W przeciwnym razie wartością całego wyrażenia jest wyrazenie_2
.
Tylko jedno z dwóch ostatnich wyrażeń jest obliczane — tylko to,
którego wartość jest brana jako wartość całego wyrażenia.
W poniższym przykładzie zmienna x
przyjmie wartość 10
:
x = x > x+1 ? 1 : 10;
Instrukcje break
i continue
Porównaj poniższe fragmenty kodu:
// Przykład 1 int i; for(i = 0; i<10; ++i){ if( i == 5) continue; printf("%d\n", i); } // Przykład 2 int i; for(i = 0; i<10; ++i){ if( i == 5) break; printf("%d\n", i); }
Instrukcja case
switch(wyrazenie) { case stala1: instrukcje; break; case stala2: instrukcje; break; default: instrukcje; }
Napisz program, który wczytuje dwie liczby całkowite i działa w zależności od wartości pierwszej liczby:
0
— program nic nie robi;1
— program wypisuje dziesięciokrotność drugiej liczby;2
— program wypisuje cyfrę jedności drugiej liczby;- w pozostałych przypadkach program wypisuje drugą liczbę bez zmian.
Zadania
-
Napisz program, który wczyta dwie liczby i wypisze maksimum ich wartości bezwzględnych.
-
Napisz program, który wczyta dwie liczby i wypisze wartość bezwzględną ich maksimum.
-
Napisz program, który wczyta liczbę dodatnią
n
i wypisze, na którym miejscu (licząc od prawej) znajduje się najbardziej znacząca jedynka w zapisie binarnym liczbyn
— inaczej: długość zapisu binarnego liczbyn
. Na przykład:./a.out 7 3 // bo 111 ./a.out 8 4 // bo 1000
-
Napisz program, który wczyta liczbę dodatnią
n
i wypisze część całkowitą z pierwiastka kwadratowego zn
. Nie możesz użyć funkcji z biblioteki matematycznej.
Pętla do-while
do { instrukcje; } while(warunek);
Zasada działania:
- Wykonaj instrukcje wewnątrz pętli;
- Oblicz
warunek
; - Jeśli
warunek
jest spełniony, skocz do początku pętli (pkt 1); - W przeciwnym razie opuść pętlę.
Przykład:
int i = 100; do { printf("%d\n", i); i+=1; } while(i < 10); // porównaj z: int i = 100; while(i < 10){ printf("%d\n", i); i+=1; }
Funkcje
Funkcja to fragment kodu, który można wielokrotnie wykorzystać poprzez jej wywołanie — już to robiliśmy z funkcjami z biblioteki standardowej.
Definicja funkcji:
typ_zwracany nazwa_funkcji(lista parametrow){ instrukcje; return wartosc_zwracana; }
Nagłówek powyżej zdefiniowanej funkcji to typ_zwracany
nazwa_funkcji(lista parametrów)
.
Wypisanie samego nagłówka funkcji bez podania jej definicji (ciała
funkcji) to jej deklaracja.
Przykłady funkcji:
int suma(int a, int b){ return a+b; } int maximum(int a, int b){ if(a>b){ return a; } else { return b; } } int maximum_inaczej_napisane(int a, int b){ if(a>b) return a; return b; } int maximum_jeszcze_inaczej(int a, int b){ return a>b?a:b; } int rok_przestepny(unsigned int rok){ if(rok < 1582) return rok % 4 == 0; if(rok % 4 == 0){ if(rok % 100 == 0){ return rok%400 == 0; } else { return 1; } } return 0; }
Uwagi:
-
Funkcji nie powinno się zagnieżdżać.
-
Zmienne zdefiniowane wewnątrz funkcji są w niej lokalne.
-
Funkcja musi być znana kompilatorowi w momencie jej wywołania. Oznacza to, że jej definicja (a przynajmniej deklaracja) ma się pojawić przed funkcją, która jej używa.
-
Parametry funkcji są przekazywane przez wartość — jeśli podamy funkcji argument, który jest zmienną, wewnątrz funkcji będziemy działać na jej kopii (patrz przykład poniżej).
-
Jeśli funkcja nie musi nic zwracać, zaznaczamy to poprzez słowo kluczowe
void
w miejscu nazwy typu zwracanej wartości.void probuj_zmienic(int a){ a += 1; } int main(){ int b = 10; probuj_zmienic(b); printf("%d\n", b); return 0; }
-
W przykładzie poniżej
int min(int a, int b){ return a<b?a:b; } int main(){ int x, y, z; scanf("%d%d", &x, &y); z = min(x*2, y-3); printf("%d\n", z); return 0; }
parametrami funkcji
min
sąa
orazb
, natomiast argumentami funkcjimin
są wyrażeniax*2
iy-3
. Czyli parametr to zmienna występująca w definicji funkcji, natomiast argument to wartość przekazywana do funkcji w momencie jej wywoływania.
Zadania
-
Napisz funkcję, która dla podanego parametru
n
typuint
zwróci silnię zn
. -
Napisz funkcję, która przyjmuje dwe wartości zmiennoprzecinkowe:
- długość podstawy trójkąta,
- wysokość trójkąta.
Funkcja ma zwrócić pole trójkąta.
-
Napisz funkcję, która przyjmuje 3 wymiary prostopadłościanu (wartości zmiennoprzecinkowe) i zwraca jego pole powierzchni.