[UML] program obliczajacy pole/obwod figur

0

Witam, jest to mój pierwszy post, więc siema ;)

Mam problem, bo zarazem projektuje swoje pierwszy schemat UML i program w języku c++.

Od razu napiszę ze posiadam podstawy programowanie obiektowego czysto teoretyczne (przeczytałem książkę) ale jak na razie nic sam nie napisałem, a muszę oddać schemat UML do szkoły, później będę musiał go implementować (ale na razie chodzi mi o UML'a)

Program z założenia ma obliczać pole figur, to jest trójkąta i kwadrata, musi też pobierać wartości z klasy figura.

poniżej schemat który sam narysowałem, mile widziane krytyka :)

http://img140.imageshack.us/my.php?image=diagramkl7.png

0

Nie rozumiem po co rozbiłeś obliczania pola i obwód do innych klas. Ja bym zrobił mniej więcej tak:

http://www.fotosik.pl/pokaz_obrazek/0d71a3ecc9f9dcf8.html

0

Mój projekt musi posiadać 3 klasy, klasy dziedziczone są traktowane jako jedna (klasa rodzica).
Jeśli zrobię w ten sposób który przedstawiłem na skrinie to akceptowalne są dwie klasy.

Wiec teraz mam dylemat, bo prawdopodobnie utworzenie 3 klas, będzie dużo prostsze niż zrobienie mojego projektu, ale jestem dość ambitny i chce się nauczyć jak najwięcej w trakcje tworzenia projektu.

Ale jak Ty uważasz, bo jak wcześniej napisałem o programowaniu mam pojecie czysto teoretyczne?
Wiec, może się okazać ze takie rozwiązanie jest bez celowe i nie daje żadnych dodatkowych możliwości, chodzi mi głownie o rozbudowę np. po przez dodanie kolejnych figur, albo sposobów obliczeń(tj. wzorów)

0

Moja propozycja:
user image
Są trzy klasy i nic nie jest naciągane (vel. klasa Pole) i jak będziesz potrzebował to dodasz elipsy, okręgi i inne takie.
*liczności w asocjacjach mogłem pokręcić.
dopisane: a w klasie Odcinek powinna być funkcja set_konce - ustawiajace A i B, albo te atrybuty powinny być public. W ogóle to raczej na takie szczegóły nie zwracaj uwagi, raczej skup się na idei ;)

0

Bardzo ciekawy pomysł z klasą Wielokąty :)

ale nie zrozumiem zależności klas Punkt i Wielokąt, mógłbyś trochę to opisać?

Cala składanie metody set_wierzchołki jest trochę nie jasna, czyli 'in punkty : Punkt[]' co oznacza ten prostokąt? (dowolna nazwa punktu?)

0

ale nie zrozumiem zależności klas Punkt i Wielokąt, mógłbyś trochę to opisać?

Jasne. Każdy wielokąt posiada wiele punktów. Punkt należy do jakiegoś wielokąta i odcinka. Z kolei odcinek składa się z dokładnie dwóch punktów. Choć wydaje mi się, że tych asocjacji nie koniecznie musisz zawierać w tak prostym diagramie.

Cala składanie metody set_wierzchołki jest trochę nie jasna, czyli 'in punkty : Punkt[]' co oznacza ten prostokąt? (dowolna nazwa punktu?)

Prostokąt to kwadratowy nawias otwierający i zamykający. Oznacza, że to jest wektor (tablica jednowymiarowa) instancji klasy Punkt. Nie wiem, czy to jest prawidłowy opis w UML - po prostu w którymś C tak było i wydało mi się naturalne zapisanie tego w taki sposób (ja dawno w C nic nie pisałem, edytor nie protestował ;P). 'In' oznacza, że to jest parametr wejściowy - narzędzie którego używam wymaga żeby wybrać in, out, albo in/out.

0
id02009 napisał(a)

ale nie zrozumiem zależności klas Punkt i Wielokąt, mógłbyś trochę to opisać?

