.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);
}
}
}