Где и для чего применяют C#
Формулировка задачи:
Можете ли вы мне рассказать зачем писать на C#? Что на нём пишут? Какая цель у языка? Где его применяют, для чего?
Вообщем можете рассказать не сколько о самом языке, сколько о среде, где его используют и для чего?
Решение задачи: «Где и для чего применяют C#»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Text; namespace MyMath { public static class CalculateExpression { private static readonly Dictionary<string, byte> _opdict = new Dictionary<string, byte> {{"(", 0}, {"+", 1}, {"-", 2},{"/", 3}, {"*", 4}}; private static readonly HashSet<string> _operators = new HashSet<string> { "+", "-", "/", "*" }; private static string _input; private static double CalculateSimple(double a, double b, char op) //Выполняем нужное вычисление в зависимости от операции { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a*b; case '/': return a/b; } return 0; } private static double StackCalc(double a, double b, char op) //Так как из стека достаем в обратном порядке, требуется инвертировать левый и правый операнды { return CalculateSimple(b, a, op); } private static bool BadBreckets(string s) //Проверяем баланс скобок в строке { int i = 0; foreach (char c in s) { if (c == '(') i++; else if (c == ')') i--; } return i != 0; } private static string Reverse(string s) //Обращаем строку в обратный порядок { int length = s.Length; var sb = new StringBuilder(length, length); for (int i = length - 1; i >= 0; i--) sb.Append(s[i]); return sb.ToString(); } public static string ToRPN() //Для более удобного анализа переводим в ОПН { var result = new StringBuilder(_input.Length); bool negative = false; var stack = new Stack<char>(); foreach (char c in _input) { if (c == ' ') continue; if (c == '(') stack.Push(c); else if (c == ')') //Если встречаем закрывающую скобку, то вытряхиваем в строку все, до появления открывабщей скобки { while (stack.Count > 0) { char a = stack.Pop(); if (a == '(') break; result.Append(" " + a); } } else if (_operators.Contains(c.ToString())) //Иначе если это оператор, вытряхиваем все операторы с большим приоритетом в строку, после этого засовываемся сами в стек { string op = c.ToString(); if (c == '-') { negative = true; result.Append("0 "); //Используем математический подход a - b = a + (0 - b) op = "+"; } else negative = false; result.Append(" "); while (stack.Count > 0 && _opdict[op] < _opdict[stack.Peek().ToString()]) { result.Append(stack.Pop() + " "); } stack.Push(op[0]); } else { if (negative) { result.Append('-'); negative = false; } result.Append(c); } //Если это не скобки и не операторы, то это цифра, добавляем к выходной строке, с учетом знака } while (stack.Count > 0) //Вытряхиваем в строку оставшиеся символы result.Append(" " + stack.Pop()); return result.ToString(); } public static string ToPN() { return Reverse(ToRPN()); } public static double? Calculate(string input) //Вычисляем выражение. Если формат ввода неправильный, возвращаем null { if (BadBreckets(input) || String.IsNullOrEmpty(input)) return null; _input = input; string[] strings = ToRPN().Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); var stack = new Stack<double>(input.Length/2); foreach (string s in strings) { if (_opdict.ContainsKey(s)) //Если оператор, то выполняем его над последними двумя элементами стека. { if (stack.Count < 2) if (s == "+" || s == "-") { stack.Push(StackCalc(stack.Pop(), 0, s[0])); continue; } else return null; stack.Push(StackCalc(stack.Pop(), stack.Pop(), s[0])); } else //Иначе это должно быть число, если вдруг что-то другое, то возвращаем null { double a; if (!double.TryParse(s, out a)) return null; stack.Push(a); } } return Math.Round(stack.Peek(), 15); //В стеке остается единственный элемент, значение выражения, который возвращаем } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д