[OOP Exam1] - Сутрешна група - Решения и впечатления


8

Здравейте колеги,
Поздравявам ви с края на още един курс в академията smiley Днес видях на практика колко полезно е ООП-то и защо толкова държаха лекторите, че трябва да се знае.
Ще се радвам да видя и вашите решения и мнения за днешните задачи. Лично за мен и двете бяха изключително приятни.

Много се смях на IVulnerable уловката за ниджата, отне ми около 15мин, докато я схвана, но цялата работа протече изключитлно приятно.
А нинджата съм я направил sealed class, защото никой не може да бъде по-силен от една нинджа! :D

Software Academy - http://pastebin.com/MVRifjNh
Academt RPG - http://pastebin.com/1b5zPss1

Thank you OOP! :D




Отговори



5

 

Качили сме задачите, тестовете и решенията от ООП изпита в студентската система: http://telerikacademy.com/Courses/Courses/Details/29

Наков

от svetlin.nakov (31978 точки)


0
Първата задача беше доста лесна. Втората отначало ми се стори сложна. Сигурно заради дългото условие, но след внимателно оглеждане на кода и прочитането на условието, разбрах всичко и се оказа приятна. Мислих, че ще са по-трудни задачите, макар че за времето което имахме тия задачи пасваха перфектно. След малко ще си кача решенията.

от VGeorgiev (2890 точки)


0
Втора беше по-лесна от първата.

от simeon.bg (462 точки)

0
На мен първата ми отне не повече от 2 часа, втората задача около половин час съм я оглеждал, и през другото време съм писал. В крайна сметка 10 секунди не ми стигнаха да направя 200т.

от VGeorgiev (2890 точки)



0
Антони, не трябваше да пипаш Engine класа :(

от SVGN_H (3048 точки)


0
Това го разбрах, пропуснал съм че имплементацията на командите също не трябва да се добавя. Трябва още едно наследяване да бях направил... Здраве да е :) Поука - да си чета условието още веднъж преди да си тръгна :D

от KOCTEHYPKATA (5259 точки)

0
Явно не си обърнал внимание на GeometryAPI, там се прави същото :)

от SVGN_H (3048 точки)


3
За мен и 2те бяха прилично лесни. Хареса ми че и 2те задачи бяха строго концентрирани въху ООП-то, а РПГ играта ми беше доста интересна. Доволен съм от изпита, нямам търпение да си видя и бонус точките.

от KrisNickson (2635 точки)


3

Едит:Условията и авторските решения

Ще обесня, до колкото помня условията, как съм решил задачите от изпита в 10:30ч. – 15:00ч. на 25.03.2013. Обясненията ги карам по спомен, ако има нещо поправяйте ме. :)

Задача 1-SoftwareAcademysource

  1. Като за начало отделих всичко в отделни *.cs файлове, за да е по-прегледно.
  2. За да работи рефлекшъна премахнах using SoftwareAcademy; понеже съм махнал и namespace-a.
  3. Клас диаграмата
  4. Това, което за мен беше малко по-пипкаво беше форматирането и това да направя ITeacher nullable. Форматирането е в ToString() на класовете и не мисля, че много за обяснение по него. :)

 

 

Задача 2- AcademyRPGsource

HitPoints, AttackPoints и DefencePoints са зададени както по условие.

1.       Добавям нужните класове – наследници на Character класа

a.       Giant – който наследява интерфейси IFighter и IGatherer

i.      Посочено е в условието, че трява да е неутрален задаваме на base конструктора owner -> 0.

ii.      Не атакува неутрални обекти.

iii.      При събиране на камък добавяме към AttackPoints 100.

b.      Knight – който наследява интерфейса IFighter

                                                               i.      Посочено е в условието, че Knight принадлежи на нечий играч. В конструктора оставяме owner, за да бъде зададен играч от конзолата.

 ii.      Не атакува неутрални обекти и обекти принадлежащи на този играч.

c.       Ninja - който наследява интерфейси IFighter и IGatherer. Като цяло това е най-сложния Character.

i.      Посочено е в условието, че Ninja принадлежи на нечий играч. В конструктора оставяме owner, за да бъде зададен играч от конзолата.

ii.      Не атакува неутрални обекти и обекти принадлежащи на този играч. Също така трябва да атакува обектите с най-високи HitPoints. Това правя с Lambda израз

int highestHitPoints = availableTargets.Max(x => x.HitPoints);

iii.      При събрано дърво – увеличваме AttackPoints с количеството на събраното дърво. При събран камък увеличаваме AttackPoints с количеството на събрания камък умножено по 2.

2.       Добавям нужните класове – наследници на StaticObject  класа

a.      Stone – наследява интерфейса IResource

b.      House

c.      Rock – наследява интерфейса IResource

3.       Клас диаграмата

4. Имаше условие да не се променя Engine класа. Начина да добавите неща в switch-a в метода ExecuteCreateObjectCommand() в Engine без да го променяте е да направите един клас (в моя случай CreateObject) наследяващ Engine и override-ва споменатия метод. За да не се повтаря кода (switch-a) добавяме като case-ове само новосъздадените от нас обекти, а в default слагаме базовия метод  ExecuteCreateObjectCommand() с аргумент стинга с командите.

Това е моят начин за решаване на задачите. Задачите бяха доста интересни и интуитивни. Чакам вашите препоръки и забележки. Поздравления и успехи за напред на всички. :)

ПС: По погрешка забравих, че класа не трябваше да се подменя. Благодарности на Куртев, че ми припомни, но за жалост след изпита. :)


от kirov (4821 точки)


0
По-добре или махни клас диаграмите или ги изрежи някак, така в момента е мазало :D

от Teodor92 (13062 точки)

0
Ааааааааааа това съм го изпуснал със switch-a... кофти :) Аз разбрах че трябва да се имплементират команди за създаване и директно ги имплементирах :D

от KOCTEHYPKATA (5259 точки)



2

Та, колеги, още един изпит е в историята! Честито на всички доволи от своя резултат, а на тези, кото не са - не се отчайваите, ще има още възможности пред вас с които да компенсирате :)

Преди да постна моите решения, ето малко статистика за сутрешната група:

Точки Резултат
0т. 41
1 - 100т. 98
101-199т. 88
200т. 65

Общо явилите се на изпит са - 292 човека, от които 251 имат не нулев резултат.

 

Та ето и моите решения задачите:

1ва задача - Academy Software

Решение: GitHub

По-интересни моменти:

Като цяло класовата йерархия тук не е нищо прекалено сложно - Имаме един абстрактен клас Course, който се наследява от LocalCourse и Offsite course и един клас Teacher.

Най-трудното в тази задача е принтирането на съдържанието на всеки клас на конзолата. Тук имаме няколко основни проблема:

1. В края на всяко принтиране НЕ трябва да имаме точка и запетая. Как се справяме с този проблем ? - Точката и запетаята не се присвояват на изходния стринк с всеки текущ елемет, а с всеки следващ, ако го има. Пример:

                outText.AppendFormat("Name={0}", this.Name);
 
                if (this.Teacher != null)
                {
                    outText.AppendFormat("; Teacher={0}", this.Teacher.Name);
                }
- Трябва ли да пишем пак наново ToString за класовете наследници LocalCourse и Offsite course ? - разбира се, че не. Ако зададените полета в тях имат стойност, извикваме базовия ToString() и към него прибавяме тази стойност.
 

2ра задача - Academy RPG

Решение: GitHub

По-интересни моменти:

Като цяло задачата беше доста приятна и единственото предизвикателство тук бе да разбереш как работи скелета, който ни е предоставен.

Ето няколко момента, на който трябва да се обърне внимание:

- НЕ трябва да се редактира класа Engine, а трябва да се направи нов клас в който да се добавят новите команди за създаване и той да наследява стария клас Engine.

- Как може да направим ниджата си безсмъртна ? - Лесно, просто му задайте максимални защитни точки :) Пример:

public int DefensePoints
        {
            get { return int.MaxValue; }
        }
- Как може да проверим дали целата атакувана от нинджата имам най-много HitPoints ? - 2 думи - lambda израз :) Пример:
availableTargets[i].HitPoints == availableTargets.Max(x => x.HitPoints)
 
 
Та това е, ще се радвам на всякакви критики и въпроси по решенията си :)
 

от Teodor92 (13062 точки)


0
Аз лично направих един абстрактен клас, който да държи Teacher и Course , в него имаше пропърти за Name и ToString(), защото те се повтаряха:) Това обаче го реших след като бях написала всичко и го бях тествала, и прехвърлянето на ToString() стана едно малко приключение. Започна да мята едни ексепшъни, отне ми около час да го правя, но се бях заяла да стане така и така не ми остана много време за втората задаяа. И добре, че този път пишеше къде да се пипа на втората задача, очаквах там подводни камъни:P

от Gerya (1079 точки)

0
Имаш един клас, който е баща на Teacher и Course ? Това не нарушава ли принципа за наследяване ? В смисъл какво е общото м/у Teacher и Course ? :)

от Teodor92 (13062 точки)



2

Общо взето тези задачи нямат много начини за решаване...

1. SoftwareAcademy - source

В първа задача се искаше да се направи съвсем скромна клас йерархия, да се добавят споменатите в условието полета и да се override'не ToString() метода. Със сигурност много ми помогна ООП проекта, иначе едва ли щях да чета за design pattern'ите, като точно в тази задача трябваше да имплементираме част от design pattern'a. 

