.NET 4.x Консольный калькулятор - C#

Узнай цену своей работы

Формулировка задачи:

Всем привет! Знаю эта тема уже застарела но все таки... Я в С# новичёк, и вот решил написать свою первую программку, а именно консольный калькулятор. Вот что я сделал, но далее столкнулся с проблемой: мой калькулятор делает только одно действие - например 2+3 или 4.5- 6.7 или 3/4 и т. д. можете попробовать, он полностью рабочий. Но как далее сделать чтобы он считал вот такое например: 2+3*(45-6)/5-1, вот что-то в таком роде. Подскажите пожалуйста кто чем сможет, дайте какие-то идеи как это можно сделать или может есть примеры, искал в интернете, но не нашел ничего подходящего. Заранее всем благодарен!!! Первый файл:
using System;
using System.Linq;
 
namespace Calculator
{
    public static class Calculator
    {
 
        public static void Do(string str, double a = 0, double b = 0)
        {
            try
            {
                char[] actions = new[] { '+', '-', '/', '*' };
                char z = str.First(c => actions.Any(r => r == c));
 
                try
                {
                    switch (z)
                    {
                        case '+':
                            Console.WriteLine(a + " + " + b + " = " + "{0}", a + b);
                            break;
                        case '-':
                            Console.WriteLine(a + " - " + b + " = " + "{0}", a - b);
                            break;
                        case '*':
                            Console.WriteLine(a + " * " + b + " = " + "{0}", a * b);
                            break;
                        case '/':
                            if (b != 0)
                            {
                                Console.WriteLine(a + " / " + b + " = " + "{0}", a / b);
                            }
                            else
                            {
                                Console.WriteLine("Делить на ноль нельзя!");
                            }
                            break;
                        default:
                            Console.WriteLine("Введите верный знак");
                            break;
                    }
                }
                catch (DivideByZeroException)
                {
                    Console.WriteLine("Делить на ноль нельзя");
 
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Operation does not support.{0}{1}", Environment.NewLine, e.Message);
            }

        }
 
    }
}
Второй файл:
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Text;
using System.Threading;
 
namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("uk-UA");
            double a;
            double b;
 
            Console.WriteLine("Укажите дейсвия которое вы хотите сделать и нажмите Enter");
 
            string str = Console.ReadLine();
            if (str != null)
            {
                str = str.Replace(".", ",");
                string[] variables = str.Split('+', '-', '/', '*');
 
                try
                {
                    a = double.Parse(variables[0], NumberStyles.AllowDecimalPoint);
                    b = double.Parse(variables[1], NumberStyles.AllowDecimalPoint);
 
                    Calculator.Do(str, a, b);
                }
                catch (IndexOutOfRangeException ex)
                {
                    Console.WriteLine(ex.Message);
                }
                catch (FormatException ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
 
            Console.ReadKey();
        }
    }
}

Решение задачи: «.NET 4.x Консольный калькулятор»

textual
Листинг программы
using System;
using System.CodeDom.Compiler;
using System.Linq;
using System.Reflection;
using Microsoft.CSharp;
 
namespace ConsoleApplication108
{
    class MathEvaluator
    {
        private const string ClassBody =
            "using System; public static class LambdaCreator {{ public static Func<double> Create() {{ return ()=>({0}); }} }} ";
 
            
        public static double Calculate(string input)
        {
            var sources = string.Format(ClassBody, input);
            var provider = new CSharpCodeProvider();
            var parameters = new CompilerParameters { GenerateInMemory = true };
            parameters.ReferencedAssemblies.Add("System.dll");
            CompilerResults results = provider.CompileAssemblyFromSource(parameters, sources);
            if (results.Errors.Count > 0)
            {
                string errors = string.Join(Environment.NewLine,
                                            results.Errors.Cast<CompilerError>().Select(x => x.ErrorText));
                throw new ArgumentException(errors, "input");
            }
            var cls = results.CompiledAssembly.GetType("LambdaCreator");
            var method = cls.GetMethod("Create", BindingFlags.Static | BindingFlags.Public);
 
            return (double) ((Delegate) method.Invoke(null, null)).DynamicInvoke(null);
        }
    }
}

Оцени полезность:

10   голосов , оценка 3.5 из 5
Похожие ответы