Zad. 4: Szablonu dla układu równań liniowych

Podobne dokumenty
Zad. 5: Układ równań liniowych liczb zespolonych

Zad. 3: Układ równań liniowych

Zad. 3: Rotacje 2D. Demonstracja przykładu problemu skończonej reprezentacji binarnej liczb

Zad. 4: Rotacje 2D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

Laboratorium nr 4: Arytmetyka liczb zespolonych

Zad. 5: Sterowanie robotem mobilnym

Laboratorium nr 5: Mnożenie wektorów i macierzy

Zad. 6: Sterowanie robotem mobilnym

Zad. 7: Fabryka obiektów i singleton

Zadanie nr 2: Arytmetyka liczb zespolonych

Zad. 5: Sterowanie dronem

Układ równań liniowych

Zad. 7: Sterowanie robotami mobilnymi w obecności przeszkód

Zadanie nr 3: Sprawdzanie testu z arytmetyki

Zadanie 2: Arytmetyka symboli

Zad. 4: Rotacje 3D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

Szablony funkcji i szablony klas

Zad. 5: Rotacje 3D. 1 Cel ćwiczenia. 2 Program zajęć. 3 Opis zadania programowego

C++ Przeładowanie operatorów i wzorce w klasach

Zad. 7: Sterowanie manipulatorem przypadek 3D

Wyliczanie wyrażenia obiekty tymczasowe

Zad. 6: Sterowanie dronami w obecności przeszkód

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Podstawy Programowania Obiektowego

Klasa, metody, rozwijanie w linii

Lab 9 Podstawy Programowania

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

Dodatkowo klasa powinna mieć destruktor zwalniający pamięć.

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Podstawy Programowania

1 Powtórzenie wiadomości

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Klasa, metody, rozwijanie w linii

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Mathcad c.d. - Macierze, wykresy 3D, rozwiązywanie równań, pochodne i całki, animacje

TEMAT : KLASY DZIEDZICZENIE

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Style programowania - krótki przeglad

Szablony. Szablony funkcji

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Zad. 10: Sterowanie manipulatorem cz. 2 i 3

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

PARADYGMATY PROGRAMOWANIA Wykład 4

Budowa aplikacji ASP.NET współpracującej z bazą dany do obsługi przesyłania wiadomości

Podział programu na moduły

Laboratorium 7 Blog: dodawanie i edycja wpisów

Aplikacje w środowisku Java

Rozdział 4 KLASY, OBIEKTY, METODY

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

5. Rozwiązywanie układów równań liniowych

Archiwizacja baz MSSQL /BKP_SQL/ opis oprogramowania

Rozdział 5: Style tekstu

Programowanie celowe #1

W dowolnym momencie można zmienić typ wskaźnika.

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Wykorzystanie programów komputerowych do obliczeń matematycznych, cz. 2/2

Operacje wykonywane są na operandach (argumentach operatorów). Przy operacji dodawania: argumentami operatora dodawania + są dwa operandy 2 i 5.

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

KURS LICZB ZESPOLONYCH

Klasy abstrakcyjne i interfejsy

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

dr inż. Ryszard Rębowski 1 WPROWADZENIE

Lista nr 1 - Liczby zespolone

Funkcje wymierne. Jerzy Rutkowski. Działania dodawania i mnożenia funkcji wymiernych określa się wzorami: g h + k l g h k.

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Zaawansowane metody numeryczne

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Programowanie strukturalne i obiektowe. Funkcje

KURS MATURA ROZSZERZONA część 1

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Liczby zespolone. Magdalena Nowak. 23 marca Uniwersytet Śląski

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Nazwa wariantu modułu (opcjonalnie): Laboratorium programowania w języku C++

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Wykład 14. Elementy algebry macierzy

Wykład 8: klasy cz. 4

Konstruktor kopiujacy

Część 4 życie programu

Szablony klas, zastosowanie szablonów w programach

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Wykład 4: Klasy i Metody

