Loading...

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

cvetomirG avatar cvetomirG 132 Точки

12 - Currency Converter - 2 решения без излишни проверки

Здравейте колеги, зная  че задачите от домашната са направени така, че учещите да се тренират върху материала, който се преподава вмомента, но желая да споделя 2 елегантни, кратки и прости решения на задачата ( и най-вече мързеливи :D ) , въпреки че включват неща, които скоро няма да се изучават. Все пак може някой да се запали и да човърка в теми за по-напреднали с цел улеснение на решаване на бъдещи проблеми.

 

http://pastebin.com/pTxLNBQS   - Без If конструкции, само 4 случая на case, като switch-a е изнесен в метод и затова няма нужда да повтаряме код, а само да приложим метода върху двата стринга, които прочитаме.

 

http://pastebin.com/uGRfhgKK - Тук менторите ме насочиха още в Събота, да ползвам dictionary, понеже нямам желание да го правя с if / switch конструкции и чак в нас успях да го измисля, с малко помощ от google. Накратко с dictionary имаме по всяко време key / value и можем да ги използваме от сорта на :  double result =     (currencies[firstCurrency] / currencies[secondCurrency]) * amount;

Дано на някой са му били интересни решенията и да се запали да чете за някои неща, които ще се изучават напред.

Междудругото от лекция 03-Simple-Conditional-Statements има няколко задачки, които се решават с един от тези начини, без многото if/ switch проверки, решението на тях мисля, че няма нужда да го пускам, то е същото като този код, само трябва да се променят стойностите евентуално.

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

Поздрави.

 

1
Programming Basics 24/10/2016 23:25:41
PavlinPetkov88 avatar PavlinPetkov88 24 Точки

Хубаво е когато работиш с пари, да изпошзваш decimal .

1
cvetomirG avatar cvetomirG 132 Точки

Така е, правилна забележка.

 

0
dmaknev avatar dmaknev 49 Точки

Защо? И защо това не бе споменато в съответната лекция или която и да е предходна, преди това домашно? Очевидно и с double всичко е наред. Дори decimal няма ли да доведе до неточности?

0
PavlinPetkov88 avatar PavlinPetkov88 24 Точки

Реални типове с десетична точност

В C# се поддържа т. нар. десетична аритметика с плаваща запетая (decimal floating-point arithmetic), при която числата се представят в десетична, а не в двоична бройна система и така не се губи точност при записване на десетично число в съответния тип с плаваща запетая.

Типът данни за реални числа с десетична точност в C# е 128-битовият тип decimal. Той има точност от 28 до 29 десетични знака. Минималната му стойност е -7.9×1028, а максимал­ната е +7.9×1028. Стойността му по подразбиране е 0.0м или 0.0М. Символът 'm' накрая указва изрично, че числото е от тип decimal (защото по подразбиране всички реални числа са от тип double). Най-близките до 0 числа, които могат да бъдат записани в decimal са ±1.0 × 10-28. Видно е, че decimal не може да съхранява много големи положителни и отрица­телни числа (например със стотици цифри), нито стойности много близки до 0. За сметка на това този тип почти не прави грешки при финансови пресмятания, защото представя числата като сума от степени на числото 10, при което загубите от закръгляния са много по-малки, отколкото когато се използва двоично представяне. Реалните числа от тип decimal са изключително удобни за пресмятания с пари – изчисляване на приходи, задължения, данъци, лихви и т.н.

1
dmaknev avatar dmaknev 49 Точки

Не ми се вижда нито по-кратко, нито по-просто от стандартното решение, а само излишно усложняване, при толкова лесна задача... може би за някакви по-трудни да е по-добре да се ползват някои от тези техники, но на мен за сега с if-овете ми е OK ;)

            var stojnost = double.Parse(Console.ReadLine());
            string whodwal = Console.ReadLine();
            string izhwal = Console.ReadLine();
                        
            if (whodwal == "USD") stojnost = stojnost * 1.79549;
            else if (whodwal == "EUR") stojnost = stojnost * 1.95583;
            else if (whodwal == "GBP") stojnost = stojnost * 2.53405;
 

            if (izhwal == "USD") stojnost = stojnost / 1.79549;
            else if (izhwal == "EUR") stojnost = stojnost / 1.95583;
            else if (izhwal == "GBP") stojnost = stojnost / 2.53405;
 

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

0
drunin89 avatar drunin89 14 Точки

Ето моето решение, дълго е но ми даде 100/100.

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

namespace CurrencyConvertor
{
    class CurrencyConvertor
    {
        static void Main(string[] args)
        {
            var suma = Double.Parse(Console.ReadLine());
            var valutaIn = Console.ReadLine();
            var valutaOut = Console.ReadLine();
            if (valutaIn == "BGN")
            {
            
                if (valutaOut == "BGN")
                {
                    Console.WriteLine(suma);
                }
                else if (valutaOut == "USD")
                     {
                         Console.WriteLine(suma / 1.79549);
                      }
                     else if (valutaOut == "EUR")
                             {
                                  Console.WriteLine(suma / 1.95583);
                             }
                          else if (valutaOut == "GBP")
                              {
                                 Console.WriteLine(suma / 2.53405);
                              }
           else
               {
                  Console.WriteLine("Nepravilno vavedeni danni");
               }
            }
            if (valutaIn == "USD")
            {

                if (valutaOut == "USD")
                {
                    Console.WriteLine(suma);
                }
                else if (valutaOut == "BGN")
                {
                    Console.WriteLine(suma * 1.79549);
                }
                else if (valutaOut == "EUR")
                {
                    Console.WriteLine((suma * 1.79549) / 1.95583);
                }
                else if (valutaOut == "GBP")
                {
                    Console.WriteLine((suma * 1.79549) / 2.53405);
                }
                else
                {
                    Console.WriteLine("Nepravilno vavedeni danni");
                }
            }
            if (valutaIn == "EUR")
            {

                if (valutaOut == "EUR")
                {
                    Console.WriteLine(suma);
                }
                else if (valutaOut == "USD")
                {
                    Console.WriteLine((suma * 1.95583) / 1.79549);
                }
                else if (valutaOut == "BGN")
                {
                    Console.WriteLine(suma * 1.95583);
                }
                else if (valutaOut == "GBP")
                {
                    Console.WriteLine((suma * 1.95583) / 2.53405);
                }
                else
                {
                    Console.WriteLine("Nepravilno vavedeni danni");
                }
            }
            if (valutaIn == "GBP")
            {

                if (valutaOut == "GBP")
                {
                    Console.WriteLine(suma);
                }
                else if (valutaOut == "USD")
                {
                    Console.WriteLine((suma * 2.53405) / 1.79549);
                }
                else if (valutaOut == "BGN")
                {
                    Console.WriteLine(suma * 2.53405);
                }
                else if (valutaOut == "EUR")
                {
                    Console.WriteLine((suma * 2.53405) / 1.95583);
                }
                else
                {
                    Console.WriteLine("Nepravilno vavedeni danni");
                }
            }

 


        }
    }
}

 

0
Leprikona avatar Leprikona 108 Точки

Добро решение, но повярвай: със switch case е 1 000 пъти по лесно. И аз си мислех, че е много играчка, ама като пробваш няколко пъти и ще видиш, че наистина ти улеснява живота. :)

Keep coding!

0
cvetomirG avatar cvetomirG 132 Точки

То решението заспива със 100/ 100 точки, но лично аз винаги се стремя нещата да ги правя що годе както биха се правили  в живота. Следвам DRY принципа ( do not repeat yourself ) понеже много съм си патил. Твоето решение например става да, заспива на 100/100 точки, но евентуално ако трябва да се вкара някъде може да имаш големи бели :D . Аз продавам един php скрипт, що годе доволно вървят нещата, че да се издържам само от него, но там  като почнах да го пиша го пишех pure php, с минимално използване на методи и много повторения на код, абе с една дума спагети код :D  и си мислех, е какъв е проблема, нали са 5-6 файла, няма нужда и от ООП дори. Да, но впоследствие почнаха проблемите, мейлите, рефундовете и направо се наложи да се пренапише целия код буквално за да го направя с MVC фронт контролер, обектно ориентиран и разделение на кода и що годе да няма повторения  ( има и сега :D ). Та от тази гледна точка търся някакви адекватни решения на домашните, които биха ми били полезни и занапред в "реалното програмиране", а не в това да изкарва 100/ 100. 

И тук е момента да изкаже мнение някой човек, който е писал във фирма .NET / CSharp код, евентуално нещо такова как би се изкодило в кадърна фирма и какво би се ползвало, че да научим как се правят нещата в реалното програмиране.

 

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