| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1984 人关注过本帖, 1 人收藏
标题:小弟经过九九八十一难写出了一个运算器
只看楼主 加入收藏
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
结帖率:100%
收藏(1)
已结贴  问题点数:100 回复次数:26 
小弟经过九九八十一难写出了一个运算器
小弟经过九九八十一难写出了一个运算器,仅支持加减乘除以及平方(^)运算,括号不分大中小,支持多重括号,支持负数,支持空格.例如输入一个字符串:1+(2*(2+3)),输出11.
运行成功的一刻,真是泪流满面啊。不过个人觉得仍有地方可以改进,不过凭小弟的功力却是不行了,请各位大神们提出你们的宝贵建议。
程序代码:
#include<math.h>
#include<stdio.h>
#include<string.h>
char str[200];                     
double data[121];
void str_clear(int start,int change,int size);
void str_clear(int start,int change,int size)
{
    str[start]=change;
    for(;str[start+size-1]!='\0';start++)
        str[start+1]=str[start+size];           
}
void data_change(int,int);
void data_change(int start,double change)
{
    data[start]=change;
}
int main()
{
    int data_num=1;
    gets(str);
    for(int j=0;j<(int)strlen(str);j++)
    {
        if(str[j]==' ')
        {str_clear(j,str[j+1],2);j--;}
    }
    for(int i=0;i< (int)strlen(str) ;i++)
        {
            if(str[i]<='9' && str[i]>='0')
                {
                    int n=0;                           
                    for(int a=i;str[a]<='9' && str[a]>='0';a++)
                {
                    n*=10;
                    n+=str[a]-48;
                }
            if (data_num=='(' || data_num==')' || data_num=='+' || data_num=='-' || data_num=='*' || data_num=='/')
            data_num++;
            if(str[i-1]=='-' && (str[i-2]=='(') || i==1)
                {
                    n*=-1; 
                    data[data_num]=(double)n;
                    str_clear(i-1,data_num++,a-i+1);
                    continue;
                }
            
            data[data_num]=(double)n;
            str_clear(i,data_num++,a-i);
        }
    }

while(str[1]!='\0')
{   
    for(int g=0;g<strlen(str);g++) 
{        
        if(str[g]=='^' && str[g-1]!=')' && str[g+1]!='(')
{                
            data_change(str[g-1],pow(data[str[g-1]],data[str[g+1]]));
            str_clear(g-1,str[g-1],3);
}
}    




    for(g=0;g<(int)strlen(str);g++)
    {    if((str[g]=='*' || str[g]=='/') && str[g-1]!=')' &&str[g+1]!='(' && str[g+2]!='^' && str[g-2]!='^')
        {    
            if(str[g]=='*')
            {
                data_change(str[g-1],data[str[g-1]]*data[str[g+1]]);
                str_clear(g-1,str[g-1],3);
            }
            else
            {
                data_change(str[g-1],data[str[g-1]]/data[str[g+1]]);
                str_clear(g-1,str[g-1],3);
            }    
            g--;
        }
    }

    for( g=0;g<(int)strlen(str);g++)
    {    
                if((str[g]=='+' || str[g]=='-') && str[g-1]!=')' &&str[g+1]!='(' && str[g+2]!='*' && str[g+2]!='/' && str[g+2] !='^' && str[g-2]!='*' && str[g-2]!='/' && str[g-2] !='^' )
    {
        if(str[g]=='+' && (str[g-2]=='+' || str[g-2]=='(' || g==1))
        {
        data_change(str[g-1],data[str[g-1]]+data[str[g+1]]);
        str_clear(g-1,str[g-1],3);
        g--;
        }
        else if(str[g-2]=='+' || str[g-2]=='(' || g==1)
        {
        data_change(str[g-1],data[str[g-1]]-data[str[g+1]]);
        str_clear(g-1,str[g-1],3);
        g--;
        }
      
       
    }
    }
for( g=0;g<(int)strlen(str);g++)
{
    if(str[g]=='(' && str[g+2]==')')
    str_clear(g,str[g+1],3);
}

}
printf("\n%f\n",data[str[0]]);
return 0;
}

 


