Wejściówka na lab.14

Do obydwu klas reprezentujących owoce z poprzedniej wejściówki dodaj operator +=, przy czym dla jednego typu owoców napisz ten operator w formie metody należącej do klasy, a dla drugiego – w formie funkcji globalnej.

Napisz funkcję main w której tworzone są dwie listy dynamiczne, zawierające: jedna owoce jednego typu, a druga drugiego. Dodaj do każdej z list po kilka obiektów utworzonych za pomocą konstruktora domyślnego, a następnie dla każdej z list zsumuj operatorem += jej obiekty, zapisując wynik do obiektów pomocniczych odpowiedniego typu zadeklarowanych jako obiekty lokalne funkcji main.

Wejściówka na lab.13

Wymyśl i napisz klasę abstrakcyjną reprezentującą pojecie owocu. Zaproponuj w tej klasie przynajmniej dwie metody czysto wirtualne. Następnie zaimplementuj dwie klasy dziedziczące po tej klasie i reprezentujące dwa wybrane gatunki owoców. Obiekty reprezentujące gatunki owoców powinny być tak zaprojektowane, aby można z nich było tworzyć listy dynamiczne. W funkcji main utwórz jedną listę dynamiczną składającą się z kilku różnych owoców i na jej przykładzie zademonstruj polimorfizm metod deklarowanych w bazowej jako czysto wirtualne (np. wywołaj dla wszystkich obiektów w liście te czysto wirtualne metody, demonstrując w ten sposób ich różne działanie w zależności od typu obiektu).

Uwaga: zadanie daje dużą swobodę interpretacji, jeżeli chodzi o model (co mają reprezentować metody zadeklarowane w klasie bazowej? – tj. co można robić z owocami..), dlatego interpretacje identyczne mogą zostać potraktowane jako wykonane niesamodzielnie i mogą zostać nie uznane przez prowadzących. Wejściówki opracowane wspólnie przez kilka osób nie będą akceptowane. Sprawdzane będą podobieństwa pomysłów w obrębie grupy usos’owej, a także między grupami. Wszystkie osoby, które zawarły ten sam model w swoim kodzie, mają anulowaną wejściówkę, a w konsekwencji również punkty zdobyte na lab. 13. Nie będzie rozstrzygania, kto pierwszy zaprezentował swój pomysł i jest jego autorem, a kto był tylko plagiatorem.

Wejściówka na lab.12

Zaprojektuj i zaimplementuj cztery klasy, które na zajęciach 12 posłużą jako klasy bazowe. Klasy reprezentują pojęcia:

  1. silnik samochodowy – zawiera pola przechowujące cechy wspólne dla wszystkich silników (moc, wymiary).
  2. samochód – zawiera pola przechowujące cechy wspólne dla wszystkich samochodów (cena, rodzaj silnika).
  3. urządzenie optyczne – zawiera pola przechowujące cechy wspólne dla wszystkich takich urządzeń (zoom, waga).
  4. osoba na uczelni – zawiera pola przechowujące cechy wspólne dla wszystkich takich osób (imię i nazwisko, adres e-mail).

Wszystkie pola klasy bazowej powinny być zadeklarowane jako protected. Dla każdego z pól powinny istnieć odpowiednie getery i setery. Ponadto każda klasa musi mieć metodę wypisz, która wypisze w oknie konsoli wartości wszystkich pól.

Do wszystkich klas zaprojektuj po trzy konstruktory: konstruktor domyślny, kopiujący oraz z argumentami przechowującymi wartości dla inicjalizacji wszystkich pól.

Dodatkowo każda klasa bazowa powinna mieć jeszcze pole nast, zadeklarowane jako public i zawierające wskaźnik typu takiego jak klasa bazowa. Tym sposobem klasa bazowa będzie mogła być wykorzystana jako element listy dynamicznej jednokierunkowej.

Zademonstruj poprawność działania zaprojektowanych klas, pisząc w funkcji main kod, budujący dla każdego z typów danych listę dynamiczną jednokierunkową zawierającą 5 elementów. Do tworzenia elementów listy użyj konstruktorów domyślnych. Po utworzeniu każdej z list wywołaj metodę wypisz na rzecz każdego z elementów listy. Na koniec usuń wszystkie listy.

Wejściówka na lab.11