Jasne. Każdy wielokąt posiada wiele punktów. Punkt należy do jakiegoś wielokąta i odcinka. Z kolei odcinek składa się z dokładnie dwóch punktów. Choć wydaje mi się, że tych asocjacji nie koniecznie musisz zawierać w tak prostym diagramie.

Może źle zrozumiałem, ale czy to nie jest przypadkiem zbyteczna komplikacaj, bo x i y reprezentuja wartosci na osi XY? czyli żeby program policzył długość kwadratu będę musiał podać pozycji (w zapisie XY) kazdego punktu? (nie planuje rozwijac programu graficzne, wiec wydaje mi się ze zbede, ale oczywiście mogę mylić i pewnie tak jest:) )

Cala składanie metody set_wierzchołki jest trochę nie jasna, czyli 'in punkty : Punkt[]' co oznacza ten prostokąt? (dowolna nazwa punktu?)

[...] Oznacza, że to jest wektor (tablica jednowymiarowa) instancji klasy Punkt.[...] 'In' oznacza, że to jest parametr wejściowy
to mi sie przy liczeniu np. pola figury? bo w moim zamysle program mial liczyc z liczy np. przy polu prostokata, pole_a * pole_b (12 * 14), a z tymi wektorami to sam nie wiem jak to bedzie wygladało, nie spotkalem sie jeszcze z tym w programowaniu

0

Może źle zrozumiałem, ale czy to nie jest przypadkiem zbyteczna komplikacaj, bo x i y reprezentuja wartosci na osi XY?

tak

czyli żeby program policzył długość kwadratu będę musiał podać pozycji (w zapisie XY) kazdego punktu? (nie planuje rozwijac programu graficzne, wiec wydaje mi się ze zbede, ale oczywiście mogę mylić i pewnie tak jest:) )

Spoko, to zrób tak, żeby wielokąt składał się z wektora odcinków, w szczególnym przypadku prostokątu z czterech (a dokładnie z dwóch par takich samych; kwadratu - w czterech identycznych).
Przykład, plus jak bym widział rozwijanie o dalsze figury (Koło):
user image

  • tylko usuń metody z klasy Wielokat, bo juz nie pasują ;)
0

Tak według mnie powinien wygadać, ten program, a nie potrafię sobie wyobrazić jak będzie to wyglądało w twoim projekcie

Wybierz figurę:

1.koło
2.trójkąt
3.kwadrat
4.prostokąt

0.exit

Wybieram 3 (prostokąt)

podaj długość pierwszego boku: 

wpisuje: 3

podaj długość drugiego boku: 

wpisuje: 4

Pole powierzchni wynosi: 12 (wektor1*wektor2)

Obwód wynosi: 7 (wektor1+wektor2)

Naciśnij Enter, aby przejść do menu wyboru figury: [Enter]

a tak rozumiem wykonywane polecenia przez komputer

Wybieram Prostokąt, posiada 2 odcinki(wartości wektorów)
a: 3
b: 4


Mam już długości boków, więc teraz zaczynam liczyć pole i obwód. Klasa Prostokąt dziedziczy metody (Oblicz_obwod i Oblicz_pole) z klasy Wielokąty, która najpierw odziedziczyła metody wirtualne z klasy Figury, ale właściwa metodę zawiera ona sama, gdyż do wzór dla każdej z figur jest inny. Komputer już wie jak mam obliczyć, czyli przypisuje wartości do wzoru i wypisuje:

Pole powierzchni wynosi:  12 (wektor1*wektor2)
Obwód wynosi: 7 (wektor1+wektor2)

No właśnie nie wiem jak z tym wektorem, ale zakładam ze mogę podać długość wektora, np. poprzez ustawienie początku wartość początku wektora na 0. Jak wpisze np. długość boku 12 to od razu mi wyliczy długość wektora. wygląda mi na to ze dzięki temu zabiegowi dochodzą 2 klasy, ale jest to chyba naciągane, ale jak już nie jedno krotnie napisałem, to tylko moje spostrzeżenia... które nie muszą być trafne

