首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 根据公式自动计算出结果 [已结贴,结贴人:gengxin_914]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 16:54:17 楼主
    想实现一个根据公式来自动计算结果的功能。
    公式有很多种,根据用户的选择来显示不同的计算公式,然后自动生成文本框供用户输入,最后自动生成计算结果。
    比如用户选择了公式:
    (a+b)*c-d
    页面自动生成4个文本框,由用户自己输入数据后生成结果,不知道能不能事先该功能
    100  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lovefootball
    • 等级:
    发表于:2008-06-13 16:57:491楼 得分:20
    http://www.yaosansi.com/post/446.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • gomoku
    • 等级:
    发表于:2008-06-13 17:00:562楼 得分:0
    为什么要生成4个文本框,让用户直接输入 (1+2)*3-4 不是更直接吗?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 17:06:373楼 得分:0
    主要是对用户选择哪个公式的判定,比如用DropDownList来存储公式,根据用户的选择来判断套用哪一个公式,然后在页面用Controls.Add()生成控件。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mqcan
    • 等级:
    发表于:2008-06-13 17:07:114楼 得分:0
    首先得到公式,然后根据文本框的值,replace到公式中.计算!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 17:07:115楼 得分:40
    C# code
    // Expression.cs - 动态生成数学表达式并计算其值 // 表达式使用 C# 语法,可带一个的自变量(x)。 // 表达式的自变量和值均为(double)类型。 // 使用举例: // Expression expression = new Expression("Math.Sin(x)"); // Console.WriteLine(expression.Compute(Math.PI / 2)); // expression = new Expression("double u = Math.PI - x;" + // "double pi2 = Math.PI * Math.PI;" + // "return 3 * x * x + Math.Log(u * u) / pi2 / pi2 + 1;"); // Console.WriteLine(expression.Compute(0)); using System; using System.CodeDom.Compiler; using Microsoft.CSharp; using System.Reflection; using System.Text; namespace Skyiv.Util { class Demo { static void Main() { string s = "(x+2)*3-4"; double a = (new Expression(s)).Compute(1); Console.WriteLine(a); } } sealed class Expression { object instance; MethodInfo method; public Expression(string expression) { if (expression.IndexOf("return") < 0) expression = "return " + expression + ";"; string className = "Expression"; string methodName = "Compute"; CompilerParameters p = new CompilerParameters(); p.GenerateInMemory = true; CompilerResults cr = new CSharpCodeProvider().CompileAssemblyFromSource(p, string. Format("using System;sealed class {0}{{public double {1}(double x){{{2}}}}}", className, methodName, expression)); if(cr.Errors.Count > 0) { string msg = "Expression(\"" + expression + "\"): \n"; foreach (CompilerError err in cr.Errors) msg += err.ToString() + "\n"; throw new Exception(msg); } instance = cr.CompiledAssembly.CreateInstance(className); method = instance.GetType().GetMethod(methodName); } public double Compute(double x) { return (double)method.Invoke(instance, new object [] { x }); } } }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • mqcan
    • 等级:
    发表于:2008-06-13 17:10:216楼 得分:0
    JScript code
    function Chkfocus() { //alert("OK"); //document.getElementById("inu1").focus(); var str="(a+b)*c+d"; var a=2,b=3,c=4,d=5; alert(eval(str)); }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 17:19:447楼 得分:0
    关键公式有很多,要不我就直接自己写了
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 17:22:348楼 得分:0
    TO:空军兄
    CompilerResults cr =new CSharpCodeProvider().CompileAssemblyFromSource这里报错:
    “Microsoft.CSharp.CSharpCodeProvider”并不包含对“CompileAssemblyFromSource”的定义
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 17:29:549楼 得分:0
    CompileAssemblyFromSource()方法需要.net2.0,也就是Visaul Studio 2005。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 18:21:5110楼 得分:0
    套用词法分析,用一个树来分解公式,至于怎么分解可以去看看《数据结构》,然后把各个变量用文本框显示出来就好了。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    发表于:2008-06-13 18:46:1411楼 得分:20
    C# code
    float i = (float)new DataTable().Compute("1+1", "");
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 20:29:2512楼 得分:20
    http://www.cnblogs.com/wf5360308/articles/1219542.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-13 22:06:4013楼 得分:0
    http://www.cnblogs.com/zjjzhangd/archive/2008/06/13/1220371.html

    看看希望能帮助你
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 07:18:1214楼 得分:0
    直接输入表达式
    当初用C++写的时候,是先将表达式转换为后缀表达式
    然后用一个栈实现运算优先级
    数据结构的书应该都有这个,很典型的

    一个公式输入4个值
    用户不停用的鼠标换控件焦点(或者用Tab,但很少人用)
    用户也挺烦的,累的慌
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-14 08:08:5215楼 得分:0
    大学时写的,凑着用吧。
    C/C++ code
    #include <iostream> #include <stack> #include <cassert> using namespace std; // 获得操作符所对应的比较值 // Expression 公式 // int EnumOP(char op) { switch (op) { case '+': case '-': return 1; case '*': case '/': return 2; case '('://把()中的公式看成是新的公式 case '#': default: return 0; } } // 用于计算操作数栈中两个数,操作符栈中一个操作符所得的值,并保存在操作数栈中 //eter 操作符栈 //eter 操作数栈 double Operation(stack<char> &Op, stack<double> &Data) { //从数据栈中取出两个操作数 assert(Data.size() > 1);//断言,如果表达式中出现语法错误即无法进行 /* if (Data.size() < 2) return 0; */ double rval = Data.top(); Data.pop(); double lval = Data.top(); Data.pop(); char op = Op.top(); Op.pop(); switch(op) { case '+': return lval + rval; case '-': return lval - rval; case '*': return lval * rval; case '/': { if (rval != 0) return lval / rval; else { cout << "division by zero!" << endl; return 0; } } default: /*throw new Exception("Operation dosn't take param with ' '");*/ exit(1); } } //计算 //eter 带常量名的表达式 // Expression的值 double Compute(string Expression) { assert(!Expression.empty()); stack<double> Data; stack<char> Op; int i = 0; char ch = Expression[i]; Op.push('#'); while (i < Expression.size()) { if (ch == ' ')//当为空格时读取下一个char ch = Expression[++i]; if (ch == '(')//当为(时进入操作符栈 { Op.push(ch); } else if (ch == ')')//当为)时把括号里面的操作数计算出来 { while (Op.top() != '(') { //出栈一次操作符,两次数据,进行计算 double result = Operation(Op, Data); Data.push(result);//把结果放进数据栈中 } Op.pop(); } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { if (EnumOP(ch) <= EnumOP(Op.top()))//当获取的操作符(ch)比栈中top的操作符比较值较小或相等时,进行运算. { //出栈一次操作符,两次数据,进行计算 double result = Operation(Op, Data); //Op.pop(); Data.push(result);//把结果放进数据栈中 } Op.push(ch);//把新的操作符插入到操作符栈中 } else if ((ch >= '0' && ch <= '9') || ch == '.') { //把本来数值的数据转成double类型 double x = 0; double y = 0; do { x = x * 10 + ch - '0'; if (++i < Expression.size())//遇到公式最后是数字时判断以离数组越界 ch = Expression[i]; else break; }while (ch >= '0' && ch <= '9'); if (ch == '.') { ch = Expression[++i]; double j = 10.0; do { y = y + (ch - '0') / j; j *= 10; if (++i < Expression.size()) ch = Expression[++i]; else break; } while (ch >= '0' && ch <= '9'); } x += y; Data.push(x); continue; } if (Op.size() > 1)//由于一开始就把'#'插入到操作符栈中,所以当只有#时为空栈. ch = Expression[++i]; else return Data.top(); } while (Op.size() > 1)//把剩余值计算 { //出栈一次操作符,两次数据,进行计算 double result = Operation(Op, Data); //Op.pop(); Data.push(result); } return Data.top(); } //测试 int main() { string str; char expression[128]; //str = "25*2/5+10*2"; //str = " ( 25*2/ 5+10 *2 ) "; cin.getline(expression, 128); while (strcmp(expression, "") != 0) { str = expression; cout << Compute(str) << endl; cin.getline(expression, 128); } system("pause"); return 0; }
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • yagebu1983
    • 等级:
    发表于:2008-06-14 08:59:1316楼 得分:0
    学习了!!
    帮你顶!!
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 10:34:4317楼 得分:0
    如果直接想求出:
    (3000-(314*57)/100)+(300-(15.4*57)/100)+(16.8-(24*57)/100)+(280-(30*57)/100)+(2.88-(0.96*57)/100)+(2.40-(3.825*57)/100)+(0.67-(0.224*57)/100)+(6-(2*57)/100)+(4.12-(4.08*57)/100)+(7.8-(2.6*57)/100)+(1.95-(0.65*57)/100)+(10.99-(3.662*57)/100)+(3.06-(1.02*57)/100)+(2.4-(0.8*57)/100)+(3.42-(1.139*57)/100)
    这个结果该怎么实现啊
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • jinjazz
    • 等级:
    发表于:2008-06-16 10:50:0918楼 得分:0
    C# code
    object obj= new DataTable().Compute("(3000-(314*57)/100)+(300-(15.4*57)/100)+(16.8-(24*57)/100)+(280-(30*57)/100)+(2.88-(0.96*57)/100)+(2.40-(3.825*57)/100)+(0.67-(0.224*57)/100)+(6-(2*57)/100)+(4.12-(4.08*57)/100)+(7.8-(2.6*57)/100)+(1.95-(0.65*57)/100)+(10.99-(3.662*57)/100)+(3.06-(1.02*57)/100)+(2.4-(0.8*57)/100)+(3.42-(1.139*57)/100) ", ""); Console.WriteLine(obj);
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-06-16 11:34:0119楼 得分:0
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved