Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Wprowadzenie

Istnieje wiele dobrych praktyk dotyczących programowania i rozwiązywania problemów oraz mnóstwo sposobów i narzędzi, które umożliwiają wykrywanie błędów. W celu ułatwienia pracy programistom powstały specjalne edytory kodów źródłowych z różnymi funkcjami, np. analizatorami składniowymi oraz narzędziami do edycji kodu w kilku miejscach naraz. Dzięki temu wykrycie i naprawa błędu składniowego (literówka w nazwie zmiennej) czy semantycznego (odczytanie niezainicjowanej zmiennej) staje się znacznie prostsze. Ponadto zawsze możemy skorzystać z serwisów internetowych, które pomogą wyjaśnić problemy programistyczne.

Stack Overflow

Stack Overflow to jedno z najbardziej popularnych for informatycznych. Powstało w celu udzielania porad i korzystania z pomocy społeczności podczas wytwarzania oprogramowania. Każdy zarejestrowany użytkownik może zadać pytanie, dodając fragment kodu (demo) obrazujący dany problem. Strona cieszy się tak wielką popularnością, że można ją traktować jako zbiór rozwiązanych problemów programistycznych. Przy umiejętnym użyciu wyszukiwarki internetowej, istnieje duże prawdopodobieństwo, że to właśnie na tej stronie znajdziemy interesujące nas rozwiązanie.

Ciekawostka

Nazwę serwisu można przetłumaczyć jako „przepełnienie stosu”. Oznacza to błąd programistyczny, zwykle spowodowany uruchomieniem nieskończonej rekurencji. Programy w systemie ładowane i uruchamiane są w pamięci RAM w strukturze nazywanej stosem. Każde wywołanie funkcji tworzy pewną liczbę danych na stosie. W momencie uruchomienia nieskończonej rekurencji następuje przepełnienie stosu, czyli wykroczenie poza przydzielony przez system obszar pamięci. W takiej sytuacji następuje błąd krytyczny i działanie programu zostaje przerwane przez system operacyjny.

Aby zobrazować zalety serwisu Stack Overflow, spróbujemy przeanalizować propozycje programów napisanych w językach: C++, Java oraz Python, pobierających dane od użytkownika.

Załóżmy, że dopiero rozpoczęliśmy naukę programowania. Jedną z rzeczy, którą na pewno wielokrotnie będziemy musieli zaprogramować, będzie pobranie danych od użytkownika.

Posłużmy się wyszukiwarką Google w celu przeszukania strony Stack Overflow, aby odnaleźć sposób na wczytanie danych od użytkownika. Wyszukiwarka Google umożliwia nam określenie, z jakiej strony chcielibyśmy wyświetlić wyniki. W tym celu do zapytania należy dopisać angielskie słowo „site:” (czyli: strona), a po dwukropku podać adres strony. W omawianym przypadku wpiszemy frazę: „site:stackoverflow.com” .

Ważne!

Zalecamy wpisywanie fraz w języku angielskim. Znacząco zwiększa to szansę odnalezienia odpowiedzi na szukane pytanie.

Język C++

Sprawdźmy zatem, co wyświetli się po zgłoszeniu wyszukania „c++ read input from user site:stackoverflow.com”. Pierwszą pozycją, jaka wyświetli się w przeglądarce (dostęp: 06.05.2022 r.), jest strona zawierająca następujący kod programu:

Ro5OMNMBIUFnH
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Formatted I/O; taken from: Baby's First C++

Linia 1. kratka include otwórz nawias ostrokątny string zamknij nawias ostrokątny. Linia 2. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 4. int main otwórz nawias okrągły zamknij nawias okrągły. Linia 5. otwórz nawias klamrowy. Linia 6. std dwukropek dwukropek string name średnik. Linia 7. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Enter your name dwukropek cudzysłów średnik. Linia 8. std dwukropek dwukropek getline otwórz nawias okrągły std dwukropek dwukropek cin przecinek name zamknij nawias okrągły średnik. Linia 9. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Thank you przecinek apostrof cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny name otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów apostrof kropka cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny std dwukropek dwukropek endl średnik. Linia 10. zamknij nawias klamrowy.

This isn't quite satisfactory, as many things can (and thus will) go wrong. Here's a slightly more watertight version:

Linia 1. int main otwórz nawias okrągły zamknij nawias okrągły. Linia 2. otwórz nawias klamrowy. Linia 3. std dwukropek dwukropek string name średnik. Linia 4. int score znak równości 0 średnik. Linia 6. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Enter your name dwukropek cudzysłów średnik. Linia 8. if otwórz nawias okrągły wykrzyknik std dwukropek dwukropek getline otwórz nawias okrągły std dwukropek dwukropek cin przecinek name zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy prawy ukośnik asterysk I prawy ukośnik O error wykrzyknik asterysk prawy ukośnik return minus 1 średnik zamknij nawias klamrowy. Linia 10. if otwórz nawias okrągły wykrzyknik name kropka empty otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów Thank you przecinek apostrof cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny name otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów apostrof przecinek you passed the test kropka cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny std dwukropek dwukropek endl średnik. Linia 12. plus plus score średnik. Linia 13. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 14. std dwukropek dwukropek cout otwórz nawias ostrokątny otwórz nawias ostrokątny cudzysłów You fail kropka cudzysłów otwórz nawias ostrokątny otwórz nawias ostrokątny std dwukropek dwukropek endl średnik. Linia 15. minus minus score średnik. Linia 16. zamknij nawias klamrowy. Linia 17. zamknij nawias klamrowy.

Using means that you might read an empty line, so it's worthwhile checking if the result is empty. It's also good to check for the correct execution of the read operation, as the user may pipe an empty file into stdin, for instance (in general, never assume that any particular circumstances exist and be prepared for anything). The alternative is token extraction, std::cin >> name, which only reads one word at a time and treats newlines like any other whitespace.getline()

Otrzymaliśmy zatem informację, w jaki sposób możemy wczytać od użytkownika pewien napis, a także jak wykryć powstałe błędy.

Język Java

Dla zapytania „java read input from user site:stackoverflow.com” również otrzymujemy kilka wyników w wyszukiwarce. Pozycje położone najwyżej to strony z pytaniami najbardziej zbliżonymi do naszego oraz najchętniej odwiedzane. Wejdźmy w pierwszą z nich:

RW6J8Ake17rU8
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

You can use any of the following options based on the requirements.

Scanner class

Linia 1. import java kropka util kropka Scanner średnik. Linia 2. prawy ukośnik prawy ukośnik kropka kropka kropka. Linia 3. Scanner scan znak równości new Scanner otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 4. String s znak równości scan kropka next otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 5. int i znak równości scan kropka nextInt otwórz nawias okrągły zamknij nawias okrągły średnik.

BufferedReader and InputStreamReader classes

Linia 1. import java kropka io kropka BufferedReader średnik. Linia 2. import java kropka io kropka InputStreamReader średnik. Linia 3. prawy ukośnik prawy ukośnik kropka kropka kropka. Linia 4. BufferedReader br znak równości new BufferedReader otwórz nawias okrągły new InputStreamReader otwórz nawias okrągły System kropka in zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 5. String s znak równości br kropka readLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 6. int i znak równości Integer kropka parseInt otwórz nawias okrągły s zamknij nawias okrągły średnik.

DataInputStream class

Linia 1. import java kropka io kropka DataInputStream średnik. Linia 2. prawy ukośnik prawy ukośnik kropka kropka kropka. Linia 3. DataInputStream dis znak równości new DataInputStream otwórz nawias okrągły System kropka in zamknij nawias okrągły średnik. Linia 4. int i znak równości dis kropka readInt otwórz nawias okrągły zamknij nawias okrągły średnik.

Console class

Linia 1. import java kropka io kropka Console średnik. Linia 2. prawy ukośnik prawy ukośnik kropka kropka kropka. Linia 3. Console console znak równości System kropka console otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. String s znak równości console kropka readLine otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 5. int i znak równości Integer kropka parseInt otwórz nawias okrągły console kropka readLine otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik.

Apparently, this method does not work well in some IDEs.

Język Python

Dla języka Python zapytanie „python read input from user site:stackoverflow.com” zwróciło rezultat:

R19iuiPONi6dN
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

To read user input you can try the cmd module for easily creating a mini‑command line interpreter (with help texts and autocompletion) and raw_input (input for Python 3+) for reading a line of text from the user.

