11.6 Klasa do obsługi liczb wymiernych



Podobne dokumenty
Rozdział 4 KLASY, OBIEKTY, METODY

Metody Metody, parametry, zwracanie wartości

Wykład 4: Klasy i Metody

Programowanie obiektowe i C++ dla matematyków

JAVA W SUPER EXPRESOWEJ PIGUŁCE

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

Podejście obiektowe. Tablice obiektów Przykład 1 metody i atrybuty statyczne oraz niestatyczne

Programowanie obiektowe i zdarzeniowe

Programowanie obiektowe - zadania

Język C++ umożliwia przeciążanie operatora, tzn. zmianę jego znaczenia na potrzeby danej klasy. W tym celu definiujemy funkcję o nazwie:

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Podstawy programowania obiektowego

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

TEMAT : KLASY DZIEDZICZENIE

Języki i metody programowania Java. Wykład 2 (część 2)

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

Przeciążanie operatorów

Aplikacje w środowisku Java

Programowanie obiektowe

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

Programowanie obiektowe

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

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Podejście obiektowe. Tablice (1) obiektów

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Wykład 8: klasy cz. 4

Enkapsulacja, dziedziczenie, polimorfizm

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Programowanie obiektowe

PODEJŚCIE OBIEKTOWE. Przykład 1 metody i atrybuty statyczne

Programowanie obiektowe

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

Podstawy programowania obiektowego

Wyliczanie wyrażenia obiekty tymczasowe

1 Powtórzenie wiadomości

Języki i metody programowania Java INF302W Wykład 2 (część 1)

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Zadania z podstaw programowania obiektowego

Klasy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 13

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

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

Programowanie obiektowe

Podstawy obiektowości

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Definiowanie własnych klas

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

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Języki i metody programowania Java Lab2 podejście obiektowe

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

Dokumentacja do API Javy.

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Programowanie komputerowe. Zajęcia 7

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Klasy abstrakcyjne, interfejsy i polimorfizm

Programowanie 2. Język C++. Wykład 3.

Podstawy i języki programowania

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

Programowanie obiektowe

Tablice i łańcuchy znakowe jako obiektowe typy danych. dr Jarosław Skaruz

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Programowanie - instrukcje sterujące

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe i zdarzeniowe

1 Atrybuty i metody klasowe

Programowanie obiektowe

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Aplikacje w Javie- wykład 11 Wątki-podstawy

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Laboratorium z przedmiotu: Inżynieria Oprogramowania INEK Instrukcja 7

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Wstęp do Programowania 2

ALGORYTMY I STRUKTURY DANYCH

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

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Programowanie współbieżne Wykład 8 Podstawy programowania obiektowego. Iwona Kochaoska

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

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

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Programowanie w Javie 1 Wykład i Ćwiczenia 2 Przegląd podstawowych klas w Javie (elementy programowania obiektowego) Płock, 16 października 2013 r.

Klasy i obiekty cz II

Podstawy Programowania Obiektowego

Wykład 5: Klasy cz. 3

Programowanie obiektowe i C++ dla matematyków

Lista dwukierunkowa - przykład implementacji destruktorów

Programowanie obiektowe

Wykład 8: Obsługa Wyjątków

Programowanie obiektowe i zdarzeniowe

10. Programowanie obiektowe w PHP5

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

Klasy i obiekty cz I Klasy, obiekty, podstawy używania obiektów

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Zaawansowane aplikacje WWW - laboratorium

Algorytmy i Struktury Danych. Anna Paszyńska

Opis zagadnieo 1-3. Iteracja, rekurencja i ich realizacja

Transkrypt:

246 11.6 Klasa do obsługi liczb wymiernych Klasa do obsługi liczb wymiernych, którą teraz zaprojektujemy w celu zilustrowania korzyści wynikających z programowania obiektowego, służy do zgrabnego wykonywania operacji na liczbach wymiernych przedstawianych w postaci nieskracalnego ułamka. Na przykład, wyobraźmy sobie, że musimy sprawdzić, czy nasz młodszy brat dobrze policzył wartość następującego wyrażenia: 5 6 + 7 8 + 1 12 + 5 24 Jak wiadomo, programista woli napisać program niż cokolwiek liczyć na papierze. Przystępując do pisania programu, warto to zrobić klarownie i tak, by można go było wykorzystywać do różnych celów. Na przykład, stosując klasę Wymierne można również wykonywać dokładne obliczenia typu: czy też 1 + 1 2 + 1 3 + 1 4 +... + 1 10 1 + 1 4 + 1 9 + 1 16... + 1 100 Z sumowaniem szeregów (oczywiście skończonych) trzeba jednak uważać, ponieważ wykonując dokładne obliczenia na ułamkach, w których są duże liczby, można bardzo szybko wyjść poza zakres wykorzystywanego typu. Na przykład, wartości wyrażenia: 1077749 705600 + 1 81 nie da się policzyć przy stosowaniu zmiennych typu int. Jest to możliwe dla zmiennych typu long, ale i tak w trakcie dosumowywania składników szybko wyjdziemy poza zakres tego typu. W pierwszym przybliżeniu klasę Wymierne zaprojektujemy następująco: class Wymierne private long licznik, mianownik;