Napisz program, który tworzy dynamiczną listę jednokierunkową obiektów – figur geometrycznych jednego, dowolnie wybranego typu z dwóch wykorzystywanych na lab. 10. W tym celu do klasy reprezentującej wybraną figurę geometryczną dodaj pole nast, które ma być dostępne w trybie public, tak aby można było z niego korzystać w funkcji main. Po utworzeniu listy składającej się z co najmniej pięciu obiektów, wywołaj metodę szukaj, która znajduje w liście pierwszą figurę, dla której odległość jej geometrycznego środka od wskazanego przez użytkownika punktu, jest mniejsza niż 1. Użytkownik wskazuje ten punkt na płaszczyźnie przez podanie jego dwóch współrzędnych. Środek geometryczny figury obliczany jest jako średnia z odpowiednich współrzędnych wszystkich wierzchołków tej figury. Odległość między wskazanym punktem a środkiem figury liczymy jak zwykłą odległość euklidesową między punktami na płaszczyźnie. Na koniec działania programu lista powinna być usuwana.

Przy pisaniu kodu metody szukaj oraz instrukcji jej wywołania w funkcji main wzoruj się na przykładowym kodzie zaprezentowanym na slajdzie 157, wykład 10.

Uwaga: kod programu napisanego na lab. 10, zadanie poziomu I, zwłaszcza klasy reprezentujące figury geometryczne, oraz kod wejściówki będą stanowiły punkt startowy do realizacji zadań na lab. 11.

Wskazówki dotyczące zadań semestralnych

Każde zadanie wymaga napisania programu implementującego grę.

  1. Program powinien udostępniać pracę w dwóch trybach: gra z drugim graczem (program przyjmuje na przemian polecenia wykonania ruchów od dwóch osób) i gra z komputerem.
  2. W obydwu w/w przypadkach program dokonuje sprawdzenia poprawności ruchu. Jeżeli proponowany ruch jest niezgodny z zasadami gry, program powinien to zakomunikować i odmówić jego wykonania.
  3. W przypadku gry z komputerem wystarczy, że program będzie wykonywał ruchy losowe, tj. wygenerowane z pomocą generatora liczb losowych. Te losowe ruchy również powinny być zgodne z regułami gry. Uwaga: nie ma obowiązku implementowania żadnych strategii zwiększających szanse na wygraną komputera (tzw. „sztucznej inteligencji”).
  4. Powyższe wymagania są dobrym pretekstem do zaimplementowania następującej hierarchii dziedziczenia klas: klasa bazowa gracz i dwie klasy pochodne: gracz-człowiek i gracz-komputer. Jest to też dobra okazja do wprowadzenia do kodu programu polimorfizmu (metod wirtualnych oraz ewentualnie czysto wirtualnych).
  5. Program powinien udostępniać na żądanie użytkownika tablicę wyników wszystkich dotychczas rozegranych gier. W tablicy powinny znaleźć się nazwy graczy (w przypadku gry z komputerem – 'komputer’). Tablica ta powinna być zapisywana do pliku.
  6. Powinna istnieć możliwość przerwania w każdym momencie już rozpoczętej gry i wyjścia z programu. W takiej sytuacji aktualny stan gry powinien zostać zapisany do pliku. Przy ponownym uruchomieniu programu powinna istnieć możliwość powrotu do przerwanej rozgrywki.
  7. Wszystkie dane wprowadzane z klawiatury przez użytkownika oraz wczytywane z pliku powinny być kontrolowane pod względem ich poprawności. Np. kiedy dane mają być liczbowe, to po pierwsze należy sprawdzić, czy wprowadzony tekst jest liczbą, a po drugie – czy liczba ta należy do dozwolonego przedziału lub zbioru wartości. Tak samo w przypadku odczytywania danych z pliku, należy sprawdzać, czy są one zgodne ze składnią pliku. W razie odstępstwa, należy wyświetlić komunikat o błędzie i zaprzestać pobierania danych z uszkodzonego pliku. Generalnie zasada jest taka, że program nie może przerwać swojej pracy lub zacząć działać błędnie z powodu niepoprawnych danych.

lab.10 – hint

Zadania pierwszego i drugiego poziomu na lab. 10 będą polegały na rozwinięciu kodu napisanego na lab. 9 (dopisaniu nowych składowych do obydwu klas: (1) trapez i (2) trójkąt lub prostokąt, oraz zademonstrowaniu ich poprawnego działania). Jeżeli ktoś nie zrealizował całego zakresu zadania na lab.9 poziom 1, dobrym pomysłem jest dokończenie tego samodzielnie w domu, tak żeby na zajęciach zająć się od razu realizacją bieżącego materiału.