Loading...
p.mitov avatar p.mitov 6 Точки

[Homework] C# Basics - Conditional Statements - Problem {13}

Колеги,

 

При решаването на задача 13. Triangle от домашното за Условни конструкции срещнах една неочаквана трудност. При изчислението на страните на триъгълника се получава закръгление (15-16 знак при double), в следствие на което за определени входни данни се получава некоректен резултат.

Тествах и авторското решение, качено в judge - също връща грешен отговор в някои случаи.

Всеки може да го тества с точки A(0,0), B(2,2) и C(6,6) - това е само един от множеството примери, които дават грешка. Тези три точки са на една линия и не могат да образуват триъгълник. Но програмата казва, че могат. С включването на дебъгера лесно се вижда защо се получава така - от закръгление едното от неравенствата на триъгълника става вярно.

Опитах да го избегна чрез работа с decimal, но Math.Sqrt си иска double, което оттам насетне обезсмисля работата с decimal.

И тъй като всичко това се случва преди да го кача в judge, пробвах няколко други варианта като с още малко геометрия в крайна сметка стана (без да се ползват неравенствата на триъгълника). Не гледайте, че имам качени няколко грешни решения в judge - на друго се дължат.

В коментарите към домашното ми е препоръчано (и съвсем основателно) да ползвам неравенствата на триъгълника, както ни съветва самото условие на задачата. Надявам се това да не се е отразило на оценката, макар и да не смятам, че се е отразило. По никакъв начин не искам да дискредитирам оценката на домашното, колегата е дал добри препоръки и забележката не е насочена към неговата работа.

Но, това, което ме притеснява повече, е следното - възможно ли е в judge системата да не се тестват достатъчно изчерпателно решенията и в крайна сметка да може да се признае невярно решение. Под невярно имам предвид даващо грешен резултат, а не грешно като концепция. Защото тук е точно такъв случаят - аз изгубих около час да се боря със заобикаляне на закръгленията, а се оказва, че това изобщо не е било необходимо. Допускам, че judge системата проверява дали каченото решение дава същите отговори, както авторското, и затова дава 100 точки.

Надявам се някой да вземе предвид този проблем и да се избегнат подобни случаи занапред.

 

Поздрави,

Пламен Митов

 

P.S. Ако някой има решение само с неравенствата на триъгълника, което да дава верен отговор с цитираните по-горе входни данни, нека да покаже как го е постигнал.

0
Programming Basics
Anonymous:
Има вече отворена тема за домашно Conditional Statements: https://softuni.bg/forum/questions/details/321
Hristo_Penchev avatar Hristo_Penchev 389 Точки

Здравей, колега,

 

Не мога да открия решението ти, но ми е интересно - как проверяваш дали трите точки образуват триъгълник? С неравенства просто е най-лесно. Иначе сигурно има и други начини, но не ми хрумват в момента. Имам някакъв спомен от някъде, че double оставя паразитни числа и не е напълно точен, съответно от там може да ти дава, че трите точки са на една линия, а да не са всъщност. В момента само гадая, понеже не съм видял кода ти.

Както и да е, ето моето решение с double и неравенства. Просто е и работи. Сложих и някои коментари:

http://pastebin.com/NFT7B4K1

1
Filkolev avatar Filkolev 4482 Точки

Проблемът на колегата идва оттам, че е намерил точки, за които авторското решение и Judge дават грешен отговор (не че не му признават точки, а самият отговор подаден на Judge не е верен).

Трите точки с координати (0, 0), (2, 2) и (6, 6) лежат на една права, но проверката чрез неравенствата на триъгълника връща true и лице на "триъгълника" - 0.0 или нещо такова. Т.е. заради неточностите при работа с floating point числа неравенствата на триъгълника излизат верни по грешка.

Аз лично след като получих 100 точки хич не съм се заглеждал дали има някъде такива несъответствия, макар че със сигурност проверих поне няколко точки, които лежат на една права, но явно не съм уцелил такива, за които се получава грешка (вероятно има и други освен посочената тройка).

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.