Programowanie i techniki algorytmiczne

Wprowadzenie do programu Mathcad 15 cz. 1

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Transkrypt:

Zad. 4: Szablonu dla układu równań liniowych 1 Cel ćwiczenia Wykształcenie zdolności definiowania szablonów funkcji i klas oraz abstrahowania operacji arytmetycznych od konkretnych typów. Unaocznienie problemów związanych z programowaniem uogólnionym i potencjalnych zalet takiego podejścia. 2 Program zajęć Ocena realizacji zadania z poprzedniego laboratorium ocenie podlega poprawność realizacji zadania, styl pisania programu oraz opisy. Modyfikacja programu wg wskazań osoby prowadzacej ocenie będzie podlegała poprawność realizacji modyfikacji. Pracę nad modyfikacją programu (wszystkie operacje należy wykonywać na kopii) należy rozpocząć w trakcie pierwszej fazy zajęć, gdyż prowadzący nie będzie w stanie ocenić wcześniejszego programu wszystkim jednocześnie. Samodzielna praca należy dokonać przeróbki klasy Wektor na szablon wg dostarczonego przykładu (szczegóły patrz podrozdział 6). 3 Opis zadania programowego Należy przerobić program rozwiązujący układ równań z poprzedniego zadania, tak aby był w stanie rozwiązać układ równań liniowych z pięcioma niewiadomymi zarówno dla przypadku liczb rzeczywistych, jak też zespolonych. W tym celu należy przerobić moduły klas Wektor, Macierz, UkladRownanLiniowych na szablony. Mają one być parametryzowane zarówno wartością rozmiaru (ilością niewiadomych), jak też typem. Wspomniany typ ma być typem współrzędnych wektorów oraz współczynników macierzy, jak też typem szukanych wartości niewiadomych. Niniejsze zadanie jest swego rodzaju sprawdzianem poprawności przyjętych wcześniej koncepcji. Im były one lepsze tym mniej problemów będzie nastręczała zamiana rozmiaru i typów liczb, na których działa program. 3.1 Działanie programu Program ma umożliwiać dwa warianty obliczeń, tzn. rozwiązywanie układu pięciu równań liniowych z pięcioma niewiadomymi dla przypadku, gdy współczynniki są liczbami rzeczywistymi, oraz dla przypadku liczb zespolonych. Wybór wariantu obliczeń ma być realizowany na początku poprzez podanie znaku r (obliczenia dla wariantu liczb rzeczywistych) lub z (obliczenia dla wariantu liczb zespolonych). Podanie jakiegokolwiek innego znaku powinno skutkować przerwaniem działania programu ze stosownym komunikatem. Program nie ma udostępniać żadnego dodatkowego interfejsu użytkownika. Zakłada się, że po wyborze wariantu działanie programu ma przebiegać analogicznie jak w przypadku wcześniejszego zadania. Jedyną różnicą jest to, że tym razem program nie musi wyświetlać normy wektora błędu (jego długości). 1

