文本版|topic 高级搜索
   名人堂 帮助 论坛制度 意见反馈 | 首页 博客 周新贴 招聘 专题 新闻
RSS 底部
 
社区导航: 专家门诊   网络技术   操作系统   数据库   程序设计   系统应用   考试认证   CIO及信息化   站长交流   综合交流   下载基地  51CTO产品服务 设为首页 | 收藏本站
51CTO技术论坛» C/C++ » 函数型计算器(VC++6.0,win32 console)       [ 打印]  [ 订阅]  [ 收藏]  [ 推荐给朋友]   [ 本帖文本页]

论坛跳转:
     
标题: [转载] 函数型计算器(VC++6.0,win32 console)  ( 查看:754  回复:0 )   
 
sundexuan
技术员  点击可查看详细



帖子 42
精华 0
无忧币 294
积分 226
阅读权限 30
注册日期 2007-8-17
最后登录 2007-8-24 离线

[查看资料]  [发短消息]  [Blog
       
发表于:2007-8-24 15:56   标题:函数型计算器(VC++6.0,win32 console)
上一帖 |
函数型计算器(VC++6.0,Win32 Console)
    程序由 yu_hua 于2007-07-27设计完成
    功能:目前提供了10多个常用数学函数:
    ⑴正弦sin   ⑵余弦cos   ⑶正切tan⑷开平方sqrt    ⑸反正弦arcsin
    ⑹反余弦arccos  ⑺反正切arctan⑻常用对数lg    ⑼自然对数ln
    ⑽e指数exp     ⑾乘幂函数
    用法:如果要求2的32次幂,可以打入,2^32回车>如果要求30度角的正切可,键入tan(Pi/6)回车>注意不能打入:tan(30)如果要求1.23弧度的。正弦,有几种方法都有效:
    sin(1.23)
    sin 1.23
    sin1.23  
    如果验证正余弦的平方和公式,可打入
    sin(1.23)^2+cos(1.23)^2 或
    sin1.23^2+cos1.23^2 此外两
    函数表达式连在一起,自动理解为相乘
    如:sin1.23cos0.77+cos1.23sin0.77
    就等价于
    sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77)
    当然你还可以依据三角变换,再用
    sin(1.23+0.77)也即sin2验证一下。
    本计算器充分考虑了运算符的优先级
    因此诸如:2+3*4^2 实际上相当于:
    2+(3*(4*4))另外函数名前面如果是
    数字,那么自动认为二者相乘.同理,
    如果某数的右侧是左括号,则自动
    认为该数与括弧项之间隐含一乘号。
    如:3sin1.2^2+5cos2.1^2 相当于
    3*sin2(1.2)+5*cos2(2.1) 又如:
    4(3-2(sqrt5-1)+ln2)+lg5 相当于
    4*(3-2*(√5 -1)+loge(2))+log10(5)
    此外,本计算器提供了圆周率 Pi
    键入字母时不区分大小写,以方便使用。
----------------------------------------*/
#include
#include
#include
#include
#include
#include
using namespace std;
const char Tab=0x9;
const int  DIGIT=1;
double fun(double x,char op[],int *iop)
{
    while(op[*iop-1]本行使得函数嵌套调用时不必加括号
//  如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234
    switch(op[*iop-1])
    {
        case  7: x=sin(x);  (*iop)--;break;
        case  8: x=cos(x);  (*iop)--;break;
        case  9: x=tan(x);  (*iop)--;break;
        case 10: x=sqrt(x); (*iop)--;break;
        case 11: x=asin(x); (*iop)--;break;
        case 12: x=acos(x); (*iop)--;break;
        case 13: x=atan(x); (*iop)--;break;
        case 14: x=log10(x);(*iop)--;break;
        case 15: x=log(x);  (*iop)--;break;
        case 16: x=exp(x);  (*iop)--;break;
    }
    return x;
}
double calc(char *expr,char **addr)
{
    static deep; //递归深度
    static char *fname[]={ "sin","cos","tan","sqrt",
    "arcsin","arccos","arctan","lg","ln","exp",NULL};
    double ST[10]={0.0}; //数字栈
    char op[10]={'+'}; //运算符栈
    char c,*rexp,*pp,*pf;
    int ist=1,iop=1,last;
    if(!deep)
    {
        pp=pf=expr;
        do
        {
        c = *pp++;
        if(c!=' '&& c!=Tab)
        *pf++ = c;
        }
        while(c!='\0');
    }
    pp=expr;
    if((c=*pp)=='-'||c=='+')
    {
        op[0] = c;
        pp++;
    }
    last = !DIGIT;
    while((c=*pp)!='\0')
    {
        if(c=='(')//左圆括弧
        {
            deep++;
            ST[ist++]=calc(++pp,addr);
            deep--;
            ST[ist-1]=fun(ST[ist-1],op,&iop);
            pp = *addr;
            last = DIGIT;
            if(*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2))
            {                   ////目的是:当右圆括弧的
                op[iop++]='*'; ////右恻为左圆括弧或函数
                last = !DIGIT; ////名字时,默认其为乘法
                c = op[--iop]; /////////////////////////////
                goto operate ; /////////////////////////////
            }
        }
        else if(c==')')//右圆括弧
        {
            pp++;
            break;
        }
        else if(isalpha(c))
        {
            if(!strnicmp(pp,"Pi",2))
            {
                if(last==DIGIT){cout左侧遇)" 两个π相连" 右侧遇(" 陌生函数名" 运算符粘连" 乘幂符连用" 两数字粘连" 非法字符" =ist){cout表达式有误"
int main()
{
    char s[128],*end;
    system("chcp 936"); //中文代码页
    while(1)
    {
        cout 请输入表达式:";
        cin.getline(s,128);
        cout <<seprecision(17)<<calc(s,&end)<<endl;
   }
return 0;
}

[ 本帖最后由 sundexuan 于 2007-8-24 16:01 编辑 ]



网络工程师到底该不该去考CCIE认证?
2007-8-24 15:561楼
[ 顶部 ]
     
论坛跳转:  

| | |

标记已读 · 删除论坛Cookies · 文本版 · WAP
 
| 诚征版主 | 版主堂 | 意见建议 | 大史记 | 论坛地图
Copyright©2005-2008 51CTO.COM  Powered by Discuz!
本论坛言论纯属发布者个人意见,不代表51CTO网站立场!如有疑义,请与管理员联系。
京ICP备05051492号