Ejemplo n.º 1
0
        /// <summary>
        /// Переводит число из десятичной системы в систему счисления targetNotation
        /// </summary>
        /// <param name="targetNotation">Систему счисления, в которую надо перевести число</param>
        /// <returns></returns>
        public string ConvertNumberFromDecToTargetNotation(int targetNotation)
        {
            if (targetNotation != 10)
            {
                var    div = new BigNumber(GetDiv(_str)); // Получение целой части числа
                var    mod = new BigNumber(GetMod(_str)); // Получение числа без целой части
                string s1  = string.Empty,                // Число перед запятой в новой системе счисления
                       s2  = string.Empty;                // Число после запятой в новой системе счисления
                int kol    = 0;                           // Количество элементов в массиве mas
                var mas    = new string[25];              // Массив, для отлова цикла при получении дробной части

                if (div.Value == "-1" || mod.Value == "-1")
                {
                    return("Error: Unknown symbol.");
                }

                while (div > "0")
                {
                    int d = Convert.ToInt32((div % targetNotation).Value);
                    div.Value = BigNumber.QuotientDiv(div.Value, targetNotation.ToString());
                    s1        = ToStr(d) + s1;
                }

                if (_minus)
                {
                    s1 = "-" + s1;
                }

                do
                {
                    mod = mod * targetNotation;
                    int gfd = Convert.ToInt32(GetDiv(mod.Value));

                    if (gfd < targetNotation)
                    {
                        s2 += ToStr(gfd);
                    }
                    else
                    {
                        s2 += "0";
                    }

                    mod        = mod % "1";
                    mas[kol++] = mod.Value;

                    for (int i = 0; i < kol - 1; i++)
                    {
                        if (mas[kol - 1] == mas[i])
                        {
                            mod.Value = "0";
                        }
                    }
                }while (mod > E && kol < 25);

                if (s1.Equals(string.Empty))
                {
                    s1 = "0";
                }
                else if (s1.Equals("-"))
                {
                    s1 = "-0";
                }

                return(s1 + "," + s2);
            }

            if (_minus)
            {
                return("-" + _str);
            }

            return(_str);
        }
