[Homework] Currency Converter help
Ако някой може да подаде ръка на начинаещ онлайн колега , би било много хубаво . Имам нужда от помощ в задачата за конвертиране на валути . Кои команди да ползвам , за направата на самият код ? Може би var или Dictionary<string, double> factors = new Dictionary<string, double>(); factors.Add("GBP", 0); factors.Add("USD", 0); ? Или други ? Моля помогнете .
Поздрави !
При мен и при двата случая (if else, switch case) в Judge системата ми дава Run-Time error :(
В VS Express всичко е ОК! Кода е следния:
Грешката е следната:
Явно проблема се получава при парсването !?
Забих тук и не мога да продължа докато не разбера защо се получава така.
Интересно, просто преместих реда var value = double.Parse(Console.ReadLine()); най-отгоре:
И системата прие решението ...
Гледам ти кода , но и аз все още не разбирам защо гърми ? .. Изписва , че има грешка с input, или по-скоро , че е в грешен формат, но
не виждам грешка. Продължавам да опитвам и ако открия проблемът ще ти пиша, но засега и аз съм в задънена улица.
Предполагам, че това, което сте разбрали до момента е, че кодът се изпълнява от горе надолу. Т.е. в 99% от случаите има значение кой ред къде е, не е просто "преместих един ред по-горе и то взе, че тръгна".
Нека погледнм примерния вход в задачата:
20
USD
BGN
Нека видим и кода, който си предоставил:
Когато кажеш Console.ReadLine() кой от тези три реда от входа ще прочете? Няма как магически програмата да се усети, че трябва да изчака два реда и да вземе 2рия. Ще вземе, разбира се, първия ред. И променливата input ще стане стринга "20".
След това пак казваш Console.ReadLine(). Първият ред е прочетен и чака за втори. Вторият е USD и променливата output ще стане стринга "USD".
След това пак казваш прочети ред (Console.ReadLine()). Първите два са прочетени и ще се опита да прочете третия, който е BGN. Ще го прочете и ще се опита стринга "BGN" да го конвертира към double (double.Parse). Няма да успее, защото BGN не е валидно число и ще гръмне програмата.
Да.. RoYal е абсолютно прав. И аз тествах и се получи. Просто var value трябва да е най-отгоре. Объркал си реда на подаване на данните и затова е гръмнало...
А пък аз къде се забих да търся грешката направо не е истина :D ... почнах да търся за грешки в променливите, за грешни парсвания и дали switch е правилен
откъм синтаксис, а грешката направо е щяла да ми извади очите... ужас..
Благодаря много за съдействието, опитах и с онлайн компилатори - в повечето от тях работи. В условието на задачата виждам, че сумата за конвертиране е първа на вход, но все пак си мисля, че проблема е в парсването от string към double.
@dakata,
Прочете ли ми поста обстойно?
Да, косвено проблемът е, че се опитваш да парснеш стринг към double. Стрингът "BGN".
Това обаче се случва, защото правиш грешни операции върху входа. На първа линия винаги получаваш value. На втора линия получаваш входната валута и на трета линия изходната. Това, че си кръстил променливите по този начин и че си написал коментари НЯМА да повлияе на потребителя (и в случая на автоматизираната система) да започне да въвежда данните в различен ред.
Реда на операциите има значение в 99% от кода, който ще пишеш през живота си.
Ако имам променлива X, която е 10. Изпринтирам я на конзолата. После я събера с 12. На конзолата ще излезе ДЕСЕТ, а не ДВАДЕСЕТ И ДВЕ.
Ако обаче разменя местата на операциите и сложа събирането преди принирането, то тогава щ изпринтирам ДВАДЕСЕТ И ДВЕ.
Т.е. размяната на редовете е от огромно значение:
int x = 10;
Console.WriteLine(x);
x = x + 12;
и
int x = 10;
x = x + 12;
Console.WriteLine(x);
Ще изпринтират респективно 10 и 22.
@dakata,
Judge-а мисля, че не е като повечето компилатори, той е по-специфичен и е проектиран точно специфични задачи да проверя. Всъщност той не е
компилатор , а просто проверява. И както спомена RoYal тук е много важна последователността. Примерно Judge-a очаква в първия ред
да се вземе стойността за конвентиране, във вторият ред да се вземе входната валута и третият ред да е за изходната валута. Ти на първият ред
не му беше задал стойността 20 , а изходната или входящата валута, тоест ти точно на обратно. Първо си му подал валутите и после стойността и за това
е гръмнал. Иначе няма проблем с парсванията според мен. Като огледох всичко ми се видя добре.
Ама то и онлайн и офлайн и каквито и компилатори да ползвате има значение. И във вашето VS като пуснете програмата и не ги напишете в очаквания от вас ред, ще гръмне. Пробвай във VS да въведеш първо "USD" после "10" и после "BGN"... Няма сила на тоя свят, която да разбере кой ред към коя променлива магически да се напасне. Затова се четат поредно. Първия рийдлайн отговаря на първия ред, втория рийдлайн на втория ред и т.н.
Не може да очакваш произволен вход. Представи си, че го даваш на потребители това приложение. Те трябва да въвеждат в определен формат входа. Т.е. Няма как Пешо да въведе "USD", "20", "BGN", а Гошо да въведе "20", "BGN", "USD" и това да даде еднакви резултати.
Така е и в приложенията, които сте ползвали. Регистрирате се в някой сайт и след като си въведете данните, след това си ходите в имейла и си потвърждавате имейла нали? Няма как първо да се потвърдиш имейла, пък после да се регистрираш в сайта. Обикновено реда от операции има значение.
Благодаря Ви много за помощта, прочетох обстойно коментарите Ви и всъщност се видя до какво може да доведе едно недоглеждане в програмирането ... до два часа лутане при мен :)
Повярвай ми daka и аз като теб се залутах и тръгна да препускам из кода.. може би съм свикнал с judge-а и дори не подозирах за подобна грешка,
но е хубаво че се получи така, защото дискусията е много полезна за всички - за теб, за мен и всеки , който прочете мненията. Така хората ще разберат,
че наистина редът на операциите е много важен и дори дребно разместване като това може да доведе до ядове и проблеми. Благодаря и на RoYal
за много добрите обяснения и пояснения. Благодаря ти, че отдели време, за да напишеш тези толкова полезни неща. Вярвам , че са полезни не само за мен.
В условието на задачата пише, че първо се въвежда стойност (число), следва валута източник (string) и крайна валута (string).
При твоето решение четеш стойността (числото) най-накрая, а същевременно от клавиатурата въвеждаш 20, USD, GBR. Т.е. караш double.Parse да преобразува текста "GBR" в число, което не е възможно. Съответно компилаторът ти "казва", че това няма как да стане със съобщението "System.FormatException: Input string was not in a correct format" :)
Поредността на въвеждане и приемане на входните параметри е важна. Judge системата разчита точно на това.
Да, RoYaL е постнал обстоен коментар по темата още в 12:52:27 но не знам защо съм го пропуснал, работя с Judge системата от 2-3 дни и вече започвам да схващам. Коментарите тук са много важни, трябва да се пита ... след като user-a се е поблъскал достатъчно разбира се.
Джаджата чака първо VALUE - сумата за конвертиране. При първия ти вариант, първо въвеждаш входна и изходна валута, които са стринг EUR, BGN ..., после сума за конвертиране. Нормално е джаджата да гърми, умножава или дели по валутния курс вместо число - стринг, т.е EUR*1.95, ВМЕСТО 100 примерно по 1.95.
Именно ... string*double = Грешка по време на изпълнение :)
Може да е заради последователноста на кода , понеже първо трябва да въведеш цифра а при твоя случай искаш парво да въведеш стрингери. Затова като си го преместил горе се е получило. Поне така мисля
Според мен проблема идва от реда на въвеждане на променливите.
По условие са в следния ред:
1.сума - число
2.входна валута - текст
3.изходна валута - текст
а програмата ги чете:
1.входна валута - текст
2.изходна валута - текст
3.сума - число
И от тук се получава раминаване на типовете променливи.
Ако всички променливи бяха един тип, нямаше да дава грешка в променливите, но пак нямаше да мине тестовете.
Тестването в Judge системата е автоматично, т.е. вписва предварително зададени данни и очаква конкретен отговор и дори една точка в повече или по-малко е грешка.
Здравей,
При такива задачи понякога е хубаво да кажеш и какъв вход подаваш. Пример за това защо програмата ти гърми е, че има възможност да не даваш правилен вход т.е. ти да подаваш числото- 5,26, но в зависимост от културата на програмата то може да изглежда ето така- 5.26, това е така защото е наложен американския стандарт, който казва, че десетичния делител е точка, а не запетая. Виж дали това е проблема, ако не е- сподели- ще огледам кода по-обстойно! :)
Поздрави!
Delete