| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2606 人关注过本帖
标题:计算表达式 括号的嵌套问题
只看楼主 加入收藏
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
结帖率:94.44%
收藏
 问题点数:0 回复次数:2 
计算表达式 括号的嵌套问题
程序代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
int sum[20][3];
int search(int i);
int left(int k);
int chuli(int a,int b,char ch[]);
int main()
{
    char ch[100];
    int i,t,k,j,u=0;
    gets(ch);
    t=strlen(ch);
    j=0;
    for(i=0;i<t;i++)
    {
        if(ch[i]=='(')   //记录所有括号的对数
            u++;
    }
    while(u--)
    {
        for(i=0;i<t;i++)
        {
            k=i;
            if(ch[i]=='l') continue;
            if(ch[i]=='('&&k<t)
            {
                k=i+1;
                while(ch[k]!='('&&k<t)
                {
                    k++;
                    if(ch[k]==')')
                    {
                        sum[j][0]=i;sum[j][1]=k;ch[i]='l';ch[k]='r';j++;break;  //将括号所在位子记下
                    }
                }
                if(ch[k]=='r') break;
            }
        }
    }
    
    for(i=0;i<j;i++)
    {
        sum[i][2]=chuli(sum[i][0],sum[i][1],ch); //计算每一对括号里的值
    }
    printf("%d",sum[j-1][2]);
    return 0;
}
int chuli(int a,int b,char ch[])  //该函数用来计算
{
    int i,p[10],k,l,num[10],m=0,end;
    char c;
    for(i=a;i<b;i++)
    {
        if(ch[i]=='r'||ch[i]=='b') continue;
        if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*') //记录括号里的符号
        {
            c=ch[i];ch[i]='b';
        }
        if(isdigit(ch[i]))
        {
            k=i;l=0;num[m]=0;
            while(isdigit(ch[k])||ch[k]=='l')
            {
                if(ch[k]=='l')  //如果是括号里嵌套括号,将里面的值找出来
                {
                    num[m]=search(k);  
                    k=left(k); //跳过嵌套的括号
                    m++;k++;continue;
                }
                if(ch[i]=='r'||ch[i]=='b') continue;
                p[l]=ch[k]-'0';ch[k]='b';k++;l++;  //将一连串数字的字符(即一个数的各个位上的数字)转化成整型赋给数组p
            }
            i=k;
            for(k=0;k<l;k++)
            {
                num[m]=num[m]+p[k]*pow(10,l-k-1);m++;   //将数组p中的数字转化成真正的数,赋给数组num
            }
        }
        if(ch[i]=='-'&&isdigit(ch[i]))  //考虑负数
        {
            ch[i]='b';k=i+1;l=0;num[m]=0;
            while(isdigit(ch[k])||ch[k]=='l')
            {
                if(ch[k]=='l') 
                {
                    num[m]=search(k);
                    k=left(k);
                    m++;k++;continue;
                }
                if(ch[i]=='r'||ch[i]=='b') continue;
                p[l]=ch[k]-'0';ch[k]='b';k++;l++;
            }
            i=k;
            for(k=0;k<l;k++)
            {
                num[m]=num[m]+p[k]*pow(10,l-k-1);m++;
            }
            num[m]=-num[m];
        }
    }
    if(c=='+') //开始计算括号里的数
    {
        end=0;
        for(i=0;i<m;i++)
        {
            end=end+num[i];
        }
    }
    if(c=='-')
    {
        end=num[0];
        for(i=1;i<m;i++)
        {
            end=end-num[i];
        }
    }
    if(c=='*')
    {
        end=1;
        for(i=0;i<m;i++)
        {
            end=end*num[i];
        }
    }
    return end;
}
int search(int i) //找寻嵌套括号所表示的值
{
    int c,end;
    for(c=0;;c++)
    {
        if(i==sum[c][0])
        {
            end=sum[c][2];break;
        }
    }
    return end;
}
int left(int k) //找寻嵌套括号,')'所在的位子
{
    int i,end;
    for(i=0;;i++)
    {
        if(k==sum[i][0])
        {
            end=sum[i][1];break;
        }
    }
    return end;
}

(+ 2 3 4 5)

表示2+3+4+5,其值为14

(* 2 3 5)

表示2*3*5,其值为30

减法可以表示为:

(- 2 3 4)

表示:2-3-4=-5

即括弧中第一个符号为运算符,后面是操作数,改运算也可以嵌套,比如

