|
沙发
楼主 |
发表于 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;
}
} |
|