Linia 1. text znak równości raw podkreślnik input otwórz nawias okrągły cudzysłów prompt cudzysłów zamknij nawias okrągły kratka Python 2. Linia 2. text znak równości input otwórz nawias okrągły cudzysłów prompt cudzysłów zamknij nawias okrągły kratka Python 3.

Command line inputs are in sys.argv. Try this in your script:

Linia 1. import sys. Linia 2. print otwórz nawias okrągły sys kropka argv zamknij nawias okrągły.

There are two modules for parsing command line options: optparse (deprecated since Python 2.7, use argparse instead) and getopt. If you just want to input files to your script, behold the power of fileinput.

The Python library reference is your friend.

W tym przypadku otrzymaliśmy również informację, w jaki sposób zrealizować oczekiwaną operację w dwóch wersjach języka Python. Ponieważ zadane pytanie składało się z dwóch części, uzyskana została odpowiedź na dwa pytania.

Dokumentacje

Ważnym elementem nauki każdego języka programowania jest zapoznanie się z jego dokumentacją. Przygotowana w odpowiedni sposób dokumentacja może sprawiać, że nauka będzie prosta, a wyszukiwanie nowych funkcji języka – bardzo sprawne.

Jak wiemy, na egzaminie maturalnym można posługiwać się jednym z następujących języków programowania: C++, Java i Python. Poniższej znajdziesz informacje na temat dotyczących ich dokumentacji:

C++:

  • Cppreference – dokumentacja w języku angielskim (kompletna)

  • Cplusplus – inna dokumentacja w języku angielskim (nieco bardziej przyjazna dla początkujących użytkowników)

Java:

  • Oracle – oficjalna dokumentacja języka Java

Python:

  • Python – oficjalna dokumentacja języka Python

Debugger

DebuggerdebuggerDebugger to ważna część środowisk programistycznych, stosowana do wyszukiwania błędów, przede wszystkim semantycznych i logicznych, w tworzonym systemie (błędy składniowe wskazywane są przez kompilator). Zazwyczaj debugger dostarczany jest wraz z IDEIDEIDE. Uruchomienie programu w trybie debugowania pozwala na wykonanie instrukcji krok po kroku, podgląd wartości przechowywanych w pamięci w danym czasie, zatrzymywanie programu w momencie oznaczonym jako breakpointbreakpointbreakpoint.

R1GJDxyDShpV6
W trybie debugowania w środowisku PyCharm w edytorze przy danej linijce kodu, wyświetlają się wartości, które przyjmują poszczególne zmienne.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
R1TXDVncafstn
Również w oknie debuggera możemy podejrzeć, jaką wartość przyjmuje zmienna w danym momencie.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Rozważmy następujący problem:

Dana jest tablica liczb całkowitych. Sprawdź, ile z tych liczb ma ostatnią cyfrę 2 i jest podzielnych przez 7. Znajdź tę liczbę.

Specyfikacja problemu:

Dane:

  • tablica – tablica liczb całkowitych

Wynik:

  • liczba liczb z tablicy dane podzielnych przez 7 oraz o ostatniej cyfrze równej 2

Trzech początkujących programistów napisało swoje rozwiązania w językach C++, Java oraz Python. Okazało się, że w każdej implementacji wystąpił błąd, który spowodował niepoprawne działanie programu. W celu zdiagnozowania problemu posłużymy się debuggerem.

Ważne!

Przedstawione kroki mogą różnić się w zależności od konfiguracji środowiska programistycznego.

C++

Kod napisany w języku C++ wygląda następująco:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int dane otwórz nawias kwadratowy 9 zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias klamrowy średnik. Linia 8. int i znak równości 0 przecinek k znak równości 0 średnik. Linia 10. while otwórz nawias okrągły i otwórz nawias ostrokątny 9 zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. if otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 ampersant ampersant dane otwórz nawias kwadratowy i plus plus zamknij nawias kwadratowy procent 7 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. k znak równości k plus 1 średnik. Linia 13. zamknij nawias klamrowy. Linia 14. zamknij nawias klamrowy. Linia 16. cout otwórz nawias ostrokątny otwórz nawias ostrokątny k otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 17. zamknij nawias klamrowy.