[ 本帖最后由 a745043791 于 2012-8-10 09:58 编辑 ]
搜索更多相关主题的帖子: color 字符串 加减乘除 
2012-08-09 15:00
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
膜拜大作 膜拜大牛
2012-08-09 15:04
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
程序代码:
#include<stdio.h>
#include<string.h>

char str[200];                    
double data[121];

void str_clear(int start,int change,int size);

void str_clear(int start,int change,int size)
{
    str[start]=change;
    for(;str[start+size-1]!='\0';start++)
        str[start+1]=str[start+size];          
}

void data_change(int,int);

void data_change(int start,double change)
{
    data[start]=change;
}

int main()
{
    int data_num=1;
    scanf("%s",str);
    for(int i=0;i< (int)strlen(str) ;i++)
    {
        if(str[i]<='9' && str[i]>='0')
        {
            int n=0;                          
            for(int a=i;str[a]<='9' && str[a]>='0';a++)
            {
                n*=10;
                n+=str[a]-48;
            }
            if (data_num=='(' || data_num==')' || data_num=='+' || data_num=='-' || data_num=='*' || data_num=='/')
                data_num++;
            data[data_num]=(double)n;
            str_clear(i,data_num++,a-i);
        }
    }

    while(str[1]!='\0')
    {  
        for(int g=0;g<(int)strlen(str);g++)
        {    if((str[g]=='*' || str[g]=='/') && str[g-1]!=')' &&str[g+1]!='(')
            {  
                if(str[g]=='*')
                {
                    data_change(str[g-1],data[str[g-1]]*data[str[g+1]]);
                    str_clear(g-1,str[g-1],3);
                }
                else
                {
                    data_change(str[g-1],data[str[g-1]]/data[str[g+1]]);
                    str_clear(g-1,str[g-1],3);
                }  
                g--;
            }
        }

        for( g=0;g<(int)strlen(str);g++)
        {  
            if((str[g]=='+' || str[g]=='-') && str[g-1]!=')' &&str[g+1]!='(')
            {
                if(str[g]=='+')
                {
                    data_change(str[g-1],data[str[g-1]]+data[str[g+1]]);
                    str_clear(g-1,str[g-1],3);
                }
                else
                {
                    data_change(str[g-1],data[str[g-1]]-data[str[g+1]]);
                    str_clear(g-1,str[g-1],3);
                }
                g--;
            }
        }
        for( g=0;g<(int)strlen(str);g++)
        {
            if(str[g]=='(' && str[g+2]==')')
                str_clear(g,str[g+1],3);
        }

    }
    printf("\n%f\n",data[str[0]]);
    return 0;
}



哪个更好看呢
2012-08-09 15:05
stophin
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:3
帖 子:227
专家分:618
注 册:2010-3-26
收藏
得分:36 
3+(((9+8)-7+8)*7)
输出结果为17.000000
但是真正的结果是129.000000
多重括号换种方式就不能用了
2012-08-09 15:28
马也
Rank: 1
等 级:新手上路
帖 子:31
专家分:7
注 册:2012-1-24
收藏
得分:2 
mark一下,有空看细看~
2012-08-09 15:40
wangxiang935
Rank: 3Rank: 3
来 自:南京
等 级:论坛游侠
帖 子:177
专家分:179
注 册:2012-7-11
收藏
得分:2 
牛~~你学了多长时间了啊
2012-08-09 16:12
zhoufeng1988
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:北京
等 级:贵宾
威 望:27
帖 子:1432
专家分:6329
注 册:2009-5-31
收藏
得分:2 
来看看~
2012-08-09 16:16
御版美钱
Rank: 2
等 级:论坛游民
帖 子:5
专家分:12
注 册:2012-7-20
收藏
得分:2 
回复 2楼 zklhp
这不是汇编大牛吗
2012-08-09 16:33
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用御版美钱在2012-8-9 16:33:43的发言:

这不是汇编大牛吗

汇编大牛是什么 好吃么
2012-08-09 16:55
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
回复 4楼 stophin
谢谢大神帮我发现这个bug ,程序已改,bug已除。
2012-08-09 16:56
快速回复:小弟经过九九八十一难写出了一个运算器
数据加载中...
 
   



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

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