Temat C7. Stosowanie instrukcji iteracyjnych w językach C++ i Python

przez | 29 lipca 2020

Wszystkie treści na stronie ir.migra.pl są chronione prawami autorskimi. Więcej informacji znajdziesz tutaj.

Uwaga: Zapoznaj się wcześniej z tematami C1-C5 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I”. Jeśli realizujesz ten temat w klasie II, to zapoznaj się również z tematami C1-C3 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa II”. Wykonaj zawarte w nich ćwiczenia i zadania.

Zapisy podstawy programowej realizowane w temacie:

I. Rozumienie, analizowanie i rozwiązywanie problemów
Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. w zależności od problemu rozwiązuje go, stosując metodę wstępującą lub zstępującą;
  2. do realizacji rozwiązania problemu dobiera odpowiednią metodę lub technikę algorytmiczną i struktury danych;
  3. sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów;

II. Programowanie i rozwiązywanie problemów z wykorzystaniem komputera i innych urządzeń cyfrowych.

Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. projektuje i tworzy rozbudowane programy w procesie rozwiązywania problemów, wykorzystuje w programach dobrane do algorytmów struktury danych, […]
  2. stosuje zasady programowania strukturalnego i obiektowego w rozwiązywaniu problemów;
  3. sprawnie posługuje się zintegrowanym środowiskiem programistycznym przy pisaniu, uruchamianiu i testowaniu programów;

I + II. Zakres rozszerzony. Uczeń spełnia wymagania określone dla zakresu podstawowego, a ponadto:

  1. zapisuje za pomocą listy kroków, schematu blokowego lub pseudokodu, i implementuje w wybranym języku programowania, algorytmy poznane na wcześniejszych etapach […]:

Spis treści

  1. Instrukcja while w językach C++ i Python
  2. Instrukcja for a instrukcja while w języku C++
  3. Instrukcja while a do … while w języku C++
  4. Instrukcja for a instrukcja while w języku Python

1. Instrukcja while w językach C++ i Python

W programach tworzonych w języku C++ najczęściej wprowadzaliśmy liczbę iteracji z klawiatury po uruchomieniu programu – stosowaliśmy instrukcję iteracyjną (instrukcję pętli) for. Do zapisywania algorytmów iteracyjnych, w których liczba iteracji nie jest z góry określona, możemy zastosować instrukcję iteracyjną (instrukcję pętli) while.

C++
Ogólna postać instrukcji while:

while (warunek)
     lista_instrukcji;
kolejna_instrukcja;


Ogólna postać instrukcji while:

while warunek:
     lista_instrukcji
kolejna_instrukcja

Działanie pętli while jest takie samo w obydwu językach (C++ i Python): najpierw sprawdzany jest warunek; jeśli jest spełniony, to wykonywana jest lista_instrukcji. Wewnątrz bloku lista_instrukcji powinna być zawsze umieszczona instrukcja, która zmienia wartość warunku – w przeciwnym wypadku pętla nigdy się nie zakończy. W szczególnej sytuacji, gdy warunek od razu nie jest spełniony, lista_instrukcji w ogóle nie zostanie wykonana. Lista_instrukcji może zawierać jedną lub wiele instrukcji.

Przykład 1. Stosowanie instrukcji iteracyjnej while w językach C++ i Python

Zadanie: Napisz program, który będzie wczytywał wprowadzaną z klawiatury liczbę rzeczywistą a, obliczał i wyświetlał na ekranie liczbę odwrotną do niej, dopóki liczba a będzie różna od zera. Dla a równego zero program powinien wyprowadzić komunikat o treści „nie istnieje liczba odwrotna dla zera” i zakończyć działanie.

Dane: Liczba rzeczywista a.

Wynik: Liczba odwrotna do a: odwrotna (jeżeli a jest różne od zera) lub komunikat „Nie istnieje liczba odwrotna dla zera” (gdy a jest równe zero).

