#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define true 1
#define false 0
typedef char* String;
#define YES 1
#define NO 0
#define MaxRight 100
#define MAX 150
typedef struct _bracket{
char ch;
char ch1;
int right;
}Right;
Right a[5]={
{'(' , ')' , 1},
{ '[' ,']' , 2},
{ '{', '}', 3}
};
typedef struct _char
{
String save;
char ch ; /*所对应的字符*/
int IsInBracket;
struct _char *next;
}Bracket;
/*定义全局变量*/
Bracket *head;
String goal;
char str[MAX];
/*如果分别有小,中,大括号*/
int IsHaveSmall=0;
int IsHaveMiddle=0;
int IsHaveBig =0 ;
int HaveNoBracket =1 ;
double Sum_result=0.00;
void Print();
int CheckChar(String p){
int i=0;
int IsHaveNumber=false,IsChar=false;
int a=0,b=0,c=0;
int a1=0,b1=0,c1=0;
while(*(p+i) !='/0' )
{
if(*(p+i)=='(') { a++; IsHaveSmall=1 ; i++;}
else if(*(p+i)==')') {i++; a1++; }
else if(*(p+i)=='[') { b++; IsHaveMiddle=1;i++;}
else if(*(p+i)==']') {i++; b1++; }
else if( *(p+i)=='{' ) { c++; IsHaveBig=1; i++;}
else if(*(p+i)=='}') { i++; c1++; }
else if( (*(p+i)>='0'&&*(p+i)<='9') ||*(p+i)=='.' ||*(p+i)=='+' || *(p+i)=='-'
|| *(p+i)=='*' || *(p+i)=='/' )
{
if(*(p+i)=='/' && *(p+i+1)=='0') return false;
if(*(p+i)=='+' || *(p+i)=='-' || *(p+i)=='*' || *(p+i)=='/' ) IsChar=true;
if(IsChar)
if(! ( (*(p+i+1)>='0'&& *(p+i+1)<='9') || *(p+i+1)=='('
|| *(p+i+1)=='['|| *(p+i+1)=='{'))
return false;
IsHaveNumber=true;
i++;
IsChar=false;
}
else
return false;
}
if((a!=a1 || b!=b1 || c!=c1) || !IsHaveNumber )return false;
return true;
}
Bracket* FindDataInBra(String p,int right,int choice) /*查找处理在括号内的数据*/
{
int i=0;
int IsInBracket=0; /*是否在括号内 0否,1是*/
int Num=0,IsFirst=1;
Bracket *r, *br;
while(*(p+i)!='/0')
{
br=(Bracket *)malloc ( sizeof(Bracket) );
if(i==0) r=head=br;
if( a[choice].ch== *(p+i) ) {
IsInBracket=1;
i++; }
if(a[choice].ch1== *(p+i) ) {
IsInBracket =0 ; i++; }
if(IsInBracket)
br->IsInBracket=YES;
else
br->IsInBracket=NO;
br->save=" ";
br->ch=*(p+i) ;
r->next=br;
r=br;
i++ ;
}
br->next=NULL;
return head;
}
double Digit_Num(char *c)
{
int i=0;
double result=0;
char Ch[20];
for(i=0;*c>='0'&&*c<='9' || *c=='.';i++) { Ch[i]=*c; c++; }
Ch[i]='/0';
result=atof(Ch); /*将字符串转换为数字*/
goal=c;
return result;
}
String CaluteNoBracket(String p)
{
int j=0,Lenght=0,tag=0;
double list[MAX]={0.00,0,0,0,0};
double a=0.00,temp=0.00;
char buf[MAX];
Sum_result=0;
goal= p ;
while(*goal)
{
if( *goal>='0'&& *goal<='9'|| *goal=='.' )
{ a=Digit_Num(goal);
list[j]=a;
}
switch(*goal)
{
case '*':
goal++;
if(*goal !='-')
a=a*Digit_Num(goal);
else {
goal++;
a=-(a*Digit_Num(goal));
list[j]=a;
}
break;
case '/':
goal++;
if(*goal !='-')
a=a/Digit_Num( goal );
else {
goal++;
a=-(a/Digit_Num(goal));
list[j]=a;
}
break;
case '+':
goal++;
j++;
list[j]=a;
if(*goal!='-') list[j]=a;
else {
goal++;
a=-Digit_Num(goal);
j++;
list[j]=a;
}
break;
case '-':
goal++ ;
list[j]=a;
if( *goal=='-') { goal++; a=Digit_Num(goal) ; }
else
a=-Digit_Num(goal);
j++;
break;
}
}
list[j]=a;
for(int i=0;i<=j;i++){
// printf("list[%d]=%f/n",i,list[i]);
Sum_result=Sum_result+list[i];
// printf("Sum_result=%f/n",Sum_result);
}
//'printf("Sum_result=%f/n",Sum_result);
temp=Sum_result;
while(1) {
temp=temp/10;
Lenght++;
if(temp==0) break;
}
gcvt(Sum_result,Lenght+5,buf);
return buf;
}
String DealNoBracket() { /*处理没用括号内的数据 */
Bracket *br,*pre,*p,*r=NULL;
char ch[MAX];
int i=0 ,Is=NO,j=0;
br=head;
while(br!=NULL) {
if(br->IsInBracket==YES) {
ch[i++]=br->ch; if(i==1) r=br;
Is=1;
}
if( (br->IsInBracket==NO) && (Is==1) ) {
ch[i]='/0';
i=0 ;
pre->save=CaluteNoBracket(ch);
j=0;
while(*(pre->save+j) !='/0' ) {
if(j==0) {
r->ch=*(pre->save+j) ;
r->save=" ";
r->IsInBracket=NO;
j++;
}
else {
p=(Bracket *)malloc ( sizeof(Bracket) );
p->ch=*(pre->save+j) ;
p->save=" ";
p->IsInBracket=NO;
r->next=p;
r=p;
p->next=NULL;
j++;
}
}
p->next=br;
i=0 ;
Is=0 ;
}
pre=br;
br=br->next;
}
br=head;
j=0;
while(br!=NULL) {
str[j]=br->ch;
j++;
br=br->next;
}
str[j]='/0';
return str;
}
/*释放内存 */
void FreeData()
{
Bracket *p,*r;
p=head;
while(p!=NULL) {
r=p;
p=p->next;
free(r);
}
return ;
}
void main()
{
printf("Input Operation/n");
scanf("%s",str);
int lenght=strlen(str);
if(*(str+lenght-1)=='=') *(str+lenght-1)='/0';
int result=CheckChar(str);
if(result==false){ printf("have wrong");getchar(); getchar(); system("cls"); main();}
if(IsHaveSmall) {
head=FindDataInBra(str,0,0);
DealNoBracket();
FreeData();
}
if(IsHaveMiddle){
FindDataInBra(str,1,1);
DealNoBracket();
FreeData();
}
if(IsHaveBig)
{
FindDataInBra(str,2,2);
DealNoBracket();
FreeData();
}
if(HaveNoBracket) {
// printf("str=%s/n",str);
CaluteNoBracket(str);
}
printf("the result is: %f/n",Sum_result);
getchar();
getchar();
system("cls");
main();
}