double CalculateUnknown(double x, List <elementType> elements) { List <elementType> backup = Deepcopy(elements); for (int i = 0; i < elements.Count; i++) { if (elements[i].elementtype == elementTypes.X) { if (elements[i].value == "-x") { backup[i] = new elementType(elementTypes.NUMBER, '-' + x.ToString()); } else { backup[i] = new elementType(elementTypes.NUMBER, x.ToString()); } } } double temp = Calculate(backup); if (double.IsInfinity(temp)) { throw new EquasionException("Wynik jest zbyt wysoki"); } return(temp); }
List <dynamic> CalculateUnknownRange(double min, double max, int ammount, List <elementType> elements) { dynamic d = new ExpandoObject(); List <dynamic> results = new List <dynamic>(); List <elementType> backup = Deepcopy(elements); double am = (max - min) / (ammount - 1); am = Math.Round(am, 15); for (double i = 0; i < ammount; i++) { for (int j = 0; j < elements.Count; j++) { if (elements[j].elementtype == elementTypes.X) { if (elements[j].value == "-x") { backup[j] = new elementType(elementTypes.NUMBER, '-' + min.ToString()); } else { backup[j] = new elementType(elementTypes.NUMBER, min.ToString()); } } } double temp = Calculate(backup); d.x = Math.Round(min, 10); if (double.IsInfinity(temp)) { d.y = "Wynik jest zbyt wysoki"; } else { d.y = temp; } results.Add(d); d = new ExpandoObject(); min = min + am; } return(results); }
List <elementType> CreateONP(string row, out List <string> infix) { row = row.Replace("=", "+").Replace('.', ',').Replace(' ', '+'); List <elementType> elements = new List <elementType>(); List <Stack <elementType> > characters = new List <Stack <elementType> >(); Stack <elementType> sincosStack = new Stack <elementType>(); characters.Add(new Stack <elementType>()); infix = new List <string>(); int bracketCounter = 0, sincosCounter = 0; string number = "", minus = "", tempString; elementType characterTemp = null; bool divide = false, umberIsTaken = false, bracketIsOpen = true; void numbers() { minus = ""; divide = false; umberIsTaken = true; bracketIsOpen = false; } void equasions() { umberIsTaken = false; bracketIsOpen = true; minus = ""; bracketCounter++; sincosCounter++; if (characters.Count <= bracketCounter) { characters.Add(new Stack <elementType>()); } } for (int i = 0; i < row.Length; i++) { if (row[i] == '-' && bracketIsOpen) { minus = "-"; bracketIsOpen = false; continue; } if (row.Length >= i + 2 && row.Substring(i, 2) == "PI") { if (umberIsTaken) { throw new EquasionException("Umieściłeś PI zaraz po liczbie bez żadnego znaku rozdielającego jak +,-,*,/,^"); } i += 1; elements.Add(new elementType(elementTypes.NUMBER, minus + Math.PI.ToString())); infix.Add(minus + "PI"); numbers(); continue; } if (row[i] == 'x') { if (umberIsTaken) { throw new EquasionException("Umieściłeś x zaraz po liczbie bez żadnego znaku rozdielającego jak +,-,*,/,^"); } elements.Add(new elementType(elementTypes.X, minus + "x")); infix.Add(minus + "x"); numbers(); continue; } if (row.IndexOfAny(this.numbers, i) == i) { while (row.IndexOfAny(this.numbers, i) == i) { number += row[i]; i++; } i--; if (divide && double.Parse(number) == 0 || umberIsTaken || number == "," || number.IndexOf(",") != number.LastIndexOf(",")) { throw new EquasionException("Wrównaniu któraś liczba ma za dużo kropek lub dzielisz przez zero"); } elements.Add(new elementType(elementTypes.NUMBER, minus + number)); infix.Add(minus + number); number = ""; numbers(); continue; } if (row.IndexOfAny(signs, i) == i) { if (!umberIsTaken || minus == "-" || bracketIsOpen) { throw new EquasionException("W miejscu: " + (i + 1) + "występują 2 lub więcej znaków koło siebi umieść nawiasy lub usuń niepoprawne znaki, niepoprawnym znakiem jest: " + row[i]); } if (row[i] == '^') { characterTemp = new elementType(elementTypes.POWER, row[i].ToString()); } else { if (row[i].ToString() == "/") { divide = true; } characterTemp = new elementType(elementTypes.SIGN, row[i].ToString()); } infix.Add(row[i].ToString()); elementType z = null; int p1, p2; priority.TryGetValue(characterTemp.value, out p1); while (characters[bracketCounter].Count > 0) { z = characters[bracketCounter].Pop(); priority.TryGetValue(z.value, out p2); if (p1 <= p2) { elements.Add(z); } else { characters[bracketCounter].Push(z); break; } } characters[bracketCounter].Push(characterTemp); umberIsTaken = false; continue; } if (row.Length >= i + 5) { tempString = row.Substring(i, 4); if (tempString == "abs(" || tempString == "cos(" || tempString == "sin(" || tempString == "tan(" || tempString == "exp(" || tempString == "log(") { tempString = minus + tempString.Substring(0, 3); sincosStack.Push(new elementType(elementTypes.EXPRESSION, tempString)); infix.Add(tempString); i += 3; equasions(); continue; } tempString = row.Substring(i, 5); if (tempString == "sqrt(" || tempString == "cosh(" || tempString == "sinh(" || tempString == "tanh(" || tempString == "asin(" || tempString == "acos(" || tempString == "atan(") { tempString = minus + tempString.Substring(0, 4); sincosStack.Push(new elementType(elementTypes.EXPRESSION, tempString)); infix.Add(tempString); i += 4; equasions(); continue; } } if (row[i] == '(') { bracketCounter++; if (characters.Count <= bracketCounter) { characters.Add(new Stack <elementType>()); } sincosStack.Push(new elementType(elementTypes.BRACKET, "(")); bracketIsOpen = true; continue; } if (row[i] == ')') { if (!umberIsTaken || sincosStack.Count <= 0) { throw new EquasionException("Masz za dużo nawiasów zamykających"); } elementType t = sincosStack.Pop(); while (characters[bracketCounter].Count != 0) { elements.Add(characters[bracketCounter].Pop()); } bracketCounter--; if (t.elementtype == elementTypes.EXPRESSION) { sincosCounter--; elements.Add(t); } continue; } throw new EquasionException("równanie ma niepoprawne znaki w miejscu zaznaczonym < błąd >: " + row.Substring(0, i) + "< " + row[i] + " >" + row.Substring(i + 1)); } if (bracketCounter != 0 || !umberIsTaken || divide) { throw new EquasionException("Coś jest źle z równaniem brak nawiasu lub nawiasów zamykających, lub na końcu równania znajduje się któryś z tych znakó: +,-,*,/,^"); } while (characters[bracketCounter].Count != 0) { elements.Add(characters[bracketCounter].Pop()); } return(elements); }