Temat C5. Więcej na temat stosowania funkcji w językach C++ i Python

przez | 24 marca 2020

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;

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. Zmienne globalne i lokalne
  2. Przesłanianie zmiennych
    1. Przesłanianie zmiennych globalnych
    2. Przesłanianie parametrów funkcji

1. Zmienne globalne i lokalne

Zmienna globalna istnieje przez cały czas działania programu i możemy jej używać w wielu miejscach w programie i w funkcjach.

Zmienna lokalna jest dostępna wyłącznie wewnątrz funkcji lub innego bloku programu. Zmienne lokalne można stosować niezależnie od zmiennych globalnych.

Szczegółowe zasady stosowania zmiennych globalnych i lokalnych różnią się w zależności od wykorzystywanego języka programowania.

Zmiennym globalnym pamięć przydzielana jest na cały czas wykonywania programu, natomiast zmiennym lokalnym – tylko na czas wykonania funkcji.

C++
W języku C++ zmienne globalne deklarujemy poza funkcjami. Zmienne te są widoczne od miejsca deklaracji zmiennej do końca pliku – również w funkcjach. Zmienne a i b w przykładzie 3. zostały zadeklarowana jako globalne. Nie trzeba ich więc deklarować wewnątrz funkcji wartosci(), bowiem zasięg zmiennej obejmuje także tę funkcję.

W języku C++ zmienne lokalne są widoczne od miejsca deklaracji do końca funkcji (do nawiasu klamrowego zamykającego definicję funkcji). W języku C++ zmienne lokalne mogą być również tworzone w obrębie bloku instrukcji { }.

W funkcji usmiechy()  (przykład 1.) zmienna i jest lokalna, jej zasięg  jest ograniczony tylko do pętli for. Próba użycia zmiennej lokalnej, zadeklarowanej wewnątrz funkcji, w programie głównym spowoduje pojawienie się podczas kompilacji błędu niezadeklarowanej zmiennej.


W języku Python zmienne globalne są widoczne w dowolnym miejscu programu (w programie głównym i funkcjach).

Zmienne lokalne użyte w danej funkcji są widoczne w całej tej funkcji.

Próba użycia zmiennej lokalnej w programie głównym spowoduje pojawienie się błędu interpretera niezdefiniowanej nazwy danej zmiennej.

Przykład 1. Stosowanie zmiennej lokalnej

C++
W funkcji uśmiechy() z przykładu 1. (temat C4) zadeklarujemy zmienną lokalną k, której wartość (wprowadzana z klawiatury) decyduje o wyprowadzanym wyniku.


Ćwiczenie 1. Stosujemy zmienna lokalną

  1. Otwórz plik TC5_c1.cpp lub TC5_c1.py. Zmodyfikuj funkcję, zgodnie z przykładem 1. Zapisz plik pod tą samą nazwą.
  2. Wykonaj program kilkukrotnie dla różnych danych.
  3. Umieść w programie głównym instrukcję sprawdzającą, czy k jest równe zero; jeśli tak, powinien się wyświetlić znak zapytania.
    C++
    Czy program został skompilowany? Uzasadnij odpowiedź. Odczytaj komunikat kompilatora.

    Dlaczego program nie został uruchomiony? Uzasadnij odpowiedź. Odczytaj komunikat kompilatora.

2. Przesłanianie zmiennych

Zmienne mogą zostać przesłonięte. W szczególności zadeklarowanie wewnątrz funkcji zmiennej lokalnej o takiej samej nazwie, jak zmienna globalna, spowoduje przesłonięcie zmiennej globalnej, co oznacza, że wewnątrz funkcji używana będzie zmienna lokalna, a nie globalna.

2.1. Przesłanianie zmiennych globalnych

Przykład 2. Przesłanianie zmiennej globalnej w języku C++

C++
W funkcji licznik() zadeklarowano zmienną x. Zmienna o nazwie x została również zadeklarowana (jako zmienna globalna) poza funkcją licznik(). Oznacza to, że wewnątrz funkcji zostaną wykonane działania na zmiennej lokalnej x, a wartość zmiennej globalnej x pozostanie niezmieniona.


W funkcji licznik() zadeklarowano zmienną x. Zmienna o nazwie x została również zainicjowana (jako zmienna globalna) poza funkcją licznik(). Oznacza to, że wewnątrz funkcji zostaną wykonane działania na zmiennej lokalnej x, a wartość zmiennej globalnej x pozostanie niezmieniona.

