Edytuj stronę Odnośniki Fold/unfold all ODT export Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. ====== C# - Ćwiczenia ====== ===== Dziedziczenie ===== <code c#> public class A { public int a; protected void F(); private int x; } public class B : A { public int b; } </code> ===== Metody wirtualne ===== <code C#> public class Pojazd { public virtual void Ruszaj() {...} } public class Rower : Pojazd { public override void Ruszaj() {...} } public class Auto : Pojazd { public override void Ruszaj() {...} } </code> ===== Metody i klasy abstrakcyjne ===== <code C#> public abstract class Pojazd { public abstract void Ruszaj(); } public class Rower : Pojazd { public override void Ruszaj() {...} } public class Auto : Pojazd { public override void Ruszaj() {...} } </code> ===== Interfejsy ===== <code C#> public interface IPojazd { void Ruszaj(); } public class Rower : IPojazd { void Ruszaj() {...} } public class Auto : IPojazd { void Ruszaj() {...} } </code> ===== Przeciążanie metod i operatorów ===== <code C#> using System; public struct Complex { public int real; public int imaginary; public Complex(int real, int imaginary) { this.real = real; this.imaginary = imaginary; } public static Complex operator +(Complex c1, Complex c2) { return new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary); } public override string ToString() { return(String.Format("{0} + {1}i", real, imaginary)); } } </code> ===== Zadanie: Gra RPG ==== Zaprojektuj i zaimplementuj podstawy komputerowej gry RPG, w której może istnieć wiele typów bohaterów. Początkowo system będzie obsługiwał tylko dwa rodzaje postaci (wojownik i mag), jednakże w przyszłości planowane jest rozszerzenie systemu o inne rodzaje bohaterów. Wiadomo jednak, że wszystkie postacie będą opisane nazwą, posiadają pewien poziom żywotności oraz udostępniają operację pozwalającą obliczyć moc ataku postaci na podstawie parametrów charakteryzujących bohatera. Zaimplementuj klasy reprezentujące dwa typy postaci opisane następującymi atrybutami: * **Mag:** imię, żywotność (w %), siła (liczba całkowita), punty magii (liczba całkowita) * **Wojownik:** imię, żywotność (w %), siła (liczba całkowita) Zadbaj o właściwą hermetyzację, tzn. pola klas nie powinny być publiczne. Obiekty reprezentujące bohaterów udostępniają następujące operacje: * konstruktor pozwalający zainicjować wszystkie pola składowe, * konstruktor domyślny ustawiający pola obiektów wg schematu: * **Wojownik:** imię = „Geralt”, żywotność = 100%, siła = 3k6 (losowa wartość od 3 do 18, wynik rzutu trzema kostkami), * **Mag:** imię = „Xardas”, żywotność = 100%, siła = 1k6, punkty magii = 2k6, * metodę pozwalającą dodać (odjąć) pewną wartość punktów żywotności. Jednak wartość końcowa nie może spaść poniżej 0 i wzrosnąć powyżej 100%. Metoda zwraca nową wartość żywotności. * metodę zwracającą moc ataku postaci. Zależnie od typu bohatera wynosi ona: * dla maga: //( punkty magii + siła ) x żywotność // * dla wojownika: //siła x żywotność //, lecz gdy żywotność spadnie poniżej 5% wojownik wpada w szał i jego siła ataku równa się sile bazowej. * przeciąż metodę ''ToString()'' zwracającą napis zawierający informacje o nazwie bohatera oraz wartość żywotności i moc ataku. Zaimplementuj klasę realizującą drużynę bohaterów. Klasa ta przechowuje dowolnie duży zbiór postaci. Dla tej klasy zaimplementuj operacje: * konstruktor pozwalający zainicjować drużynę o podanej w argumencie nazwie, * metodę ''Clone()'' implementującą interfejs ''IClonable''. Metoda zwraca wierną kopię obiektu klonowanego. * metodę dodającą nową postać do drużyny, * metodę dającą dostęp (możliwość odczytu i modyfikacji) bohatera drużyny o podanym indeksie (może to być dociążony operator []) * metodę zwracającą sumaryczną wartość mocy ataku wszystkich członków drużyny, * przeciążoną metodę ''ToStrong()'', która zwraca napis zawierający nazwę drużyny, sumaryczną moc ataku oraz pełną listę postaci. Napisz program testujący działanie systemu. Utwórz grupę bohaterów o nazwie „Druzyna pierscienia” i umieść w jej składzie przynajmniej po dwie postaci z każdego typu. Zmniejsz żywotność jednego z wojowników do 3% i wypisz w terminalu zawartość drużyny: nawę, sumaryczną wartość mocy ataku i listę uczestników grupy. ====== Zadanie: Firma ====== Utwórz podstawy systemu zarządzania pracownikami w pewnej firmie. Zaimplementuj klasę reprezentującą pracownika. \\ Każdy pracownik opisany jest właściwościami: * imię i nazwisko * kontrakt Klasa reprezentująca pracownika udostępnia operacje: * konstruktor inicjujący pracownika o podanym w argumentach imieniu i nazwisku z domyślnym kontraktem stażysty * metodę pozwalającą zmienić kontrakt przypisany do pracownika * metoda zwracająca wysokość pensji pracownika uzależnionej od podpisanego kontraktu * dociążoną metodę ''ToString()'' zwierającą łańcuch znakowy zawierający imię, nazwisko i wysokość pensji pracownika Każdy kontrakt reprezentowany jest przez obiekt udostępniający publicznie następujące operacje: * metodę o nazwie Pensja(), która zwraca wysokość pensji wypłacanej przy danym kontrakcie. * konstruktor pozwalający zainicjować wszystkie pola składowe obiektu * konstruktor domyślny Obecnie w firmie podpisywane są 2 rodzaje kontraktów: **staż** i **etat**.\\ Kontrakty określone są przez następujące własności: * **Staż:** stawka miesięczna (domyślnie 1000 zł) * **Etat:** stawka miesięczna (domyślnie 5000 zł), ilość nadgodzin (domyślnie 0) Wysokość pensji wyznaczana jest dla każdego z tych kontaktów inaczej, odpowiednio: * Pensja **stażysty** równa jest stawce miesięcznej * Pensja **pracownika etatowego** = stawka miesięczna + ilość nadgodzin * (stawka miesięczna/60) Zakładamy, że w przyszłości pojawią się inne typy kontraktów różniące się sposobem naliczania wysokości pensji. Za obliczanie pensji odpowiedzialny jest obiekt klasy kontrakt, który udostępnia metodę publiczną zwracającą wysokość wynagrodzenia za pomocą metody ''Pensja()''. Dlatego, dodanie nowego typu kontraktu sprowadza się do zaimplementowania tylko jednej klasy, bez potrzeby modyfikowania istniejących już klas. ====== Zadanie: Zbiór figur ====== Zaimplementuj klasy pozwalające reprezentować zbiór figur geometrycznych w dwu wymiarowej przestrzeni. W układzie współrzędnych umieszczane będą następujące obiekty: * Punkt – opisany współrzędnymi o wartościach rzeczywistych (x, y). * Koło – określone przez współrzędne środka (punkt na płaszczyźnie) oraz promień, posiada nazwę (string) * Trójkąt – określony przez współrzędne 3 punktów, posiada nazwę (string) Dodatkowo: * Wielobok - opisany jest listą punktów definiujących położenie wierzchołków (punkty przetrzymywane w dowolnej kolekcji). Wielobok posiada nazwę (string). \\ Zauważ, że trójkąt jest szczególnym przypadkiem wieloboku. Dla wszystkich figur umieszczanych na wykresie zdefiniuj następujące operacje: * konstruktory pozwalające zainicjować wszystkie pola składowe * konstruktory domyślne * metodę ''Clone()'' zwracającą kopię obiektu (interfejs ''IClonable'') * metodę zwracającą obwód figury. Jeżeli uznamy, że punkt jest szczególnym przypadkiem figury to jego obwód będzie wynosił 0 * przeciąż metodę ''ToString()'' zwracającą odpowiednie informacje o danej figurze w postaci zmiennej typu string * przeciąż metodę ''Equals'' tak aby dwie figury tego samego typu i o tych samych parametrach (współrzędne, promień, itd. ) były traktowane jako identyczne * dociąż operator < porównujący figury względem długości obwodu Dla klasy określającej punkt zdefiniuj operację pozwalającą: * modyfikować współrzędne punktu (np. własności set/get) * obliczyć odległość pomiędzy parą punktów (np. metoda statyczna przyjmująca dwa punkty w argumentach) Dodatkowo: * dla wieloboku zaimplementuj metodę ''DodajPunkt'' pozwalającą dodać nowy wierzchołek do wieloboku * dla wszystkich figur zaimplementuj metodę pozwalającą przesunąć figurę (zmienić wszystkie współrzędne punktów określających jego położenie) * utwórz interfejs związany z obsługą konsoli dla figur wymuszający zaimplementowanie 2 metod * metodę wczytującą zawartość pól obiektu z terminala * metodę wyświetlającą (wypisującą) figurę (obiekt) na terminalu * niech jedna z figur implementuje ten interfejs ** Przykładowy diagram UML ** {{:zajecia:po_2013_1:10_cs_figury:10_cs_figury.png?500|}}