11.6 Klasa do obsługi liczb wymiernych 247 Do reprezentacji liczby wymiernej wykorzystamy dwa pola: licznik oraz mianownik o oczywistym znaczeniu: liczba = licznik mianownik Zadaniem klasy będzie po wykonaniu jakiegokolwiek obliczenia skrócenia ułamka. Do tego celu zastosujemy prywatną metodę ObliczNWP() znajdującą największy wspólny podzielnik. A oto treść tej metody: private long ObliczNWP(long a, long b) // znajdowanie największego wspólnego podzielnika long pomoc; // przypadek szczególny if (a==0) return 1; // zamiana na liczby dodatnie if (a < 0) a = - a; if (b < 0) b = - b; // pierwsza liczba musi być większa if (a < b) pomoc = a; a = b; b = pomoc; // znajdowanie największego wspólnego podzielnika // metodą reszt z dzielenia całkowitego while ( a % b!= 0) pomoc = b; b = a % b; a = pomoc; return b;

248 Zgodnie z założeniem po każdej operacji następuje próba skrócenia ułamka, a zatem metodę ObliczNWP() wywołujemy również w konstruktorze. Treść konstruktora jest następująca: public Wymierne(long alicznik, long amianownik) if (amianownik == 0) System.out.println( "BŁĄD - zerowa wartość mianownika"); amianownik = 1; long nwp; // skrócenie ułamka nwp = ObliczNWP(aLicznik, amianownik); licznik = alicznik/nwp; mianownik = amianownik/nwp; Warto też skonstruować drugą wersję konstruktora przewidzianą do tworzenia obiektów - liczb wymiernych o mianowniku równym 1. public Wymierne(long alicznik) licznik = alicznik; mianownik = 1; Obiekty klasy Wymierne możemy tworzyć w podany niżej sposób: Wymierne x = new Wymierne(18,24), y = new Wymierne(3); Dla obiektu x wartość pola licznik po wykonaniu skrócenia będzie 3, a wartość pola mianownik to 4. Dla obiektu y wartość pola licznik wynosi 3, a wartość pola mianownik jest równa 1 (zapewnia to druga wersja konstruktora klasy Wymierne). Możemy teraz przystąpić do zaprojektowania kilku metod ułatwiających wykorzystanie klasy. Do dodawania dwóch liczb wymiernych zastosujemy metodę Dodaj(). W metodzie tej skorzystamy z prostej reguły: L = a b + c d = a d + b c b d

11.6 Klasa do obsługi liczb wymiernych 249 A oto definicja metody Dodaj(): public Wymierne Dodaj(Wymierne x) long nowylicznik, nowymianownik; nowylicznik = licznik * x.mianownik + mianownik * x.licznik; nowymianownik = mianownik * x.mianownik; // utworzenie obiektu klasy Wymierne Wymierne nowy = new Wymierne(nowyLicznik,nowyMianownik); // zwrócenie referencji return nowy; Zwróćmy uwagę, że parametrem metody Dodaj() jest obiekt x klasy Wymierne. W treści metody do dyspozycji mamy zatem pola obiektu x: x.licznik i x.mianownik oraz pola licznik i mianownik obiektu, na rzecz którego jest wywoływana metoda Dodaj(). Skrócenie utworzonego ułamka następuje dopiero w konstruktorze przy tworzeniu nowego obiektu. Metoda zwraca referencję do nowo utworzonego obiektu zawierającego wynik sumowania dwóch liczb wymiernych. Dla przykładu rozważmy następujące instrukcje: Wymierne s; // wartością referencji s jest null // utworzenie dwóch obiektów klasy Wymierne Wymierne a = new Wymierne(5,6); Wymierne b = new Wymierne(7,8); // wykonanie dodoawania s = a + b s = a.dodaj(b); Metoda Dodaj() jest wywoływana dla obiektu a, gdzie parametrem formalnym jest obiekt b. Zwracana jest referencja do nowego obiektu, którą przypisujemy zmiennej s. A oto definicje dwóch kolejnych metod Odejmij() oraz Razy(), które są zaprojektowane w podobny sposób jak metoda Dodaj(). public Wymierne Odejmij(Wymierne x)

