[OOP] - Defining Classes Part Two - Task 1,2,3,4


21

Ето условията на задачите: Цък

Ето моя прогрес по нея:

GitHub

Обяснение по класове ( и структури ):

1. Point3D - основната цел тук е да се създаде
точка в 3D пространството. Няма нищо особено - има полета за отделните точки и презаписваме ToString за да печата точката.

2. Path - пази лист от точки, като със свойството Paths достъпваме нашия лист, а с метода AddPoint добавяме нова точка в "пътя"

3. Distance3D - статичен клас, който отговаря за пресмятането на разстоянието м/у 2 точки ( зададени чрез Point3D ). Формулата може да намерите тук: Wiki

4. PathStorage -  тук имаме 2 основни метода:

- PathSave - обикаляме по точките в определен Path и ги записваме в файл

- PathLoad - приемаме лист от пътища за обработка от файл, като четем входа ред по ред. Входните данни приемаме в формата X,Y,Z , а '-' разделяме отделните точки.

Въпрос:

Та имам едно въпросче, което не е точно по задачата, а е по-общо - трябва ли структурите да се обособяват в отделни файлове като класовете или не ?


в C# OOP от Teodor92 (13062 точки)


Отговори



0


distance = Math.Sqrt(Math.Pow(pointOne.pointX - pointTwo.pointX, 2) + Math.Pow(pointOne.pointY - pointTwo.pointY, 2) + Math.Pow(pointOne.pointZ - pointTwo.pointZ, 2));

image commented Mar 7 by Teodor Kurtev 1 Senior Ninja
 
 
Малка поправка - формулата е леко грешна. Трябва да е така:
 
 distance = Math.Sqrt(Math.Pow(pointTwo.XCordinate - pointOne.XCordinate, 2) +  Math.Pow(pointTwo.YCordinate - pointOne.YCordinate, 2) + Math.Pow(pointTwo.ZCordinate - pointOne.ZCordinate, 2));
 
По точно, от Х2 вадим Х1 и т.н.
Поздрави.
 
 

от wooden_jesus (2128 точки)


0
Е добре де нали се вдига на квадрат разликата не е ли едно и също дали ще е x1-x2 или x2-x1???

от anilak (1134 точки)

0
Едно и също е

от Yordan.Bonev (780 точки)



0
Защо класовете PathStorage и CalculateDistance са статични - само заради упражнението или не ? Не е ли по - добре да не са статични ?

от Hachiko (380 точки)


0
Според теб имат ли нужда от инстанции тези класове? CalcDistance е подобен на класа Math - просто извършва някакви операции върху подадените параметри и връща резултата. PathStorage пък си е просто механика за save/load. В нито един от двата класа не е необходимо да създадеш обект от съотвтния клас, за да свършиш работата им. И да имаш - какво ще го правиш? :) Поради тази причина целият клас се декларира като статик - клас, който по предназначение няма да се инстанцира(като Math). Ако класът не беше статик, щеше да се запази възможността да се създават празни обекти от този клас (с default конструктора), а при един клас, в който това не е предвидено, по-добре е да бъде премахнато като възможност изцяло.

от easlavov (4118 точки)

0
Мерси, сега го разбрах :)

от Hachiko (380 точки)



3

Ето го и мойто домашно : 

https://github.com/wIksS/Telerik/tree/master/OOP/DefiningClasses-Part-2/DefiningClasses-PartTwo

1. Създавам класът Point3D, със публични полета за x, y и z на точката. Класът има ToString, който връща трите точки на нов ред ("X --> {0}\nY --> {1}\nZ --> {2}", this.x, this.y, this.z).

2. Правя статично поле, което не може да се променя (няма set), което е инстанция на

класа и по default има стойности 0 (както се иска в условието).

3. Правя статичен клас TwoPointsDistance, който чрез метода FindDistance() намира

разтоянието на точките в пространството, използвайки питагоравата теорема.

4.Правя класа Path,където правя публично, статично поле List<Point3D>.В него добавям

нови точки, чрез метода Add(), който имплементирам по -късно.

5. Правя статичният публичен клас PathStorage. В него има статичен метод, който приема

List<Point3D> и със foreach печатам всеки елемент на листа във StreamWriter,

използвайки overrid-а на ToString().


от tddhome (3086 точки)


2

Решение : source

Имам структура Point3D с три private полета с три публични свойства x,y,z и едно статтично readonly поле и публично свойство за точка с координати 0. Overrid-нат метод ToString(), който печата точката в вид (x = {0}, y = {1}, z = {2}) . Класа Distance има един статичен метод CalculateDistanceBetween3DPoints(), който изчеслява разстоянието между две точки с Euclidean distance. Класа Path има едно private поле списък от точки List<Point3D>, като има публично свойство GetPoints, което връща точките като масив. Имам метод за добавяне на точка, както и два конструктора, единия създава празен списък от точки, другия приема IEnumerable<Point3D>. Статичния клас PathStorage има частно поле List<Path>, което съдържа пътищата, заредени чрез метода LoadPath(). Съотведно SavePath() записва точките в файл и изчиства полето. Имам и метод PrintPaths(), който печата пътищата.


