Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > .NET
Перезагрузить страницу Excel и C# как с ними работать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
ComatoZZZ ComatoZZZ вне форума
Member
 
Сообщений: 100
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2007
По умолчанию Excel и C# как с ними работать - 22.04.2008, 17:08

в какой библиотеке находится мат часть экселя?
нужна только одна функция
MessageBox.Show(new Microsoft.Office.Interop.Excel.Application().Evalu ate("1+1").ToString());
если делать так то нужно ставить эксель. а нужно без него.
Подскажите как можно сделать. есть ли библиотеки аналоги?
Ответить с цитированием
  (#2 (permalink)) Старый
Rius Rius вне форума
Программист
 
Аватар для Rius
 
Сообщений: 7,810
Сказал(а) спасибо: 24
Поблагодарили 991 раз(а) в 972 сообщениях
Регистрация: 27.08.2004
Адрес: Russian Federation
По умолчанию 22.04.2008, 21:39

ExpressionParser (анализатор выражений)
Шилдт, Герберт. Полный справочник по C#.: Пер. с англ. - М.: Издательский дом "Вильямс", 2004. - 752с.: ил. - Парал. тит. англ. ISBN 5-8459-0563-X (рус.)

Код:
using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace ExpressionParser
{
    /// <summary>
    /// Класс исключения для обнаружения ошибок анализатора
    /// </summary>
    class ParserException : ApplicationException
    {
        public ParserException(string str) : base(str) { }
        public override string ToString()
        {
            return Message;
        }
    }
    /// <summary>
    /// Класс анализа математических выражений
    /// </summary>
    public class Parser
    {
        public Parser()
        {
            //
            // TODO: Add constructor logic here
            //
            //for(int i=0; i< vars.Length; i++) vars[i] = 0.0;
            mVars = new Dictionary<string, double>();
            mShowErrorMessages = true;
        }
        /// <summary>
        /// Массив переменных
        /// </summary>
        //double []vars = new double[26];
        private Dictionary <String, double> mVars;
        private bool mShowErrorMessages;
        /// <summary>
        /// Показывать ли сообщения об ошибках
        /// </summary>
        public bool ShowErrorMessages
        {
            get
            {
                return mShowErrorMessages;
            }
            set
            {
                mShowErrorMessages = value;
            }
        }
        /// <summary>
        /// Входная точка анализатора
        /// </summary>
        /// <param name="exprstr">Строка выражения</param>
        /// <returns>Вычисленное значение</returns>
        public double Evaluate(string exprstr)
        {
            double result = 0.0;
            exp = exprstr;
            expIdx = 0;
            try
            {
                GetToken();
                if (token == "")
                {
                    SyntaxErr(Errors.NoExp);//выражение отсутствует
                    return 0.0;
                }
                EvalExp1(out result);
                if (token != "")//Последняя лексема должна быть null-значением
                    SyntaxErr(Errors.Syntax);
                return result;
            }
            catch (ParserException exc)
            {
                //Console.WriteLine(exc);
                //MessageBox.Show("При вычислении выражения \"" + exprstr + "\"\nпроизошла ошибка \"" + exc,
                //    "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                return Double.NaN;;
            }
        }
        public void ClearVars()
        {
            mVars.Clear();
        }

        private string exp;        //строка выражения
        private int expIdx;        //текущий индекс в выражении
        private string token;    //текущая лексема
        private Types tokType;    //тип лексемы

        private void GetToken()
        {
            tokType = Types.None;
            token = "";

            if (expIdx == exp.Length) return;//конец выражения

            //пропускаем пробелы
            while (expIdx < exp.Length &&
                Char.IsWhiteSpace(exp[expIdx])) ++expIdx;

            //хвостовой пробел завершает выражение
            if (expIdx == exp.Length) return;

            if (IsDelim(exp[expIdx]))//если это оператор
            {
                token += exp[expIdx];
                expIdx++;
                tokType = Types.Delimiter;
            }
            else if (Char.IsLetter(exp[expIdx]))//если это переменная
            {
                while (!IsDelim(exp[expIdx]))
                {
                    token += exp[expIdx];
                    expIdx++;
                    if (expIdx >= exp.Length) break;
                }
                tokType = Types.Variable;
            }
            else if (Char.IsDigit(exp[expIdx]))//если это число
            {
                while (!IsDelim(exp[expIdx]))
                {
                    token += exp[expIdx];
                    expIdx++;
                    if (expIdx >= exp.Length) break;
                }
                tokType = Types.Number;
            }
        }
        private bool IsDelim(char c)
        {
            if ((" +-/*%=()".IndexOf(c) != -1))
                return true;
            return false;
        }
        /// <summary>
        /// Обработка присвоения
        /// </summary>
        /// <param name="result">Результат</param>
        private void EvalExp1(out double result)
        {
            int varIdx;
            Types ttokType;
            string tempToken;

            if (tokType == Types.Variable)
            {
                //сохранение старой лексемы
                tempToken = String.Copy(token);
                ttokType = tokType;
                //вычисление индекса переменной
                //varIdx = Char.ToUpper(token[0]) - 'A';
                GetToken();
                if (token != "=")
                {
                    PutBack();//возвращение текущей лексемы в поток и восстановление старой, т.к. не было присвоения
                    token = String.Copy(tempToken);
                    tokType = ttokType;
                }
                else
                {
                    GetToken();//получаем следующую часть выражения exp
                    EvalExp2(out result);
                    //vars[varIdx] = result;
                    if (!mVars.ContainsKey(tempToken))
                    {
                        mVars.Add(tempToken, result);
                    }
                    else
                    {
                        mVars[tempToken] = result;
                    }
                    return;
                }
            }
            EvalExp2(out result);
        }
        /// <summary>
        /// Сложение или вычитание двух членов выражения.
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void EvalExp2(out double result)
        {
            string op;
            double partialResult = 0.0;
            EvalExp3(out result);
            while ((op = token) == "+" || op == "-")
            {
                GetToken();
                EvalExp3(out partialResult);
                switch (op)
                {
                    case "-":
                        result = result - partialResult;
                        break;
                    case "+":
                        result = result + partialResult;
                        break;
                }
            }
        }
        /// <summary>
        /// Умножение или деление двух множителей
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void EvalExp3(out double result)
        {
            string op;
            double partialResult = 0.0;
            EvalExp4(out result);
            while ((op = token) == "*" || op == "/" || op == "%")
            {
                GetToken();
                EvalExp4(out partialResult);
                switch (op)
                {
                    case "*":
                        result = result * partialResult;
                        break;
                    case "/":
                        if (partialResult == 0.0) SyntaxErr(Errors.DivByZero);
                        result = result / partialResult;
                        break;
                    case "%":
                        if (partialResult == 0.0) SyntaxErr(Errors.DivByZero);
                        result = (int)result % (int)partialResult;
                        break;
                }
            }
        }
        /// <summary>
        /// Возведение в степень
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void EvalExp4(out double result)
        {
            double partialResult, ex;
            int t;
            EvalExp5(out result);
            if (token == "^")
            {
                GetToken();
                EvalExp4(out partialResult);
                ex = result;
                if (partialResult == 0.0)
                {
                    result = 1.0;
                    return;
                }
                for (t = (int)partialResult - 1; t > 0; t--)
                    result = result * (double)ex;
            }
        }
        /// <summary>
        /// Операция унарного + или -
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void EvalExp5(out double result)
        {
            string op;
            op = "";
            if ((tokType == Types.Delimiter) && token == "+" || token == "-")
            {
                op = token;
                GetToken();
            }
            EvalExp6(out result);
            if (op == "-") result = -result;
        }
        /// <summary>
        /// Обработка выражений в круглых скобках
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void EvalExp6(out double result)
        {
            if (token == "(")
            {
                GetToken();
                EvalExp2(out result);
                if (token != ")")
                    SyntaxErr(Errors.Unbalparens);
                GetToken();
            }
            else
                Atom(out result);
        }
        /// <summary>
        /// Получение значения числа
        /// </summary>
        /// <param name="result">Вычисленное значение</param>
        private void Atom(out double result)
        {
            switch (tokType)
            {
                case Types.Number:
                    try
                    {
                        result = Double.Parse(token);
                    }
                    catch (FormatException)
                    {
                        result = 0.0;
                        SyntaxErr(Errors.Syntax);
                    }
                    GetToken();
                    break;
                case Types.Variable:
                    result = FindVar(token);
                    GetToken();
                    break;
                default:
                    result = 0.0;
                    SyntaxErr(Errors.Syntax);
                    break;
            }
        }
        /// <summary>
        /// Получение значения переменной
        /// </summary>
        /// <param name="vname">Имя переменной</param>
        /// <returns>Значение переменной</returns>
        private double FindVar(string vname)
        {
            if (!Char.IsLetter(vname[0]))
            {
                SyntaxErr(Errors.Syntax);
                return 0.0;
            }
            if (!mVars.ContainsKey(vname))
            {
                SyntaxErr(Errors.VariableNotFound);
                return 0.0;
            }
            //return vars[Char.ToUpper(vname[0]) - 'A'];
            return mVars[vname];
        }
        private void PutBack()
        {
            for (int i = 0; i < token.Length; i++) expIdx--;
        }
        /// <summary>
        /// Обработка синтаксических ошибок
        /// </summary>
        /// <param name="error"></param>
        private void SyntaxErr(Errors error)
        {
            if (mShowErrorMessages)
            {
                string[] err = {
                            "Синтаксическая ошибка",
                            "Дисбаланс скобок",
                            "Выражение отсутствует",
                            "Деление на ноль",
                            "Переменная не найдена (значение не присвоено)"};
                throw new ParserException(err[(int)error]);
            }
        }
    }
    /// <summary>
    /// Типы лексем
    /// </summary>
    enum Types { None, Delimiter, Variable, Number };
    /// <summary>
    /// Типы ошибок
    /// </summary>
    enum Errors { Syntax, Unbalparens, NoExp, DivByZero, VariableNotFound };
}
Ответить с цитированием
  (#3 (permalink)) Старый
ComatoZZZ ComatoZZZ вне форума
Member
 
Сообщений: 100
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 09.06.2007
По умолчанию 23.04.2008, 00:29

Большое спасибо!
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макросы VBA Excel как с ними работать Z@R(!)N@ Visual Basic 0 23.03.2011 02:26
VBA Excel и MySQL как с ними работать melkii_add Visual Basic 0 19.11.2008 16:02
Списки как с ними работать monday С/С++ 7 19.03.2008 03:30
DLL библиотеки как с ними работать Exmap .NET 1 15.01.2008 22:07
Сокеты как с ними работать Norf Сетевое программирование 1 25.03.2007 18:52
Списки как с ними работать gleban С/С++ 9 09.06.2006 18:17
C++ и SCO как с ними работать c++ Мысли вслух 6 28.01.2006 07:50
Метки как с ними работать Alter Pascal 5 26.12.2005 22:28
Как заставить работать проект Excel 2002 в Excel 20023? Alex25 Visual Basic 3 21.07.2005 01:03
STL исключения как с ними работать ARSi С/С++ 15 22.02.2005 16:33
Кватернионы как с ними работать Frankinshtein Программирование графики 8 22.02.2004 19:36
IIS и ASP как с ними работать Anonymous ASP 2 04.04.2003 18:24



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов