[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 :)

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