250 long nowylicznik, nowymianownik; nowylicznik = licznik * x.mianownik - mianownik * x.licznik; nowymianownik = mianownik * x.mianownik; // utworzenie obiektu klasy Wymierne Wymierne nowy = new Wymierne(nowyLicznik,nowyMianownik); // zwrócenie referencji return nowy; public Wymierne Razy(Wymierne x) long nowylicznik, nowymianownik; nowylicznik = licznik * x.licznik; nowymianownik = mianownik * x.mianownik; // utworzenie obiektu klasy Wymierne Wymierne nowy = new Wymierne(nowyLicznik,nowyMianownik); // zwrócenie referencji return nowy; Jeżeli chcemy dodać do siebie dwie liczby i wynik przypisać jednej z nich, to warto zaprojektować metodę DodajDoSiebie() o następującej treści: public Wymierne DodajDoSiebie(Wymierne x) licznik = licznik * x.mianownik + mianownik * x.licznik; mianownik = mianownik * x.mianownik; long nwp = ObliczNWP(licznik, mianownik); licznik /= nwp;

11.6 Klasa do obsługi liczb wymiernych 251 mianownik /= nwp; return this; W przeciwieństwie do metody Dodaj() tym razem nie tworzymy nowego obiektu, lecz wynik dodawania zapisujemy w obiekcie, na rzecz którego dana metoda została wywołana. Metoda DodajDoSiebie() zwraca referencję do tego obiektu. Taka konstrukcja metody umożliwia na przykład potraktowanie wywołania: a.dodajdosiebie(b) jako argumentu innej metody, co ilustruje poniższa instrukcja: d = c.razy(a.dodajdosiebie(b)); Oczywiście, warto zdefiniować analogiczne metody dla innych operacji arytmetycznych, ale zostawiamy to już jako ćwiczenie dla Czytelnika. Można jeszcze zaprojektować metodę Wyprowadz() do wyprowadzania zawartości obiektu - liczby wymiernej. public void Wyprowadz() JOptionPane.showMessageDialog(null, licznik+"/"+ mianownik, "Liczba wymierna", JOptionPane.INFORMATION_MESSAGE); Można również utworzyć metodę tostring() przesłaniającą metodę tostring() z klasy Object. public String tostring() return licznik + "/" + mianownik; Metoda ta jest wywoływana na przykład w poniższej instrukcji: JOptionPane.showMessageDialog(null, suma, "Liczba wymierna", JOptionPane.INFORMATION_MESSAGE);

252 W drugim parametrze metody showmessagedialog() powinien być podany obiekt klasy String, a jest podany obiekt suma klasy Wymierne. I właśnie teraz jest automatycznie wywoływana metoda tostring(). A oto definicja klasy Wymierne bez podawania treści metod omówionych wyżej. import javax.swing.*; class Wymierne private long licznik, mianownik; public Wymierne(long alicznik, long amianownik) public Wymierne(long alicznik) private long ObliczNWP(long a, long b) public Wymierne Dodaj(Wymierne x) public Wymierne Odejmij(Wymierne x) public Wymierne Razy(Wymierne x)

11.6 Klasa do obsługi liczb wymiernych 253 public Wymierne DodajDoSiebie(Wymierne x) public void Wyprowadz() public String tostring() Zastosowanie klasy Wymierne zilustrujemy w poniższej aplikacji. Obliczymy wartość wyrażenia ułamkowego podanego na początku rozdziału oraz sumę kilku składników szeregu: 1 + 1 4 + 1 9 + 1 16... + 1 100 Aplikacja 11.3 public class Dokladnie public static void main(string[] args) new Dokladnie(); public Dokladnie()

254 int i,n; String odp; Wymierne s; Wymierne a = new Wymierne(5,6); Wymierne b = new Wymierne(7,8); Wymierne c = new Wymierne(1,12); Wymierne d = new Wymierne(5,24); s = a.dodaj(b); s.dodajdosiebie(c); s.dodajdosiebie(d); s.wyprowadz(); // obliczenie sumy szeregu odp = JOptionPane.showInputDialog( "Podaj liczbę elementów"); n = Integer.parseInt(odp); Wymierne suma = new Wymierne(1); // suma szeregu for (i=2; i<=n; i++) // utworzenie i-tego składnika Wymierne skladnik = new Wymierne(1,i); // obliczenie kwadratu składnika skladnik = skladnik.razy(skladnik); // dodanie do sumy szeregu suma.dodajdosiebie(skladnik); suma.wyprowadz(); // ilustracja wykorzystania metody tostring() JOptionPane.showMessageDialog(null, suma, "Liczba wymierna", JOptionPane.INFORMATION_MESSAGE); System.exit(0);