Example #1
0
        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);
        }
Example #2
0
        List <string> CalculateUnknownRange(double min, double max, int ammount, List <elementType> elements)
        {
            List <string>      results = new List <string>();
            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);
                if (double.IsInfinity(temp))
                {
                    results.Add(string.Format("{0} => {1}", min, "Wynik jest zbyt wysoki"));
                }
                else
                {
                    results.Add(string.Format("{0} => {1}", min, Calculate(backup)));
                }


                min += am;
            }
            return(results);
        }
Example #3
0
        List <elementType> CreateONP(string row, ref string infix)
        {
            row = row.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>());
            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 += 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 += 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 += 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 += 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 += 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 += tempString + " ( ";
                        i     += 4;
                        equasions();
                        continue;
                    }
                }

                if (row[i] == '(')
                {
                    infix += "( ";
                    bracketCounter++;
                    if (characters.Count <= bracketCounter)
                    {
                        characters.Add(new Stack <elementType>());
                    }
                    sincosStack.Push(new elementType(elementTypes.BRACKET, "("));
                    bracketIsOpen = true;
                    continue;
                }

                if (row[i] == ')')
                {
                    infix += ") ";
                    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);
        }