2ра задача от изпита по ООП


1

Някоя нинджа по физика може ли да сподели формулата за намиране време на обиколка от 2ра задача?

Стигнах до последните 2 реда на първия нулев тест, които показват най-бързите времена, но така и не намерих формулата, с която да изкарам верни резултати. Най-добрият ми опит беше 5 минути преди края, нагласих някаква формула да смята приблизително вярно до секунди, но имаше разминавания в милисекундите 

Това е най-добрият ми опит:

int topSpeedInMeters = MetricUnitsConverter.GetMetersPerSecondFrom(this.TopSpeed);

double timeToReachTopSpeed = (double)(topSpeedInMeters - 0) / (double)this.Acceleration;

double distanceToReachTopSpeed = (this.Acceleration * Math.Pow(timeToReachTopSpeed , 2)) / 2;

double finalTime = timeToReachTopSpeed + (trackLengthInMeters - distanceToReachTopSpeed) / topSpeedInMeters;




Отговори



2

Времето се намира като първо намериш за колко време колата достига максималната си скорост, провериш колко разстояние е изминала за това време и от там нататък спрямо случая, ако й остава още разстояние директно си ползваш S = V.t (за оставащото разстояние), където V ще ти бъде максималната достигната скорост (TopSpeed). Не се взимаше предвид тежестта на цялото превозно средство, за да не навлизаме прекалено много в света на физиката, но се ползваше ускорението, за да не е прекалено лесна имплементацията. 

Като цяло задачата ви беше дадена готова, трябваше да прегледате хубаво готовите класове, за 30 минути макс да репликирате моделите които трябваше да се добавят и да напишете 4-5 функционалности. Хората масово отделиха по 3-4 часа за първа задача, затова после не им стигна времето за 2-ра.


от INKolev (4141 точки)


0

Това го пробвах вчера накрая ( 10-на минути преди края ), но явно грешно :( 

едит. всъщност грешката ми е доста глупава, може да се посмеете малко ако ги гледате ръчно


от todorovh (2055 точки)

1
Значи мисля че формулата ми е вярна, само че ми дава 400 милисекунди разлика, тъй като не ползвам TypeCast класа. Моя грешка, че го игнорирах, но наистина имаше много за писане по другите неща, а submit-a ми на 1ва за 100 беше в 12 и 15, т.е. не е като да съм губил време с нея

от georgivelikov (1844 точки)


1

Без да гледам задачата мисля че проблема е че смяташ TopSpeed като int. 100 км/ч в метри за секунда ще е някакво дробно число, което няма как да се запише в int без загуба на точност.

Изобщо ... int стойности се ползват само за броячи на нещо. В реалния живот всичко е дробно...
Примерно можеш да ползваш int за да кажеш, че си произвел 50 000 кофички кисело мляко, защото те ще са или 50 000, или 50 001, или 49 999. Но във всяка кофичка кисело мляко имаш ОКОЛО 500 милилитра мляко. Може да са 498.742, или 507.386. Ако искаш да знаеш колко мляко е излезнало от мандрата днес, ще трябва да смяташ количеството с double, иначе вечерта кат правиш калкулацията ще имаш голямо разминаване :)


от JulianG (5316 точки)


1

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

В условието TopSpeed ти е даден като int в interface-a, няма как да го подам като double директно, трябва да се мине през някакво преобразуване. Същ така авторският MetricUnitsConverter.GetMetersPerSecondFrom() също приема и връща само int.

 Както и да е, ще се чака авторското


от georgivelikov (1844 точки)

1

Това в конвертера е плод на болен мозък (или умишлено направена простотия) :)

    public static class MetricUnitsConverter
    {
        private const decimal MetersInKilometer = 1000m;
        private const int MinutesInHour = 60;
        private const int SecondsInMinute = 60;

        public static int GetMetersPerSecondFrom(int kilometersPerHour)
        {
            var expression = ((kilometersPerHour * MetersInKilometer) / (MinutesInHour * SecondsInMinute));
            var metersPerSecond = Convert.ToInt32(Math.Ceiling(expression));

            return metersPerSecond;
        }
    }

Какво би наложило да дефинираш константа от тип decimal която да има стойност 1000? После да ползваш var (за да замаскираш кретенията), да виждаш очевадно че имаш деление и въпреки това да закръглиш (и то нагоре), че и после да кастнеш към int?

Ако някой ми даде такъв код, взимам монитора и му го нахлузвам през главата кат вратовръзка... :)


от JulianG (5316 точки)



0

трябва да взимаш впредвид и теглото..... ама как ?????
ш видим дали автора му е силна физиката :Д

ако не се взима впредвид теглото - това си е гавра - на ви копи пействайте (немалко пъти) безполезна стойност
(предполагам не се взима, щото драйвърите бяха безтегловни)

Сетих се - пускаш стопуоч - после цикъл през 1 милисекунда тред.слийп с алфизичната формула :) и после връщаш стойността на стопуоча - и кодера гърми за време... ама поне си ги гледаш наживо състезанията :)

както казва един общ познат: "Cqlata im rabota takawa"©  :D


от kiko81 (1655 точки)


2

То в този ред на мисли не видях и цената да се ползва някъде. Според мен е за упражнение да пишем през абстрактни класове. Проблема ми на мен с многото параметри беше, че в начало тръгнах прилежно да пиша в константи, но след 5ия  клас като видях че ми остават още 20 и отсвирих константите и директно писах в конструкторите.


от georgivelikov (1844 точки)

1
аха - упражнение за сръчност .... и каляване на нерви

от kiko81 (1655 точки)



1

Интересно ми е колко получавате като резултат на обиколка? Някой да получава 33,75788 вместо 33,338 за първото време на първия нулев тест?

Edit: 541 скорост и 117 ускорение за първата кола


от georgivelikov (1844 точки)


0

ами ко да ти кажа мен - тая кола няма двигател :) просто в нулевия тест не се прави нито един двигател
поредното безумие - да живее физиката

а иначе не знам как смятат макс скоростта и ускорението
аз ги смятам като към базовата на колата добавя всички от TunningParts
за първата кола получавам скорост 566
ускорение 94


от kiko81 (1655 точки)

0

Добавяш ли бонусите от тунинг партовете към acceleration и top speed ?

Може би от там идва проблема.

В абстрактния MotorVehicle цената се вади като базова цена + цената на всеки tuning part.

Би трябвало acceleration и top speed да се вадят по същия начин.


от todorovh (2055 точки)



0
Ще използвам същата тема да попитам, на някой при всяка команда за нов driver му слага id=0, а съм използвал в конструктора this.id=DataGenerator.GenerateId(); като след това го извиква с id=1 и ми хвърля exception

от magadisho (823 точки)


1

Правилно си сложил Id, по-скоро изобщо не ти създава driver-ите правилно. Ако искаш постни текста на грешката. Трябва класовете да се казват точно както са ти в условието, и да наследяват абстрактни класове, и да нямат параметри в конструкторите, само константи в базовия конструктор.

public Driver(string name, GenderType gender) - това е конструктора на базовия клас
        {
            this.id = DataGenerator.GenerateId();
            this.name = name;
            this.gender = gender;
            this.vehicles = new List<IMotorVehicle>();
        }

public VinBenzin()
            : base("Vin Benzin", GenderType.Male)
        {
        }

Другия вариант е да не си разписал assign командата


от georgivelikov (1844 точки)

1
Ами всъщност не бях забелязал, че на RaceTrack не и генерира Id

от magadisho (823 точки)