Dla ułatwienia testowania programu, należy skorzystać z plików testowych, które zawierają dane dla wariantu liczb rzeczywistych i zespolonych. Ich zawartością jest to, co należy wprowadzić z klawiatury. Dzięki temu przy wywołaniu programu wystarczy przekierować jego wejście standardowe. 3.2 Wymagania co do konstrukcji programu Oprócz wymagań sformułowanych w opisie zadania należy uwzględnić uwarunkowania przedstawione poniżej. Program musi zachować strukturę modułową i odpowiednią strukturę kartotek. O ile będzie to konieczne, należy zmodyfikować plik Makefile (np. gdy dodany zostanie nowy moduł/plik nagłówkowy). Wszystkie metody, które nie zmieniają stanu obiektu, na którym działają, powinny być metodami typu const. Wszystkie klasy i metody powinny być opisane. Oprócz tego pozostają w mocy wszystkie wcześniejsze wymagania dotyczące struktury katalogów, pliku Makefile, modułowej struktury programu, jak też opisów. 4 Przykład działania programu Dla ułatwienia sobie pracy warto zapisać dane w pliku i później czytać dane z pliku poprzez przekierowanie go na wejście standardowe programu. Taki sposób postępowania przedstawiony jest poniżej. jkowalsk@noxon: rozwiazanie> cat rownanie_liczb_rzeczywistych.dat r 2.00 1.00 1.00 1.00 2.00 2.00 2.00 3.00 1.00 2.00 1.00 1.50 1.00 1.00 0.00 3.00 1.00 2.00 4.00 0.00 3.00 2.00 2.00 0.00 1.00 9.00 8.00 8.00 9.00 1.00 jkowalsk@noxon: rozwiazanie>./uklad_rownan < rownanie_liczb_rzeczywistych.dat Uklad rownan liniowych o wspolczynnikach rzeczywistych Macierz A^T: 2.00 1.00 1.00 1.00 2.00 2.00 2.00 3.00 1.00 2.00 1.00 1.50 1.00 1.00 0.00 3.00 1.00 2.00 4.00 0.00 3.00 2.00 2.00 0.00 1.00 9.00 8.00 8.00 9.00 1.00 Wektor wyrazow wolnych b: 2

