Pętla for - odpowiedzi - Programowanie jest łatwe

Sprawdź, jak sobie radzisz z pętlami. W tym artykule znajdziesz odpowiedzi do ćwiczeń dotyczących for.

94be20311379790850b069316e7ef7edb55c8e4a.jpg

  1. Co się stanie po wykonaniu poniższego kodu:
    for (int i = 0; i < 10; ++i) {}

Pętla wykona się tak samo, jak w przypadku użycia operatora postinkrementacji i++. Jednak nie jest to bez znaczenia, jakiego operatora użyjemy. Różnica powstanie w momencie, gdy wartość iteratora będziemy przypisywać do zmiennej, która później zostanie użyta wewnątrz pętli. Np.

int x = 0;
for (int i = 0; i < 10; x = ++i) {}

W takim wypadku użyty operator ma kolosalne znaczenie. Otóż w przypadku preinkrementacji wartość i zostanie najpierw zwiększona, a następnie przypisana do zmiennej x. W przypadku postinkrementacji i++ najpierw zostanie przypisana wartość iteratora do zmiennej x a dopiero później zwiększona wartość i:

int x = 0;
for (int i = 0; i < 5; x = ++i) {
  printf("i: %d, x: %d\n", i, x);
}

Wyświetli:

i: 0, x: 0
i: 1, x: 1
i: 2, x: 2
i: 3, x: 3
i: 4, x: 4

Natomiast:

int x = 0;
for (int i = 0; i < 5; x = i++) {
  printf("i: %d, x: %d\n", i, x);
}

Wyświetli:

i: 0, x: 0
i: 1, x: 0
i: 2, x: 1
i: 3, x: 2
i: 4, x: 3
  1. Napisz pętlę for, która wyświetli wartości ciągu Fibonacciego, nie przekraczające wartości 200.
int poprzednia_wartosc = 0;
int nastepna_wartosc = 1;
int aktualna_wartosc = 1;

for (poprzednia_wartosc = 0; (poprzednia_wartosc + nastepna_wartosc) <= 200; poprzednia_wartosc = aktualna_wartosc) {
  aktualna_wartosc = nastepna_wartosc;
  nastepna_wartosc = poprzednia_wartosc + nastepna_wartosc;
  printf("%d\n", nastepna_wartosc);
}

Kod napisany na podstawie ciągu Fibonacciego z ćwiczeń z pętlą for. To, co zrobiłem, to umieściłem kopiowanie aktualnej wartości do poprzedniej wartości w miejsce manipulacji iteratora. Pozostała część jest praktycznie taka sama.

  1. Co się stanie, gdy zostanie pominięta inicjalizacja iteratora?

Poza tym, że zostanie nam to przypomniane przez kompilator- nic. Można pominąć inicjalizację iteratora, jednak należy pamiętać, że w późniejszym czasie może okazać się to strzałem w kolano. Tutaj przykład pętli, która będzie działać tak samo dobrze jak ta z ćwiczenia 1, ale bez zainicjalizowanego iteratora:

int x = 0;
int i = 0;
for (i = 0; i < 5; x = ++i) {
  printf("i: %d, x: %d\n", i, x);
}

W przypadku, gdy nie zdefiniujemy wartości iteratora przy jego deklaracji, czyli tak:

int x = 0;
int i;
for (; i < 5; x = ++i) {
  printf("i: %d, x: %d\n", i, x);
}

Otrzymamy losowy wynik, ponieważ nie wiadomo jaką wartość początkową będzie miała zmienna i.

  1. Czy można pominąć instrukcje zwiększające wartość iteratora? Jaki ma to wpływ na przebieg pętli?

Można, podobnie jak w ćwiczeniu powyżej, należy liczyć się z błędami, które na pewno wystąpią, jeżeli ręcznie nie zadbamy o należytą wartość operatora. W takim przypadku lepiej jednak rozważyć pętlę while albo do... while:

int i = 0;
  for (i = 0; i < 5;) {
}

Ta pętla nigdy się nie skończy, ponieważ i zawsze będzie wynosić 0.

  1. Co się stanie, gdy wewnątrz pętli zmodyfikujemy wartość iteratora?

Iterator, po obiegu pętli, w momencie sprawdzania warunku stopu będzie zmieniony. Będzie to miało wpływ na przebieg pętli:

int i = 0;
for (i = 0; i < 10; i++) {
  i+= 2;
}

Pętla wykona się 4 razy.


Dodano: 2018-05-11 07:18 przez Piotr Poźniak

ćwiczenia , odpowiedzi , pętle , for ,
Piotr Poźniak
O autorze:

Programuję od ponad 15 lat. Prowadzę software house. Angażuję i zachęcam wszystkich do programowania w ramach inicjatywy Programowanie jest łatwe.