This is an old revision of the document!
Laboratorium: Pętla "while", formatowanie kodu, debuggowanie
Aby sprawdzić, czy dla zadanej liczby $x$ zachodzi $4 < x < 6$ należy zapisać wyrażenie następująco:
if (4 < x && x < 6) ...
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).
#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; }
#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; }
#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; }
#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; }
Pomysł polega na tym, aby sumować cyfry zaczynając od jedności i następnie “obcinając” po jednej pozycji - właśnie zaczynając od jedności:
196 / 10
wynosi 19
19 / 10
wynosi 9
1 / 10
wynosi 0
Gdy po (kolejnym) dzieleniu dostaniemy wartość 0
– wiemy, że nie zostało już więcej cyfr do sumowania.
#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; }