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.