Lista kroków:

  1. Zacznij algorytm.
  2. Wprowadź wartość liczby a.
  3. Sprawdź, czy a = 0: jeżeli tak, idź do kroku 7.
  4. Zmiennej a przypisz wartość jej odwrotności: odwrotna = 1 / a.
  5. Wyprowadź wynik: odwrotna
  6. Idź do kroku 2.
  7. Wyprowadź komunikat: „Nie istnieje liczba odwrotna dla zera”.
  8. Zakończ algorytm.

W zadaniu nie określono, dla ilu par liczb program ma być wykonywany, ale wprowadzono warunek (a różne od 0), dlatego możemy zastosować instrukcję while, której działanie polega na wykonywaniu ciągu instrukcji, dopóki warunek jest spełniany.

Fragment rozwiązania zadania:

C++

Ćwiczenie 1. Stosujemy instrukcję iteracyjną while w językach C++ i Python

  1. Otwórz plik TC7_c1_p1.cpp lub TC7_c1_p1.py. Uzupełnij wybrany program zgodnie z listą kroków (przykład 1.).
  2. Zapisz plik pod tą samą nazwą. Sprawdź działanie programu dla kilku danych.
  3. Odpowiedz na pytania:
    • W jakim przypadku instrukcje wewnątrz pętli nie zostaną wykonane ani razu?
    • Która instrukcja ma wpływ na zmianę wartości logicznej warunku? Sprawdź, jak będzie działał program, jeśli usuniesz tę instrukcję.

2. Instrukcja for a instrukcja while w języku C++

Ćwiczenie 2. Przypominamy postać instrukcji for w języku C++

  1. Przypomnij sobie ogólną postać instrukcji for w języku C++ (temat C5 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I”).
  2. Podaj przykład problemu, do którego zapisania w języku programowania można zastosować instrukcję for.

W pętli while w odróżnieniu od pętli for nie ma wyrażenia ustalającego wartość początkową zmiennej sterującej (wyrażenie_początkowe) i wyrażenia służącego do zwiększania lub zmniejszania wartości zmiennej sterującej (wyrażenie_pętli). Sprawdzany jest tylko warunek.

Mimo tych różnic, pętle for i while w języku C++ mogą być stosowane zamiennie. Wystarczy odpowiednio zmodyfikować program z pętlą for, by ten sam algorytm zapisać z użyciem pętli while – i na odwrót.

Przykład 2. Zamiana pętli for na pętlę while w języku C++

Napiszemy program obliczający i wyświetlający na ekranie n iloczynów kolejnych dwóch liczb naturalnych, zaczynając od 1: 1 * 2, 2 * 3, … n – 1 * n. W pierwszym rozwiązaniu zastosujemy pętlę for, w drugim zamienimy ją na pętlę while.

C++
Rozwiązanie z pętlą for:

C++
Rozwiązanie z pętlą while:

Uwagi:

Aby zmienić rozwiązanie z pętlą for na rozwiązanie z pętlą while, dodaliśmy instrukcję ustalającą wartość początkową zmiennej sterującej (i = 0;) oraz instrukcję zwiększającą wartość zmiennej sterującej (i++;).

Ćwiczenie 3. Zamieniamy pętlę for na pętlę while w języku C++

  1. Otwórz plik TC7_c3_p2_for.cpp. Uruchom program dla kilku różnych danych n.
  2. Zmodyfikuj program, zmieniając pętlę for na while. Uruchom program dla kilku różnych danych n. Zapisz program w pliku pod nazwą TC7_c3_p2_while.cpp.
  3. Porównaj obydwa programy i oceń, które rozwiązanie jest lepsze (czytelniejsze, wykonane w lepszym stylu).

Przykład 3. Zamiana pętli while na pętlę for w języku C++

W pętli for wymagane są trzy elementy (dwa wyrażenia i warunek) oddzielone średnikami. Można jednak umieścić w nawiasach sam warunek pomiędzy średnikami:

    for ( ;warunek; )

lub same średniki:

    for( ; ; )

