C1. Wykonaj w ramach jednego projektu następujące polecenia:
- Stwórz klasę
Car
. - Stwórz w niej nowe prywatne pola
double pojemonoscSilnika
,string marka
. - Stwórz obiekt typu
Car
, czy masz dostęp do jego pól? czy możesz zmienić wartości? (nie zmieniaj pól klasy na publiczne). - Do klasy
Car
dodaj samodzielnie napisany konstruktor bez parametru. - Przeciąż konstruktor tworząc nowy:
Car(double pojemonoscSilnika, string marka)
. Niech ten parametryczny konstruktor ustawia wartości pól pojemność silnika oraz marka. (użyj inicjalizatorathis
). - Stwórz nowy obiekt za pomocą konstruktora parametrycznego.
- Za pomocą debuggera sprawdź jakie warości na prywatnych polach ma obiekt numer 1, a jakie obiekt 2.
- Zmień modyfikatory dostępu konstruktorów na private. Czy jest możliwe utworzenie nowego obiektu tej klasy? Co się stało z konstruktorem domyślnym?
- W klasie
Car
stwórz metodęCreate()
, która będzie zwracać obiekt. - Stwórz obiekt dzięki metodzie
Create()
(pamiętałeś o dodaniustatic
do metody? ) - Utwórz statyczne pole int
iloscKol
. Następnie stwórz statyczny konstruktor ustawiający wartość tego pola na 4. Jak możesz odwołać się do pola? czy możesz go zmodyfikować? co się stanie jak dodaszreadonly
? - Uruchom program i w debuggerze sprawdź jaką wartość pola
iloscKol
ma wczesniej stworzony obiekt. - Do klasy
Car
dodaj destruktor~Car()
, wewnątrz dodaj następujący kod:
Console.WriteLine("Zwalniam pamięć");
Console.ReadKey();
- Uruchom program i zwróć uwagę kiedy następuje zwolnienie pamięci.
- Dodaj w klasie
Car
stałe pole iloscDrzwi i ustaw mu wartość 4. Jak możesz się do niego odnieść? czy możesz go zmodyfikować?
C2. Stwórz klasę Matematyka
i dodaj w niej statyczne pole pi
i nadaj mu wartość 3.14. Następnie w tej klasie dodaj statyczne metody z jednym parametrem pozwalające obliczyć pole i obwód koła. W klasie Program
i metodzie Main
przećwiczyć użycie tych metod.
C3. W klasie Program
poza metodą Main
dodaj kod:
static string OpiszTyp()
{
return "Metoda bez argumentów";
}
static string OpiszTyp(int x)
{
return "Liczba całkowita";
}
static string OpiszTyp(string x)
{
return "Łańcuch znaków";
}
static string OpiszTyp(int x, int y)
{
return "Dwie liczby calkowite";
}
W metodzie Main
przetestuj działanie tych metod.
C4. Stwórz nowy projekt i w nim wykonają następujące czynnności:
- dodaj klasę Samochod,
- w klasie
Samochod
dodaj prywatne pole model typustring
. - Utwórz właściwość dla tego pola za pomocą narzędzi VS – Edit/Refactor/Encapsulate Field (lub Ctrl+R,Ctrl+E).
- w klasie
Program
stwórz prosty program do pobrania modelu. - w klasie
Samochod
wpisz wyrażeniepropfull
i naciśnijTab
. Następnie zmień typ pola i właściwości na double, nazwę pola na cena, a nazwę właściwości na Cena. UzupełnijProgram
aby pobierało i zwracało dodatkowo cenę. - w klasie
Samochod
dodaj właściwość marka za pomocą skróconej deklaracji:
public string Marka { get; set; }
- rozbuduj
Program
o pobieranie i zwracanie ceny. Użyj metodyTryParse().
Czemu jest to nie możliwe? Zrób konwersję/parsowanie inaczej.
C5. Stwórz klasę Konto
z kilkoma polami, metodami i konstruktorami (saldo początkowe, końcowe, przelew miedzy kontami, przelew zewnętrzny, wplata, wyplata itd.) Następnie utwórz co najmniej 3 obiekty i wykonaj kilka metody na nich.
C6. Stwórz klasę Telefon
, która będzie zawierała parametry do obsługi bilingu (usługa prepaid).Dodatkowo ma zawierać metody, konstruktory (saldo początkowe, końcowe, doładowanie, wysłanie smsa, rozmowa, połączenie z internetem, usługi premium). Potem stwórz kilka obiektów i wykonaj na nich metody. Na ekranie wyświetl „bilingi” dla stworzonych obiektów.
C7. Stwórz nowy projekt, a w nim wykonaj poniższe operacje:
- Stwórz klasę
Osoba
z polamiimie
,nazwisko
,rokUrodzenia
, dodaj domyślny konstruktor i parametryczny, oraz dodaj metodęWypiszInfo()
wyświetlającą wartości obiektu. - Stwórz klasę potomną
Student
z dodatkowymi polamirok
,numerGrupy
,numerAlbumu
, stwórz konstruktury i metodęWypiszInfo()
. - Ustaw modyfikatory dostępu w klasie "rodzica" na
protected
. - W klasie
Osoba
dodaj metodęObliczWiek()
. Następnie stwórz obiekt z klasyStudent
i spróbuj na nim wywołać metodęObliczkWiek()
. - W klasie
Osoba
dodaj polemiejsceZamieszkania
z modyfikatoremprivate
. Spróbuj je wywołać dla obiektu z klasyStudent
. Popraw kod aby wszystko działało. - Stwórz klasę potomną
StudentPierwszegoRoku
dziedziczoną z klasyStudent
iOsoba
. Czy to możliwe? Co w C# możemy jedynie zrobić? - Stwórz obiekt typu
Osoba
z klasyStudent
(np.Osoba student2 = new Student()
). Wywołaj dla niego metodęWypiszInfo()
. - Stwórz nowy obiekt
student3
typuStudent
. Następnie stwórz obiektosoba3
typuOsoba
i podstaw za niegostudent3
. Następnie stwórz obiektstudent4
typuStudent
i podstaw za niegoosoba3
.
Student student3 = new Student();
Osoba osoba3 = student3;
Student student4 = osoba3;
Dla obiektu osoba3
wywołaj metodę WypiszInfo()
. Gdzie jest błąd?
C8. W nowym projekcie stwórz klasę Osoba
z prywatnymi polami imie
i nazwisko
. Następnie stwórz klasę potomną Pacjent
z prywatnym polem wiek
. W klasie Pacjent
dodaj konstruktor parametryczny, który ustawi wszystkie pola z klasy bieżącej i "rodzica".
C9. Stwórz program z klasą Konto
. Dodaj w niej samodzielnie wybrane pola, metody, konstruktory, opisujące możliwe działania na koncie (saldo początkowe, końcowe, przelew, wpłata/wypłata w kasie, wypłata w bankomacie, płatność kartą, itp).
- Stwórz kilka obiektów, wyciągi dla kont wyświetl na ekranie i zapisz je do pliku tekstowego.
- Stwórz klasy potomne
KontoPrywatne
(rozbuduj o przelew wynagrodzenia, otrzymanie 500+, itp) iKontoFirmowe
(przelewy do ZUS, US). - Rozbuduj program tak, by na początku sprawdzał czy istnieje plik z zapisem historii danego konta - jeśli tak, ponowne uruchomienie programu powinno wykonać dalsze operacje na koncie (a nie nadpisanie dotychczasowych).
- Narysuj diagram UML projektu.
C10. Zaprojektuj i zaimplementuj podstawy gry RPG. W grze może istnieć kilka typów bohaterów, lecz na początku będą tylko dwa rodzaje – wojownik i łucznik. W przyszłości planowana jest rozbudowa.
- Wiadomo że wszystkie postacie będą opisane imieniem, poziomem życia, oraz posiadać będą operację która pozwoli obliczyć moc ataku.
- Zaimplementuj wojownika i łucznika zgodnie ze schematem:
Łucznik: imię, żywotność (w %), zręczność (liczba całkowita), punkty taktyki (liczba całkowita)
Wojownik: imię, żywotność(w %), siła (liczba całkowita), punkty taktyki (liczba całkowita)
- Zadbaj o hermetyzację w klasach.
- Konstruktor domyślny powinien implementować bohaterów zgodnie ze schematem: Łucznik: Imię=”GoblinA”, żywotność=100%, zręczność=15, PT = 3; Wojownik: Imię=”OrkA”, żywotność=100%, siła=15,PT=1;
- Pozostałe metody:
i. zmiana pkt życia (nie mniej niż 0% i nie więcej niż 100%),
ii. moc ataku (zręczność/siła * PT * żywotność) UWAGA: w przypadku wojownika gdy żywotność spada poniżej 20% wpada w szał i mnożnik żywotności zmienia się na stałe 150%
Pytania: Czy pomyślałeś o klasie rodzica np.bohater? Czy Łucznik i wojownik dziedziczą po bohaterze? Czy ciężko byłoby dodać kolejnych bohaterów? Czy możliwe byłoby stworzenie klasy DrużynaBohaterów i czy miałoby to sens?
C11. Stwórz przykłady klasy obrazujące inne związki między klasami niż dziedziczenie.
C12. Stwórz nowy projekt. Wykonaj w nim następujące polecenia:
- Napisz w nim pustą klasę
Pojazd
oraz dwie dziedziczące po niej klasySamochod
iRower
. - Teraz utwórz interfejs
IJazda
, zawierający deklarację metodyJedz()
typuvoid
(z oknaSolution Explorer
wybierzAdd/New Item/Interface/
ew.ctr+shit+a
). - Podepnij interfejs do klas
Samochod
iRower
i zaimplementuj metodęJedz()
w sposób niejawny wyświetlając w konsoli komunikat"Jadę samochodem"
lub"Jadę rowerem"
. - Stwórz po jednym obiekcie typu
Samochod
iRower
. Dla nowo utworzonych obiektów wywołaj metodęJedz()
i zobacz co wyświetli się na ekranie. - Stwórz nowy interfejs
IMuzyka
z metodąKlakson()
typuvoid
i podepnij go do klasyRower
. Następnie za pomocąConsole.Beep
stwórz dźwięk dzwonka roweru (jeśli nie masz opcji usłyszenia użyj wyświetl łańcuch"dryń"
). Wywołaj metodę na obiekcie typuRower
. Czy wielodziedziczenie interfejsów w C# jest możliwe? - Narysuj diagram UML projektu.
- Skorzystaj z rzutowania w górę i stwórz obiekt
Rower
zrzutowany na typPojazd
(Pojazd rower2 = new Rower();
). Wywołaj na tym obiekcie metodęKlakson()
. Czy to jest możliwe?
C13. W nowym projekcie wykonaj poniższe czynności:
- Stwórz klasę
Osoba
- Stwórz interfejsy
ISport
iIMuzyka
, dodaj w nich deklarację metodyGraj()
zwracającej typstring
- Oba interejsy podepnij pod klasę
Osoba
, dodaj niejawną implementację interfejsu tak by metoda zwracała string"gra"
. - w klasie
Program
i metodzieMain
stwórz trzy obiekty za pomocą poniższego kodu:
Osoba osoba1 = new Osoba();
IMuzyka osoba2 = new Osoba();
ISport osoba3 = new Osoba();
- Na powyższych obiektach wywołaj metodę
Graj()
i sprawdź na konsoli co zwraca. - W klasie
Osoba
dodaj jawną implementację interfejsuIMuzyka
tak, aby metodaGraj()
zwracała string"muzyka"
(nie usuwaj niejawnej implementacji). Następnie uruchom program i sprawdź co się zmieniło. Czy pamiętasz, aby usunąć modyfikator dostępu? - W klasie
Osoba
usuń niejawną implementację interejsu. Następnie dodaj jawną implementację interfejsuISport
tak, aby metodaGraj()
zwracała string"sport"
. Uruchom program. Co trzeba poprawić? (są dwa możliwe rozwiązania).
C14. W nowym projekcie wykonaj poniższe czynności:
- Stwórz klasę
Owoc
i klasę potomnąGruszka
. - Stwórz interfejs
IJedzenie
i dodaj w nim deklarację metodyJedzenie()
typuvoid
. - Podepnij interfejs pod obie klasy stworzonę wyżej, dodaj w obu klasach implementację niejawną w postaci wyświetlania jakiegoś stringa na konsoli.
- W klasie
Program
i instrukcjiMain
dodaj kod.
Gruszka gruszka1 = new Gruszka();
Owoc gruszka2 = new Gruszka();
IJedzenie gruszka3 = new Gruszka();
gruszka1.Jedzenie();
((Owoc)gruszka1).Jedzenie();
((Gruszka)gruszka1).Jedzenie();
((IJedzenie)gruszka1).Jedzenie();
Console.WriteLine("---");
gruszka2.Jedzenie();
((Owoc)gruszka2).Jedzenie();
((Gruszka)gruszka2).Jedzenie();
((IJedzenie)gruszka2).Jedzenie();
Console.WriteLine("---");
gruszka3.Jedzenie();
((Owoc)gruszka3).Jedzenie();
((Gruszka)gruszka3).Jedzenie();
((IJedzenie)gruszka3).Jedzenie();
Console.ReadKey();
Przed uruchomieniem przeanalizuj co powinno się wyświetlić na konsoli.
C15. W nowym projekcie wykonaj czynności:
- Stwórz klasę
WlasnaKlasa
- Stwórz interfejs
IAaa
i dodaj w nim deklarację metodyLiczba()
zwracającej typint
. - Stwórz interfejs
IBbb
dziedziczący z interfejsuIAaa
i dodaj w nim deklarację metodyWyraz()
zwracającej typstring
. - Podejpnij interfejs
IBbb
pod klasęWlasnaKlasa
. Zastanów się, które metody musisz obowiązkowo zaimplementować. - Narysuj diagram UML projektu.
C16. W nowym projekcie wykonaj czynności:
- W klasie
Car
dodaj polayear
(rok produkcji) ibrand
(marka) oraz konstruktor z parametrami (year
,brand
). - W klasie
Program
stwórz kolekcjecars
i dodaj na nią kilka samochodów za pomocą konstruktora np.:
List<Car> cars = new List<Car>();
cars.Add(new Car(2010, "Ford"));
cars.Add(new Car(2016, "Fiat"));
cars.Add(new Car(2012, "Skoda"));
cars.Add(new Car(2010, "BMW"));
- Do klasy
Car
dodaj interfejsIComparable<T>
i metodęCompareTo
. Następnie posortuj elementy na liście i wyświetl je kolejno na konsoli. Na koniec zmień kolejność sortowania.
C17. Stwórz nowy projekt - Zwierzaki:
- Stwórz klasę
Zwierze
, po której dziedziczyć będą następujące klasy:Pies
,Wilk
,Rekin
,Orzel
iKrokodyl
. - Stwórz interfejs zawierający dwie metody:
void JakSiePoruszam()
ivoid CoJem()
. - Obiekt każdej klasy powinien umieć wywołać powyższe metody i odpowiedzieć na nie w sensowny sposób (np. "poruszam się na czterech łapach")
- W każdej klasie potomnej po Zwierzaku dodaj pola: imię, waga, ilość nóg. Następnie
poćwiczyć użycie interfejsów
IComparable
,IEnumerable
,IClonable
.
C18. Stwórz nowy projekt - Zbiór figur:
Zaimplementuj klasy, które pozwolą reprezentować obiekty w dwuwymiarowej przestrzeni.
Punkt – reprezentowany przez dwie zmienne typu rzeczywistego X i Y
Koło – reprezentowane przez środek koła (punkt), oraz promień.
Kwadrat – reprezentowany przez 4 punkty krawędziowe.
(Wszystkie powyższe klasy posiadają też pole nazwa typu string.)
Stwórz potrzebne konstruktory.
Dodaj interfejsy z metodami (podziel je pod względem odpowiedzialności):
- metoda LiczObwód (obwód punktu = 0)
- metoda PobierzDaneZKlawiatury
- metoda Wyświetl
Po zakończeniu implementacji stwórz kilka obiektów, policz ich obwód, a następnie je wyświetl. Na koniec stwórz kolekcję, posortuj obiekty.