Loading...
PetarJekov97 avatar PetarJekov97 7 Точки

[Homework] Currency Converter help

Ако някой може да подаде ръка на начинаещ онлайн колега , би било много хубаво . Имам нужда от помощ в задачата за конвертиране на валути . Кои команди да ползвам , за направата на самият код ? Може би var или  Dictionary<string, double> factors = new Dictionary<string, double>(); factors.Add("GBP", 0); factors.Add("USD", 0); ? Или други ? Моля помогнете . 

Поздрави !

Тагове:
1
Programming Basics 24/01/2016 12:17:15
bardjo avatar bardjo -1 Точки

Незнам за вас, аз я реших с if else кострукция, сякаш така ми беше по лесно . Но все пак тази с Switch casa сащо май е подходяща.....

0
dakata avatar dakata 26 Точки

При мен и при двата случая (if else, switch case) в Judge системата ми дава Run-Time error :(

В VS Express всичко е ОК! Кода е следния: 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Program
{
    class Program
    {
        static void Main()
        {
            var input = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency
            var output = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency
            var value = double.Parse(Console.ReadLine());
            var bgn = 1.0;
            var usd = 1.79549;
            var eur = 1.95583;
            var gbp = 2.53405;
            switch (input)
            {
                case "BGN":
                    break;
                case "USD":
                    value = value * usd;
                    break;
                case "EUR":
                    value = value * eur;
                    break;
                case "GBP":
                    value = value * gbp;
                    break;
                default:
                    break;
            }
            switch (output)
            {
                case "BGN":
                    value = value / bgn;
                    break;
                case "USD":
                    value = value / usd;
                    break;
                case "EUR":
                    value = value / eur;
                    break;
                case "GBP":
                    value = value / gbp;
                    break;
                default:
                    break;
            }
            Console.WriteLine(Math.Round(value, 2) + " " + output);
        }
    }
}

Грешката е следната: 

Unhandled Exception: System.FormatException: Input string was not in a correct format.
   at System.Number.ParseDouble(String value, NumberStyles options, NumberFormatInfo numfmt)
   at Program.Program.Main()

Явно проблема се получава при парсването !? 

var value = double.Parse(Console.ReadLine());

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

1
dakata avatar dakata 26 Точки

Интересно, просто преместих реда var value = double.Parse(Console.ReadLine()); най-отгоре:

 

 static void Main()
        {
            var value = double.Parse(Console.ReadLine());
            var input = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency
            var output = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency

И системата прие решението ... 

1
r3v3nan7 avatar r3v3nan7 365 Точки

Гледам ти кода , но и аз все още не разбирам защо гърми ? .. Изписва , че има грешка с input, или по-скоро , че е в грешен формат, но 

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

0
RoYaL avatar RoYaL Trainer 6849 Точки

Предполагам, че това, което сте разбрали до момента е, че кодът се изпълнява от горе надолу. Т.е. в 99% от случаите има значение кой ред къде е, не е просто "преместих един ред по-горе и то взе, че тръгна".

Нека погледнм примерния вход в задачата:

20
USD
BGN

Нека видим и кода, който си предоставил:

var input = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency
var output = Console.ReadLine();// Enter BGN, USD, EUR or GBP currency
var value = double.Parse(Console.ReadLine());

Когато кажеш Console.ReadLine() кой от тези три реда от входа ще прочете? Няма как магически програмата да се усети, че трябва да изчака два реда и да вземе 2рия. Ще вземе, разбира се, първия ред. И променливата input ще стане стринга "20".

След това пак казваш Console.ReadLine(). Първият ред е прочетен и чака за втори. Вторият е USD и променливата output ще стане стринга "USD".

След това пак казваш прочети ред (Console.ReadLine()). Първите два са прочетени и ще се опита да прочете третия, който е BGN. Ще го прочете и ще се опита стринга "BGN" да го конвертира към double (double.Parse). Няма да успее, защото BGN не е валидно число и ще гръмне програмата.

5
r3v3nan7 avatar r3v3nan7 365 Точки

Да.. RoYal е абсолютно прав. И аз тествах и се получи. Просто var value трябва да е най-отгоре. Объркал си реда на подаване на данните и затова е гръмнало...

А пък аз къде се забих да търся грешката направо не е истина :D  ... почнах да търся за грешки в променливите, за грешни парсвания и дали switch е правилен

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

0
dakata avatar dakata 26 Точки

Благодаря много за съдействието, опитах и с онлайн компилатори - в повечето от тях работи. В условието на задачата виждам, че сумата за конвертиране е първа на вход, но все пак си мисля, че проблема е в парсването от string към double.

-1
RoYaL avatar RoYaL Trainer 6849 Точки

@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.

1
r3v3nan7 avatar r3v3nan7 365 Точки

@dakata, 

Judge-а мисля, че не е като повечето компилатори, той е по-специфичен и е проектиран точно специфични задачи да проверя. Всъщност той не е

компилатор , а просто проверява. И както спомена RoYal тук е много важна последователността. Примерно Judge-a очаква в първия ред 

да се вземе стойността за конвентиране, във вторият ред да се вземе входната валута и третият ред да е за изходната валута. Ти на първият ред

не му беше задал стойността 20 , а изходната или входящата валута, тоест ти  точно на обратно. Първо си му подал валутите и после стойността и за това

е гръмнал. Иначе няма проблем с парсванията според мен. Като огледох всичко ми се видя добре.

2
RoYaL avatar RoYaL Trainer 6849 Точки

Ама то и онлайн и офлайн и каквито и компилатори да ползвате има значение. И във вашето VS като пуснете програмата и не ги напишете в очаквания от вас ред, ще гръмне. Пробвай във VS да въведеш първо "USD" после "10" и после "BGN"... Няма сила на тоя свят, която да разбере кой ред към коя променлива магически да се напасне. Затова се четат поредно. Първия рийдлайн отговаря на първия ред, втория рийдлайн на втория ред и т.н.

Не може да очакваш произволен вход. Представи си, че го даваш на потребители това приложение. Те трябва да въвеждат в определен формат входа. Т.е. Няма как Пешо да въведе "USD", "20", "BGN", а Гошо да въведе "20", "BGN", "USD" и това да даде еднакви резултати.

Така е и в приложенията, които сте ползвали. Регистрирате се в някой сайт и след като си въведете данните, след това си ходите в имейла и си потвърждавате имейла нали? Няма как първо да се потвърдиш имейла, пък после да се регистрираш в сайта. Обикновено реда от операции има значение.

1
dakata avatar dakata 26 Точки

Благодаря Ви много за помощта, прочетох обстойно коментарите Ви и всъщност се видя  до какво може да доведе едно недоглеждане в програмирането ... до два часа лутане при мен :)

1
r3v3nan7 avatar r3v3nan7 365 Точки

Повярвай ми daka и аз като теб се залутах и тръгна да препускам из кода.. може би съм свикнал с judge-а и дори не подозирах за подобна грешка,

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

че наистина редът на операциите е много важен и дори дребно разместване като това може да доведе до ядове и проблеми. Благодаря и на RoYal 

за много добрите обяснения и пояснения. Благодаря ти, че отдели време, за да напишеш тези толкова полезни неща. Вярвам , че са полезни не само за мен.

0
pkgeorgiev avatar pkgeorgiev 38 Точки

В условието на задачата пише, че първо се въвежда стойност (число), следва валута източник (string) и крайна валута (string).

При твоето решение четеш стойността (числото) най-накрая, а същевременно от клавиатурата въвеждаш 20, USD, GBR. Т.е. караш double.Parse да преобразува текста "GBR" в число, което не е възможно. Съответно компилаторът ти "казва", че това няма как да стане със съобщението "System.FormatException: Input string was not in a correct format" :)

