User Tools

Site Tools


dydaktyka:cprog:2015:loops-solutions

This is an old revision of the document!


Pętla "while" - rozwiązania i odpowiedzi

Priorytety operatorów

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) < 61 < 61 (co oczywiście nie jest pożądanym wynikiem).

Pętla "while"

Zadanie 1

#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;
}

Pętla "do-while"

Zadanie 1

#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;
}

Zadanie 2

#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;
}

Zadania podsumowujące

Zadanie 1

#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;
}

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):

  1. $\mod(196, 10) = 6$; w języku C 196 / 10 wynosi 19
  2. $\mod(19, 10) = 9$; w języku C 19 / 10 wynosi 9
  3. $\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.

#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;
}

Zadanie 3

#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;
}
dydaktyka/cprog/2015/loops-solutions.1447308712.txt.gz · Last modified: 2020/03/25 11:46 (external edit)