This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
dydaktyka:cprog:2016:loops-solutions [2015/11/12 07:11] 127.0.0.1 edycja zewnętrzna |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Pętla "while" - rozwiązania i odpowiedzi ====== | ||
- | Laboratorium: [[dydaktyka:cprog:2015:loops|Pętla "while", formatowanie kodu, debuggowanie]] | ||
- | |||
- | ===== Priorytety operatorów ===== | ||
- | |||
- | Aby sprawdzić, czy dla zadanej liczby $x$ zachodzi $4 < x < 6$ należy zapisać wyrażenie następująco: | ||
- | <code c> | ||
- | if (4 < x && x < 6) ... | ||
- | </code> | ||
- | |||
- | Wyrażenie ''4 < x < 6'' zgodnie z priorytetami operatorów równoważne jest ''(4 < x) < 6'', a ponieważ w języku C operatory porównania (np. '<') zwraca wartość całkowitą ''1'' bądź ''0'', to przykładowo dla $x = 7$ otrzymamy ''(1 < 7) < 6'' <=> ''1 < 6'' <=> ''1'' (co oczywiście nie jest pożądanym wynikiem). | ||
- | |||
- | |||
- | ===== Pętla "while" ===== | ||
- | |||
- | ==== Zadanie 1 ==== | ||
- | |||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int n = 5; | ||
- | int k = 3; | ||
- | int iloczyn = 0; | ||
- | int n0 = n; // zapamietaj wartosc `n`, bo bedziemy ja modyfikowac... | ||
- | |||
- | while (n > 0) { | ||
- | iloczyn = iloczyn + k; | ||
- | n = n - 1; | ||
- | } | ||
- | |||
- | printf("%d * %d = %d\n", n0, k, iloczyn); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Pętla "do-while" ===== | ||
- | |||
- | ==== Zadanie 1 ==== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int n; | ||
- | |||
- | do { | ||
- | printf("Podaj liczbe dodatnia: "); | ||
- | scanf("%d", &n); | ||
- | } while (n <= 0); | ||
- | |||
- | printf("OK, wpisano %d.\n", n); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Zadanie 2 ==== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int n; | ||
- | |||
- | do { | ||
- | n = rand() % 101; | ||
- | } while (n < 10 || n > 15); // zgodnie z prawem de Morgana: | ||
- | // ~(a && b) == ~a || ~b | ||
- | |||
- | printf("OK, wpisano %d.\n", n); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ===== Zadania podsumowujące ===== | ||
- | |||
- | ==== Zadanie 1 ==== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int i, j; | ||
- | |||
- | for (i = 0; i < 3; i++) { | ||
- | for (j = 0; j < 3; j++) { | ||
- | printf("%d", (i + j) % 3 + 1); | ||
- | } | ||
- | printf("\n"); | ||
- | } | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Zadanie 2 ==== | ||
- | |||
- | Pomysł polega na tym, aby sumować cyfry zaczynając od jedności (z użyciem operatora //modulo//) i następnie "obcinać" po jednej pozycji -- właśnie zaczynając od jedności (z użyciem operatora dzielenia): | ||
- | - $\mod(196, 10) = 6$; w języku C ''196 / 10'' wynosi ''19'' | ||
- | - $\mod(19, 10) = 9$; w języku C ''19 / 10'' wynosi ''9'' | ||
- | - $\mod(1, 10) = 1$; w języku C ''1 / 10'' wynosi ''0'' | ||
- | |||
- | Gdy po (kolejnym) dzieleniu dostaniemy wartość ''0'' -- wiemy, że nie zostało już więcej cyfr do sumowania. | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int n = 196; | ||
- | int n0 = n; | ||
- | |||
- | // POMYSŁ: "Odcinaj" po jednej cyfrze od końca i zobacz, co | ||
- | // wlasciwie odcinasz ;) | ||
- | |||
- | int sum = 0; | ||
- | while (n > 0) { | ||
- | sum = sum + n % 10; // dodaj wartość ostatniej cyfry "głowy" | ||
- | n = n / 10; // obetnij ostatnią cyfrę "głowy" | ||
- | } | ||
- | |||
- | printf("Suma cyfr liczby %d to %d.\n", n0, sum); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Zadanie 3 ==== | ||
- | |||
- | <code c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | int main () | ||
- | { | ||
- | double S = 5.0; | ||
- | double x = S; // krok (1) | ||
- | double x_prev; // wartość `x` w poprzedniej iteracji | ||
- | |||
- | do { | ||
- | x_prev = x; | ||
- | x = (x_prev + S / x_prev) / 2; // krok (2) | ||
- | printf("%.6f\n", x); | ||
- | } while (x - x_prev < -10e-3); // krok (3) | ||
- | |||
- | printf("sqrt(%.2f) ~= %.6f\n", S, x); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> |