Ćwiczenie 2. Sprawdzamy, na czym polega przesłanianie zmiennej globalnej

  1. Otwórz plik TC5_c2.cpp lub TC5_c2.py. Zmodyfikuj wybrany program, zgodnie z przykładem 2. Wyjaśnij, co się dzieje w poszczególnych wierszach programu.
  2. Zapisz plik pod tą samą nazwą. Uruchom program.
  3. Dlaczego w wyniku działania programu wartość zmiennej x wynosi 10, a wyświetla się siedem liczb (od 1 do 7)? Odpowiedź uzasadnij

Dzięki mechanizmowi przesłaniania, nie musimy się martwić o nazywanie zmiennych wewnątrz funkcji. Jeśli nawet wybierzemy nazwę zmiennej lokalnej (tu: x) taką samą jak nazwa zmiennej globalnej (również x), to wartość zmiennej globalnej nie zostanie naruszona dzięki istnieniu zmiennej lokalnej o tej samej nazwie.

2.2. Przesłanianie parametrów funkcji

Parametry formalne danej funkcji w jej treści mogą być traktowane jak zmienne lokalne i ewentualne operacje wykonywane na tych parametrach wewnątrz funkcji nie będą powodowały zmian wartości odpowiadających im parametrów aktualnych (argumentów). Tak się dzieje w przypadku parametrów przekazywanych przez wartość.

Uwaga: Zależnie od języka programowania i używanych typów zmiennych parametry mogą być przekazywane funkcji na różne sposoby, m.in.: przez wartość, referencję, wskaźnik. Jednak to zagadnienie, jako bardziej skomplikowane, omówimy w dalszych tematach.

Przykład 3. Przesłanianie parametrów funkcji

Funkcja wartosci() została zdefiniowana z dwoma parametrami: x i y. Wywołanie funkcji w programie głównym z parametrami aktualnym a i b przekazywanymi przez wartość powoduje, że wewnątrz funkcji parametry x i y przyjmują odpowiednio wartości zmiennych a i b.

C++

Uwaga: Zmienna x i odpowiadająca jej zmienna a (podobnie zmienne y i b) zajmują w pamięci komputera dwa różne miejsca (o różnym adresie), dlatego wykonanie działań na zmiennych x i y nie ma wpływu na wynik wywołania procedury z parametrami aktualnymi (argumentami) a i b (przykład w tabeli 1.).

Tabela 1. Parametry x i y przesłoniły parametry aktualne a i b

Ćwiczenie 3. Sprawdzamy, na czym polega przesłanianie parametrów funkcji

Otwórz plik TC5_c3.cpp lub TC5_c3.py.  Wykonaj program dla kilku par parametrów.

Sprawdź dodatkowo, jakie otrzymasz wyniki:

  • wywołując funkcję z konkretnymi wartościami, np. wartosci(12, 20);
  • wprowadzając dane wewnątrz funkcji (zamiast w programie głównym lub na zewnątrz funkcji); rozważ w każdym z języków dwa przypadki:

    C++
    Przypadek 1.

    cin >> x;
    cin >> y;

    Przypadek 2.

    cin >> a;
    cin >> b;


    Przypadek 1.

    a = int(input("Wprowadź pierwszą liczbę: "))
    b = int(input("Wprowadź drugą liczbę: "))

    Przypadek 2.

    x = int(input("Wprowadź pierwszą liczbę: "))
    y = int(input("Wprowadź drugą liczbę: "))

    Objaśnij w każdym z przypadków otrzymane wyniki.

Zadania

  1. Otwórz plik TC5_z1.cpp lub TC5_z1.py. Dodaj do programu funkcję wyprowadzającą na ekran 20 znaków „@”. Zmodyfikuj program tak, aby dla k równego zero na ekran były wyprowadzane znaki „@”, a dla k różnego od zera – zestaw znaków „:-)”.
  2. Otwórz plik TC5_z2.cpp lub TC5_z2.py. Zmodyfikuj funkcję usmiechy(), aby wyświetlać w n wierszach po 20 „uśmiechów”. Rozpatrz przypadek, gdy zmienna n została zadeklarowana w funkcji usmiechy() jako zmienna lokalna i równocześnie, gdy zmienna n została zadeklarowana poza funkcją usmiechy() jako zmienna globalna. Zapisz plik pod tą samą nazwą. Uruchom program. Wyjaśnij otrzymane wyniki.