• Nie Znaleziono Wyników

Języki i techniki programowania Ćwiczenia 2

N/A
N/A
Protected

Academic year: 2021

Share "Języki i techniki programowania Ćwiczenia 2"

Copied!
9
0
0

Pełen tekst

(1)

Języki i techniki programowania

Ćwiczenia 2

Autor: Marcin Orchel

(2)

Spis treści:

Język C++ ... 5

Przekazywanie parametrów do funkcji ... 5

Przekazywanie parametrów w Javie. ... 5

Przekazywanie parametrów w c++ ... 5

Ogólne zasady przekazywania parametrów ... 8

Przypisanie ... 8

Porównywanie obiektów ... 9

Inicjalizacja obiektów ... 9

Modyfikator const ... 10

Zwracanie wartości przez funkcję ... 10

Techniki programowania ... 11

Zadania ... 12

(3)

Język C++

Przekazywanie parametrów do funkcji Przekazywanie parametrów w Javie.

W Javie parametry przekazywane są przez wartość.

Zmienne typów prostych, takich jak int, float odnoszą się bezpośrednio do liczb.

Zmienne typów złożonych, takich jak tablice, klasy definiowane przez użytkownika, itd.

odnoszą się do wskaźników do obiektów.

Przykład

void foo(int i, Float number1, int [] array1, List<Integer> list1, Triangle triangle1) {

}

Wartość i jest kopiowana na stos.

Wskaźnik do number1 jest kopiowany na stos.

Wskaźnik do tablicy array1, która jest obiektem jest kopiowany na stos.

Wskaźnik do list1 jest kopiowany na stos.

Wskaźnik do triangle1 jest kopiowany na stos.

Przekazywanie parametrów w c++

1. W c++ parametry mogą być przekazywane przez wartość.

Zmienne oznaczają bezpośrednio obiekty.

void foo(int i, int array[10], Triangle triangle1) Wartość i jest kopiowana na stos.

Tablice w c++ są w rzeczywistości wskaźnikami na pierwszy element, a więc będzie kopiowany na stos tylko wskaźnik.

Na stos będzie kopiowany obiekt triangle1 zdefiniowany przez użytkownika.

2. W c++ parametry mogą być przekazywane przez referencję.

void foo(int & i, Triangle & triangle1) wywołanie funkcji foo(i, triangle)

Referencja to stały wskaźnik (int *const p). Oznacza to, że nie można zmienić

wskazywanego obiektu na inny. We funkcji na obiekt triangle mówimy triangle1. Na stos kopiowany jest wskaźnik do liczby i, oraz wskaźnik do obiektu triangle.

(4)

Dana zmienna w Javie może wskazywać na różne obiekty, w c++ referencje są stałymi wskaźnikami, a więc nie może się zmieniać obiekt, na który wskazują.

Przykład:

Java:

Triangle triangle1 = new Triangle();

Triangle triangle2 = new Triangle();

triangle1 = triangle2;

Wskaźnik triangle1 wskazuje poźniej na triangle2. Obiekt na który wskazywał na początku triangle1 zostanie usunięty przez garbage collector.

C++:

Triangle & triangle1 = Triangle();

Triangle & triangle2 = Triangle();

Nie można zmienić wskazania triangle1 (triangle1 = triangle2 tutaj zostanie uruchomione kopiowanie obiektów)

Przykładowe zastososowanie referencji:

konieczność zmiany przekazywanego obiektu we funkcji.

Referencje w c++ nie zabezpieczają w 100% przed błędami pracy na nieznanym obszarze pamięci, ze względu na istnienie wskaźników w c++.

Do funkcji przyjmującej argument (int & p) można podać p, gdzie p jest zdefiniowane int

*p, ale nie zostało zainicjalizowane. Przez co p wskazuje na nieznany obszar pamięci. W Javie każda zmienna typu złożonego musi zostać zainicjalizowana, dlatego nie ma problemu ze wskazaniem na nieznany obszar pamięci.

Stała referencja

