| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1984 人关注过本帖, 1 人收藏
标题:小弟经过九九八十一难写出了一个运算器
取消只看楼主 加入收藏
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
结帖率:100%
收藏(1)
已结贴  问题点数:100 回复次数:4 
小弟经过九九八十一难写出了一个运算器
小弟经过九九八十一难写出了一个运算器,仅支持加减乘除以及平方(^)运算,括号不分大中小,支持多重括号,支持负数,支持空格.例如输入一个字符串: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
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
回复 4楼 stophin
谢谢大神帮我发现这个bug ,程序已改,bug已除。
2012-08-09 16:56
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
回复 16楼 madfrogme
不行的。
2012-08-09 21:58
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
回复 19楼 pangding
这个没有问题。
2012-08-10 08:49
a745043791
Rank: 4
等 级:业余侠客
帖 子:95
专家分:260
注 册:2012-2-12
收藏
得分:0 
谢谢前面几位朋友的建议,程序已改,新增次方运算,负数支持,空格支持,如程序有bug请及时提醒,小弟在这里先谢过了。
对了,小弟并不是什么大牛,高手,小弟只是一个自学c语言几月的一个刚入门的菜鸟,距离高手还有很远的距离,我希望和众菜鸟一起学习,早日成为高手。
2012-08-10 10:05
快速回复:小弟经过九九八十一难写出了一个运算器
数据加载中...
 
   



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

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