Ejemplo n.º 2
0
        // Кнопка "Вычислить"
        private void buttonRun_Click(object sender, EventArgs e)
        {
            Perevod perevod;                                // Переменная для класса перевода кодировок
            string  text    = textOperation.Text.ToUpper(); // строка пользователя без пробелов и в верхнем регистре
            var     ptext   = new string[100];              // массив элементов строки в обратной польской записи
            int     ptn     = 0;                            // указатель для работы с этим массивом
            var     stec    = new char[100];                // стек для (, ), +, -, * и / (исп. при получении ptext)
            int     stn     = 0;                            // укзатель для работы с этим стеком
            var     stecStr = new string[100];              // стек для чисел и знаков (исп. для получения rezult)
            int     ssn     = 0;                            // укзатель для работы с этим стеком

            // Убирание пробелов из выражения
            while (text.IndexOf(' ') > -1)
            {
                text = text.Replace(" ", string.Empty);
            }

            // Если строка для вычисления не пуста, то начинаем с ней работать
            if (text.Length > 0)
            {
                // Вставление 0 перед унарным минусом в начале выражения
                if (text[0] == '-' || text[0] == '+')
                {
                    text = "0" + text;
                }

                string temp = text[0].ToString();
                // Вставление 0 перед унарным минусом после открывающей скобки
                for (int i = 1; i < text.Length; i++)
                {
                    if (ExpressionVerifier.IsOpenBracket(text[i - 1]) && (text[i] == '-' || text[i] == '+'))
                    {
                        temp += "0" + text[i];
                    }
                    else
                    {
                        temp += text[i];
                    }
                }

                text = temp;
            }
            else
            { // Если строка оказалась пустой, то выходим
                textOperation.Focus();
                textResult.Text = string.Empty;
                return;
            }

            // Проверяем наше выражение на синтаксическую правильность
            var verifier = new ExpressionVerifier(text);

            switch (verifier.Verify())
            {
            case 1:
                textResult.Text = "Error: placing brackets";
                textOperation.Focus();
                return;

            case 2:
                textResult.Text = "Error: quantity character";
                textOperation.Focus();
                return;

            case 3:
                textResult.Text = "Error: writing numbers";
                textOperation.Focus();
                return;

            case 4:
                textResult.Text = "Error: unknown symbol";
                textOperation.Focus();
                return;

            case 5:
                textResult.Text = "Error: syntax expression";
                textOperation.Focus();
                return;
            }

            // Получаем строку в обратной польской записи
            for (int i = 0; i < text.Length; i++)
            {
                if (ExpressionVerifier.IsDigit(text[i]))
                {
                    while (i < text.Length && (ExpressionVerifier.IsDigit(text[i]) || ExpressionVerifier.IsSeparator(text[i])))
                    {
                        ptext[ptn] += text[i++];
                    }

                    perevod    = new Perevod(ptext[ptn]);
                    ptext[ptn] = perevod.ConvertNumberFromCurrentNotationToDec(_notation);
                    if (ptext[ptn].Length > 5 && ptext[ptn].Substring(0, 5).Equals("Error"))
                    {
                        textResult.Text = ptext[ptn];
                        textOperation.Focus();
                        return;
                    }

                    ptn++;
                    i--;
                }
                else if (ExpressionVerifier.IsOpenBracket(text[i]))
                {
                    stec[stn++] = text[i];
                }
                else if (ExpressionVerifier.IsCloseBracket(text[i]))
                {
                    stn--;
                    while (!ExpressionVerifier.IsOpenBracket(stec[stn]))
                    {
                        ptext[ptn++] += stec[stn--];
                    }
                }
                else
                {
                    switch (text[i])
                    {
                    case '+':
                    case '-':
                        if (stn == 0 || ExpressionVerifier.IsOpenBracket(stec[stn - 1]))
                        {
                            stec[stn++] = text[i];
                        }
                        else
                        {
                            stn--;
                            while (stn != -1 && !ExpressionVerifier.IsOpenBracket(stec[stn]))
                            {
                                ptext[ptn++] += stec[stn--];
                            }
                            stn++;
                            stec[stn++] = text[i];
                        }
                        break;

                    case '*':
                    case '/':
                    case '%':
                        if (stn == 0 || ExpressionVerifier.IsOpenBracket(stec[stn - 1]) || stec[stn - 1] == '+' || stec[stn - 1] == '-')
                        {
                            stec[stn++] = text[i];
                        }
                        else
                        {
                            stn--;
                            while (stn != -1 && !ExpressionVerifier.IsOpenBracket(stec[stn]) && stec[stn] != '+' && stec[stn] != '-')
                            {
                                ptext[ptn++] += stec[stn--];
                            }
                            stn++;
                            stec[stn++] = text[i];
                        }
                        break;

                    case '^':
                        if (stn == 0 || ExpressionVerifier.IsOpenBracket(stec[stn - 1]) || stec[stn - 1] == '+' || stec[stn - 1] == '-' || stec[stn - 1] == '*' || stec[stn - 1] == '/')
                        {
                            stec[stn++] = text[i];
                        }
                        else
                        {
                            stn--;
                            while (stn != 0 && !ExpressionVerifier.IsOpenBracket(stec[stn]) && stec[stn] != '+' && stec[stn] != '-' && stec[stn] != '*' && stec[stn] != '/')
                            {
                                ptext[ptn++] += stec[stn--];
                            }
                            stn++;
                            stec[stn++] = text[i];
                        }
                        break;
                    }
                }
            }

            for (int i = stn - 1; i >= 0; i--)
            {
                ptext[ptn++] += stec[i];
            }

            // Вычисляем выражение, записанное в обратной польской записи
            BigNumber c;

            for (int i = 0; i < ptn; i++)
            {
                if (ExpressionVerifier.IsDigit(Convert.ToChar(ptext[i].Substring(0, 1))))
                {
                    stecStr[ssn++] = ptext[i];
                }
                else
                {
                    var a = new BigNumber(ExpressionVerifier.RemoveBeganZerosFromNumber(stecStr[ssn - 2]));
                    var b = new BigNumber(ExpressionVerifier.RemoveBeganZerosFromNumber(stecStr[ssn - 1]));

                    switch (Convert.ToChar(ptext[i].Substring(0, 1)))
                    {
                    case '+':
                        c = a + b;
                        break;

                    case '-':
                        c = a - b;
                        break;

                    case '*':
                        c = a * b;
                        break;

                    case '/':
                        c = a / b;
                        if (c.Value.StartsWith("Error"))
                        {
                            textResult.Text = c.Value;
                            textOperation.Focus();
                            return;
                        }
                        break;

                    case '%':
                        c = a % b;
                        if (c.Value.StartsWith("Error"))
                        {
                            textResult.Text = c.Value;
                            textOperation.Focus();
                            return;
                        }
                        break;

                    case '^':
                        c = a ^ b;
                        break;

                    default:
                        textResult.Text = "Error: RUNTIME ERROR";
                        textOperation.Focus();
                        return;
                    }

                    stecStr[ssn - 2] = c.Value;
                    ssn--;
                }
            }

            if (ssn != 1)
            {
                textResult.Text = "Error: syntax expression";
                textOperation.Focus();
                return;
            }

            perevod         = new Perevod(stecStr[0]);
            textResult.Text = perevod.ConvertNumberFromDecToTargetNotation(_notation);
            textOperation.Focus();
            if (!textResult.Text.StartsWith("Error"))
            {
                var param = new string[2];
                param[0] = textOperation.Text;
                param[1] = textResult.Text;
                List.Rows.Insert(0, param);
            }
        }