Поредността на въвеждане и приемане на входните параметри е важна. Judge системата разчита точно на това.

1
26/01/2016 14:28:59
dakata avatar dakata 26 Точки

Да, RoYaL е постнал обстоен коментар по темата още в 12:52:27 но не знам защо съм го пропуснал, работя с Judge системата от 2-3 дни и вече започвам да схващам. Коментарите тук са много важни, трябва да се пита ... след като user-a се е поблъскал достатъчно разбира се.

1
pebodi avatar pebodi 29 Точки

Джаджата чака първо VALUE  - сумата за конвертиране. При първия ти вариант, първо въвеждаш входна и изходна валута, които са стринг EUR, BGN ..., после сума за конвертиране. Нормално е джаджата да гърми, умножава или дели по валутния курс вместо число - стринг, т.е EUR*1.95, ВМЕСТО 100 примерно по 1.95. 

1
dakata avatar dakata 26 Точки

Именно ...  string*double = Грешка по време на изпълнение :)

0
bardjo avatar bardjo -1 Точки

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

 

0
natashanikolova avatar natashanikolova 2 Точки

Според мен проблема идва от реда на въвеждане на променливите.

По условие са в следния ред:

1.сума - число

2.входна валута - текст

3.изходна валута - текст

а програмата ги чете:

1.входна валута - текст

2.изходна валута - текст

3.сума - число

И от тук се получава раминаване на типовете променливи.

Ако всички променливи бяха един тип, нямаше да дава грешка в променливите, но пак нямаше да мине тестовете.

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

0
Gesh4o avatar Gesh4o Trainer 305 Точки

Здравей,

При такива задачи понякога е хубаво да кажеш и какъв вход подаваш. Пример за това защо програмата ти гърми е, че има възможност да не даваш правилен вход т.е. ти да подаваш числото- 5,26, но в зависимост от културата на програмата то може да изглежда ето така- 5.26, това е така защото е наложен американския стандарт, който казва, че десетичния делител е точка, а не запетая. Виж дали това е проблема, ако не е- сподели- ще огледам кода по-обстойно! :)

Поздрави!

0
26/01/2016 12:56:39
DavidYordanov avatar DavidYordanov 0 Точки

Delete

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