Notacja wykładnicza - ocena kodu

Odpowiedz Nowy wątek
2018-11-15 14:53
0

Hej,

Co tu dużo pisać. Chciałem się zapytać czy takie narzędzie (podobne zastosowanie jak metody z klasy Math) jest dobrze napisane pod różnymi względami.
Starałem się nadawać nazwy, który mówią jak najwięcej, zresztą sami zobaczcie jak to wyszło.
Jedyny problem jaki miałem to jak zrobić, żeby jakość logicznie zwracać liczbę, a nie string.
Drugi problem, o który chciałem się zapytać to czy ten kod zalicza się do czytelnego, a jak nie to co byście zmienili?

Decimal to dobry typ zmiennej w tym zastosowaniu?

Mam nadzieję, że żadnych błędów nie ma.

    static class AdvancedMathOperations
    {
        private static int MIN_EXPONENTIAL_NOTATION_VALUE = 1;
        private static int MAX_EXPONENTIAL_NOTATION_VALUE = 10;

        /// <summary>
        /// Return Exponential Notation in STRING!
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        public static string MakeExponentialNotation(decimal number)
        {
            if(number >= MIN_EXPONENTIAL_NOTATION_VALUE && number <= MAX_EXPONENTIAL_NOTATION_VALUE)
            {
                return number.ToString();
            }

            if(number > MAX_EXPONENTIAL_NOTATION_VALUE)
            {
               return MakeExponentialNotationWhenNumberIsToBig(number, true);
            }

            else if(number < -MAX_EXPONENTIAL_NOTATION_VALUE)
            {
                return MakeExponentialNotationWhenNumberIsToBig(number, false);
            }

            else if(number < MIN_EXPONENTIAL_NOTATION_VALUE && number > 0)
            {
                return MakeExponentialNotationWhenNumberIsToSmall(number, true);
            }

            else if(number > -MIN_EXPONENTIAL_NOTATION_VALUE && number < 0)
            {
                return MakeExponentialNotationWhenNumberIsToSmall(number, false);
            }
            return number.ToString();
        }

        static string MakeExponentialNotationWhenNumberIsToBig(decimal number, bool isPositive)
        {
            int iterationCount = 0;
            if (isPositive)
            {
                while (number > MAX_EXPONENTIAL_NOTATION_VALUE)
                {
                    number /= MAX_EXPONENTIAL_NOTATION_VALUE;
                    iterationCount++;
                }
                return number + " * " + MAX_EXPONENTIAL_NOTATION_VALUE.ToString() + "^" + iterationCount;
            }
            else
            {
                while (number < -MAX_EXPONENTIAL_NOTATION_VALUE)
                {
                    number /= MAX_EXPONENTIAL_NOTATION_VALUE;
                    iterationCount++;
                }
                return number + " * " + MAX_EXPONENTIAL_NOTATION_VALUE.ToString() + "^" + iterationCount;
            }

        }

        static string MakeExponentialNotationWhenNumberIsToSmall(decimal number, bool isPositive)
        {
            int iterationCount = 0;
            if(isPositive)
            {
                while(number < MIN_EXPONENTIAL_NOTATION_VALUE)
                {
                    number *= MAX_EXPONENTIAL_NOTATION_VALUE;
                    iterationCount--;
                }
                return number + " * " + MAX_EXPONENTIAL_NOTATION_VALUE.ToString() + "^" + iterationCount;
            }
            else
            {
                while(number > -MIN_EXPONENTIAL_NOTATION_VALUE)
                {
                    number *= MAX_EXPONENTIAL_NOTATION_VALUE;
                    iterationCount--;
                }
                return number + " * " + MAX_EXPONENTIAL_NOTATION_VALUE.ToString() + "^" + iterationCount;
            }
        }
    }

Wielkie dzięki, jakość kodu to chyba jedyna rzecz, którą praktycznie nie da się wyczytać prosto z internetu.

edytowany 1x, ostatnio: Barteker, 2018-11-15 14:54

Pozostało 580 znaków

2018-11-15 14:56

Definitywnie za dużo kopiuj-wklej, powtórzeń i zbyt długich nazw - spróbuj zrobić całość mając do dyspozycji tylko jedno / dwa while, nie cztery :-)


dlugie nazwy imo dobre sa tutaj - fasadin 2018-11-15 15:00

Pozostało 580 znaków

2018-11-15 14:58
1

MIN_EXPONENTIAL_NOTATION_VALUE
to nie C

uzyj po prostu

private static const int MinExponentialNotationValue = 1;

jezeli funkcja ma byc private, to ja nazwij private, nie zostawiaj bez modyifkatora dostepu

uzywaj $ do laczenia stringow
https://docs.microsoft.com/en[...]reference/tokens/interpolated

duzo sie potwarzasz

edytowany 1x, ostatnio: fasadin, 2018-11-15 14:59
Faktycznie, nazwy dla stałych pisze się inaczej, dzięki. - Barteker 2018-11-15 15:13

Pozostało 580 znaków

2018-11-15 15:04
0

Zastanawiałem się trochę nad zredukowaniem pętli while, ale miałem z tym problem, bo te pętle dość dużo się od siebie różnią. Mogę jedynie zrobić, aby była jedna pętla while i w niej po kilka warunków if, ale nie wiem czy to lepsze rozwiązanie.

"$" - dzięki, muszę koniecznie to zastosować, bo bez tego kod dziwnie wygląda.

Pozostało 580 znaków

2018-11-15 15:30
1

Przynajmniej połowę pętli możesz zlikwidować poprzez działanie na liczbach bez znaku - w pseudokodzie:

numberSign = sign(number) // -1 jeśli liczba jest ujemna, +1 jeśli dodatnia
number = abs(number)

while number < MinExponentialNotationValue:
  number *= MaxExponentialNotationValue

number = numberSign * number

edytowany 1x, ostatnio: Patryk27, 2018-11-15 15:30

Pozostało 580 znaków

2018-11-15 15:39
1

cos bardzo prostego

var condition = true
while(condition)
{
    number *= MAX_EXPONENTIAL_NOTATION_VALUE;
    iterationCount--;
    if (isPositive)
    {
        condition = number < MIN_EXPONENTIAL_NOTATION_VALUE
    }
    else
    {
        condition  = number > -MIN_EXPONENTIAL_NOTATION_VALUE
    }
}
edytowany 1x, ostatnio: fasadin, 2018-11-15 16:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0