• Nie Znaleziono Wyników

Podstawy programowaniaLaboratorium 13.Cel:

N/A
N/A
Protected

Academic year: 2021

Share "Podstawy programowaniaLaboratorium 13.Cel:"

Copied!
2
0
0

Pełen tekst

(1)

Podstawy programowania

Laboratorium 13.

Cel:

• Opanowanie programowania z użyciem funkcji rekurencyjnych, wskaźników do funkcji oraz plików Zajęcia:

1. Utworzenie katalogu roboczego, np. lab_13

2. Skopiowanie pliku potega.c do podkatalogu np. rekurencje

3. Kompilacja i uruchomienie programu (np. tworząc prosty plik Makefile, jako modyfikację pliku Makefile z poprzedniego laboratorium)

4. Modyfikacja programu polegająca na:

◦ napisaniu (np. na podstawie wykładu) funkcji power_int_rekur obliczającej całkowitą potęgę liczby całkowitej w sposób rekurencyjny

◦ uzupełnienie kodu o makro assert sprawdzające w funkcji power_int_rekur czy wykładnik jest liczbą dodatnią

▪ uruchomienie programu z błędnymi danymi – obserwacja zwracanego komunikatu

▪ kompilacja z opcją -DNDEBUG , uruchomienie z błędnymi danymi – obserwacja działania 5. Modyfikacja programu polegająca na przekazywaniu parametrów z linii wywołania programu, np.

przekazanie podstawy i wykładnika – program drukuje podstawa^wykładnik

◦ do przekształcenia w liczby całkowite napisów przekazywanych przez środowisko wywołania i wskazywanych przez elementy tablicy argv[] można użyć dostarczonej funkcji my_atoi

◦ wywołanie my_atoi można następnie zamienić na wywołanie funkcji bibliotecznej atoi (ewentualnie strtol) z biblioteki standardowej

6. Skopiowanie pliku loop_table.c do podkatalogu np. tablice (zamiast pliku loop_table.c można skopiować plik z kodem zawierającym tworzenie tablic o losowych wartościach napisanym w ramach poprzednich

laboratoriów)

7. Uruchomienie, sprawdzenie poprawności działania (wydruki)

8. Rozszerzenie programu o wywołanie funkcji bibliotecznej qsort sortującej utworzoną tablicę

◦ włączenie odpowiednich plików nagłówkowych z prototypami

◦ napisanie funkcji porównywania elementów o odpowiednim prototypie zgodnym z prototypem funkcji qsort

▪ umieszczenie w kodzie deklaracji i definicji funkcji

z określeniem inline dla zasugerowania optymalizacji wywołania funkcji

◦ napisanie wywołania qsort w funkcji main

◦ sprawdzenie działania (kod sprawdzenia wewnątrz dyrektywy kompilacji warunkowej):

▪ poprzez wydruki

▪ poprzez pętlę porównującą dwa kolejne wyrazy dla całej tablicy

do porównania można użyć makra assert

▪ poprzez porównanie z wynikiem innego algorytmu sortowania, np. napisanym w ramach poprzednich laboratoriów sortowaniem bąbelkowym

9. Rozszerzenie programu o wywołanie funkcji wyszukującej wartości w posortowanej tablicy

◦ odkomentowanie fragmentów funkcji main zawierających nieskończoną pętlę wyszukiwania wartości w tablicy (pętlę można uzupełnić o warunek zakończenie obliczeń, np. przez podanie -1)

◦ wpisanie poprawnego wywołania funkcji wyszukującej wartość w tablicy

◦ uruchomienie – sprawdzenie działania poprzez porównanie wydruków

◦ dodanie porównania wyniku zwracanego przez funkcję binsearch_iter z wynikiem zwracanym przez funkcję biblioteczną bsearch

▪ sprawdzenie powinno być wewnątrz obszaru dyrektywy kompilacji warunkowej

▪ sprawdzenie może wykorzystywać makro assert lub własną obsługę błędu

10. Zamiana funkcji binsearch_iter na funkcję binsearch_rekur realizującą algorytm rekurencyjny

◦ zmiana prototypu, tak aby można było wyszukiwać we fragmencie tablicy

◦ implementacja algorytmu (np. na podstawie pseudokodu z wykładu)

◦ wpisanie poprawnego wywołania w funkcji main zamiast binsearch_iter

▪ uwaga na poprawne określenie indeksów tablicy

◦ uruchomienie, sprawdzenie poprawności działania

▪ np. poprzez wielokrotne (w pętli o zadanej liczbie iteracji) automatyczne generowanie wyszukiwanej liczby losowej i sprawdzanie czy rzeczywiście znajduje się na znalezionej pozycji

11. Dodanie do programu zapisu i odczytu tablic liczbowych do i z pliku tekstowego o wybranej nazwie

◦ zapis tablicy zaraz po wygenerowaniu – użycie fprintf

◦ odczyt do innej tablicy – użycie fscanf – porównanie wartości w tablicach

(2)

▪ poprawność zapisu można także sprawdzić poprzez przeglądanie zawartości pliku w dowolnym edytorze tekstu

◦ modyfikacja pliku poprzez zmianę wprowadzoną w edytorze tekstu powodującą błąd odczytu

▪ wypisanie informacji o błędzie w trakcie odczytu do standardowego strumienia błędu stderr

◦ wersja początkowa programu może zawierać nazwy plików bezpośrednio wpisane do kodu

◦ wersja ostateczna powinna pobierać nazwę pliku jako argument linii wywołania

▪ nazwa powinna określać pełną ścieżkę do pliku

