Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2019, 21:22   #1
lava172
Новичок
Джуниор
 
Регистрация: 15.01.2019
Сообщений: 1
По умолчанию Калькулятор, парсинг sin, cos, ln и т.д.

Реализовал калькулятор на основе делегатов, словарей, стеков, приоритетов операций. Считает он правильно сложные выражения со скобками. Но не знаю как посчитать к примеру вот такую строку sin(1)+3+cos(2). Вариант с тем, чтобы ввести 1 и нажать sin не предлагать. Такое сделал. Но хочется все-таки чтобы sin(1)+3+cos(2) он мог рассчитать. Возможно ли это и как?


Словари:

Код:
FuncDictionary = new Dictionary<string, Func<double, double, double>>()
{
                {"+", (x, y) => x + y},
                {"-", (x, y) => x - y},
                {"*", (x, y) => x * y},
                {"/", (x, y) =>
                    {
                        if (y == 0) throw new DivideByZeroException();
                        return x / y;
                    }
                },
                {"^", (x, y) => Math.Pow(x, y)}
};

PriorityDictionary = new Dictionary<string, int>()
{
                {"+", 1},
                {"-", 1},
                {"*", 2},
                {"/", 2},
                {"^", 3}
};
Метод вычисления(до этого разбиваю строку на массив строк, чтобы нормальное считать double)
Код:
private void HandleExpression()
{
            char symbol;
            foreach (var item in expression) // по списку
            {
                if (operationForTwo.FuncDictionary.ContainsKey(item)) // операция
                    HandleOperation(item);
                else if (char.TryParse(item, out symbol) &&
                    char.Parse(item).IsBracket()) // скобка
                {
                    HandleBracket(item);
                }
                else // число
                    HandleNumber(item);
            }
            while (true)
            {
                if (operationForTwo.OperationStack.Count > 0)
                        MakeOperation();
                else break;
            }
}

Последний раз редактировалось lava172; 15.01.2019 в 21:24.
lava172 вне форума Ответить с цитированием
Старый 23.02.2019, 13:22   #2
samana
Новичок
Джуниор
 
Регистрация: 23.02.2019
Сообщений: 1
По умолчанию

Вы можете попробовать сделать с помощью регулярных выражений. Создайте шаблон, который будет находить в строке все cos или sin, а содержимое в последующих скобках помещать в группу. Затем можно содержимое из группы обработать и поместить обратно в строку.
В общем строка sin(1)+3+cos(2), превращается в строку 0,841470984807897+3+-0,416146836547142.
Как видите сразу всплывают нюансы, например косинус 2 равен отрицательному числу, поэтому мы видим вместе +-.
Так же надо продумать, если в скобках написано выражение, например cos(корень(30)*5), то сначала нужно обработать всё, что в скобках, а потом уже вычислять косинус.
Код ниже сделан на скорую руку, поэтому он чисто в качестве отправной точки.

Код:
using System.Text.RegularExpressions;

string s = "sin(1)+3+cos(2)";

s = Regex.Replace(s, @"(cos\((-?\d+(\,?\d+)?)\))", i => Math.Cos(Convert.ToDouble(i.Groups[2].Value)).ToString());
s = Regex.Replace(s, @"(sin\((-?\d+(\,?\d+)?)\))", i => Math.Sin(Convert.ToDouble(i.Groups[2].Value)).ToString());

Console.WriteLine(s);
samana вне форума Ответить с цитированием
Старый 25.02.2019, 14:32   #3
Скарам
Дружите с Linq ;)
Форумчанин
 
Аватар для Скарам
 
Регистрация: 15.10.2008
Сообщений: 822
По умолчанию

Разобрано уже
Не давай организму поблажки, каждый день тренируй его в шашки..
Скарам вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сдать нужно в понедельник. Не понимаю, как вычислить значение этого выражения: S=sin(x+cos(2x-sin(3x+cos(4x+sin(5x-cos(6x+...).. n7camomile Помощь студентам 5 15.12.2013 22:44
Калькулятор. Cos и Sin Ruz34 Общие вопросы Delphi 1 09.02.2013 18:13
Пусть задано значение X. Найти первое из чисел sin X, sin sin X, sin sin sin X, ... , меньшее по модулю 10-4. hex_91 Visual C++ 1 28.04.2012 23:49
Паскаль Вычислить у - первое из чисел sin х, sin sin x, sin sin sin x, ..., меньшее по модулю 10-4 Kikikiss Помощь студентам 2 25.03.2012 13:58