Zamienimy pętlę while na for w zadaniu z przykładu 1. Aby zmienić program z pętlą while na program z pętlą for, usunęliśmy wyrażenie ustalające wartość początkową zmiennej sterującej oraz wyrażenie zwiększające wartość zmiennej sterującej:

    for ( ;a !=0; )

C++

Ćwiczenie 4. Zamieniamy pętlę while na pętlę for w języku C++

  1. Otwórz plik TC7_c1_p1.cpp zapisany w ćwiczeniu 1. Zmodyfikuj program, zmieniając pętlę while na for. Uruchom program dla kilku różnych danych a. Zapisz program w pliku pod nazwą TC7_c4_p3_for.cpp.
  2. Porównaj obydwa programy i oceń, które rozwiązanie jest lepsze (czytelniejsze, wykonane w lepszym stylu).

Zamiana instrukcji for na while (lub while na for) nie zawsze wpływa na zoptymalizowanie i zwiększenie czytelności programu.

Wybór rodzaju pętli zależy od rozwiązywanego problemu – niektóre łatwiej zapisać, używając instrukcji for, a inne – instrukcji while. Instrukcji for używamy zwykle, gdy przetwarzamy zbiór elementów (np. zliczamy je), gdy znamy liczbę iteracji, np. wprowadzamy ją z klawiatury po uruchomieniu programu. W pętli for jest od razu określone miejsce na umieszczenie wartości początkowej licznika i jego zmianę, więc trudniej o błąd. Do zapisywania innych algorytmów iteracyjnych, zwłaszcza takich, w których liczba iteracji nie jest z góry określona, stosujemy instrukcję while.

3. Instrukcja while a do … while w języku C++

C++
Ogólna postać instrukcji do … while:

do
    lista_instrukcji;
while (warunek);

W instrukcji do … while, w odróżnieniu od instrukcji while, warunek jest sprawdzany po wykonaniu listy_instrukcji, więc instrukcja wewnątrz pętli zostanie wykonana przynajmniej raz, niezależnie od wartości początkowej warunku. Pętla do … while jest wykonywana dopóki jest spełniony warunek. Gdy warunek przestanie być spełniany, nastąpi wyjście z pętli. Lista_instrukcja może być pojedyncza lub złożona.

Przykład 4. Stosowanie instrukcji do … while w języku C++

Napiszemy program wczytujący liczby wprowadzane z klawiatury i zliczający wśród nich liczby parzyste. Dla liczby równej zero program powinien zakończyć działanie i podać, ile było liczb parzystych.

Fragment rozwiązania zadania:

C++

Uwaga:

W zadaniach podanych w przykładach 1. i 2, aby zakończyć wprowadzanie danych, określaliśmy tzw. znacznik końca danych. W tym przypadku jest to liczba zero.

Ćwiczenie 5. Stosujemy instrukcję do … while w języku C++

  1. Napisz specyfikację zadania i listę kroków algorytmu opisanego w przykładzie 4.
  2. Napisz program realizujący algorytm podany w przykładzie 4.
  3. Zapisz program w pliku pod nazwą TC7_c5_p4_do.cpp.
  4. Uruchom i wykonaj program dla wybranych danych.

Instrukcje while lub do … while możemy stosować zamiennie, ale zwykle dobiera się je do rozwiązywanego problemu. Jeśli sprawdzenie warunku jest wymagane zanim zostanie wykonana lista_instrukcji wewnątrz pętli, stosujemy instrukcję while. Natomiast jeśli program wymaga najpierw wprowadzania danych z klawiatury, wykonania na nich działań, potem sprawdzenia warunku i zależnie od niego wykonania (lub nie) kolejny raz listy_instrukcji – lepiej zastosować pętlę do … while.

4. Instrukcja for a instrukcja while w języku Python

