Pewne zestawy operacji, przykładowo zależne od zmiennych, możemy zebrać w grupy (funkcje) i wywoływać tak jak circle()
i line()
. Przykład z poprzedniego ćwiczenia możemy zamknąć w funkcji:
void obrazek(int h, int r) {
10, 0, 0, h);
line( 10, 0, 2 * r, h);
line( 10 + r, h, r);
circle( }
Pierwsza linia deklaruje funkcję, która jest zależna od dwóch parametrów: h
i r
. Taką funkcję, możemy przykładowo wywołać tak: obrazek(100, 50);
. Spowoduje to wykonanie powyższych trzech operacji dla \(h = 100\) i \(r = 50\).
Pamiętaj: Nową funkcję napisz przed funkcją main
.
W funkcji main
wywołujemy funkcję obrazek
, tak jak circle
czy line
:
void main() {
200, 200);
graphics(100, 50);
obrazek(
wait(); }
Napisz i wywołaj dowolne dwie z poniższych funkcji:
prostokat(x, y, a, b)
— Rysuje prostokąt o bokach \(a\) i \(b\) i środku w \((x, y)\).kwadrat(x, y, r)
— Rysuje kwadrat o boku \(2r\), środku w \((x, y)\) i wpisane koło o promieniu \(r\).ludzik(x, y, h)
— Rysuje ludzika o wysokości \(h\) i środku głowy w \((x, y)\).olimpiada(x,y)
— Rysuje koła olimpijskie o środku w \((x, y)\).okno(a)
— Używając funkcji do rysowania prostokąta rysuje okno o boku \(a\).Omówmy pewne rzeczy trochę dokładniej.
W C i C++ musimy deklarować zmienne, tzn. musimy powiedzieć, jakich będziemy używać zmiennych i jakich będą one typów. Deklaracje piszemy typ zmienna1, zmienna2, ...;
. Najważniejsze typy to:
int
— Liczba całkowita (32-bitowa, od \(-2^{31}\) do \(2^{31}\)).float
— Liczba zmiennoprzecinkowa. Może opisywać ułamki dziesiętne z ok. 7 cyframi znaczącymi (32-bity)double
— Liczba zmiennoprzecinkowa. Ma 16 cyfr znaczących (64-bity).Pamiętaj: Jeśli używasz liczb rzeczywistych (a nie całkowitych), używaj typu double.
Pierwszym przykładem niech będzie:
double a;
0;
a =
while (a < 2 * 3.14) {
100, sin(a) * 100 + 100, 3);
circle(a * 0.001;
a = a + }
Program ten, za pomocą kółek o promieniu 3, narysuje wykres funkcji sinus przeskalowany o 100.
Używając analogicznej pętli, wykonaj dowolne dwa z poniższych zadań:
Ważne, aby pamiętać, że liczby bez przecinka dziesiętnego, są uważane za całkowite, tzn. wykonywane są na nich działania tak jak dla liczb całkowitych. Dlatego 1/4
da jako wynik 0! Wynik 0.25 zostanie obcięty do liczby całkowitej. Żeby tego uniknąć, możemy napisać 1.0/4
lub jeszcze lepiej 1.0/4.0
. Możemy także bezpośrednio ‘rzutować’ zmienną z typu int
na typ double
pisząc: (double) zmienna
.
Pamiętaj: Wszędzie, gdzie robisz obliczenia, używaj double
. Unikaj mieszania liczb całkowitych i zmiennoprzecinkowych. Nigdy nie pisz ułamków jako 1/3!
Przeanalizuj (i przetestuj) wynik tego programu. Które linie nie dadzą pożądanego efektu?
double a;
0;
a =
while (a < 2) {
100, sin(a * 3.14) * 100 + 100, 3);
circle(a * 100, sin(a * (314 / 100)) * 100 + 100, 3);
circle(a * 100, sin((a * 314) / 100) * 100 + 100, 3);
circle(a * 0.001;
a = a + }
Zestawy operacji, które powtarzamy w programie wielokrotnie, możemy zamknąć w funkcjach. Taka funkcja ,,połyka’’ parametry i coś z nimi robi. Dla przykładu:
void kreski(int n, double r) {
int i;
0;
i =
while (i < n) {
0, i, r * i);
line(i, 1;
i = i +
} }
W pierwszej linii mówimy:
kreski
,n
typu int
i r
typu double
,void
oznacza, że nic nie zwraca.Gdy gdziekolwiek w funkcji main
użyjemy wywołania kreski(20, 0.4);
jako efekt działania funkcji otrzymamy 20 pionowych kresek o długości od \(0\) do \(0.4\cdot 19\) (dlaczego \(19\) a nie \(20\)?).
Taką funkcję możemy wykonać wielokrotnie dla różnych wartości \(n\) i \(r\):
void main() {
200,200);
graphics(
10, 1.000);
kreski(20, 0.500);
kreski(30, 0.333);
kreski(40, 0.250);
kreski(
wait(); }
Napisz i wywołaj dwie spośród niżej wymienionych funkcji:
Kolejnym bloczkiem składowym programowania, jest instrukcja warunkowa. Sprawdza ona warunek i wykonuje pewną część kodu, gdy tylko warunek jest spełniony.
double x, y;
2.0;
x =
if (x > 0) {
y = sqrt(x);else {
} 0;
y = }
Instrukcje te sprawdzają czy \(x > 0\) i jeśli jest to prawdą, wstawiają \(\sqrt{x}\) do zmiennej \(y\). Gdy warunek nie jest spełniony, wykonywana jest część po else
, więc wstawiane jest \(0\) do \(y\). W ten sposób możemy zabezpieczyć się na przykład przed niemożliwymi obliczeniami, albo uzależnić działanie programu od jakiś wartości.
Zobaczmy prosty przykład:
double a;
0;
a =
while (a < 2 * 3.14) {
if (a < 2) {
100 + 100, cos(a) * 100 + 100, 5);
circle(sin(a) * else {
} 100 + 100, cos(a) * 100 + 100, 10);
circle(sin(a) *
}
0.001;
a = a + }
Gdyby nie instrukcja if
, ten program narysował by koło z małych kółek. Teraz, gdy kąt a
przekroczy \(2\) radiany, zmieni promień kółeczka z \(5\) na \(10\)
Napisz program który: