四则运算

来源:互联网 发布:淘宝宝贝如何测试爆款 编辑:程序博客网 时间:2024/04/29 03:28

#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();

 }