Loading...

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

onefen avatar onefen 27 Точки

[Homework] Primitive Data Types and Variables

Здравейте искам да питам за задачата със Joro the Football Player. Въпросът ми е следният значи например за първия пример даден в домашното с високосна година t 1 празник и 2 уикенда вкъщи трябва да се получи 38 и те се получават така:

double gamesCount = (2d / 3d)*normalWeekends + weekendsHomeTown + (1d/2d)*numberHolidays;

като след това се добави още 3, защото годината е високосна. Но преди да нпиша тези d-ta се получаваше 5 и не знам защо. Нали реалните числа по дефиниция са double и  променливата ми е double значи би трябвало да работи правилно и без тях, но не работеше правилно. Някой знае ли защо.

Тагове:
1
Programming Basics
Filkolev avatar Filkolev 4482 Точки

В лекцията по оператори и изрази се обяснява причината за това поведение.

Всеки израз си има тип и това е типа данни, който се получава като резултат от пресмятането на израза. Например изразът 2 + 3 е от тип int, защото връща като резултат цяло число (5).

Какъв тип данни връща даден израз зависи от операндите, които участват в него. 2 и 3 са цели числа, като извършиш операция между цели числа получаваш като резултат цяло число. Аналогично и при делението: 2 / 3 е израз, който връща цяло число, което е 0, извършва се целочислено деление, което се обяснява по-подробно на лекция. Друг коварен момент е, когато умножиш две големи числа от тип int, например 999 999 * 999 999 също ще върне тип int, понеже двата операнда са тип int. Ще се получи обаче препълване на типа и резултатът ще е отрицателно число.

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

За да решиш проблема, при пресмятането на израза трябва поне единият операнд да е тип double, това автоматично превръща целия израз в тип double и сметките ще са коректни.  Ето това ще е коректно:

2.0 / 3 * normalWeekends + weekendsHomeTown + 1.0 / 2 * numberHolidays

Макар че е по-добре да разделиш този ред на 3 реда, за да смяташ поотделно нещата и ако някъде нещо се омаже да може по-лесно да го намериш и отстраниш.

2
DHristoskov avatar DHristoskov 211 Точки

Аз съм го направил така ,където totalPlay е от тип int ,и задачата дава 100/100 в Judge системата.Незнам как си задал променливата normalWeekend в твоя слочай.

              if (year == 't')
                {
                    totalPlay = ((52 - homeTown) * 2 / 3 + (holiDays / 2)) + homeTown;
                    totalPlay = (totalPlay + 3);
                    Console.WriteLine(totalPlay);
                }else if(year=='f')
                {
                    totalPlay = ((52 - homeTown) * 2 / 3 + (holiDays / 2)) + homeTown;
                    Console.WriteLine(totalPlay);

0
Filkolev avatar Filkolev 4482 Точки

DHristoskov, забележи, че имаш повторение на код, имаш два реда, които се изпълняват при всички положения и само един ред, който е различен. По-правилното в случая е да извадиш двата повтарящи се реда извън условната конструкция, а в нея да остане само различният ред, ето така:

totalPlay = ((52 - homeTown) * 2 / 3 + (holiDays / 2)) + homeTown;

if (year == 't')
{
      totalPlay = (totalPlay + 3);
}

Console.WriteLine(totalPlay);

Относно коректността на сметките, за да ти работи правилно за 100 точки, явно си декларирал homeTown и holiDays променливите като double; другият вариант е разминаванията между реалните резултати и твоите да са минимални и тестовете да не са хванали грешката, но това е по-малко вероятно.

                   

2
02/03/2015 21:07:57
DHristoskov avatar DHristoskov 211 Точки

Благодаря ,поправката е направена кода, който се повтаря го изведох извън if clause.Останалите променливи са от тип double за това и в по-горния пост попитах onefen от какъв тип е неговата променлива normalWeekend.

0
02/03/2015 21:11:40
onefen avatar onefen 27 Точки

normalWeekends е от тип integer;

int weekendsInYear = 52;
int normalWeekends = weekendsInYear - weekendsHomeTown;

0
KatyaMarincheva avatar KatyaMarincheva 572 Точки

Ето и от мен едно решение на задачата Nine-Digit Magic Numbers

Първо си направих изцяло мое решение по схемата:

- намирам всички възможни 3-цифрени комбинации от цифрите 1,2,3,4,5,6,7 и ги запазвам в един IEnumerable<string> combinations

- с три вложени цикъла обикалящи IEnumerable<string> combinations намирам всеки 3 3-цифрени комбинации, отговарящи едновременно на условието за sum и на условието за diff,

- събирам всяка такава тройка в число 9-цифрено число, което запазвам в List<int> result

- печатам съдържанието на този List<int> result, или ако е празен, печатам "No"

За съжаление моето първо решение работеше вярно но толкова бавно, че надхвърли time limit на абсолютно всеки тест в judje :)

За втория вариант на решението (одобрено и от judge), си помогнах с идея от форума:

- пак създавам IEnumerable<string> combinations

- но, по идеята предложена от колеги във форума, вземам с един цилъл всяко 3-цифрено число number от IEnumerable<string> combinations, и после проверявам дали IEnumerable<string> combinations съдържа number + diff и munber + diff + diff - ако ги съдържа, проверявам сумата от цифрите, ако и тя е вярна - запазвам деветцифрената комбинация в List<int> result

Та, много благодаря на всички споделяли решения във форума :)

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