2. AcademyRPG - source

И двете задачи бяха много подобни на задачите от подготовката. В тази задача целта беше да се създадат няколко вида обекта (герои, ресурси и др.) + да се наследи Engine класа и да се override'не virtual метода за прихващане на команди.


от SVGN_H (3048 точки)


0
Един съвет към първа задача. Имаш два листа topics и courses съответно за Course и Teacher, но не е хубаво да имаш такъв get пропърти - елементите могат да бъдат променяни отвън. Вариантите са да върнеш нов лист, да върнеш същия лист като след името на листа използваш метода AsReadOnly(). Например : return this.topics.AsReadOnly(); В конкретния случай дори не е нужно да има пропърти. Като ти разгледах кода ти и аз си намерих една глупава грешка, а днес си тръгнах по-рано като си мислех, че всичко е точно :)

от nikostov (202 точки)

0
Точно тези 2 списъка 5 пъти ги промених.. какво ли не пробвах и накрая реших да ги оставя така. Само не разбрах как може да се промени, като няма никакъв setter?

от SVGN_H (3048 точки)



0

Тук са моите решения. Може да се каже, че задачите бяха сравнително лесни, но така и не се оправих с един от тестовете на РПГ-то :)

https://github.com/nikolovk/TelerikAcademy/tree/master/OOP/AcademyRPG

Някъде ми се губят 10 точки, търсих го час и половина на изпита, но нищо не открих.

п.п. Това ми е академията, като печатането ми е само в абстрактния клас курс.

https://github.com/nikolovk/TelerikAcademy/tree/master/OOP/SoftwareAcademy


от krasi.nikolov (1412 точки)


0
Може би за това, че в метода GetTargetIndex() за Ninja класа не връщаш -1 при липса на availableTarget.

от SVGN_H (3048 точки)

0
Giant-а само веднъж си променя атаката като gather-не камък. Това си го спазил, но следващите опити да събира камъни не са възможни, защото вече булевата променлива е true.

от nikostov (202 точки)



0
Аз оценявам представянето си като провал. Но задачите бяха определено приятни, жалко че нямаше достатъчно такива предварително за подготовка и тестове. Иначе си признавам, не бах добре продготвен за изпита, оказа се, че съм си заключил и акаунта в БГ кодер с няколко грешни опита (няма опция за изпращане на нова парола на поща или нещо такова), та се наложи да си правя и нова регистрация :) Като цяло мога си признавам, че тайм мениджмънта не се получи, започнах с 2 задача, достигнах до 70 точки, но доста бавно (отне ми прекалено много време и копирането на всички решения в един файл, и това не бях тренирал), после остана известно време и ту малко по първа, ту преглед защо не се получава последанта....и така си мина времето без резултат. Всъщност аз така и не разбрах дали има смисъл да се праща код на задача, която знаем, че няма как да получи точки. Примерно на първата написах класове, наследяване, но след като нямах ToString(), нямаше как да имам правилен изход и изобщо не пратих никакво решение....което може би е грешка. Поздравления за хората, които изкараха максимален резултат. P.S. не знам защо, с IE10 не ми дава нов ред с ENTER, някой има ли идея защо ?



0
Има смисъл, ще се оценява и класовата структура. От там може да хванеш точки :)

от Teodor92 (13062 точки)

0
можеше :) а това ясно ли беше предварително, защото останах с впечатление, че няма официална позиция....но може и да греша




4
Поздравления на тези които са доволни от резултата си, а тези които не са, да не се обезкуражават. Все още имате шансове ако сте си написали класовете правилно, дори и да нямате точки в кодера.
Аз съм доволен от себе си. 160 точки са малко повече от колкото се надявах да изкарам, въпреки че ако бях работил малко по-бързо можеше и повече да имам. Не ми остана време да се боря с нинджата.
Имайки предвид равномерно разпределените резултати, мисля, че изпитите бяха перфектно балансирани. Средна сложност, като беше наблегнато на ООП, а не на алгоритми.
Поздрави!

от vphilipov (3591 точки)


0

Здравейте, искам да попитам нещичко относно първата задачка

При изпълнението в bgcoder ми дава 6 верни, 3 грешни и един " explosion".
В репорта пишеше, че става дума за system.reflection.targetinvocationexception, което в моят " богат"  опит в програмирането не ми говори нищо...  Моля ако е възможно някой да ми обясни какво означава това, какво го причинява, и как да го оправя. :)


от xellscream (469 точки)


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

от Teodor92 (13062 точки)

0
Кода, който е поставил, е скелетона доколкото виждам. Покажи твоя код, за да ти помогнем.

от nikostov (202 точки)