Loading...
massbless avatar massbless 5 Точки

[Technical Issue] Programming Basics - 2. Simple Calculations

Здравейте!

При работата над задачките предложени в курса се сблъсках със следните проблеми:

 1) Методът Math.Round() не ми дава желания резултат. Например в задача, която иска да се изчисли площта на геометрична фигура, след като придам стойност на променливата "area" и след това въведа:

Math.Round(area, 2);

Console.WriteLine(area);

...резултатът, който се появавя в конзолата съдържа повече от 2 цифри след десетичната запетая. Judge системата приема решението на задачата като вярно, но това не ме успокоява особено :). Къде греша?

  2) Задачата, в която трябва да изведем дата 1000 дни след въведена рождена дата, ми дава разминаване от един (!) ден. Не мога да разбера дали от мен се очаква да използвам AddDays(999) вместо AddDays(1000) (което не ми се струва никак логично!) или проблемът възниква при конвертирането на входния стринг в DateTime променлива (обект?):

            DateTime birth_date = DateTime.ParseExact(input_date, format, CultureInfo.InvariantCulture);

Когато изведох DateTime промеливата в конзолата, забелязах, че освен MM/dd/yyyy в края се добавя и част за часа от деня - дали е възможно от там да идва разминаването? Ще съм много благодарен, ако някой даде малко светлина по въпроса :)

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

Тагове:
0
Programming Basics
RoYaL avatar RoYaL Trainer 6849 Точки

По първия въпрос: в голяма част от случаите методите връщат резултат и трябва да го запазиш някъде, за да се възползваш от функционалността му. Например като четеш от конзолата и кажеш Console.ReadLine() последният връща стойност от тип стринг и ти я запазваш в променлива от същия тип, за да я принтираш после. Същото е и с Round. Той ти е върнал стойност, но ти не си я запазил никъде, съответно извършваш и операции със старата стойност.

2
krokicha avatar krokicha 76 Точки

Да наистина трябва да използваш AddDays(999) вместо AddDays(1000), защото в задачата е казано, че деня на раждането на земята сесмята за ден първи, докато за метода 1-я ден е следващия след раждането. А относно добавянето на часа това е свързано с синтаксиса на типа DateTime. Накрая като отпечатваш резултата указваш какво ще се извежда на конзолата. Тогава можеш да игнорираш часа, който не ти трябва.

0
Thenis avatar Thenis 219 Точки

За да не ти се показва и часа, използвай ToString метода. В скобите трябва да въведеш в какъв формат да ти излезне DateTime-ма. Виж тези примери тук и ще се досетиш :)

1
massbless avatar massbless 5 Точки

@Royal: Помислих си, че нещо подобно може да се случва (от работата ми с други езици), но наистина не ми се искаше да дефинирам нова променлива, защото веднъж вече ми беше върнат слаб резултат от Judge заради бавен рън на друга задачка (бях си позволил да напиша два ReadLine-а в конзолата, които изискваха да се въведат съответните параметри), та не знаех доколко това ще се отрази на скоростта на изпълнение / използваната памет.

@krokicha: Къде точно е казано, че денят се смята за първи ден? Абсолютно съм пропуснал тази част при 6-те прочита на условието! :)

@Thenis: Това го намерих и го направих, така че да печата само онази част от записа, която ми трябва. Просто се чудех дали 'скритата' част не е оказала някакво влияние при връщането на записа обратно в dd-MM-yyyy формат.

Благодаря и на трима ви за бързите и конкретни отговори! Радвам се да видя, че има колеги, желаещи да помогнат на начинаещите :)

0
massbless avatar massbless 5 Точки

Поради някаква причина реших, че бутонът 'Коментирай' ще добави нов post към thread-а, та сега отговорите ми към трима ви се появиха като коментар на написаното от Thenis.

Благодаря отново на всички ви за помощта; сега предполагам е редно да заключа thread-a :)

0
Berchev avatar Berchev 56 Точки

Здравей, 

Ако искаш да използваш пак area и да не правиш нова променлива трябва да промениш малко кода си

 

Math.Round(area, 2);
Console.WriteLine(area);

Трябва да стане

area = Math.Round(area, 2);
Console.WriteLine(area);

или другият вариант е 

Console.WriteLine(Math.Round(area, 2));

 

0
28/03/2016 15:54:38
massbless avatar massbless 5 Точки

Благодаря ти, това върши чудесна работа!

0
butanfire avatar butanfire 32 Точки

Привет!

1) Ако е това което си мисля че ти трябва е - да зададеш колко знака след десетичната запетая да print-не. 
Console.WriteLine("{0:2}",area);  

2) В кръга на шегата може да е заради високосните :)
При всички данни ли ти се измества с 1 ден?
Ти лесно можеш да вземеш входният string и да създадеш нов DateTime ако мислиш че проблема е от parse-a (не би трябвало)

Примерно : DateTime myBirthDate = new DateTime(2016, 3, 28);

myBirthDate = myBirthDate.Add(1000);

Трябва да ти отпeчата 23.12.2018 - доказателство -> http://www.convertunits.com/dates/daysfromnow/1000

 

Воздрави,

Владо

1
Berchev avatar Berchev 56 Точки

Така няма да работи

Console.WriteLine("{0:2}",area); 

 

Трябва да е така

Console.WriteLine("{0:f2}",area);

 

2
massbless avatar massbless 5 Точки

Ами явно проблемът е в броя добавени дни. Програмата ми в настоящия ѝ вид (с AddDays(999)) връща 22.12.2018 при работа с днешната дата (28.04.2016 - да уточня, че току-що мина полунощ и се смени :)), така че с 1000 ще даде резултата от сайта, който ти линкна. За мен това означава, че според съставителите на задачата трябва да се добавят 999 дни, което не ми се струва логично, но няма да навлизам в семантики. Важното е, че кодът ми работи и това ме оставя доволен! Мерси за помощта!

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