Napisałeś ze są 3 klasy:
1.Figury
2.Punkty
3.Odcinek
tak?

edit:
http://img183.imageshack.us/img183/4720/taktowygladart3.png
u mnie to tak wyglada, program (Umbrello) sam dorysował Kompozycja

Kompozycja, zwana również złożeniem, jest związkiem typu całość-część. W relacji kompozycji, części należą tylko do jednej całości, a ich okres życia jest wspólny — razem z całością niszczone są również części. Na diagramie, kompozycję oznacza się za pomocą linii zakończonej wypełnionym rombem.

i chyba tak powinno być, ale teraz czytelność kodu spadła, a to chyba idea UML'a

troche sporo tego textu, ale mam sporo wątpliości, więc i jest sporo pytań
id02009 dzięki za zainteresowanie

0

No właśnie nie wiem jak z tym wektorem, ale zakładam ze mogę podać długość wektora, np. poprzez ustawienie początku wartość początku wektora na 0.

Problem z terminologią, napisałem wektor ale nie miałem na myśli wektora z punktu widzenia geometrii, wektor czyli tablica jednowymiarowa o jakichś wartościach (4, 2 , 34, 23, 3.14)
W klasie wielokąt idea jest taka, że składa się on z dowolnej ilości odcinków (nie tak jak w Prostokącie - zawsze czterech, w tym dwóch identycznych par), czyli chcąc zapisać pięciokąt, który składa się z pięciu odcinków A, B, C, D i E, zapamiętujesz tablicę (nieszczęsny wektor), którego wartości są obiektami klasy Odcinek [A, B, C, D, E]

Jak wpisze np. długość boku 12 to od razu mi wyliczy długość wektora. wygląda mi na to ze dzięki temu zabiegowi dochodzą 2 klasy, ale jest to chyba naciągane, ale jak już nie jedno krotnie napisałem, to tylko moje spostrzeżenia... które nie muszą być trafne

Twój ostatni diagram to dokładnie to o co mi chodziło, ja niepotrzebnie wybiegłem przed szereg i skomplikowałem. Jedyne do czego bym się przyczepił, to klasa Kwadrat, która (z konsekwencji) powinna mieć parametr odcinek, a nie jego długość.
Nie wypowiem się na temat agregacji, które zawarłeś w diagramie, bo nie jestem w temacie za bardzo. Zakładam, że świeżo po przeczytaniu książki wiesz co i jak :)

0

Fakt, powinien mieć parametr odcinek i na pewno to zmienię.
a to agregacji, to nie jest mój pomysł, ale program z automatu (Umbrello) sam mi dorysował
widzę w tym logikę, wiec jest chyba poprawnie ;)

jeszcze pobawię się tym, żeby łatwiej było dodawać nowe figury, bo teraz przy każdej nowej figurze trzeba dodać agregacje do klasy Odcinek(chyba), może jak zmienię układ to będzie lepiej ;)

Mam jeszcze jedno założenie rozbudowy, tylko teoretyczne - jak może by było rozbudować program o wyliczanie pola np. trójkąta, ale żeby liczył pole prostokąta (takie pudełko w które będzie mieściła się dana figura).

edit:
w mojej książce jest teoria C++ + przykłady, nie mam nic o UML'u
moja wiedzę, opiera ma google + laborki

edit2:
Doczytałem się ze między związkiem a agregacja jest roznieca, która jest najłatwiej opisać słownie, czyli jeśli zależność między klasami można opisać poprzez słowo 'jest', mam wtedy związek, a agregacje można opisać poprzez słowo 'ma' czyli w moim przypadku wygląda to tak:

związek:
Figura jest wielokątem
Prostokąt jest wielokątem
Kwadrat jest prostokątem

agregacja:
Prostokąt ma odcinek
Kwadrat ma odcinek
Odcinek ma punkt

a z tym wektorem, to trzeba będzie ustawić jaka zmienną np. x która będzie reprezentowała wielkość tablicy, tak?

A co z implikacją tego diagramu, czy to będzie trudna sprawa dla początkującego?
Czy będzie trzeba użyć np. polimorfizm?

teraz to wygląda tak:
http://img383.imageshack.us/my.php?image=noooowyoi6.png

0

a z tym wektorem, to trzeba będzie ustawić jaka zmienną np. x która będzie reprezentowała wielkość tablicy, tak?
Tak, w C++ musisz uważać, żeby nie wyjść poza tablicę.

A co z implikacją tego diagramu, czy to będzie trudna sprawa dla początkującego?
Czy będzie trzeba użyć np. polimorfizm?
Wydaje mi się, że chodzi Ci o implementację. Nie powinna sprawiać Ci większych problemów. Polimorfizm nie będzie Ci potrzebny (chyba, że wykładowca powie, że ma być ;))

Przyczepię się do diagramu, choć to pewnie czeski błąd: Klasa kwadrat ma atrybut typu tablicowego- wydaje mi się, że to niepotrzebne.

Tak sobie myślę, że diagram jest ok tylko pod warunkiem, że np. trójkąt jest tylko zbiorem odcinków, które są w dowolnym miejscu na płaszczyźnie (po odpowiednich przesunięciach mogą otworzyć trójkąt),
np. trójkąt ABC, gdzie
A( (1,1), (1,2) ) // odc końcu w punkcie (1,1) i w punkcie (1,2)
B( (2,1), (2,2) )
C( (3,1), (3,2) )
Jak sobie to narysujesz, to nie tworzą one trójkąta, ale można policzyć pole trójkąta, który może zostać z nich ułożony.
Jeżeli takie podejście jest ok, to ok.

W drugim przypadku, jeżeli dane odcinki muszą tworzyć figurę,
np.:
A( (1,1), (1,2) ); B( (1,1), (2,2) ); C( (1,2), (2,2) )
To klasy Prostokąt i Kwadrat nie mogą mieć takich atrybutów jak teraz, ale oba powinny mieć wszystkie boki
a, b, c i d

0

dzięki za wszystkie rady, ostatecznie skorzystałem z starego UML'a ale tylko dlatego ze sie balem porywać na coś ambitniejszego, planuje zbudować projekt na uml'u twojego autorstwa, ale muszę się sporo jeszcze nauczyć. :)
Bardzo mi pomogłeś zrozumieć sam problem programowania obiektowego, jeszcze raz dzięki!

0

Cieszę się, że mogłem pomóc :)
Powodzenia

0
id02009 napisał(a)

ale nie zrozumiem zależności klas Punkt i Wielokąt, mógłbyś trochę to opisać?

Jasne. Każdy wielokąt posiada wiele punktów. Punkt należy do jakiegoś wielokąta i odcinka. Z kolei odcinek składa się z dokładnie dwóch punktów.

Odcinek ma chyba nieskonczenie wiele punktów albo ja sie ucze innej matematyki niż Wy ;)

0

Niby tak, ale grunt to uprościć sobie życie i przyjąć, że odcinek składa się z pkt poczatkowego i końcowego, a wszystko pomiędzy to po prostu kreska ;)

0
nauczyciel_matematyki napisał(a)
id02009 napisał(a)

ale nie zrozumiem zależności klas Punkt i Wielokąt, mógłbyś trochę to opisać?

Jasne. Każdy wielokąt posiada wiele punktów. Punkt należy do jakiegoś wielokąta i odcinka. Z kolei odcinek składa się z dokładnie dwóch punktów.

Odcinek ma chyba nieskonczenie wiele punktów albo ja sie ucze innej matematyki niż Wy ;)

No tak, "składa się" to niefortunnie użyte sformułowanie. Powinienem był napisać, że odcinek możne opisać, albo zdefiniować przy pomocy dwóch punktów. Ludzie ze skrzywieniem matematycznym widzą bład, ale ci ze skrzywieniem programistycznym wiedzą o co chodzi ;)
Pozdro

1 użytkowników online, w tym zalogowanych: 0, gości: 1