Loading...
vdimitrov13 avatar vdimitrov13 1 Точки

Междувалутен конвертор

Това е задача номер 14* от Simple Calculations. При качването на следният код в judge: http://pastebin.com/e0bJxP09, ми дава 100/100 точки, но когато го пусна през конзолата не се извършва никакво изчисление и output-а е същия като input-а. Каква може да е причината?  

Тагове:
0
Programming Basics
r3v3nan7 avatar r3v3nan7 365 Точки

Най-добре е ако можеш да пуснеш дебъгера и да видиш какво се случва. Слагаш breakpoint в началото на програта 

после F5 или Fn+F5 ако имаш функционални бутони и така влизаш в режим debug.

От тук насетне постъпково с F10 или Fn+F10(ако имаш функц.бутони) и така стъпка по стъпка

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

Не вреди да се пробваш :)  А и освен всичко друго умението да се работи с debuggera е ценно и не е лошо да се развива.

Опитай тези неща, които ти написах и може да откриеш къде какво се случва и защот така се получава :) Успех

2
pebodi avatar pebodi 29 Точки

А направил ли си проекта, в който е тази програма да е First Startup Project? Аз ти тествам програмата, различни данни дава, не съм я проверявал дали вярно смята :)

0
14/02/2016 16:08:29
vdimitrov13 avatar vdimitrov13 1 Точки

Копирах кода във нов проект, тъй като отказваше да почне debuggera (grayed out) и voila - програмата си изчисляваше всичко точно. Съответно и debuggera вече работеше, но нищо не намери естествено. Благодаря за помощта, възможно е да съм барнал някаква настройка или нещо което не е трябвало, защото кода все пак е верен. We will never know :D

1
14/02/2016 16:11:22
sophis avatar sophis 4 Точки

Здравейте,

След като цял ден си блъскам главата с тази задача, най-после реших да се обърна към форума и попаднах тук. Отворих кода на vdimitrov13 и ми направи впечатление, че никъде не е декларирана стойност за BGN. Копирах кода и се уверих, че наистина работи безупречно, дори когато напиша BGN като валута. След това, обаче останових, че дори когато написха ghgjhsf конзолата ми приема стойността като 1, или все едно съм вкарала пак BGN. Та моят въпрос е, защо възприема всяка друга стойност от тези в condition-а като 1? Защо не като 0? Или защо не връща грешка, например "invalid input". Прощавайте за въпроса, ако е прекалено досаден за вас, но ми се струва, че е важно да разбера дали това си е така по подразбиране.

Благодаря!

1
Nikola_Andreev avatar Nikola_Andreev 671 Точки

Не съм сигурен, че разбрах въпроса ти но ще се опитам да ти отговоря. Ако на първия ред въведеш примерно 2, на следващите 2 реда дори да въведеш некоректни данни пак ще ти върне 2 като отговор, понеже променливата num си остава непроменена. Ще ти върне грешка ако на 1-ви ред въведеш примерно текст (string), но за следващите 2 реда променливата е от тип  var, тоест не е казано точно какъв тип данни се изискват и конзолата ти приема всичко.  

1
sophis avatar sophis 4 Точки

Num като като променлива защо се приема като 1? Това ми е въпросът. Въвеждам в конзолата:

1

EUR

BGN

1.96

1

EUR

djahdkah

1.96

т.е. num винаги е 1 (както е в случая с BGN), но моят въпрос е защо е така? Ако не се въведе стойност за променлива, тя винаги ли се разбира като единица? 

1
TeodorDimitrov89 avatar TeodorDimitrov89 264 Точки

Най-добре си пусни дебъгера с F10 и виж какво се случва.Като напишеш 20 и дсадас и дасдас става следното:Прочита ги от конзолата и вижда че няма съвпадение с if-else и просто отпечатва последния ред който е даден и затова каквото и да въведеш след цифрата ако не е това което се иска си изкарва числото.

1
Nikola_Andreev avatar Nikola_Andreev 671 Точки

Ако въведеш 0 и безмислен текст, ще ти върне 0 . Ако без да въвеждаш число, натиснеш enter ще ти върне грешка. Ако въведеш 20 EUR USD, ще си работи коректно.

1
b.serafimov avatar b.serafimov -5 Точки

Кода работи, защото приема (неправилно), че единствения възможен останал случай непокрит от IF-овете е BGN. А не показва грешка за невалидна валута, понеже не е включена такава функционалност.

За да покрива кода напълно заданието трябва да прави проверка за валидност на вида на валутата, включително и за BGN. Опционално да изкарва съобщение ако се изберат две еднакви валути и не се случва никаква конверсия.
Не съм сигурен Judge какви точно проверки прави и доколко изкарването на някакъв допълнителен и поясняващ текст няма да счупи решението.

Като допълнителен начин да се направи решението може да погледнеш как се ползва switch

ей тук и тук

Най-просто казано замества else if конструкцията с много красиви редове (cases).

ПС:

Да не забравя, понеже е важно. Типа на данните трябва да е decimal, вместо double. Това е специален тип данни, които се използват когато боравим с пари. Възможно е да почне да се оплаква VS, че курса на валутата е double, пък променливата е decimal. За да приема курса като същия тип, трябва да напишеш главно M, без интервал накрая напр.

num *= 2.53405M;

тук е разписано подробно относно как се ползва типа

 

 

-1
02/04/2016 02:03:59
i.minchev.qa avatar i.minchev.qa 34 Точки

Според мен:

1. num е основата (BGN) и всички други валутни комбинации се изграждат, като функция от нея т.е. num * "някаква стойност" или num / "някаква стойност".

2. Ако човек не въведе някой от стринговете описани в if условията, ами въведе друг произволен стринг напр. first = ldksjfdlskfj и second = dlfjalsfjd резултатът е: каквото влезло такова излезло или output = input напр 10 = 10.

   Защо?: След като липсват грешки в синтаксиса програмата се изпълнява еле и несмислена от функционална гледна точка, т.е. никой не е описал че въвеждането на недеклариран string е грешка. Програмта просто си проверява дали ще срещне познат стринг "usd", "gbp", "eur", ако не срещне не се прилага никаква математическа обработка на input и излиза без промяна на output.

3. Как да се коригира

    3.1. Деклариране на "bgn" стринга.

    3.2 Например формулиране на try, except блок където може да се опише програмата да               вади съобщения от вида "Invalid input.-  Must be: "usd", "gbp", "eur", "bgn".  Real is: dlfsjfls.

4. Инак аз съм го решил:

      4.1  така(с Dictionary): http://pastebin.com/UBFjShVJ

      4.2 и така(с If-else if): http://pastebin.com/3BCTN7yp

Дано да съм бил полезен.

Поздрави.

 

0
sophis avatar sophis 4 Точки

Много благодаря за всички отговори. Ще пробвам различните методи. А според мен judje проверява резултата, а не прави проверка на самия код. Би било лудост някой да седне и да опише всички възможни варианти на код за всяка задача... по-скоро прави проверка в конзолата. Благодаря отново! Весел уикенд!

2
ralitsa_d avatar ralitsa_d 171 Точки

Ако за пром. first дадеш стойност, различна от "usd", "gbp" или "eur", първият if-else няма да се изпълни и num ще си остане num.

По същия начин за променливата second - ако стойността и е различна от изброените, num запазва първоначалната си стойност.

Ако и двете променливи first и second се различават от изброените, накрая ще отпечата num без промяна - все едно да конвертираш BGN -> BGN.

Във всички тези случаи няма умножение на num по 1, просто num  не участва в допълнителни операции и стойността му не се променя.

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

1
i.minchev.qa avatar i.minchev.qa 34 Точки

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

Причина: Може да има объркване ако : 

                      - имаме дълъг код, с много подобни ситуации

                     - трябва да се прави някакъв software support

                       -актуализиращият не е създателят на програмата

                     Птенциална ситуация: Чесане по глава, хвалебствия по роднинска линия какво забога прави еди кое си.

Това е мое виждане от гледната точка на прохождащ, но може напредналите да се ориентират по-бързо и горенаписаното да не е валидно. 

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