User Tools

Site Tools


dydaktyka:cprog:2016:loops-solutions

This is an old revision of the document!


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

Pętla "for"

Zadanie FOR-1

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

Zadanie FOR-2

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

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 PRIME

Krótkie przypomnienie z gimnazjum: 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]$.)

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

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/2016/loops-solutions.1477305924.txt.gz · Last modified: 2020/03/25 11:46 (external edit)