от stanchev (197 точки)


0
Опитах се да отпечатам точката във вида {x, y, z}, но нещо не се разбраха placeholder-ите и къдравите скоби:
return String.Format("{{0}, {1}, {2}}", x, y, z); връща System.FormatException
Опитах да ескейпна скобите, но не позволява.

от Flystar (1171 точки)


0
Пробвай да ескейпнеш с двойни скоби: "{{{0}, {1}, {2}}}"

от Teodor92 (13062 точки)

0
Отдели крайните къдрави скоби в отделни стрингове и ги конкатенирай с този който ти е във формат.

от Ivayl3 (485 точки)



2

GitHub

3DPoint е главният клас. DistanceBetweenTwoPoints изчислява разстоянието и връща double стойност . Path представлява List . Точки към всеки Path могат да се добавят по три начина - чрез празен конструктор (0,0,0) , чрез обект от тип Point и чрез 3 int стойности. PathStorage операциите с StreamWriter i StreamReader върху конкретен Path.


от dzhenko (3893 точки)


1

http://git.io/6859OQ

Обяснението на какво съм направил е самият текст на задачите. Относно как съм го направил:

Всички полета във всички класове, във всички проекти съм направил private, достъпът до тях става с пропъртита.

В класа Point3D няма нищо интересно. Ползвам double, ToString() съм го направил да връща стринг във фромат (X, Y, Z), както в математиката се бележи точка.

Path представлява лист от обекти на Point3D, по условие. Има празен конструктор, който само инициализира листа, и такъв с неопределен брой точки, които да сложи в листа, като двата конструктора са chain-нати. Има два прости метода за добавяне и премахване на точка. Пропъртито, което връща Path от точки пак съм го направил да връща нов лист, понеже така и не измислих по-добър (според мен) начин.

PathStorage е малко по-интересен. Съдържа два метода за записване и "възпроизвеждане" на Path от точки. Записват се във файл, чието име може да бъде зададено, сложих и една default-на стойност дали да се overwrite-ва която после се подава на StreamWriter-a.
Точките се записват както се принтират - (X, Y, Z) формат. После се четат и се вкарват в един Path обект.

Distance е статичен клас с един статичен метод за изчисляване на 3D разстояние, може да се добавят и още методи за nD разстояния.


от georgiwe (720 точки)


0
Можем да си създадем точка по конструктора ти. Но интересно ми е защо не си писал сетъри за x, y и z ?

от d.brezoev (212 точки)


2
Първото домашно, благодарение на Ники82 и на Светльо, някак си го закърпих та даже и го разбрах :) това обаче върви малко тегаво и за почти цял ден успях да направя само 1,2,3,4 задача. Сега като си гледам кода, чак си се чуда какво толкова съм се мотал, но наистина нещата са доста нови. Май си трябва практика за да може да ги осмисли човек :)
Пускам кода за коментари и корекции ако имате: http://git.io/cYtkgQ

от Rusekov (971 точки)


0
имаш леко неспазване на условието т.2 private static read only поле. Така както си го написал полето ти може да се променя, макар и само вътре в класа.

от ttitto (1950 точки)

0
По-добре координатите на точките да не бъдат от целочислен тип - (3.9, 1.51, 2.44) също е валидна точка в пространството.
В Path бих добавил конструктор, който направо инициализира с някакъв брой точки. Аз го направих с params Point.
Другото ми харесва ;)

от georgiwe (720 точки)



0
Ще се радвам някой да ми каже вредните и грешни неща в решението ми. Интересно как докато дефинираме struct Point3D, едно от полетата му е от същия този тип Point3D. И това е позволено само ако полето е статик. https://github.com/dbrezoev/SVN/tree/master/OOP/DefiningClassesPart2/3DPoint

от d.brezoev (212 точки)


0
Моля за малко помощ:
Имам лист от точки:
List

от topsoft (420 точки)


0
Привет, не ми стана много ясно какво точно ти дава като грешка, но този метод ще ти върне точно една стойност и след това ще приключи.

от Ivaylo1987 (557 точки)

0
Ами в конкретната ситуация, ако listOfPoints.Count = 0 няма да влезеш в тоя цикъл, няма да стигнеш до return -а и затова ти пищи. Друг е въпроса че така написано е грешно - метода ти ще върне само първата точка (listOfPoints[0]) защото като стигне до return изпълнението на метода приключва.

от dzhenko (3893 точки)