Instrukcja_2 instr 6-9, J. Kisilewicz,K.Puchala,JGładysz v1.2
Transkrypt
Instrukcja_2 instr 6-9, J. Kisilewicz,K.Puchala,JGładysz v1.2
Jerzy Kisielewicz Jakub Gładysz Karol Puchała Instrukcja nr 2 do Laboratorium z Programowania Obiektowego Zajęcia 6-9 Tydzień INEW002L Semestr 2 Kierunek: Informatyka (INF) Teleinformatyka (TIN) Studium Kształcenia Podstawowego (SKP) Wrocław 2009 Program laboratorium przedstawia się następująco: Lab . Instrukcja 1 1 Temat Laboratorium Test Wstęp. Uruchomienie prostej aplikacji terminalowej 2 1 3 1 Prosta aplikacja terminalowa. Formatowanie obiektowego wejścia i wyjścia Propozycje programów semestralnych Definicja prostej klasy (punkt, prostokąt, zesp, itp). Obserwacja konstruktorów i destruktorów 4 1 Aplikacja dialogowa – budowa interfejsu użytkownika + przydział tematów semestralnych 5 1 Rozbudowa aplikacji dialogowej – programowanie obsługi wybranych kontrolek 6 2 Klasa z alokacją pamięci – definiowanie konstruktorów, destruktora i operatora przypisania 7 2 Przeciążanie operatorów. Definiowanie klas pochodnych, dziedziczenie proste i wielobazowe 8 2 (kontynuacja ćwiczenia 7) 9 2 Funkcje wirtualne, klasy abstrakcyjne 10 3 Aplikacja dialogowa 11 3 Aplikacja SDI 12 3 Aplikacja SDI (cd.) 13 4 Program semestralny 14 4 Program semestralny (c.d.) 15 4 Program semestralny (c.d.) i wpisy Podstawy C, Wskaźniki i struktury Podstawy C++ Klasy i ich metody Klasy pochodne, Diedziczenie, Polimorfizm Windows (zdarzenia, aplikacje dialogowe i SDI) UML, Wyjątki Ćwiczenie 6. Klasa z alokacją pamięci – definiowanie konstruktorów, destruktora i operatora przypisania. Zadania laboratoryjne (czas realizacji: 1 tydzień) Zdefiniować klasę wektorów zawierającą następujące dane: class Vec{ char Naz[4]; int n; double *A; static int p; static double x; gdzie: Naz jest maksymalnie 3 znakową nazwą wektora, n jest rozmiarem wektora (liczbą elementów tablicy wskazywanej przez A, A wskazuje na początkowy element n elementowej tablicy skojarzonej z obiektem, p jest precyzją wydruku wartości elementów tablicy A, x jest zmienną pomocniczą (do której np. można się odwołać przy braku tablicy A). Oprogramować tę klasę. Przyjąć zasadę, że jeśli operatory wymagają zgodności rozmiarów swoich argumentów (wektorów), brakujące elementy wektora o mniejszym rozmiarze są zerowe. Między innymi zdefiniować operatory dodawania, odejmowania i mnożenia wektorów, zaprzyjaźnione operatory wejścia i wyjścia, operator indeksacji i jednej konwersji skalarnej. Zdefiniować Odpowiedni zestaw konstruktorów, destruktor i operator przypisania. Niech w celach testowych konstruktory i destruktor informują o swoim działaniu. Dane powinny być wczytywane1 z pliku wybieranego przez użytkownika. Wyniki mogą być wyświetlane w odpowiedniej kontrolce lub zapisywane do pliku. 1 Należy użyć obiektów używając obiektów klasy CFile , CArchive lub obiektów klas ifstream, ofstream lub fstream. Ćwiczenie 7 i 8 Przeciążanie operatorów. Definiowanie klas pochodnych, dziedziczenie proste i wielobazowe . Zadania laboratoryjne (czas realizacji: 2 tygodnie) Zadanie 1 Celem ćwiczenia jest poznanie zasad definiowania klas pochodnych, dziedziczenie proste, dziedziczenie wielobazowe oraz przeciążanie operatorów. Zdefiniować klasę macierzy bazującą na klasie wektor z poprzedniego zadania i oprogramować ją: class Mac: public Vec { int N, M; // liczba wierszy i liczba kolumn ... }; Należy przyjąć założenie, że elementy macierzy są pamiętane wierszami w prostej tablicy o rozmiarze n=N*M wskazywanej przez A. W klasie macierzy zdefiniować wymagane konstruktory i operatory, Podobnie jak w klasie wektorów, aby uzyskać zgodność wymiarów macierzy (np. w operacji mnożenia), należy założyć, że brakujące kolumny lub brakujące wiersze są zerowe. Indeks elementu z i-tego wiersza oraz j-tej kolumny wyraża się wzorem k=i*M+j (lub k=(i-1)*M +j–1, gdy numeracja wierszy i kolumn zaczyna się od jedności). Nie definiować dla klasy macierzy operatorów wejścia i wyjścia, lecz wykorzystać istniejące operatory zdefiniowane dla klasy wektorów. W tym celu należy w obu klasach zdefiniować funkcje wirtualne, które będą realizować te fragmenty operacji we/wy, które są indywidualne w tych klasach. Np. w operacji wejścia indywidualne będą zaproszenia do podania wartości elementu wektora lub tablicy, natomiast wprowadzone wartości są w obu przypadkach wpisywane kolejno do tablicy A. W miarę możliwości użyć funkcji wirtualnych w innych przypadkach. Na przykład definiując wirtualną funkcję, która zmieni rozmiar wektora lub wiersza macierzy (dopisując zera lub usuwając ostatnie elementy), można ujednolicić operatory dodawania i mnożenia w obu klasach. Program winien umożliwiać wprowadzanie oraz wyprowadzanie danych, dodawanie, odejmowanie, mnożenie macierzy, mnożenie macierzy przez liczbę, wyznaczyć i wypisać indeks najmniejszego oraz największego elementu w poszczególnym wierszu. Należy pamiętać aby konstruktory alokowały wymagane obszary pamięci oraz zadbać o dobrą hermetyzację klas – aby użytkownik miał jak najmniejszy dostęp do wnętrza obiektów. Zadanie 2 Bazując na Zadaniu 1 napisać program który: wczyta liczbę wierszy i liczbę kolumn macierzy A, zaalokuje pamięć na tę macierz i następnie wczyta jej elementy, zaalokuje tablicę na wektor B o tylu elementach, ile jest kolumn w macierzy i wczyta elementy tego wektora, zaalokuje tablicę na wektor C o tylu elementach, ile jest wierszy w macierzy, a następnie obliczy elementy wektora C, ci=ai1b1+ai2b2+...+aimbm (i=1,2,...,n), czyli obliczy iloczyn C=AB, wyprowadzi wczytane dane i obliczone wyniki. Ćwiczenie 9. Funkcje wirtualne, klasy abstrakcyjne. Zadania laboratoryjne (czas realizacji: 1 tydzień) Przygotuj klasę Figura, która będzie klasą abstrakcyjną posiadającą następujące składniki: · dane składowe protected: nazwa (string), P1(współrzędne x1, y1), P2(współrzędne x2, y2), P3(współrzędne x3, y3), P4 (współrzędne x4, y4), kolor · publiczną funkcję składową: przedstaw_się (wypisuje nazwę figura), · wirtualne funkcje składowe Obwód o Pole · odpowiednie konstruktor Klasa Figura jest klasą podstawową dla klas: Kwadrat, Prostokąt, Romb, Czworokąt. Zdefiniuj każdą z klas pochodnych dodając niezbędne dane składowe opisujące daną figurę (np. promień, itd.). W każdym przypadku zdefiniuj odpowiednio funkcje Obwód oraz Pole. Każda z klas musi mieć zdefiniowany swój konstruktor otrzymujący parametry inicjalizujące figurę. Przygotuj funkcję PokazFigure, której argumentem jest wskaźnik na obiekt typu Figura. Funkcja powinna wywoływać funkcję składową Przedstaw_sie oraz dodatkowo wypisywać informację o polu oraz obwodzie figury. W programie głównym stwórz obiekty typu Kwadrat, Prostokąt, Romb, Czworokąt. Wywołaj funkcję PokazFigure przekazując do niej wskaźnik do utworzonych obiektów. Zmodyfikuj program tak, aby rysował figury na ekranie (środowisko MFC). Napisz program tak aby była możliwość zmiany położenia wierzchołków. Program powinien sam określić czy dana figura jest prostokątem, rombem, kwadratem czy innym dowolnym czworokątem.