Loading...
kalintri avatar kalintri 2 Точки

Programming Basics - Simple Operations and Calculations Lab - Birthday 80/100 (Python)

Здравейте, 

Опитвам се да направя лаба от заглавието, но ми дава грешки в задачи 4 и 6 без допълнителни пояснения. Изглежда доста хора са се сблъсквали с този проблем, но за C# и във всичките постове по въпроса там изглежда проблема е със закръглянето до третия знак. 
Аз обаче правя зкръгляне и ми излизат всички примерни резултати, но не мога да разбера какво не му харесва на judje. 
Ако някой може да даде акъл ще съм много благодарен.

Ето го и кода, който изпозлвам:

length = int(input())
width = int(input())
height = int(input())
percent = float(input())

volume_cm_cube = length * width * height

volume_liters = volume_cm_cube * 0.001

percent_adjusted = percent*0.01

volume_adjusted = volume_liters * (1 - percent_adjusted)


volume_rounded = float("{0:.3f}".format(volume_adjusted))

print(volume_rounded)

 

Тагове:
0
Programming Basics
svetoslav_0 avatar svetoslav_0 1009 Точки
Best Answer

Проблемът тук е малко деликатен.

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

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

0.1236 -> 0.124

А това е форматиране:

0.1236 -> 0.123

При форматирането имаме "отрязване" от самото число, докато при закръглянето имаме извършване на математическа операция, както се вижда в примерите.

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

volume_adjusted = volume_liters * (1 - percent_adjusted)

print('%.3f' % volume_adjusted)
1
kalintri avatar kalintri 2 Точки

Благодаря!

Следния код, предложен от теб проработи в judge:

length = int(input())
width = int(input())
height = int(input())
percent = float(input())

volume_cm_cube = length * width * height

volume_liters = volume_cm_cube * 0.001

percent_adjusted = percent * 0.01

volume_adjusted = volume_liters * (1 - percent_adjusted)

print('%.3f' % volume_adjusted)


Входа и Изхода от него ако принтирам след всяка операция е:
Вход:
105
77
89
18.5

Изход:
719565
719.565
0.185
586.445475
586.445

При моя първоначален код по-горе изхода при същия вход изглежда по абсолютно същия начин:
719565
719.565
0.185
586.445475
586.445

Явно обаче judge си проверява, коя операция е използвана, закръгляне или форматиране. 
Благодаря отново!

0
04/01/2019 20:04:25
svetoslav_0 avatar svetoslav_0 1009 Точки

Мисля, че причината не е в Judge. До колкото знам има особености при закръглянето в Python. Тук и тук има полезна информация за това.

0
kalintri avatar kalintri 2 Точки

Реших да се заровя малко и да разбера защо първоначалното закръгляне, което използвах с "{0:.3f}".format() даваше грешка, а това с '%.3f' % не. Според това, което четох % е "стария" начин за форматиране, докато str.format() e новия, предполагам под стар и нов се има предвид Python 2 и 3. Независимо от това обаче и двете би трябвало да са абсолютно еднакви и това още повече ме озадачи и тръгнах да търся, кое може да дава разлика. 

Тогава осъзнах, че това което ти предложи  е да се форматира "volume_adjusted" директно в принт функцията, докато аз имах една допълнителна стъпка, която всъщност е излишна и изглежда направо грешна:

volume_rounded = float("{0:.3f}".format(volume_adjusted))

Това е float() в този ред. "volume_adjusted" вече е float и явно повторния опит за конвертирането и дава някаква грешка. Ако променя кода на:

volume_rounded = "{0:.3f}".format(volume_adjusted)

и след това разпечатам, изхода изглежда същия, но минава със 100/100 и в judge.


Като заключение грешката е някъде при опита за повторно конвертиране на променлива, която вече е float във float и като се премахне това всеки един от следните три варианта за форматиране при изпечатването работи коректно и дава 100/100 в judge:

print('%.3f' % volume_adjusted)

print("{0:.3f}".format(volume_adjusted))

print(f"{volume_adjusted:.3f}")


 

1
05/01/2019 20:09:43
svetoslav_0 avatar svetoslav_0 1009 Точки

Е, знаех си, че имало и по-кадърен начин :D

Много добре, 

keep coding :)

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