Po uruchomieniu programu zaczyna on wykonywać się w nieskończoność. Początkujący programista może nie wiedzieć, co jest przyczyną tego problemu. Spróbujmy zatem prześledzić problem w debuggerze. Ponieważ program wykonuje się w nieskończoność, łatwo stwierdzić, że błąd jest najprawdopodobniej spowodowany niepoprawnie skonstruowanym warunkiem końca. Ustawmy zatem pierwszy breakpoint w linijce 9. W środowisku Microsoft Visual Studio breakpoint ustawiamy, klikając lewym przyciskiem myszy na linijce przy numerze wiersza. Aby go usunąć, musimy kliknąć lewym przyciskiem myszy na czerwoną kropkę na pasku przerwań.

RtJdheF3dXXkK
Poprawnie ustawiony breakpoint w środowisku Microsoft Visual Studio.

Uruchomimy program w trybie debugowania. W tym celu wybieramy zielony trójkąt z napisem Local Windows Debugger w górnej części programu Visual Studio lub przyciskamy klawisz F5 na klawiaturze.

RKrPwgFnMGBzn
Przycisk uruchamiający program w trybie debugowania w środowisku Microsoft Visual Studio.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Po uruchomieniu program zatrzyma się tuż przed wykonaniem linijki 9. W dolnej części środowiska możemy znaleźć kartę o nazwie Locals, w której wyświetlony jest obecny stan zmiennych zawartych w programie.

R6mWl7tfnFrdd
Karta z podglądem stanu zmiennych w środowisku Microsoft Visual Studio.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Na razie nie widzimy błędu. Spróbujmy zatem przejść krok dalej. Z górnego paska programu wybierzmy opcję Step Over. W tym celu możemy również nacisnąć klawisz F10 na klawiaturze.

R1bBQwWEZIseb
Opcja "Step Over" w środowisku Microsoft Visual Studio.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Po wybraniu opcji, debugger przeniósł nas od linijki 12. Oznacza to, że nie weszliśmy do instrukcji warunkowej, ponieważ warunek nie został spełniony. Na razie wszystko się zgadza. Spójrzmy jeszcze raz na kartę Locals, aby sprawdzić stan zmiennych.

R1U9ZVqBj3X1k
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Widzimy, że wartości zmiennych nie zostały zmienione. Nie zgadza się to jednak z zamysłem autora kodu, gdyż w następnym wykonaniu pętla wykona się w dokładnie w ten sam sposób i zmienne pozostaną w tym samym stanie. Można zatem przypuszczać, że nie wykonała się instrukcja i++ z linijki 9.

Spróbujmy poszukać przyczyny w wyszukiwarce Google. W tym wypadku wymyślenie odpowiedniego zapytania może być trudne, jednak zacznijmy od hasła „C++ &&”.

Rc2sDoGatU15Q
Wyniki wyszukiwania dla hasła "C++ &&" w wyszukiwarce Google z dnia pisania materiału.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Łatwo zauważyć, że trzecia pozycja raczej nie będzie stanowiła przydatnej informacji. Skupmy się zatem na pierwszym oraz piątym wyniku, ponieważ stanowią one dokumentację języka C++. W przypadku piątej pozycji odpowiedź możemy poznać już z poziomu wyszukiwarki Google. Pierwszy wynik to dokumentacja języka C++ według firmy Microsoft. Ponieważ strona została przetłumaczona na język polski z wykorzystaniem maszyny tłumaczącej, aby uniknąć błędów językowych, wyświetlmy ją w oryginalnym języku, tj. w angielskim. Dokonamy tego poprzez włączenie opcji „Przeczytaj w języku angielskim” w prawym górnym rogu.

RdpA4o6uVS0Im
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W czwartym akapicie znajduje się interesująca nas informacja: w przypadku operatora logicznego && drugi operand wykonywany jest tylko w momencie, gdy wartość pierwszego jest równa true. Skoro zatem nie jest spełniony warunek dane[i] % 10 == 2, nie zostanie sprawdzony warunek dane[i++] % 7 == 0, a co za tym idzie – nie zwiększy się wartość zmiennej i. Poprawny kod może wyglądać na przykład tak:

Linia 1. kratka include otwórz nawias ostrokątny iostream zamknij nawias ostrokątny. Linia 3. using namespace std średnik. Linia 5. int main otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int dane otwórz nawias kwadratowy 9 zamknij nawias kwadratowy znak równości otwórz nawias klamrowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias klamrowy średnik. Linia 8. int i znak równości 0 przecinek k znak równości 0 średnik. Linia 10. while otwórz nawias okrągły i otwórz nawias ostrokątny 9 zamknij nawias okrągły otwórz nawias klamrowy. Linia 11. if otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 ampersant ampersant dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 7 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. k znak równości k plus 1 średnik. Linia 13. zamknij nawias klamrowy. Linia 14. i plus plus średnik. Linia 15. zamknij nawias klamrowy. Linia 17. cout otwórz nawias ostrokątny otwórz nawias ostrokątny k otwórz nawias ostrokątny otwórz nawias ostrokątny endl średnik. Linia 18. zamknij nawias klamrowy.

Java

Kod omawianego programu w języku Java wygląda następująco:

Linia 1. public class Project otwórz nawias klamrowy. Linia 2. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. int otwórz nawias kwadratowy zamknij nawias kwadratowy dane znak równości otwórz nawias klamrowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias klamrowy średnik. Linia 5. int i znak równości 0 przecinek k znak równości 0 średnik. Linia 7. while otwórz nawias okrągły i otwórz nawias ostrokątny 9 zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. if otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 ampersant ampersant dane otwórz nawias kwadratowy i plus plus zamknij nawias kwadratowy procent 7 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. k znak równości k plus 1 średnik. Linia 10. zamknij nawias klamrowy. Linia 11. zamknij nawias klamrowy. Linia 13. System kropka out kropka println otwórz nawias okrągły k zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy.

Okazuje się, że program nie działa prawidłowo. Sprawdźmy za pomocą debuggera, w czym tkwi problem. Ustawmy breakpoint w linijce 8. W środowisku Eclipse możemy to osiągnąć przez wybranie opcji Toogle breakpoint, po kliknięciu prawym przyciskiem myszy na pasku przerwań przy interesującej nas linijce. Usunięcie breakpointa odbywa się w ten sam sposób, jednak należy wybrać opcję Disable breakpoint.

R1evwMdBlm5tt
Poprawnie utworzony breakpoint w środowisku Eclipse.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Następnie uruchomimy napisany program w trybie debugowania. W środowisku Eclipse możemy to osiągnąć za pomocą przycisku z ikoną robaka na górnym pasku narzędzi.

R1cT7mPzX6BRk
Ikona uruchamiająca program w trybie debugowania w środowisku Eclipse.

Po uruchomieniu program zatrzyma się przed wykonaniem sprawdzenia warunku instrukcji if. W prawej części środowiska wyświetli się karta z podglądem na stan zmiennych.

RqRAFpfbTP0eT
Karta z podglądem stanu zmiennych w środowisku Eclipse.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym momencie błąd nie jest jeszcze widoczny. Wybierzmy opcję Step Over z górnego paska narzędzi. Możemy ewentualnie nacisnąć klawisz F6.

RwVysaWOuIP9Q
Ikona funkcji "Step Over" w środowisku Eclipse.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W tym momencie program wykona jedną instrukcję. Sprawdźmy aktualny stan zmiennych.

R1WfjQ2V2FlzW
Karta z podglądem stanu zmiennych w środowisku Eclipse
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Łatwo zauważyć, że nie została zwiększona wartość zmiennej i. Nie wykonała się zatem inkrementacja z drugiej części warunku. Kolejne próby wybrania opcji Step Over nadal nic nie zmieniają. Dlaczego? Odpowiedź na to pytanie spróbujmy znaleźć w wyszukiwarce Google. Możemy sprawdzić wyniki wyszukiwania dla hasła „Java &&”.

RepxfG0RWcC5y
Wyniki wyszukiwania dla hasła "Java &&" w wyszukiwarce Google (dostęp: 30.03.2021)
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Pierwsze dwie odpowiedzi nie wydają się zbyt pomocne. Zauważmy, że otrzymaliśmy wyniki wyszukiwania ze strony stackoverflow.com. Sprawdźmy zatem, czego możemy się dowiedzieć, wybierając trzeci wynik wyszukiwania. Rozwiązanie naszego problemu znajduje się w najlepszej odpowiedzi:

RTqDTT7mY7Tn9
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

W momencie, gdy lewa strona operatora && została uznana za false, prawa strona nie została wykonana. Z tego powodu nie zwiększyła się wartość zmiennej i, a w rezultacie pętla wykonywała się w nieskończoność. Poprawne rozwiązanie powinno być następujące:

Linia 1. public class Project otwórz nawias klamrowy. Linia 2. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. int otwórz nawias kwadratowy zamknij nawias kwadratowy dane znak równości otwórz nawias klamrowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias klamrowy średnik. Linia 5. int i znak równości 0 przecinek k znak równości 0 średnik. Linia 7. while otwórz nawias okrągły i otwórz nawias ostrokątny 9 zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. if otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 ampersant ampersant dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 7 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. k znak równości k plus 1 średnik. Linia 10. zamknij nawias klamrowy. Linia 11. i plus plus średnik. Linia 12. zamknij nawias klamrowy. Linia 14. System kropka out kropka println otwórz nawias okrągły k zamknij nawias okrągły średnik. Linia 15. zamknij nawias klamrowy. Linia 16. zamknij nawias klamrowy.

Python

Program napisany w języku Python wygląda tak:

Linia 1. dane znak równości otwórz nawias kwadratowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias kwadratowy. Linia 3. i znak równości 0. Linia 4. k znak równości 0. Linia 6. while i otwórz nawias ostrokątny 9 dwukropek. Linia 7. if dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 and dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 7 znak równości znak równości 0 dwukropek. Linia 8. k znak równości k plus 1. Linia 10. print otwórz nawias okrągły k zamknij nawias okrągły.

Aby odnaleźć błąd w przedstawionym programie, ustawmy breakpoint wewnątrz pętli w linijce 7. Możemy tego dokonać, klikając lewym przyciskiem myszy na pasku przerwań. Usunięcie już istniejącego breakpointa można uzyskać w ten sam sposób, co w przypadku jego dodania.

RVRv44yOoboVs
Poprawnie ustawiony breakpoint w środowisku PyCharm.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Przejdźmy teraz do uruchomienia programu w trybie debugowania w środowisku PyCharm. W tym celu należy nacisnąć ikonę robaka w prawym górnym rogu lub kombinację klawiszy Shift + F9 na klawiaturze.

R1JiAFL3RQqmx
Przycisk uruchamiający program w trybie debugowania w środowisku PyCharm.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Już w tym miejscu możemy podejrzeć stan zmiennych w dolnej części środowiska.

R1YwC1pDBTsOv
Karta z podglądem stanu zmiennych w środowisku PyCharm.
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Jeżeli nie widzimy błędu, możemy wybrać opcję Step Over, która znajduje się w karcie Debug w dolnej części programu. Ewentualnie możemy nacisnąć klawisz F8.

R1aH900R07vXu
Ikona "Step Over" w środowisku PyCharm.

Łatwo zauważyć, że pomimo wielokrotnego wyboru opcji Step Over, nie zmienia się stan zmiennej i. Jeżeli zmienna się nie zmienia, to program nie wyjdzie z pętli, ponieważ tylko zmienna i jest sprawdzana w warunku pętli. Może nam się nasunąć prosty wniosek, tj. programista zapomniał o zwiększaniu wartości zmiennej i wewnątrz pętli. Poprawny kod wygląda następująco:

Linia 1. dane znak równości otwórz nawias kwadratowy 1 przecinek 5 przecinek 49 przecinek 212 przecinek 735 przecinek 231 przecinek 532 przecinek 103 przecinek 147 zamknij nawias kwadratowy. Linia 3. i znak równości 0. Linia 4. k znak równości 0. Linia 6. while i otwórz nawias ostrokątny 9 dwukropek. Linia 7. if dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 10 znak równości znak równości 2 and dane otwórz nawias kwadratowy i zamknij nawias kwadratowy procent 7 znak równości znak równości 0 dwukropek. Linia 8. k znak równości k plus 1. Linia 9. i znak równości i plus 1. Linia 11. print otwórz nawias okrągły k zamknij nawias okrągły.

Słownik

breakpoint
breakpoint

punkt wstrzymania lub pułapka – miejsce docelowego przerwania działania programu w celu sprawdzenia jego stanu w danym momencie; program uruchomiony pod kontrolą debuggera przerwie działanie w danym miejscu

debugger
debugger

służy do szybkiego znajdowania błędów w kodzie programu i ich eliminowania

IDE
IDE

(ang. Integrated Development Environment - zintegrowane środowisko programistyczne) zbiór programów, służących do tworzenia, modyfikowania oraz utrzymywania oprogramowania