9.00 8.00 8.00 9.00 1.00 Rozwiazanie x = (x1, x2, x3, x4, x5): -0.13 0.47 3.51 1.29 0.31 Wektor bledu: Ax-b = (-1.78e-15-1.78e-15-1.78e-15 0.00e+00-2.89e-15) jkowalsk@noxon: rozwiazanie>_ jkowalsk@noxon: rozwiazanie> cat rownanie_liczb_zespolone.dat z (2.00+1.00i) (1.00+1.00i) (1.00+1.00i) (1.00+2.00i) (2.00+3.00i) (2.00+3.00i) (2.00+5.00i) (3.00+7.00i) (1.00+2.00i) (2.00+2.00i) (1.00+2.00i) (1.50+3.00i) (1.00+1.00i) (1.00+1.00i) (0.00+2.00i) (3.00+1.00i) (1.00+4.00i) (2.00+1.00i) (4.00+3.00i) (0.00+0.00i) (3.00+2.00i) (2.00+2.00i) (2.00+0.00i) (0.00+1.00i) (1.00+1.00i) (9.00+1.00i) (8.00+2.00i) (8.00+8.00i) (9.00+5.00i) (1.00+1.00i) jkowalsk@noxon: rozwiazanie>./uklad_rownan < rownanie_liczb_zespolone.dat Uklad rownan liniowych o wspolczynnikach zespolonych Macierz A^T: (2.00+1.00i) (1.00+1.00i) (1.00+1.00i) (1.00+2.00i) (2.00+3.00i) (2.00+3.00i) (2.00+5.00i) (3.00+7.00i) (1.00+2.00i) (2.00+2.00i) (1.00+2.00i) (1.50+3.00i) (1.00+1.00i) (1.00+1.00i) (0.00+2.00i) (3.00+1.00i) (1.00+4.00i) (2.00+1.00i) (4.00+3.00i) (0.00+0.00i) (3.00+2.00i) (2.00+2.00i) (2.00+0.00i) (0.00+1.00i) (1.00+1.00i) Wektor wyrazow wolnych b: (9.00+1.00i) (8.00+2.00i) (8.00+8.00i) (9.00+5.00i) (1.00+1.00i) Rozwiazanie x = (x1, x2, x3, x4, x5): (-0.13-4.66i) (0.47+5.50i) (3.51-1.45i) (1.29-3.62i) (0.31+2.95i) Wektor bledu: Ax-b = ((-1.78e-15-1.78e-15i) (-1.78e-15+3.55e-15i) (-1.78e-15-8.88e-16i) (0.00e+0 jkowalsk@noxon: rozwiazanie>_ Ułożenie znaków w linii w przypadku wyświetlania macierzy, nie musi być idealnie równe, aby jeden wiersz długością pasował do drugiego. Format wyświetlania liczb również nie musi być w pełni zgodny z tym, który jest w przykładzie. 3

5 Zalecenia (ważne) Istniejące konstrukcje w języku C++ pozwalają na niejawne konwersje typów. Jeżeli mechanizmy nie są świadomie stosowane lub nie są dobrze zrozumiane, to mogą prowadzić do błędów działania programu, które będą bardzo trudne do zdiagnozowania. Aby tego uniknąć należy zastosować zalecenia przedstawione poniżej. Nie zaleca się definiowanie konstruktora jednoargumentowego postaci: LZespolona::LZespolona(float r); Zalecane jest natomiast zdefiniowanie konstruktora bezparametrycznego oraz dwuargumentowego, tzn. LZespolona::LZespolona(); LZespolona::LZespolona(float r, float i); 6 Przeróbka klasy Wektor na szablon ćwiczenie W niniejszym zadaniu należy przerobić trzy klasy na szablony. Nieumiejętne podejście do tego zadania prowadzi do wielu komplikacji i problemów na poziomie kompilacji. Ich złe rozwiązanie może spowodować powstawania błędów, które będą trudne do zlokalizowania. Z tych też względów należy do tego podejść stopniowo i systematycznie. Przeróbki należy rozpocząć od podstawowej klasy (tzn. Wektor). Należy je prowadzić w osobnej kartotece. Przykład znajduje się w kartotece ~bk/edu/kpo/zad/z4/od-klasy-do-szablonu W kartotece tej znajdują się 3 podkartoteki, które obrazują proponowany sposób przeróbki składający się z trzech etapów (kroków), które przedstawione są w dalszej części. Krok 1: Wydzielamy moduł, który ma zostać przerobiony na szablon i tworzymy plik main.cpp, w którym znajdują podstawowe testy metod i funkcji udostępnianych przez moduł. Przykładowa postać plików, które rezultatem tego etapu, przedstawiona jest w kartotece krok1-jeszcze-klasa. Krok 2: Tworzymy plik nagłówkowy, w którym zdefiniujemy szablon klasy. Chcąc uniknąć przypadkowych błędów, lepiej jest nadać szablonowi nieco inną nazwę niż oryginalna klasa, np. SWektor. W pliku nagłówkowym umieszczamy w nim stopniowo poszczególne elementy przerabianej klasy. W trakcie pracy nie usuwamy starego modułu. W pliku main.cpp dopisujemy dołączenie pliku z szablonem poprzez dyrektywę #include, np. #include "SWektor.hh" Na początkowym etapie wystarczy, że definicja szablony klasy SWektor zawierać będzie tylko pola bez metod, np. 4

template <typename STyp, int SWymiar> class SWektor { STyp _Wsp[SWymiar]; public: }; Natomiast w funkcji main wystarczy umieścić tylko definicję zmiennej nowego typu, np. SWektor<double,ROZMIAR> WekTestowy; Po doprowadzeniu do poprawnej kompilacji możemy przejść do dodawania kolejnych elementów definicji szablonu. Wreszcie po przeniesieniu definicji wszystkich niezbędnych metod możemy usunąć moduł klasy Wektor oraz odpowiednio wyczyścić funkcję main, jak też zmodyfikować plik Makefile. Finalna postać tego etapu przedstawiona jest w kartotece krok2-juz-szablon. Krok 3: W końcowym kroku pozostaje sprawdzić, czy będzie możliwe użycie tak zdefiniowanego szablonu w przypadku, gdy typem pól będzie klasa modelująca pojęcie liczby zespolonej. W tym celu należy wykorzystać moduł, który został stworzony w ramach zadania nr 2. Prawie na pewno w strukturze LZespolona będzie potrzeba dodatkowego zdefiniowania przeciążenia operacji podstawienia liczby rzeczywistej (tzn. wartości typu double). Przykład realizacji tego przeciążenia znajduje się w katalogu krok3-wektor-zespolony. W tej też kartotece znajduje się końcowy rezultat realizacji tego kroku. Po zakończeniu pracy nad szablonem SWektor, należy dodać definicję szablonu SMacierz i analogicznie do kroku 2. dla szablonu SWektor stopniowo przenosić defincje pól i metod, tak aby było poprawne testowe utworzenie obiektu klasy SMacierz<double,ROZMIAR> oraz wywołanie dopisywanych definicji poszczególnych metod. Następnie, analogicznie do kroku 3, dodajemy utworzenie instancji SMacierz<LZespolona,ROZMIAR> i modyfikujemy/rozszerzamy definicję struktury LZesplona, aby osiągnąć poprawność kompilacji i konsolidacji oraz realizowanych testów. Analogicznie postępujmy z klasą UkladRownanLiniowych. W ramach ćwiczenia realizowanego na zajęciach należy przekopiować zawartość kartoteki od-klasy-do-szablonu i wzorując się na przykładzie należy rozszerzyć szablon SWektor znajdujący się w podkartotece krok2-juz-szablon o wszystkie metody, które są w klasie Wektor stworzonej w ramach poprzedniego zadania. 7 Wersje zadania W dalszej części przedstawione zostały propozycje wersji zadania zarówno łatwiejsze, jak też ciekawszej :) 7.1 Wersja łatwiejsza W poprzednim zadaniu w ramach łatwiejszej wersji można było zrealizować zadanie dla układu z dwoma zmiennymi. Program ten w takiej postaci można przekształcić do wersji z szablonami jako wersję łatwiejszą. 5

7.2 Wersja ciekawsza rozszerzenie nieobowiazkowe Podobnie jak w poprzedniej wersji zadania, należy wyświetlić długość wektora błędu. Do wyliczania długości powinna zostać zdefiniowana metoda w szablonie SWektor. Dla współrzędnych typu double długość liczona jest jako pierwiastek z sumy kwadratów wartości poszczególnych współrzędnych. W przypadku liczb zespolonych trzeba uwzględnić, że nie mogą to być kwadraty, a iloczyny liczb przez ich sprzężenia. Problem ten można i należy rozwiązać definiując specjalizację metody Dlugosc szablonu SWektor dla typu LZespolone. Więcej o specjalizacji będzie powiedziane na wykładzie. 8 Przygotowanie do zajęć 8.1 Tydzień 0 Ze względu na to, że zadanie niniejsze bazuje na wynikach zadania wcześniejszego, nie jest wymagane dodatkowe przygotowanie do zajęć. Jednak w ramach zajęć należy zdefiniować zasadniczą cześć szablonu SWektor, który będzie podstawą do tworzenia dalszych szablonów. Zalecany sposób definiowania szablonu, który bazuje na wcześniejszej definicji klasy Wektor, został opisany w rozdziale 6. Pragnąc ułatwić sobie pracę należy skorzystać z dostarczonych przykładów zawartych w kartotece bk/edu/kpo/zad/z4. 8.2 Tydzień 1 Przed zajęciami musi zostać zdefiniowany szablon SMacierz oraz elementarne testy w funkcji main, które będą pokazywały efekt pracy programu, gdy tworzona jest instancja klasy macierzy dla typu double oraz dla LZesplona (patrz przykład dla szablonu SWektor w podkartotece krok3-wektor-zespolony). Szablon klasy SMacierz musi być zdefiniowany w osobnym pliku nagłówkowym. Należy również odpowiednio zmodyfikować/uzupełnić opisy, o ile okaże się to konieczne. Wszystko co będzie ponad to będzie oceniane in plus. 8.3 Tydzień 2 Rozliczenie się z gotowego programu i rozpoczęcie następnego zadania (tydzień 0 dla zadania nr 5). 6