(* (+ 2 3) 6)

表示先计算2+3=5,然后再5*6=30
要求:给出一个这样的例子,然后计算其值。
写的不好看,拜托各位大侠看看,如果只有一个括号是没有问题的,但是一旦括号里面套了个括号,就出现问题了
搜索更多相关主题的帖子: 表达式 
2011-12-14 17:18
傻瓜菜
Rank: 2
来 自:earth
等 级:论坛游民
帖 子:73
专家分:66
注 册:2011-10-4
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<ctype.h>
int sum[20][3];
int search(int i);
int left(int k);
int chuli(int a,int b,char ch[]);
int main()
{
    char ch[100];
    int i,t,k,j,u=0;
    gets(ch);
    t=strlen(ch);
    j=0;
    for(i=0;i<t;i++)
    {
        if(ch[i]=='(')   
            u++;
    }
    while(u--)
    {
        for(i=0;i<t;i++)
        {
            k=i;
            if(ch[i]=='l') continue;
            if(ch[i]=='('&&k<t)
            {
                k=i+1;
                while(ch[k]!='('&&k<t)
                {
                    k++;
                    if(ch[k]==')')
                    {
                        sum[j][0]=i;sum[j][1]=k;ch[i]='l';ch[k]='r';j++;break;  
                    }
                }
                if(ch[k]=='r') break;
            }
        }
    }
    for(i=0;i<j;i++)
    {
        sum[i][2]=chuli(sum[i][0],sum[i][1],ch); 
    }
    printf("%d",sum[j-1][2]);
    return 0;
}
int chuli(int a,int b,char ch[])  
{
    int i,p[10],k,l,num[10],m=0,end;
    char c;
    for(i=a+1;i<b;i++)
    {
        if(ch[i]=='r'||ch[i]=='b') continue;
        if(ch[i]=='+'||ch[i]=='-'||ch[i]=='*') 
        {
            c=ch[i];ch[i]='b';
        }
        if(isdigit(ch[i])||ch[i]=='l')
        {
            k=i;l=0;num[m]=0;
            while(isdigit(ch[k])||ch[k]=='l')
            {
                if(ch[k]=='l')  
                {
                    num[m]=search(k);  
                    k=left(k); 
                    m++;num[m]=0;k++;continue;
                }
                else
                {
                    p[l]=ch[k]-'0';ch[k]='b';k++;l++;  
                }
            }
            i=k;num[m]=0;
            for(k=0;k<l;k++)
            {
                num[m]=num[m]+p[k]*pow(10,l-k-1); 
            }
            m++;
        }
        if(ch[i]=='-'&&isdigit(ch[i]))  
        {
            ch[i]='b';k=i+1;l=0;num[m]=0;
            while(isdigit(ch[k])||ch[k]=='l')
            {
                if(ch[k]=='l') 
                {
                    num[m]=search(k);
                    k=left(k);
                    m++;num[m]=0;k++;continue;
                }
                else
                {
                    p[l]=ch[k]-'0';ch[k]='b';k++;l++;
                }
            }
            i=k;num[m]=0;
            for(k=0;k<l;k++)
            {
                num[m]=num[m]+p[k]*pow(10,l-k-1);m++;
            }
            num[m]=-num[m];
        }
    }
    if(c=='+') 
    {
        end=0;
        for(i=0;i<m;i++)
        {
            end=end+num[i];
        }
    }
    if(c=='-')
    {
        end=num[0];
        for(i=1;i<m;i++)
        {
            end=end-num[i];
        }
    }
    if(c=='*')
    {
        end=1;
        for(i=0;i<m;i++)
        {
            end=end*num[i];
        }
    }
    return end;
}
int search(int i) 
{
    int c,end;
    for(c=0;;c++)
    {
        if(i==sum[c][0])
        {
            end=sum[c][2];break;
        }
    }
    return end;
}
int left(int k) 
{
    int i,end;
    for(i=0;;i++)
    {
        if(k==sum[i][0])
        {
            end=sum[i][1];break;
        }
    }
    return end;
}



我修改了代码,可是还是WA,无语了,崩溃啦
2011-12-14 20:04
hcl1008
Rank: 1
等 级:新手上路
帖 子:18
专家分:9
注 册:2011-12-8
收藏
得分:0 
飘过哦!
2011-12-16 20:13
快速回复:计算表达式 括号的嵌套问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025615 second(s), 7 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved