Lab 3 - Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Zadanie 1 - Wykorzystaj program z poprzednich zajęć (program z funkcją przeliczającą Fahrenheity na Celsjusze). Niech program operuje na zmiennych typu float: float FtoC(float f) return (f-32.0) * 5.0/9.0; Zadanie 2 - Utworzyć dodatkową funkcję FtoK, która przelicza F na K, na bazie poprzedniej F to C (z poprzednich zajęć), wg wzoru: Kelvin = (Fahrenheit + 459.67) * 5.0 / 9.0 Niech wynik od 0 do 200F wyświetla w trzech kolumnach: F = (wartość) C = (wyliczona wartość) K = (wyliczona wartość) Zadanie 3 Utwórz dodatkowe funkcje: CtoF F = C * 9.0/5.0 + 32.0 CtoK K = C + 273.15 KtoC C = K 273.15 KtoF F = K * 9.0/5.0 459.67 (Zadanie 1, 2 i 3 tworzą jeden spójny kod, który należy wysłać na maila Kaja.Gutowska@cs.put.poznan.pl, tytul maila: Imie_Nazwisko_PP_lab3) 4 - Debuggowanie: 4.1. Debuggowanie jest procesem wyszukiwania oraz usuwania błędów znajdujących się w pisanym przez nas kodzie programu. Program wykorzystywany do tego celu nazywany jest debuggerem (ang. debugger w wolnym tłumaczeniu odpluskiwacz). Istnieje szereg debuggerów w postaci komercyjnych rozwiązań zintegrowanych z pakietami Visual Studio, Visual C++ itd. Nie jesteśmy oczywiście zmuszeni do korzystania z powyższych środowisk. Uwagę swoją można bowiem skierować na narzędzia oparte na licencji publicznej GNU. Przykładem debuggera GNU jest program gdb. Zwykle nie musimy korzystać bezpośrednio z gdb gdyż narzędzia te są częścią zintegrowanego środowiska programistyczne (IDE), jak CodeBlocks czy Visual Studio.
4.2. Aby skorzystać z przedstawionych metod wyszukiwania błędów konieczne jest, aby każdy testowany przez nas program uruchamiać w trybie Debug (nie wybierać opcji Release ). W środowisku CodeBlocks ustawienie tej opcji można kontrolować w polu Build target na pasku Compiler. Podobna sytuacja ma miejsce w przypadku środowiska Visual Studio. 4.3. Uwaga, żeby skorzystać z opcji debuggowania trzeba utworzyć projekt w Code::Blocks! -Utworzyć nowy projekt: File New Project -W dalszej kolejności wybrać typ tworzonego projektu: Console application -W wyświetlonym oknie dialogowym wybrać język w jakim będziemy programowali: C++ -Wpisać nazwę projektu oraz jego lokalizację -Naciśnięcie przycisku Finish kończy procedurę tworzenia projektu. W okienku Menadzera w zakładce Projects można przejrzeć drzewo przedstawiające strukturę plików w naszym projekcie. W chwili obecnej posiadamy jeden plik *.cpp o nazwie main.cpp zawierający wygenerowany przez środowisko prosty kod programu, przedstawiony poniżej (należy go nadpisać własnym!): #include <iostream> // dodanie pliku nagłówkowego using namespace std; // korzystamy z przestrzeni nazw std int main() // główna funkcja programu cout << "Hello world!" << endl; // wyświetlenie na standardowym wyjściu Hello World! return 0; 4.4 Napisz programy i skompiluj w trybie Debug (uruchom w celu sprawdzenia poprawności): Zadanie 4.4a Napisz program obliczający zadaną potęgę n liczby 2 (tzn. 2 n ), można wykorzystać program: int n=4; int wynik=1; for(int i=0;i<n;i++) wynik=wynik*2; printf("wynik=%d\n", wynik);
Zadanie 4.4b - Napisz program obliczający pierwiastki wybranego równania kwadratowego. Wykorzystaj funkcję sqrt(), która wymaga dołączenia biblioteki <math.h>. 4.5. Kiedy dysponujemy już gotowym i działającym kodem rozwiązującym postawione zadanie, możemy przejść do ustawienia pierwszych punktów wstrzymania. Punktem wstrzymania (ang. breakpoint) jest pewne miejsce w programie w którym debugger automatycznie zatrzyma jego działanie. Nie jesteśmy oczywiście ograniczeni do pojedynczego punktu wstrzymania a ich położenie zależy wyłącznie od nas samych i wiedzy na temat możliwych błędów jakie mogą się pojawić w danym miejscu kodu źródłowego CodeBlocks: -Ustaw kursor w linijce, w której ma znaleźć się punkt wstrzymania -Z menu wybierz: Debug Toggle breakpoint (F5) -Uruchom program: Debug Start (F8) Zadanie 4.6 Debuggowanie: -Ustaw kilka punktów wstrzymania w różnych linijkach kodu. -Sprawdź działanie poleceń dostępnych w menu Debug: -Next Line (F7), przejście do następnej linii kodu źródłowego. -Next instruction (ALT+F7), przejście do następnej linii kodu maszynowego. -Step into (SHIFT+F7), wykonanie następnej instrukcji z wejściem do funkcji. -Step out (SHIFT+CTRL+F7), wyjście z funkcji. -Run to cursor (F4), przejście do pozycji wskazywanej przez kursor. 4.7. Opcje debuggowania można znaleźć na pasku Debugger pod ikonką Debugging windows : Okno: -Call stack: okno stosu wywołań (ang. Call stack) zawiera listę wywołań funkcji. Lista ta przedstawiana jest w postaci hierarchicznej od funkcji wywołanej najwcześniej aż do wywołanej w bieżącej chwili. Kliknięcie prawym przyciskiem na nazwę funkcji oraz wybranie z pop-up menu polecenia switch to this Frame powoduje przeskoczenie do wskazanej funkcji. -Okno: CPU Registers: okno to przedstawia aktualną zawartość rejestrów procesora. Możliwa jest bieżąca obserwacja zmian wartości zapisanych w rejestrach. Bezpośrednia manipulacja wartościami rejestrów procesora możliwa jest z poziomu języka maszynowego tj. assemblera. -Okno: Disassembly: okno to (zwane oknem disassemblera) zawiera widok kodu maszynowego zapisanego w języku assemblera i wygenerowanego przez kompilator.
-Okno: Memory dump: polskim odpowiednikiem dla tej nazwy jest okno zrzutu pamięci. Okno to pozwala na bezpośrednie podglądanie zawartości pamięci. Możliwość podglądania zawartości pamięci ograniczona jest do obszaru należącego do przestrzeni adresowej naszego procesu. Nie możemy zatem podejrzeć obszaru pamięci wykraczającego poza ten przydzielony (przez system operacyjny) dla aplikacji którą właśnie debuggujemy. -Okno: Running threads: w oknie tym znajdują się informacja o wątkach pracujących w bieżącej chwili. Wszystkie programy pisane na tych zajęciach będą programami jednowątkowymi. -Okno: Watches (zdecydowanie nas interesuje): okno to umożliwia podejrzenie bieżącej wartości zmiennych jak również śledzenie zmian ich wartości. Zadanie 4.8 Korzystając z przedstawionych możliwości debuggowania prześledź napisany dotychczas program przeliczania temperatur. -- Zapoznaj się z funkcjami dostępnymi w menu: Debug Information. Zadania do wykonania w domu: Zadanie 5 Napisz prosty kalkulator implementujący funkcje dodawania, odejmowania, dzielenia (z zabezpieczeniem dla dzielenia przez 0), potęgowania i pierwiastkowania dla liczb zmiennoprzecinkowych (sugerowany typ double). Zadanie 6 - Napisz program znajdujący wszystkie dzielniki zadanej liczby. Zadanie 7- Stwórz program znajdujący wszystkie wspólne podzielniki dwóch podanych liczb. Zadanie 8 - Napisz program wyznaczający liczbę i sumę liczb podzielnych przez 3 w zbiorze n liczb naturalnych. Na wejściu użytkownik podaje wartość n będącą liczbą całkowitą z przedziału <0, 255>. Program powinien obliczać w/w wartości dla zbioru liczb 1..n. Zadanie 9 - Napisz program znajdujący pierwszych k liczb dodatnich, których kwadraty składają się wyłącznie z cyfr 1,4 lub 9. Takimi liczbami są np.: 1, 2, 3, 7, 12, 21, 38, 107,..., ponieważ 1 2 =1, 2 2 =4, 3 2 =9, 7 2 =49, 12 2 =144, 21 2 =441, 38 2 =1444, 107 2 =11449, Zadanie 10 - Napisz program znajdujący wszystkie liczby pierwsze, które można stworzyć z podzbiorów cyfr podanej liczby całkowitej typu int (taką liczbę nazywa się w jęz. ang. primeval number).
Przykład: pytamy ile liczb pierwszych można stworzyć z cyfr liczby 1379. Potraktujmy liczbę 1379 jako zbiór cyfr 1,3,7,9 i znajdźmy wszystkie podzbiory, które tworzą liczby pierwsze. Okazuje się, że możemy znaleźć aż 31 liczb pierwszych zanurzonych w liczbie 1379. Są to: 3, 7, 13, 17, 19, 31, 37, 71, 73, 79, 97, 137, 139, 173, 179, 193, 197, 317, 379, 397, 719, 739, 937, 971, 1973, 3719, 3917, 7193, 9137, 9173, 9371. Uwaga: budując liczbę pierwszą możemy każdą cyfrę ze zbioru wejściowego wziąć tylko raz.