Ćwiczenie 6. Przypominamy instrukcję for w języku Python

  1. Przypomnij sobie ogólną postać instrukcji for w języku Python i przykłady jej stosowania (temat C5 z podręcznika „Teraz bajty. Informatyka dla szkół ponadpodstawowych. Zakres podstawowy. Klasa I”).
  2. Podaj przykład problemu, do którego zapisania w języku programowania można zastosować instrukcję for.

W języku Python (podobnie jak w języku C++) pętli for używamy, aby przetwarzać zbiór elementów, gdy znana jest liczba iteracji. W odróżnieniu od języka C++, liczbę iteracji można tu określać w różny sposób, na przykład powtarzając polecenia zawarte wewnątrz pętli dla konkretnych wartości wypisanych w liście_wartości (przykład 5.) lub podając liczbę powtórzeń z zastosowaniem funkcji range() (przykład 6.).

Przykład 5. Stosowanie pętli for w języku Python z określaniem listy_wartości

Napiszemy program obliczający i wyświetlający w kolumnie kwadraty dziesięciu wybranych liczb.

Ćwiczenie 7. Stosujemy pętlę for w języku Python z określaniem listy_wartości

  1. Otwórz plik TC7_c7_p5.py. Uruchom program. Ile razy została wykonana instrukcja print(i*i)? Jakie kolejne wartości będzie przyjmować zmienna i?
  2. Zmodyfikuj program, zmieniając kolejność kilku elementów w liście_wartości. Zapisz program w pliku pod nazwą TC7_c7_p5_2.py i ponownie go uruchom. Co zauważasz?

Ćwiczenie 8. Stosujemy pętlę for w języku Python z określaniem listy_wartości

  1. Napisz program obliczający średnią temperaturę powietrza w ciągu jednego tygodnia dla temperatur: 21, 19, 22, 25, 28, 23, 22.
  2. Zapisz program w pliku pod nazwą TC7_c8.py.

Przykład 6. Stosowanie pętli for w języku Python z wykorzystaniem funkcji range() i zamienianie na pętlę while

Napiszemy program obliczający i wyświetlający na ekranie n iloczynów kolejnych dwóch liczb naturalnych, zaczynając od 1: 1 * 2, 2 * 3, … n – 1 * n.

Rozwiązanie zadania z pętlą for:

Rozwiązanie zadania z pętlą while:

Ćwiczenie 9. Zamieniamy pętlę for na pętlę while w języku Python

  1. Otwórz plik TC7_c9_p6_for.py. Uruchom program dla kilku różnych danych n.
  2. Zmodyfikuj program, zmieniając pętlę for na while. Uruchom program dla kilku różnych danych n. Zapisz program w pliku pod nazwą TC7_c9_p6_while.py.
  3. Porównaj obydwa programy i oceń, które rozwiązanie jest lepsze (czytelniejsze, wykonane w lepszym stylu).

W języku Python pętlę for z funkcją range() możemy zamienić na pętlę while, ale nie wpłynie to na zoptymalizowanie i zwiększenie czytelności programu, a wręcz odwrotnie, ponieważ musimy dodać instrukcję inicjującą licznik (tu zmienną i) oraz instrukcję zwiększającą licznik o 1 (i = i + 1). W praktyce taka zamiana nie ma większego zastosowania.
Wybór rodzaju pętli zależy od rozwiązywanego problemu. Instrukcji for używamy zwykle, gdy przetwarzamy zbiór elementów (np. zliczamy je), gdy znamy liczbę iteracji, np. wprowadzamy ją z klawiatury po uruchomieniu programu. Do zapisywania innych algorytmów iteracyjnych, zwłaszcza takich, w których znamy tylko warunek zakończenia, stosujemy instrukcję while. W jednym programie (przykład 7.) możemy zastosować obydwie pętle – for i while. W przykładzie 7. pokażemy również zastosowanie metody append() i funkcji len().

Metoda append(wartosc) dodaje wartosc na końcu listy.

Metodę append() w programie możemy wywołać, dodając po nazwie listy kropkę, a po niej nazwę metody, np.: polecenie dostawy.append(20) doda na końcu listy dostawy liczbę 20

Funkcja len(nazwa_listy) zwraca długość listy.

Na przykład, jeśli lista dostawcy zawiera 25 elementów, to funkcja len(dostawcy) zwróci wartość 25.

Przykład 7. Stosowanie pętli for i while, metody append i funkcji len w języku Python

Napiszemy program zliczający liczby wprowadzane z klawiatury aż do wystąpienia zera i wyświetlający je w kolumnie na ekranie.

Na początku programu zdefiniujemy pustą listę o nazwie liczby.

Ćwiczenie 10. Stosujemy metodę append i funkcję len w języku Python

  1. Otwórz plik TC7_c10_p7.py. Uruchom program kilkakrotnie dla różnej liczby danych. Objaśnij znaczenie poszczególnych wierszy programu.
  2. Zmodyfikuj program, aby obliczał dodatkowo różnicę pomiędzy pierwszym i ostatnim elementem i wyprowadź wynik. Zapisz program w pliku pod nazwą TC7_c10_p7_2.py.

Zadania

  1. Narysuj schemat blokowy algorytmu zapisanego w postaci listy kroków w przykładzie 1.
  2. Ile razy będą wykonane pętle pokazane w ramkach? Rozważ różne przypadki w zależności od wprowadzonych danych.
  3. C++

    a)

    b)

    c)

    a)

    b)

    c)

  4. W wybranym języku programowania napisz program wczytujący liczby całkowite wprowadzane z klawiatury, aż do wystąpienia liczby niedodatniej oraz obliczający i wyprowadzający średnią arytmetyczną tych liczb. Jaka liczba będzie tu znacznikiem końca danych?
  5. Otwórz plik TC7_c5_p2.cpp zapisany w ćwiczeniu 5. Zmień w programie instrukcję while … do na while. Zapisz program w pliku pod nazwą TC7_z4.cpp. Uruchom i przetestuj program. Porównaj obydwa programy, a następnie omów wnioski.
  6. W języku Python napisz program wczytujący liczby wprowadzone z klawiatury i zliczający wśród nich liczby parzyste. Dla liczby równej zero program powinien zakończyć działanie i podać, ile było liczb parzystych. Zapisz program w pliku pod nazwą TC7_z5.py.
  7. Zmodyfikuj program zapisany w zadaniu 4. lub w zadaniu 5., dodając możliwość zliczania liczb nieparzystych. Zapisz program w pliku pod nazwą TC7_z6.
  8. W języku C++ napisz program obliczający i wyświetlający w kolumnie kwadratów dziesięć kolejnych liczb pierwszych. Liczby zapamiętaj w tablicy. Zapisz program w pliku pod nazwą C7_z7.cpp.
  9. W wybranym języku programowania napisz program wczytujący liczby aż do wystąpienia zera i dzielący je na dwa podzbiory: liczby parzyste i liczby nieparzyste. Zdefiniuj odpowiednie funkcje oraz wykorzystaj tablice (C++) lub listy (Python). Zapisz program w pliku pod nazwą TC7_z8.
  10. Dla zainteresowanych:

  11. W wybranym języku programowania napisz program umożliwiający wprowadzenie dwóch liczb całkowitych większych od 1 i wyprowadzający tę z nich, której suma cyfr jest większa. Wykorzystaj algorytm wyodrębniania cyfr danej liczby (poznany w klasie VIII szkoły podstawowej). Zapisz program w pliku pod nazwą TC7_z9.
    Wskazówka: Zadanie można rozwiązać, korzystając z instrukcji while oraz z operatorów: modulo (%) oraz dzielenia (/).
  12. Wymyśl samodzielnie problem iteracyjny. Sformułuj zadanie, napisz jego specyfikację i listę kroków oraz zapisz w wybranym języku programowania. Zapisz program w pliku pod nazwą C7_z10. Uzasadnij wybór instrukcji iteracyjnej zastosowanej w swoim rozwiązaniu.