This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
dydaktyka:cprog:2016:loops-solutions [2016/10/24 12:45] pkleczek |
— (current) | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ====== Pętla "while" - rozwiązania i odpowiedzi ====== | ||
- | Laboratorium: [[dydaktyka:cprog:2015:loops|Pętla "while", formatowanie kodu, debuggowanie]] | ||
- | |||
- | ===== Pętla "for" ===== | ||
- | |||
- | ==== Zadanie FOR-1 ==== | ||
- | |||
- | <code c for-1.c> | ||
- | /* Program oblicza sume liczb naturalnych 1,2,...,10. */ | ||
- | |||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int i = 0; | ||
- | int suma = 0; | ||
- | |||
- | for (i = 1; i <= 10; i = i + 1) { | ||
- | suma = suma + i; | ||
- | } | ||
- | | ||
- | printf("suma = %d\n", suma); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | ==== Zadanie FOR-2 ==== | ||
- | |||
- | <code c for-2.c> | ||
- | /* Program oblicza sume liczb calkowitych z przedzialu <a,b>. */ | ||
- | |||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int a = 0; | ||
- | int b = 0; | ||
- | int suma = 0; | ||
- | |||
- | int i; | ||
- | |||
- | printf("Podaj liczby `a` i `b`: "); | ||
- | scanf("%d %d", &a, &b); | ||
- | |||
- | for (i = a; i <= b; i = i + 1) { | ||
- | suma = suma + i; | ||
- | } | ||
- | |||
- | printf("suma = %d\n", suma); | ||
- | |||
- | return 0; | ||
- | } | ||
- | </code> | ||
- | |||
- | |||
- | ===== 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 PRIME ==== | ||
- | |||
- | Krótkie przypomnienie z gimnazjum: [[http://www.math.edu.pl/czy-pierwsza|Jak rozpoznać czy liczba naturalna jest pierwsza?]] \\ | ||
- | (W poniższym programie nie bawię się w warunek $i < \sqrt{n}$, czyli równoważnie $i^2 < n$, tylko po prostu sprawdzam wszystkie liczby naturalne z przedziału $[2,n-1]$.) | ||
- | |||
- | <code c prime.c> | ||
- | #include <stdio.h> | ||
- | #include <stdlib.h> | ||
- | |||
- | int main() | ||
- | { | ||
- | int n; | ||
- | int i; | ||
- | |||
- | printf("Podaj liczbe calkowita: "); | ||
- | scanf("%d", &n); | ||
- | |||
- | for (i = 2; (i < n) && (n % i != 0); i = i + 1) | ||
- | ; /* po prostu sprawdz kolejna liczbe... */ | ||
- | |||
- | if (i == n) { | ||
- | // Cala petla zostala wykonana, wiec liczba N nie byla podzielna | ||
- | // przez zadna z liczb 2, 3, ..., N-1. | ||
- | printf("Liczba %d jest pierwsza.\n", n); | ||
- | } else { | ||
- | printf("Liczba %d NIE jest pierwsza.\n", n); | ||
- | } | ||
- | |||
- | 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> |