搜索
查看: 1482|回复: 6
打印 上一主题 下一主题

[原创] 自己做得 一个表达式求值....

[复制链接]
跳转到指定楼层
楼主
发表于 2013-3-22 08:34:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
....12年12月做的  由于水平问题  有什么问题  请见谅
沙发
 楼主| 发表于 2013-3-22 08:35:20 | 只看该作者
/*
        任意输入算式 可以有括号()【】            目前仅支持正数
*/

#include<stdlib.h>
double shuanshi[100];                //算式
double jdss[100]; int s=0;         //简单算式的长度
int cd;                        //长度   
int kuohw[100];        //存放括号在算式中的位置
int kuoh[100];        //存放括号
int kuoh1=-1;         //前一个..  
int yc()
{       
        if(kuoh1==99 )return 0;
        return 1;
}
int jz(char a)
{       
        if(yc()==1)
        {
                kuoh[++kuoh1]=a;
        }
}
int cz()
{       
        kuoh1=kuoh1-1;
}                                                                                                                        
double ys(double z,int f,double y)//运算
{
        switch(f)
        {
                case -50000:return z+y;        
                case -60000:return z-y;
                case -70000:return z*y;        
                case -80000:
                {
                        if(y!=0)return z/y;
                        else
                        {
                                printf("除数不能为零!\n");  
                                exit(0);
                        }
                }
                case -90000:return z*10+y;
        }
}
double changjisuan(double cjs[],int changd) //数组,长度   //返回计算后的值 ( )【 】 + - * /  -10000至-80000   //不能有括号
{
        int i;
        for(i=0;i<changd;)
        {
                if(cjs[i]==-70000 || cjs[i]==-80000)
                {
                        cjs[i+1]=ys(cjs[i-1],cjs[i],cjs[i+1]);
                        changd=hbz(cjs,i-1,i+1,changd);  //数组的合并
                        continue;
                }
                i++;
        }
        for(i=0;i<changd;)
        {
                if(cjs[i]==-50000 || cjs[i]==-60000)
                {
                        cjs[i+1]=ys(cjs[i-1],cjs[i],cjs[i+1]);
                        changd=hbz(cjs,i-1,i+1,changd);  //数组的合并
                        continue;
                }
                i++;
        }
        return cjs[0];               
}
int hbz(double sz[],int a,int b,int changdu)//数组 首位和末位 changdu //返回修改后长度..
{
        int c,d;
        for(c=0;c<(changdu-a);c++)
        {       
                sz[a+c]=sz[b+c];
        }
        return changdu-(b-a);                       
}
void huoqu(double c[],int a,int b)  //获取没有括号的数组
{
        int i2;
        for(i2=0;i2<(b-a);i2++)
        {
                jdss[i2]=c[a+1+i2];
        }
}
double keng(int cahngd)
{       
        int b,c=-1,d;
        double jieguo;
        b=0;       
        for(b=0;b<cahngd;b++)                //去括号
        {
                if(shuanshi[b]==-10000 || shuanshi[b]==-30000)
                {
                        c++;
                        kuohw[c]=b;
                        kuoh[c]=shuanshi[b];       
                }
                if(shuanshi[b]==-20000 && kuoh[c]==-10000 || shuanshi[b]==-40000 && kuoh[c]==-30000)
                {
                                huoqu(shuanshi,kuohw[c],b);
                                shuanshi[b]=changjisuan(jdss,b-kuohw[c]);
                                cahngd=hbz(shuanshi,kuohw[c],b,cahngd);
                                b=kuohw[c];
                                c--;                               
                }
        }
        jieguo=changjisuan(shuanshi,cahngd);
        return jieguo;
}
int fuhao(char a)
{
        if(kuoh1==-1 && (a==')' || a==']')) return 0;       
        if(a=='(' || a=='[')
        {
                jz(a);
                return 1;
        }
        switch(a)
        {
                case ')':
                {       
                        if(kuoh[kuoh1]=='(')
                        {
                                cz();
                                return 1;
                        }
                         else return 0;       
                }
                case ']':               
                {                                     
                         if(kuoh[kuoh1]=='[')
                        {
                                cz();
                                return 1;
                        }            
                        else return        0;             
                 }                     
        }       
}
int hefa(char a[])
{
        int i=-1;
        while(a[++i]!='\0')
        {       
                if(a[i]!='(' && a[i]!=')' && a[i]!='[' && a[i]!=']'&&a[i]!='+' && a[i]!='-' && a[i]!='*' && a[i]!='/'&&(a[i]<'0' || a[i]>'9'))
                {
                        printf("[Error;Wrong]!\n");
                        return(1); //  算式中含有非算式的字符
                }
                if((a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/')&&(a[i+1] == '+' || a[i+1] == '-' || a[i+1] == '*' || a[i+1] == '/'))
                {
                        printf("[Error;Wrong]!\n");
                        return(2);        //算式中运算符号相连
                }
                if(a[i]!='(' && a[i]!=')' && a[i]!='[' && a[i]!=']') continue;  
                if(fuhao(a[i]) == 0)
                {
                        printf("[Error;Wrong]!\n");  
                        return(3);        //算式中括号不合法
                }
                if(a[i]=='(' || a[i]==')' || a[i]=='[' || a[i]==']')
                {
                        if((a[i-1] == '+' || a[i-1] == '-' || a[i-1] == '*' || a[i-1] == '/') && ( a[i]==')' || a[i]==']'))
                        {
                                printf("i=%c  i-1=%c",a[i],a[i-1]);
                                printf("[Error;Wrong]!\n");
                                return(4);        //算式中")"or"]"前有运算符号
                        }
                        if((a[i+1] == '+' || a[i+1] == '-' || a[i+1] == '*' || a[i+1] == '/') && ( a[i]=='(' || a[i]=='['))
                        {
                                printf("i=%c  i-1=%c",a[i],a[i-1]);
                                printf("[Error;Wrong]!\n");
                                return(4);
                        }
                }
               
        }
        if(kuoh1 != -1)
        {
                printf("[Error;Wrong]!\n");
                return(3);
        }
        return (0);
}
int main()
{
        char zif[100],c;
        int i,b;
        int cwts;
        double jieguo;
        while(1)
        {
                i=0;
                b=-1;
                cwts=100;
                while(1)
                {       
                        printf("请输入算式:");
                        scanf("%s",zif);
                        getchar();
                        cwts=hefa(zif);
                        if(cwts==0)break;
                        else
                        switch(cwts)
                        {
                                case 1:printf("错误原因:算式中 含有非法字符\n");break;       
                                case 2:printf("错误原因:算式中 运算符号相连\n");break;
                                case 3:printf("错误原因:算式中 括号不合法\n");break;
                                case 4:printf("错误原因:算式中 括号与运算符号衔接错误\n");break;
                        }
                }
                do   //转化..   / /( )【 】 + - * /  -10000至-80000   char zuanhuawei  double;
                {
                        switch(zif[i])
                        {
                                case '(':shuanshi[++b]=-10000;break;
                                case ')':shuanshi[++b]=-20000;break;
                                case '[':shuanshi[++b]=-30000;break;
                                case ']':shuanshi[++b]=-40000;break;
                                case '+':shuanshi[++b]=-50000;break;
                                case '-':shuanshi[++b]=-60000;break;
                                case '*':shuanshi[++b]=-70000;break;
                                case '/':shuanshi[++b]=-80000;break;
                                 default:
                                {       
                                        if(zif[i]>='0' && zif[i]<='9')
                                        {
                                                if(zif[i-1]>='0' && zif[i-1]<='9');
                                                else b++;
                                                shuanshi[b]=ys(shuanshi[b],-90000,zif[i]-48);break;
                                        }
                                }
                        }
                }while(zif[++i]!='\0');
                cd=b+1;         
                //printf(" cd=%d \n",cd);
                jieguo=keng(cd);
                printf("%s=%.2lf\n\n",zif,jieguo);
                printf("继续?.Y/N.\n\n");
                c=getch();
                if(c=='n' || c=='N') break;       
        }       
}
板凳
 楼主| 发表于 2013-3-22 08:37:37 | 只看该作者
不过 还是可以计算一些  计算结果为负数  的算式  
地板
 楼主| 发表于 2013-3-22 08:38:56 | 只看该作者
/*
        任意输入算式 可以有括号()【】            目前仅支持正数
*/

#include<stdlib.h>
double shuanshi[100];                //算式
double jdss[100]; int s=0;         //简单算式的长度
int cd;                        //长度   
int kuohw[100];        //存放括号在算式中的位置
int kuoh[100];        //存放括号
int kuoh1=-1;         //前一个..  
int yc()
{       
        if(kuoh1==99 )return 0;
        return 1;
}
int jz(char a)
{       
        if(yc()==1)
        {
                kuoh[++kuoh1]=a;
        }
}
int cz()
{       
        kuoh1=kuoh1-1;
}                                                                                                                        
double ys(double z,int f,double y)//运算
{
        switch(f)
        {
                case -50000:return z+y;        
                case -60000:return z-y;
                case -70000:return z*y;        
                case -80000:
                {
                        if(y!=0)return z/y;
                        else
                        {
                                printf("除数不能为零!\n");  
                                exit(0);
                        }
                }
                case -90000:return z*10+y;
        }
}
double changjisuan(double cjs[],int changd) //数组,长度   //返回计算后的值 ( )【 】 + - * /  -10000至-80000   //不能有括号
{
        int i;
        for(i=0;i<changd;)
        {
                if(cjs[i]==-70000 || cjs[i]==-80000)
                {
                        cjs[i+1]=ys(cjs[i-1],cjs[i],cjs[i+1]);
                        changd=hbz(cjs,i-1,i+1,changd);  //数组的合并
                        continue;
                }
                i++;
        }
        for(i=0;i<changd;)
        {
                if(cjs[i]==-50000 || cjs[i]==-60000)
                {
                        cjs[i+1]=ys(cjs[i-1],cjs[i],cjs[i+1]);
                        changd=hbz(cjs,i-1,i+1,changd);  //数组的合并
                        continue;
                }
                i++;
        }
        return cjs[0];               
}
int hbz(double sz[],int a,int b,int changdu)//数组 首位和末位 changdu //返回修改后长度..
{
        int c,d;
        for(c=0;c<(changdu-a);c++)
        {       
                sz[a+c]=sz[b+c];
        }
        return changdu-(b-a);                       
}
void huoqu(double c[],int a,int b)  //获取没有括号的数组
{
        int i2;
        for(i2=0;i2<(b-a);i2++)
        {
                jdss[i2]=c[a+1+i2];
        }
}
double keng(int cahngd)
{       
        int b,c=-1,d;
        double jieguo;
        b=0;       
        for(b=0;b<cahngd;b++)                //去括号
        {
                if(shuanshi[b]==-10000 || shuanshi[b]==-30000)
                {
                        c++;
                        kuohw[c]=b;
                        kuoh[c]=shuanshi[b];       
                }
                if(shuanshi[b]==-20000 && kuoh[c]==-10000 || shuanshi[b]==-40000 && kuoh[c]==-30000)
                {
                                huoqu(shuanshi,kuohw[c],b);
                                shuanshi[b]=changjisuan(jdss,b-kuohw[c]);
                                cahngd=hbz(shuanshi,kuohw[c],b,cahngd);
                                b=kuohw[c];
                                c--;                               
                }
        }
        jieguo=changjisuan(shuanshi,cahngd);
        return jieguo;
}
int fuhao(char a)
{
        if(kuoh1==-1 && (a==')' || a==']')) return 0;       
        if(a=='(' || a=='[')
        {
                jz(a);
                return 1;
        }
        switch(a)
        {
                case ')':
                {       
                        if(kuoh[kuoh1]=='(')
                        {
                                cz();
                                return 1;
                        }
                         else return 0;       
                }
                case ']':               
                {                                     
                         if(kuoh[kuoh1]=='[')
                        {
                                cz();
                                return 1;
                        }            
                        else return        0;             
                 }                     
        }       
}
int hefa(char a[])
{
        int i=-1;
        while(a[++i]!='\0')
        {       
                if(a[i]!='(' && a[i]!=')' && a[i]!='[' && a[i]!=']'&&a[i]!='+' && a[i]!='-' && a[i]!='*' && a[i]!='/'&&(a[i]<'0' || a[i]>'9'))
                {
                        printf("[Error;Wrong]!\n");
                        return(1); //  算式中含有非算式的字符
                }
                if((a[i] == '+' || a[i] == '-' || a[i] == '*' || a[i] == '/')&&(a[i+1] == '+' || a[i+1] == '-' || a[i+1] == '*' || a[i+1] == '/'))
                {
                        printf("[Error;Wrong]!\n");
                        return(2);        //算式中运算符号相连
                }
                if(a[i]!='(' && a[i]!=')' && a[i]!='[' && a[i]!=']') continue;  
                if(fuhao(a[i]) == 0)
                {
                        printf("[Error;Wrong]!\n");  
                        return(3);        //算式中括号不合法
                }
                if(a[i]=='(' || a[i]==')' || a[i]=='[' || a[i]==']')
                {
                        if((a[i-1] == '+' || a[i-1] == '-' || a[i-1] == '*' || a[i-1] == '/') && ( a[i]==')' || a[i]==']'))
                        {
                                printf("i=%c  i-1=%c",a[i],a[i-1]);
                                printf("[Error;Wrong]!\n");
                                return(4);        //算式中")"or"]"前有运算符号
                        }
                        if((a[i+1] == '+' || a[i+1] == '-' || a[i+1] == '*' || a[i+1] == '/') && ( a[i]=='(' || a[i]=='['))
                        {
                                printf("i=%c  i-1=%c",a[i],a[i-1]);
                                printf("[Error;Wrong]!\n");
                                return(4);
                        }
                }
               
        }
        if(kuoh1 != -1)
        {
                printf("[Error;Wrong]!\n");
                return(3);
        }
        return (0);
}
int main()
{
        char zif[100],c;
        int i,b;
        int cwts;
        double jieguo;
        while(1)
        {
                i=0;
                b=-1;
                cwts=100;
                while(1)
                {       
                        printf("请输入算式:");
                        scanf("%s",zif);
                        getchar();
                        cwts=hefa(zif);
                        if(cwts==0)break;
                        else
                        switch(cwts)
                        {
                                case 1:printf("错误原因:算式中 含有非法字符\n");break;       
                                case 2:printf("错误原因:算式中 运算符号相连\n");break;
                                case 3:printf("错误原因:算式中 括号不合法\n");break;
                                case 4:printf("错误原因:算式中 括号与运算符号衔接错误\n");break;
                        }
                }
                do   //转化..   / /( )【 】 + - * /  -10000至-80000   char zuanhuawei  double;
                {
                        switch(zif[i])
                        {
                                case '(':shuanshi[++b]=-10000;break;
                                case ')':shuanshi[++b]=-20000;break;
                                case '[':shuanshi[++b]=-30000;break;
                                case ']':shuanshi[++b]=-40000;break;
                                case '+':shuanshi[++b]=-50000;break;
                                case '-':shuanshi[++b]=-60000;break;
                                case '*':shuanshi[++b]=-70000;break;
                                case '/':shuanshi[++b]=-80000;break;
                                 default:
                                {       
                                        if(zif[i]>='0' && zif[i]<='9')
                                        {
                                                if(zif[i-1]>='0' && zif[i-1]<='9');
                                                else b++;
                                                shuanshi[b]=ys(shuanshi[b],-90000,zif[i]-48);break;
                                        }
                                }
                        }
                }while(zif[++i]!='\0');
                cd=b+1;         
                //printf(" cd=%d \n",cd);
                jieguo=keng(cd);
                printf("%s=%.2lf\n\n",zif,jieguo);
                printf("继续?.Y/N.\n\n");
                c=getch();
                if(c=='n' || c=='N') break;       
        }       
}
5#
发表于 2013-3-23 22:34:50 | 只看该作者
加油
6#
发表于 2013-3-24 14:38:47 | 只看该作者
报错:÷0后程序自动关闭
7#
发表于 2013-4-23 11:17:36 | 只看该作者
http://bbs.ahalei.com/thread-1003-1-1.html
这是我写的,可能可以增强你的功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表