▪ katalog, w którym mają znajdować się pliki może zostać przekazany jako inny argument linii wywołania i połączony w jedną nazwę za pomocą odpowiedniej funkcji obsługi napisów, np. sprintf Tematy rozszerzające:

1. Rozszerzenie funkcji my_atoi do funkcji my_atof przekształcającej napisy do postaci liczb typu double (dla uproszczenia założyć standardowy zapis liczby w napisie – z przecinkiem (lub kropką), bez wykładnika jak w zapisie naukowym)

1. wskazówka: funkcja my_atof może zachowywać się identycznie jak my_atoi, aż do napotkania przecinka (lub kropki) - if (s[i] == '.' || s[i] == ',') i++; - po czym ustalanie kolejnych cyfr liczby powinno odbywać się wraz z liczeniem ile cyfr jest po przecinku, co należy wykorzystać przy obliczaniu ostatecznego wyniku

2. modyfikacja funkcji main, tak aby przyjmować z linii poleceń argumenty obliczania potęgi i następnie wywoływać funkcję power_int dla argumentów całkowitych, ewentualnie funkcję biblioteczną pow (man 3 pow) w przypadku argumentów innych typów

3. sprawdzenie, czy funkcja my_atof (dla swoich dopuszczalnych argumentów) daje te same wyniki co funkcja biblioteczna atof (ewentualnie funkcja biblioteczna strtod)

1. sprawdzenie można umieścić wewnątrz dyrektywy kompilacji warunkowej, np.

#ifdef DEBUG_MY_ATOF

... // odpowiednie sprawdzenia, wydruki itp.

endif

2. uruchomienie kodu bez sprawdzenia i ze sprawdzeniem (przekazaniem opcji -DDEBUG_MY_ATOF) 4. uzupełnienie kodu o makro assert sprawdzające w funkcji main czy podstawa jest liczbą dodatnią

1. uruchomienie programu z błędnymi danymi – obserwacja zwracanego komunikatu

2. kompilacja z opcją -DNDEBUG , uruchomienie z błędnymi danymi – obserwacja działania

2. Wykorzystanie w dowolnych programach pobierających dane ze standardowego wejścia i zapisujących wynik do standardowego wyjścia przekierowania z i do plików za pomocą opcji linii wywołania polecenia < i >

(man bash , /PRZEKIEROWANIE, n, n aż do odpowiedniego akapitu)

◦ sprawdzanie poprawności poprzez przeglądanie zawartości plików i testowanie poprawności działania programów

3. Modyfikacja algorytmu wyszukiwania binarnego, tak aby zawsze zwracał wskaźnik do pierwszego wystąpienia zadanej wartości w tablicy

◦ wskazówka: można to osiągnąć poprzez przeprowadzenie wyszukiwania zawsze do momentu osiągnięcia przez zakres indeksów wartości minimalnej (np. pocz==kon-1) i zwrócenie odpowiedniej wartości wskaźnika dopiero w tym momencie

◦ sprawdzenie poprawności algorytmu

4. Zamiana zapisu i odczytu formatowanego tablic w programie sortowania na zapis binarny

◦ wykorzystanie niskopoziomowych funkcji z interfejsu systemowego open, read i write (man 3 open, man 3 read, man 3 write)

5. Rozszerzenie programu sortowania tablic o generowanie tablic liczb podwójnej precyzji o losowych wartościach (np. wykorzystując funkcję drand48 lub prostą konwersję r=a+rand()*(b-a)/RAND_MAX

◦ zapis liczb do plików tekstowych z wykorzystaniem różnych sposobów formatowania

▪ %f, %e, %g – różne warianty dodatkowych parametrów

◦ sprawdzenie poprzez przeglądanie plików w edytorach tekstu Warunki zaliczenia:

1. Obecność na zajęciach i wykonanie co najmniej kroków 1-

2. Oddanie 1-2 stronicowego sprawozdania, napisanego ręcznie, zawierającego:

1. opis wykonanych zadań

2. kod źródłowy podstawowych funkcji i konstrukcji sterujących 3. wnioski

Cytaty

Powiązane dokumenty

Tablica będzie uporządkowana, ponieważ instrukcja 3 poprawnie uporządkuje elementy tablicy od od l-tego do i-1-szego, i-ty jest na właściwej pozycji wobec poprawności

Program początkowo nie zawiera instrukcji wykonywalnych (z wyjątkiem printf) 2. linie zaczynające się od ////** stanowią komentarz i instrukcje wykonywania zadań 2. linie

▪ na podstawie przeprowadzonej analizy dobranie parametru TOLERANCJA i, zamiast warunku if(a==0){...}, wprowadzenie warunku if(fabs(a)&lt;TOLERANCJA) (zastosowane rozwiązanie

▪ wydrukowanie wartości argumentów i zmiennych, na które wskazują wewnątrz funkcji prosta_funkcja4. ◦ modyfikacja wartości wskaźników (int_ptr++,

▪ utworzenie nowego bloku (reguły) dla pliku main.o (zależnego od pliku main.c i pliku lista_powiazana.h (każda modyfikacja interfejsu wymaga rekompilacji kodu – dla sprawdzenia

Ułamki niewłaściwe można zapisać w postaci liczby mieszanej, np. Mieliśmy siedem piątych. Czyli cztery drugie to dwie całe. Mieliśmy pięć drugich. Cztery z nich wykorzystaliśmy

Napisz program, który pobiera od użytkownika 15 liczb całkowitych i wypisuje je od końca oddzielone *, ale tylko ostatnie

sprawdzenie warunku, czyli wyrażenie logiczne kontrolujące pętlę – pętla będzie wykonywana dopóki ten warunek jest prawdziwy, oraz modyfikację zmiennych kontrolujących