Jeśli funkcja przyjmuje argument: int & a, czy można podać do tej funkcji liczbę np. 2 + 2?

Wartość wyrażenia jest stała, dlatego można to zrobić pod warunkiem, że argumentem funkcji będzie stała referencja: const int & a.

Jak jest implementowana stała referencja? const int *const p;

3. W c++ parametry mogą być również przekazywane za pomocą wskaźników.

void foo(int * i, Triangle * triangle1)

Na stos kopiowane są wskaźniki (adresy) do liczby i oraz obiektu triangle1.

Porównanie referencji i wskaźników

W większości wypadków referencje są bezpieczniejsze od wskaźników, ponieważ referencje muszą być inicjalizowane adresem obiektu.

(5)

Ogólne zasady przekazywania parametrów

Parametry niewielkich rozmiarów można przekazywać przez wartość, gdy parametry mają większy rozmiar lepiej przekazywać je przez referencję.

Przypisanie

a = b

W Javie dla typów złożonych kopiowany jest tylko wskaźnik.

W c++ przypisanie będzie dotyczyło kopiowania obiektów.

Jeśli a i b to są referencjami to podczas przypisania b do a będzie kopiowany obiekt b.

Referencja nie może być zmieniana. Tutaj modelem referencji, która wyjaśnia to kopiowanie jest traktowanie referencji jako przezwiska. Kopiowane są obiekty bo referencje są tylko przezwiskami tych obiektów.

Kopiowanie obiektów w Javie.

Implementacja interfejsu cloneable i nadpisanie metody clone.

Implementacja metody clone na tablicach: dla każdego elementu są tworzone referencje do elementów wyjściowych, chyba, że są to typy proste, wtedy jest robione kopiowanie tych liczb. Kopiowanie tylko referencji nazywa się shallow copy, w przeciwieństwie do deep copy.

Porównywanie obiektów

W javie porównywanie za pomocą operatora == porównuje zmienne, które są wskaźnikami do obiektów. A więc nie ma porównania samych obiektów, tylko ich adresów.

Przykład:

String a = „a”;

String b = „a”;

warunek a == b nie będzie spełniony.

Jeśli zachodzi konieczność porównania zawartości obiektów to wywołuje się metodę equals.

W C++ aby porównać dwa obiekty konieczne jest zdefiniowanie dla nich operatora ==.

Dla typu string operator ten zdefniowany jest jako porównanie leksykalne.

(6)

Inicjalizacja obiektów

W Javie trzeba zainicjalizować zmienną złożoną, przy braku inicjalizacji zmiennej złożonej pojawi się błąd kompilacji.

W C++ gdy nie zainicjalizujemy obiektu, zostanie wywołany defaultowy konstruktor.

Modyfikator const

W Javie słowo kluczowe final oznacza, że nie można danej zmiennej modyfikować, co oznacza, że nie można modyfikować wskaźnika, ale można modyfikować dane obiektu.

Jak w Javie rozwiązuje się problem taki, że chcielibyśmy zapewnić aby dany obiekt nie był modyfikowany w danym miejscu? Można stworzyć interfejs, z metodami, które są nam potrzebne, a które nie modyfikują obiektu. Klasa musi wtedy implementować ten interfejs.

W C++ const oznacza, że danego obiektu nie można modyfikować wewnętrznie. Jeśli jednak chcemy użyć metody dla obiektu const, to ta metoda musi mieć modyfikator const. A jeśli ta metoda chce zapisać pewne wyniki tymczasowe w klasie, to aby to było możliwe to pola klasy, które będą wykorzystane muszą mieć modyfikator mutable.

Zwracanie wartości przez funkcję

Zwracanie tablicy.

W Javie metoda może zwrócić tablicę. Tablica w Javie jest alokowana za pomocą operatora new, dopóki istnieje odwołanie do tej tablicy, to tablica nię będzie usuwana przez garbage collector.

W C++ funkcja nie może zwrócić tablicy. Tablica powinna być przekazana w parametrach funkcji.

(7)

Techniki programowania

1. Stosowanie wszędzie const tam gdzie spodziewamy się, że obiekt nie będzie modyfikowany.

2. Sprawdzanie argumentów funkcji: w każdej funkcji na początku warto sprawdzić poprawność podawanych argumentów.

(8)

Zadania

zadanie podstawowe Stworzyć klasę Side

- stworzyć konstruktor w klasie Side przyjmujący długość boku, długość boku w klasie Side jest const

Stworzyć klasę Triangle, która zawiera 3 boki typu Side

- stworzyć konstruktor, którego parametrami są 3 obiekty typu Side, konstruktor ten zapisuje podane boki do obiektu Triangle jako stałe parametry

- napisać metodę sprawdzającą czy podane boki spełniają warunek trójkąta - stworzyć operator porównania == dla klasy Triangle

- stworzyć operator porównania != dla klasy Triangle Utworzyć klasę Triangles:

- utworzyć konstruktor do którego podajemy tablicę obiektów typu Triangle.

- stworzyć metodę wyszukującą trójkąt o maksymalnym obwodzie metoda zwraca trójkąt o maksymalnym obwodzie

- utworzyć metodę sprawdzającą czy istnieją w tabeli dwa różne trójkąty:

funkcja zwraca true, jeśli istnieją, zwraca false, jeśli nie istnieją.

We funkcji main stworzyć tablicę obiektów typu Triangle, utworzyć obiekt klasy Triangles,

wywołać z niego metody wyszukiwania trójkąta o maksymalnym obwodzie, oraz sprawdzania czy istnieją dwa różne trójkąty.

Napisać funkcję testującą poprawność działania programu.

zadanie dodatkowe 1

- utworzyć operator przypisania = dla klasy Triangle - utworzyć konstruktor kopiujący dla klasy Triangle

- utworzyć konstruktor i operator kopiujący dla klasy Triangles

- skopiować obiekt Triangles za pomocą konstruktora kopiującego oraz operatora kopiującego

Napisać funkcję testującą powyższą funkcjonalność.

zadanie dodatkowe 2

- dla klasy Triangles zdefiniować operator indeksujący [].

(9)

- dla klasy Triangle zdefiniować operator wypisywania <<, - dla klasy Triangles zdefiniować operator wypisywania <<

- stworzyć metodę klasy Triangle do obliczania pola trójkąta za pomocą wzoru Herona, - stworzyć metodę w klasie Triangles wyszukującą trójkąt o maksymalnym polu

Napisać funkcję testującą powyższe metody.

Cytaty

Powiązane dokumenty

- wszystkie rzucane wyjątki obsłużyć w klasie Figures, która przechowuje zdefiniowaną powyżej listę

Kompilator – program przetwarzający kod źródłowy na kod wynikowy (kod pośredni w języku maszynowym, który jest zrozumiały dla komputera).. Interpretator –

Typ definiuje zakres lub zbiór dopuszczalnych wartości zmiennych, stałych i funkcji, zbiór dopuszczalnych operacji wykonywanych na tych wartościach

Wyrażenia są budowane w oparciu o stałe, zmienne, operatory, nazwy funkcji i zbiorów oraz nawiasy okrągłe. Wyrażenia zapisujemy w jednym wierszu, bez opuszczania znaku mnożenia,

Jeśli wartość wyrażenia_logicznego jest prawdą (TRUE), to wykonana zostanie instrukcja_1. W przeciwnym wypadku instrukcja_1 zostanie opuszczona i wykonana

Pomoc na temat konkretnej procedury uzyskuje się przez ustawienie kursora na pierwszej literze nazwy procedury i wciśnięcie Ctrl-F1.. Opracować program drukujący napis:

bez cyfr po przecinku, z jedną cyfrą po przecinku, dwoma, trzema oraz czterema cyframi po przecinku.. Kolejne wartości zmiennych wyprowadzać jedna

Przyjmując, że zmienna dzien jest selektorem instrukcji wyboru case wyprowadzić pełną nazwę dnia tygodnia.. Opracować program realizujący funkcje prostego